| /* Copyright 2013 Google Inc. All Rights Reserved. | |
| Distributed under MIT license. | |
| See file LICENSE for detail or copy at https://opensource.org/licenses/MIT | |
| */ | |
| /* Function to find backward reference copies. */ | |
| #include "backward_references.h" | |
| #include "../common/constants.h" | |
| #include "../common/dictionary.h" | |
| #include "../common/platform.h" | |
| #include <brotli/types.h> | |
| #include "command.h" | |
| #include "compound_dictionary.h" | |
| #include "dictionary_hash.h" | |
| #include "encoder_dict.h" | |
| #include "memory.h" | |
| #include "quality.h" | |
| #if defined(__cplusplus) || defined(c_plusplus) | |
| extern "C" { | |
| #endif | |
| static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance, | |
| size_t max_distance, | |
| const int* dist_cache) { | |
| if (distance <= max_distance) { | |
| size_t distance_plus_3 = distance + 3; | |
| size_t offset0 = distance_plus_3 - (size_t)dist_cache[0]; | |
| size_t offset1 = distance_plus_3 - (size_t)dist_cache[1]; | |
| if (distance == (size_t)dist_cache[0]) { | |
| return 0; | |
| } else if (distance == (size_t)dist_cache[1]) { | |
| return 1; | |
| } else if (offset0 < 7) { | |
| return (0x9750468 >> (4 * offset0)) & 0xF; | |
| } else if (offset1 < 7) { | |
| return (0xFDB1ACE >> (4 * offset1)) & 0xF; | |
| } else if (distance == (size_t)dist_cache[2]) { | |
| return 2; | |
| } else if (distance == (size_t)dist_cache[3]) { | |
| return 3; | |
| } | |
| } | |
| return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1; | |
| } | |
| #define EXPAND_CAT(a, b) CAT(a, b) | |
| #define CAT(a, b) a ## b | |
| #define FN(X) EXPAND_CAT(X, HASHER()) | |
| #define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER())) | |
| #define PREFIX() N | |
| #define ENABLE_COMPOUND_DICTIONARY 0 | |
| #define HASHER() H2 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H3 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H4 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H5 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H6 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H40 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H41 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H42 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H54 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H35 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H55 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H65 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #undef ENABLE_COMPOUND_DICTIONARY | |
| #undef PREFIX | |
| #define PREFIX() D | |
| #define ENABLE_COMPOUND_DICTIONARY 1 | |
| #define HASHER() H5 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H6 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H40 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H41 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H42 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H55 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #define HASHER() H65 | |
| /* NOLINTNEXTLINE(build/include) */ | |
| #include "backward_references_inc.h" | |
| #undef HASHER | |
| #undef ENABLE_COMPOUND_DICTIONARY | |
| #undef PREFIX | |
| #undef EXPORT_FN | |
| #undef FN | |
| #undef CAT | |
| #undef EXPAND_CAT | |
| void BrotliCreateBackwardReferences(size_t num_bytes, | |
| size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, | |
| ContextLut literal_context_lut, const BrotliEncoderParams* params, | |
| Hasher* hasher, int* dist_cache, size_t* last_insert_len, | |
| Command* commands, size_t* num_commands, size_t* num_literals) { | |
| if (params->dictionary.compound.num_chunks != 0) { | |
| switch (params->hasher.type) { | |
| #define CASE_(N) \ | |
| case N: \ | |
| CreateBackwardReferencesDH ## N(num_bytes, \ | |
| position, ringbuffer, ringbuffer_mask, \ | |
| literal_context_lut, params, hasher, dist_cache, \ | |
| last_insert_len, commands, num_commands, num_literals); \ | |
| return; | |
| CASE_(5) | |
| CASE_(6) | |
| CASE_(40) | |
| CASE_(41) | |
| CASE_(42) | |
| CASE_(55) | |
| CASE_(65) | |
| #undef CASE_ | |
| default: | |
| break; | |
| } | |
| } | |
| switch (params->hasher.type) { | |
| #define CASE_(N) \ | |
| case N: \ | |
| CreateBackwardReferencesNH ## N(num_bytes, \ | |
| position, ringbuffer, ringbuffer_mask, \ | |
| literal_context_lut, params, hasher, dist_cache, \ | |
| last_insert_len, commands, num_commands, num_literals); \ | |
| return; | |
| FOR_GENERIC_HASHERS(CASE_) | |
| #undef CASE_ | |
| default: | |
| break; | |
| } | |
| } | |
| #if defined(__cplusplus) || defined(c_plusplus) | |
| } /* extern "C" */ | |
| #endif |