1 /* Copyright 2013 Google Inc. All Rights Reserved. 2 3 Distributed under MIT license. 4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 5 */ 6 7 /* Function to find backward reference copies. */ 8 9 #include "./backward_references.h" 10 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" 17 #include "./memory.h" 18 #include "./quality.h" 19 20 #if defined(__cplusplus) || defined(c_plusplus) 21 extern "C" { 22 #endif 23 24 static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance, 25 size_t max_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]) { 32 return 0; 33 } else if (distance == (size_t)dist_cache[1]) { 34 return 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]) { 40 return 2; 41 } else if (distance == (size_t)dist_cache[3]) { 42 return 3; 43 } 44 } 45 return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1; 46 } 47 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())) 52 53 #define PREFIX() N 54 55 #define HASHER() H2 56 /* NOLINTNEXTLINE(build/include) */ 57 #include "./backward_references_inc.h" 58 #undef HASHER 59 60 #define HASHER() H3 61 /* NOLINTNEXTLINE(build/include) */ 62 #include "./backward_references_inc.h" 63 #undef HASHER 64 65 #define HASHER() H4 66 /* NOLINTNEXTLINE(build/include) */ 67 #include "./backward_references_inc.h" 68 #undef HASHER 69 70 #define HASHER() H5 71 /* NOLINTNEXTLINE(build/include) */ 72 #include "./backward_references_inc.h" 73 #undef HASHER 74 75 #define HASHER() H6 76 /* NOLINTNEXTLINE(build/include) */ 77 #include "./backward_references_inc.h" 78 #undef HASHER 79 80 #define HASHER() H40 81 /* NOLINTNEXTLINE(build/include) */ 82 #include "./backward_references_inc.h" 83 #undef HASHER 84 85 #define HASHER() H41 86 /* NOLINTNEXTLINE(build/include) */ 87 #include "./backward_references_inc.h" 88 #undef HASHER 89 90 #define HASHER() H42 91 /* NOLINTNEXTLINE(build/include) */ 92 #include "./backward_references_inc.h" 93 #undef HASHER 94 95 #define HASHER() H54 96 /* NOLINTNEXTLINE(build/include) */ 97 #include "./backward_references_inc.h" 98 #undef HASHER 99 100 #define HASHER() H35 101 /* NOLINTNEXTLINE(build/include) */ 102 #include "./backward_references_inc.h" 103 #undef HASHER 104 105 #define HASHER() H55 106 /* NOLINTNEXTLINE(build/include) */ 107 #include "./backward_references_inc.h" 108 #undef HASHER 109 110 #define HASHER() H65 111 /* NOLINTNEXTLINE(build/include) */ 112 #include "./backward_references_inc.h" 113 #undef HASHER 114 115 #undef PREFIX 116 117 #undef EXPORT_FN 118 #undef FN 119 #undef CAT 120 #undef EXPAND_CAT 121 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) { 128 #define CASE_(N) \ 129 case N: \ 130 CreateBackwardReferencesNH ## N( \ 131 num_bytes, position, ringbuffer, \ 132 ringbuffer_mask, params, hasher, dist_cache, \ 133 last_insert_len, commands, num_commands, num_literals); \ 134 return; 135 FOR_GENERIC_HASHERS(CASE_) 136 #undef CASE_ 137 default: 138 break; 139 } 140 } 141 142 #if defined(__cplusplus) || defined(c_plusplus) 143 } /* extern "C" */ 144 #endif 145