1 /* Copyright 2013 Google Inc. All Rights Reserved.
3 Distributed under MIT license.
4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
7 /* Function to find backward reference copies. */
9 #include "./backward_references.h"
11 #include "../common/constants.h"
12 #include "../common/dictionary.h"
13 #include "../common/platform.h"
14 #include <brotli/types.h>
15 #include "./command.h"
16 #include "./dictionary_hash.h"
18 #include "./quality.h"
20 #if defined(__cplusplus) || defined(c_plusplus)
24 static BROTLI_INLINE
size_t ComputeDistanceCode(size_t distance
,
26 const int* dist_cache
) {
27 if (distance
<= max_distance
) {
28 size_t distance_plus_3
= distance
+ 3;
29 size_t offset0
= distance_plus_3
- (size_t)dist_cache
[0];
30 size_t offset1
= distance_plus_3
- (size_t)dist_cache
[1];
31 if (distance
== (size_t)dist_cache
[0]) {
33 } else if (distance
== (size_t)dist_cache
[1]) {
35 } else if (offset0
< 7) {
36 return (0x9750468 >> (4 * offset0
)) & 0xF;
37 } else if (offset1
< 7) {
38 return (0xFDB1ACE >> (4 * offset1
)) & 0xF;
39 } else if (distance
== (size_t)dist_cache
[2]) {
41 } else if (distance
== (size_t)dist_cache
[3]) {
45 return distance
+ BROTLI_NUM_DISTANCE_SHORT_CODES
- 1;
48 #define EXPAND_CAT(a, b) CAT(a, b)
49 #define CAT(a, b) a ## b
50 #define FN(X) EXPAND_CAT(X, HASHER())
51 #define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER()))
56 /* NOLINTNEXTLINE(build/include) */
57 #include "./backward_references_inc.h"
61 /* NOLINTNEXTLINE(build/include) */
62 #include "./backward_references_inc.h"
66 /* NOLINTNEXTLINE(build/include) */
67 #include "./backward_references_inc.h"
71 /* NOLINTNEXTLINE(build/include) */
72 #include "./backward_references_inc.h"
76 /* NOLINTNEXTLINE(build/include) */
77 #include "./backward_references_inc.h"
81 /* NOLINTNEXTLINE(build/include) */
82 #include "./backward_references_inc.h"
86 /* NOLINTNEXTLINE(build/include) */
87 #include "./backward_references_inc.h"
91 /* NOLINTNEXTLINE(build/include) */
92 #include "./backward_references_inc.h"
96 /* NOLINTNEXTLINE(build/include) */
97 #include "./backward_references_inc.h"
101 /* NOLINTNEXTLINE(build/include) */
102 #include "./backward_references_inc.h"
106 /* NOLINTNEXTLINE(build/include) */
107 #include "./backward_references_inc.h"
111 /* NOLINTNEXTLINE(build/include) */
112 #include "./backward_references_inc.h"
122 void BrotliCreateBackwardReferences(
123 size_t num_bytes
, size_t position
, const uint8_t* ringbuffer
,
124 size_t ringbuffer_mask
, const BrotliEncoderParams
* params
,
125 HasherHandle hasher
, int* dist_cache
, size_t* last_insert_len
,
126 Command
* commands
, size_t* num_commands
, size_t* num_literals
) {
127 switch (params
->hasher
.type
) {
130 CreateBackwardReferencesNH ## N( \
131 num_bytes, position, ringbuffer, \
132 ringbuffer_mask, params, hasher, dist_cache, \
133 last_insert_len, commands, num_commands, num_literals); \
135 FOR_GENERIC_HASHERS(CASE_
)
142 #if defined(__cplusplus) || defined(c_plusplus)