isomorfeus-ferret 0.12.4 → 0.12.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +612 -612
  3. data/README.md +77 -48
  4. data/ext/isomorfeus_ferret_ext/bm_hash.c +9 -6
  5. data/ext/isomorfeus_ferret_ext/bm_micro_string.c +4 -2
  6. data/ext/isomorfeus_ferret_ext/brotli_common_constants.c +15 -0
  7. data/ext/isomorfeus_ferret_ext/brotli_common_constants.h +200 -0
  8. data/ext/isomorfeus_ferret_ext/brotli_common_context.c +156 -0
  9. data/ext/isomorfeus_ferret_ext/brotli_common_context.h +113 -0
  10. data/ext/isomorfeus_ferret_ext/brotli_common_dictionary.c +5914 -0
  11. data/ext/isomorfeus_ferret_ext/brotli_common_dictionary.h +64 -0
  12. data/ext/isomorfeus_ferret_ext/brotli_common_platform.c +22 -0
  13. data/ext/isomorfeus_ferret_ext/brotli_common_platform.h +594 -0
  14. data/ext/isomorfeus_ferret_ext/brotli_common_transform.c +291 -0
  15. data/ext/isomorfeus_ferret_ext/brotli_common_transform.h +85 -0
  16. data/ext/isomorfeus_ferret_ext/brotli_common_version.h +26 -0
  17. data/ext/isomorfeus_ferret_ext/brotli_dec_bit_reader.c +76 -0
  18. data/ext/isomorfeus_ferret_ext/brotli_dec_bit_reader.h +351 -0
  19. data/ext/isomorfeus_ferret_ext/brotli_dec_decode.c +2608 -0
  20. data/ext/isomorfeus_ferret_ext/brotli_dec_huffman.c +339 -0
  21. data/ext/isomorfeus_ferret_ext/brotli_dec_huffman.h +121 -0
  22. data/ext/isomorfeus_ferret_ext/brotli_dec_prefix.h +732 -0
  23. data/ext/isomorfeus_ferret_ext/brotli_dec_state.c +159 -0
  24. data/ext/isomorfeus_ferret_ext/brotli_dec_state.h +365 -0
  25. data/ext/isomorfeus_ferret_ext/brotli_decode.h +344 -0
  26. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references.c +145 -0
  27. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references.h +39 -0
  28. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_hq.c +843 -0
  29. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_hq.h +95 -0
  30. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_inc.h +163 -0
  31. data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost.c +35 -0
  32. data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost.h +63 -0
  33. data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost_inc.h +127 -0
  34. data/ext/isomorfeus_ferret_ext/brotli_enc_block_encoder_inc.h +34 -0
  35. data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter.c +194 -0
  36. data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter.h +51 -0
  37. data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter_inc.h +440 -0
  38. data/ext/isomorfeus_ferret_ext/brotli_enc_brotli_bit_stream.c +1314 -0
  39. data/ext/isomorfeus_ferret_ext/brotli_enc_brotli_bit_stream.h +84 -0
  40. data/ext/isomorfeus_ferret_ext/brotli_enc_cluster.c +56 -0
  41. data/ext/isomorfeus_ferret_ext/brotli_enc_cluster.h +48 -0
  42. data/ext/isomorfeus_ferret_ext/brotli_enc_cluster_inc.h +320 -0
  43. data/ext/isomorfeus_ferret_ext/brotli_enc_command.c +28 -0
  44. data/ext/isomorfeus_ferret_ext/brotli_enc_command.h +190 -0
  45. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment.c +790 -0
  46. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment.h +61 -0
  47. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment_two_pass.c +645 -0
  48. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment_two_pass.h +54 -0
  49. data/ext/isomorfeus_ferret_ext/brotli_enc_dictionary_hash.c +1846 -0
  50. data/ext/isomorfeus_ferret_ext/brotli_enc_dictionary_hash.h +25 -0
  51. data/ext/isomorfeus_ferret_ext/brotli_enc_encode.c +1927 -0
  52. data/ext/isomorfeus_ferret_ext/brotli_enc_encoder_dict.c +33 -0
  53. data/ext/isomorfeus_ferret_ext/brotli_enc_encoder_dict.h +43 -0
  54. data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode.c +503 -0
  55. data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode.h +122 -0
  56. data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode_static.h +539 -0
  57. data/ext/isomorfeus_ferret_ext/brotli_enc_fast_log.c +105 -0
  58. data/ext/isomorfeus_ferret_ext/brotli_enc_fast_log.h +66 -0
  59. data/ext/isomorfeus_ferret_ext/brotli_enc_find_match_length.h +79 -0
  60. data/ext/isomorfeus_ferret_ext/brotli_enc_hash.h +488 -0
  61. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_composite_inc.h +125 -0
  62. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_forgetful_chain_inc.h +293 -0
  63. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match64_inc.h +267 -0
  64. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match_inc.h +262 -0
  65. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match_quickly_inc.h +266 -0
  66. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_rolling_inc.h +212 -0
  67. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_to_binary_tree_inc.h +329 -0
  68. data/ext/isomorfeus_ferret_ext/brotli_enc_histogram.c +100 -0
  69. data/ext/isomorfeus_ferret_ext/brotli_enc_histogram.h +63 -0
  70. data/ext/isomorfeus_ferret_ext/brotli_enc_histogram_inc.h +51 -0
  71. data/ext/isomorfeus_ferret_ext/brotli_enc_literal_cost.c +175 -0
  72. data/ext/isomorfeus_ferret_ext/brotli_enc_literal_cost.h +30 -0
  73. data/ext/isomorfeus_ferret_ext/brotli_enc_memory.c +170 -0
  74. data/ext/isomorfeus_ferret_ext/brotli_enc_memory.h +114 -0
  75. data/ext/isomorfeus_ferret_ext/brotli_enc_metablock.c +663 -0
  76. data/ext/isomorfeus_ferret_ext/brotli_enc_metablock.h +105 -0
  77. data/ext/isomorfeus_ferret_ext/brotli_enc_metablock_inc.h +183 -0
  78. data/ext/isomorfeus_ferret_ext/brotli_enc_params.h +46 -0
  79. data/ext/isomorfeus_ferret_ext/brotli_enc_prefix.h +53 -0
  80. data/ext/isomorfeus_ferret_ext/brotli_enc_quality.h +165 -0
  81. data/ext/isomorfeus_ferret_ext/brotli_enc_ringbuffer.h +167 -0
  82. data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict.c +486 -0
  83. data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict.h +40 -0
  84. data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict_lut.h +5864 -0
  85. data/ext/isomorfeus_ferret_ext/brotli_enc_utf8_util.c +85 -0
  86. data/ext/isomorfeus_ferret_ext/brotli_enc_utf8_util.h +32 -0
  87. data/ext/isomorfeus_ferret_ext/brotli_enc_write_bits.h +87 -0
  88. data/ext/isomorfeus_ferret_ext/brotli_encode.h +448 -0
  89. data/ext/isomorfeus_ferret_ext/brotli_port.h +288 -0
  90. data/ext/isomorfeus_ferret_ext/brotli_types.h +83 -0
  91. data/ext/isomorfeus_ferret_ext/frb_index.c +35 -4
  92. data/ext/isomorfeus_ferret_ext/frb_store.c +34 -5
  93. data/ext/isomorfeus_ferret_ext/frt_document.h +1 -0
  94. data/ext/isomorfeus_ferret_ext/frt_fs_store.c +1 -0
  95. data/ext/isomorfeus_ferret_ext/frt_index.c +174 -25
  96. data/ext/isomorfeus_ferret_ext/frt_index.h +6 -3
  97. data/ext/isomorfeus_ferret_ext/frt_posh.h +11 -19
  98. data/ext/isomorfeus_ferret_ext/frt_q_parser.c +1844 -1911
  99. data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +12 -15
  100. data/ext/isomorfeus_ferret_ext/frt_ram_store.c +1 -0
  101. data/ext/isomorfeus_ferret_ext/frt_scanner.c +1 -0
  102. data/ext/isomorfeus_ferret_ext/frt_scanner_mb.c +1 -0
  103. data/ext/isomorfeus_ferret_ext/frt_scanner_utf8.c +1 -0
  104. data/ext/isomorfeus_ferret_ext/frt_search.h +1 -1
  105. data/ext/isomorfeus_ferret_ext/libstemmer.c +14 -11
  106. data/ext/isomorfeus_ferret_ext/libstemmer.h +4 -9
  107. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_basque.c +1167 -0
  108. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_basque.h +6 -0
  109. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_catalan.c +1433 -0
  110. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_catalan.h +6 -0
  111. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_danish.c +120 -143
  112. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_danish.h +1 -2
  113. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_dutch.c +217 -237
  114. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_dutch.h +1 -1
  115. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_english.c +377 -432
  116. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_english.h +1 -1
  117. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_finnish.c +298 -342
  118. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_finnish.h +1 -2
  119. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_french.c +530 -524
  120. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_french.h +1 -1
  121. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_german.c +201 -214
  122. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_german.h +1 -1
  123. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_hungarian.c +1 -1
  124. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_indonesian.c +394 -0
  125. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_indonesian.h +6 -0
  126. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_irish.c +457 -0
  127. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_irish.h +6 -0
  128. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_italian.c +396 -439
  129. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_italian.h +1 -1
  130. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_norwegian.c +104 -128
  131. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_norwegian.h +1 -1
  132. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_porter.c +242 -273
  133. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_porter.h +1 -1
  134. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_portuguese.c +406 -461
  135. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_portuguese.h +1 -2
  136. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_spanish.c +405 -456
  137. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_spanish.h +1 -1
  138. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_swedish.c +108 -126
  139. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_1_swedish.h +1 -1
  140. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_hungarian.c +849 -0
  141. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_hungarian.h +6 -0
  142. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_romanian.c +373 -405
  143. data/ext/isomorfeus_ferret_ext/stem_ISO_8859_2_romanian.h +1 -1
  144. data/ext/isomorfeus_ferret_ext/stem_KOI8_R_russian.c +288 -305
  145. data/ext/isomorfeus_ferret_ext/stem_KOI8_R_russian.h +1 -1
  146. data/ext/isomorfeus_ferret_ext/stem_UTF_8_arabic.c +1651 -0
  147. data/ext/isomorfeus_ferret_ext/stem_UTF_8_arabic.h +6 -0
  148. data/ext/isomorfeus_ferret_ext/stem_UTF_8_armenian.c +546 -0
  149. data/ext/isomorfeus_ferret_ext/stem_UTF_8_armenian.h +6 -0
  150. data/ext/isomorfeus_ferret_ext/stem_UTF_8_basque.c +1171 -0
  151. data/ext/isomorfeus_ferret_ext/stem_UTF_8_basque.h +6 -0
  152. data/ext/isomorfeus_ferret_ext/stem_UTF_8_catalan.c +1436 -0
  153. data/ext/isomorfeus_ferret_ext/stem_UTF_8_catalan.h +6 -0
  154. data/ext/isomorfeus_ferret_ext/stem_UTF_8_danish.c +121 -141
  155. data/ext/isomorfeus_ferret_ext/stem_UTF_8_danish.h +1 -1
  156. data/ext/isomorfeus_ferret_ext/stem_UTF_8_dutch.c +221 -241
  157. data/ext/isomorfeus_ferret_ext/stem_UTF_8_dutch.h +1 -1
  158. data/ext/isomorfeus_ferret_ext/stem_UTF_8_english.c +381 -431
  159. data/ext/isomorfeus_ferret_ext/stem_UTF_8_english.h +1 -1
  160. data/ext/isomorfeus_ferret_ext/stem_UTF_8_finnish.c +300 -345
  161. data/ext/isomorfeus_ferret_ext/stem_UTF_8_finnish.h +1 -1
  162. data/ext/isomorfeus_ferret_ext/stem_UTF_8_french.c +518 -511
  163. data/ext/isomorfeus_ferret_ext/stem_UTF_8_french.h +1 -1
  164. data/ext/isomorfeus_ferret_ext/stem_UTF_8_german.c +201 -209
  165. data/ext/isomorfeus_ferret_ext/stem_UTF_8_german.h +1 -1
  166. data/ext/isomorfeus_ferret_ext/stem_UTF_8_greek.c +3660 -0
  167. data/ext/isomorfeus_ferret_ext/stem_UTF_8_greek.h +6 -0
  168. data/ext/isomorfeus_ferret_ext/stem_UTF_8_hindi.c +309 -0
  169. data/ext/isomorfeus_ferret_ext/stem_UTF_8_hindi.h +6 -0
  170. data/ext/isomorfeus_ferret_ext/stem_UTF_8_hungarian.c +306 -671
  171. data/ext/isomorfeus_ferret_ext/stem_UTF_8_hungarian.h +1 -1
  172. data/ext/isomorfeus_ferret_ext/stem_UTF_8_indonesian.c +394 -0
  173. data/ext/isomorfeus_ferret_ext/stem_UTF_8_indonesian.h +6 -0
  174. data/ext/isomorfeus_ferret_ext/stem_UTF_8_irish.c +457 -0
  175. data/ext/isomorfeus_ferret_ext/stem_UTF_8_irish.h +6 -0
  176. data/ext/isomorfeus_ferret_ext/stem_UTF_8_italian.c +400 -442
  177. data/ext/isomorfeus_ferret_ext/stem_UTF_8_italian.h +1 -1
  178. data/ext/isomorfeus_ferret_ext/stem_UTF_8_lithuanian.c +824 -0
  179. data/ext/isomorfeus_ferret_ext/stem_UTF_8_lithuanian.h +6 -0
  180. data/ext/isomorfeus_ferret_ext/stem_UTF_8_nepali.c +408 -0
  181. data/ext/isomorfeus_ferret_ext/stem_UTF_8_nepali.h +6 -0
  182. data/ext/isomorfeus_ferret_ext/stem_UTF_8_norwegian.c +105 -127
  183. data/ext/isomorfeus_ferret_ext/stem_UTF_8_norwegian.h +1 -1
  184. data/ext/isomorfeus_ferret_ext/stem_UTF_8_porter.c +245 -276
  185. data/ext/isomorfeus_ferret_ext/stem_UTF_8_porter.h +1 -1
  186. data/ext/isomorfeus_ferret_ext/stem_UTF_8_portuguese.c +409 -464
  187. data/ext/isomorfeus_ferret_ext/stem_UTF_8_portuguese.h +1 -1
  188. data/ext/isomorfeus_ferret_ext/stem_UTF_8_romanian.c +376 -408
  189. data/ext/isomorfeus_ferret_ext/stem_UTF_8_romanian.h +1 -1
  190. data/ext/isomorfeus_ferret_ext/stem_UTF_8_russian.c +272 -287
  191. data/ext/isomorfeus_ferret_ext/stem_UTF_8_russian.h +1 -1
  192. data/ext/isomorfeus_ferret_ext/stem_UTF_8_serbian.c +6530 -0
  193. data/ext/isomorfeus_ferret_ext/stem_UTF_8_serbian.h +6 -0
  194. data/ext/isomorfeus_ferret_ext/stem_UTF_8_spanish.c +407 -458
  195. data/ext/isomorfeus_ferret_ext/stem_UTF_8_spanish.h +1 -1
  196. data/ext/isomorfeus_ferret_ext/stem_UTF_8_swedish.c +110 -125
  197. data/ext/isomorfeus_ferret_ext/stem_UTF_8_swedish.h +1 -1
  198. data/ext/isomorfeus_ferret_ext/stem_UTF_8_tamil.c +1865 -0
  199. data/ext/isomorfeus_ferret_ext/stem_UTF_8_tamil.h +6 -0
  200. data/ext/isomorfeus_ferret_ext/stem_UTF_8_turkish.c +698 -806
  201. data/ext/isomorfeus_ferret_ext/stem_UTF_8_turkish.h +1 -1
  202. data/ext/isomorfeus_ferret_ext/stem_UTF_8_yiddish.c +1220 -0
  203. data/ext/isomorfeus_ferret_ext/stem_UTF_8_yiddish.h +6 -0
  204. data/ext/isomorfeus_ferret_ext/stem_api.c +1 -9
  205. data/ext/isomorfeus_ferret_ext/stem_api.h +1 -3
  206. data/ext/isomorfeus_ferret_ext/stem_header.h +30 -26
  207. data/ext/isomorfeus_ferret_ext/stem_modules.h +113 -26
  208. data/ext/isomorfeus_ferret_ext/stem_modules.txt +18 -5
  209. data/ext/isomorfeus_ferret_ext/stem_utilities.c +167 -132
  210. data/ext/isomorfeus_ferret_ext/test.c +7 -1
  211. data/ext/isomorfeus_ferret_ext/test_fields.c +57 -45
  212. data/ext/isomorfeus_ferret_ext/test_index.c +4 -1
  213. data/ext/isomorfeus_ferret_ext/test_search.c +0 -1
  214. data/lib/isomorfeus/ferret/version.rb +1 -1
  215. metadata +125 -5
  216. data/ext/isomorfeus_ferret_ext/q_parser.y +0 -1366
@@ -0,0 +1,339 @@
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
+ /* Utilities for building Huffman decoding tables. */
8
+
9
+ #include "brotli_dec_huffman.h"
10
+
11
+ #include <string.h> /* memcpy, memset */
12
+
13
+ #include "brotli_common_constants.h"
14
+ #include "brotli_common_platform.h"
15
+ #include "brotli_types.h"
16
+
17
+ #if defined(__cplusplus) || defined(c_plusplus)
18
+ extern "C" {
19
+ #endif
20
+
21
+ #define BROTLI_REVERSE_BITS_MAX 8
22
+
23
+ #if defined(BROTLI_RBIT)
24
+ #define BROTLI_REVERSE_BITS_BASE \
25
+ ((sizeof(brotli_reg_t) << 3) - BROTLI_REVERSE_BITS_MAX)
26
+ #else
27
+ #define BROTLI_REVERSE_BITS_BASE 0
28
+ static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
29
+ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
30
+ 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
31
+ 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
32
+ 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
33
+ 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
34
+ 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
35
+ 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
36
+ 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
37
+ 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
38
+ 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
39
+ 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
40
+ 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
41
+ 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
42
+ 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
43
+ 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
44
+ 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
45
+ 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
46
+ 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
47
+ 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
48
+ 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
49
+ 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
50
+ 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
51
+ 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
52
+ 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
53
+ 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
54
+ 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
55
+ 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
56
+ 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
57
+ 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
58
+ 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
59
+ 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
60
+ 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
61
+ };
62
+ #endif /* BROTLI_RBIT */
63
+
64
+ #define BROTLI_REVERSE_BITS_LOWEST \
65
+ ((brotli_reg_t)1 << (BROTLI_REVERSE_BITS_MAX - 1 + BROTLI_REVERSE_BITS_BASE))
66
+
67
+ /* Returns reverse(num >> BROTLI_REVERSE_BITS_BASE, BROTLI_REVERSE_BITS_MAX),
68
+ where reverse(value, len) is the bit-wise reversal of the len least
69
+ significant bits of value. */
70
+ static BROTLI_INLINE brotli_reg_t BrotliReverseBits(brotli_reg_t num) {
71
+ #if defined(BROTLI_RBIT)
72
+ return BROTLI_RBIT(num);
73
+ #else
74
+ return kReverseBits[num];
75
+ #endif
76
+ }
77
+
78
+ /* Stores code in table[0], table[step], table[2*step], ..., table[end] */
79
+ /* Assumes that end is an integer multiple of step */
80
+ static BROTLI_INLINE void ReplicateValue(HuffmanCode* table,
81
+ int step, int end,
82
+ HuffmanCode code) {
83
+ do {
84
+ end -= step;
85
+ table[end] = code;
86
+ } while (end > 0);
87
+ }
88
+
89
+ /* Returns the table width of the next 2nd level table. |count| is the histogram
90
+ of bit lengths for the remaining symbols, |len| is the code length of the
91
+ next processed symbol. */
92
+ static BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
93
+ int len, int root_bits) {
94
+ int left = 1 << (len - root_bits);
95
+ while (len < BROTLI_HUFFMAN_MAX_CODE_LENGTH) {
96
+ left -= count[len];
97
+ if (left <= 0) break;
98
+ ++len;
99
+ left <<= 1;
100
+ }
101
+ return len - root_bits;
102
+ }
103
+
104
+ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
105
+ const uint8_t* const code_lengths,
106
+ uint16_t* count) {
107
+ HuffmanCode code; /* current table entry */
108
+ int symbol; /* symbol index in original or sorted table */
109
+ brotli_reg_t key; /* prefix code */
110
+ brotli_reg_t key_step; /* prefix code addend */
111
+ int step; /* step size to replicate values in current table */
112
+ int table_size; /* size of current table */
113
+ int sorted[BROTLI_CODE_LENGTH_CODES]; /* symbols sorted by code length */
114
+ /* offsets in sorted table for each length */
115
+ int offset[BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1];
116
+ int bits;
117
+ int bits_count;
118
+ BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH <=
119
+ BROTLI_REVERSE_BITS_MAX);
120
+
121
+ /* Generate offsets into sorted symbol table by code length. */
122
+ symbol = -1;
123
+ bits = 1;
124
+ BROTLI_REPEAT(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH, {
125
+ symbol += count[bits];
126
+ offset[bits] = symbol;
127
+ bits++;
128
+ });
129
+ /* Symbols with code length 0 are placed after all other symbols. */
130
+ offset[0] = BROTLI_CODE_LENGTH_CODES - 1;
131
+
132
+ /* Sort symbols by length, by symbol order within each length. */
133
+ symbol = BROTLI_CODE_LENGTH_CODES;
134
+ do {
135
+ BROTLI_REPEAT(6, {
136
+ symbol--;
137
+ sorted[offset[code_lengths[symbol]]--] = symbol;
138
+ });
139
+ } while (symbol != 0);
140
+
141
+ table_size = 1 << BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH;
142
+
143
+ /* Special case: all symbols but one have 0 code length. */
144
+ if (offset[0] == 0) {
145
+ code = ConstructHuffmanCode(0, (uint16_t)sorted[0]);
146
+ for (key = 0; key < (brotli_reg_t)table_size; ++key) {
147
+ table[key] = code;
148
+ }
149
+ return;
150
+ }
151
+
152
+ /* Fill in table. */
153
+ key = 0;
154
+ key_step = BROTLI_REVERSE_BITS_LOWEST;
155
+ symbol = 0;
156
+ bits = 1;
157
+ step = 2;
158
+ do {
159
+ for (bits_count = count[bits]; bits_count != 0; --bits_count) {
160
+ code = ConstructHuffmanCode((uint8_t)bits, (uint16_t)sorted[symbol++]);
161
+ ReplicateValue(&table[BrotliReverseBits(key)], step, table_size, code);
162
+ key += key_step;
163
+ }
164
+ step <<= 1;
165
+ key_step >>= 1;
166
+ } while (++bits <= BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH);
167
+ }
168
+
169
+ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
170
+ int root_bits,
171
+ const uint16_t* const symbol_lists,
172
+ uint16_t* count) {
173
+ HuffmanCode code; /* current table entry */
174
+ HuffmanCode* table; /* next available space in table */
175
+ int len; /* current code length */
176
+ int symbol; /* symbol index in original or sorted table */
177
+ brotli_reg_t key; /* prefix code */
178
+ brotli_reg_t key_step; /* prefix code addend */
179
+ brotli_reg_t sub_key; /* 2nd level table prefix code */
180
+ brotli_reg_t sub_key_step; /* 2nd level table prefix code addend */
181
+ int step; /* step size to replicate values in current table */
182
+ int table_bits; /* key length of current table */
183
+ int table_size; /* size of current table */
184
+ int total_size; /* sum of root table size and 2nd level table sizes */
185
+ int max_length = -1;
186
+ int bits;
187
+ int bits_count;
188
+
189
+ BROTLI_DCHECK(root_bits <= BROTLI_REVERSE_BITS_MAX);
190
+ BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH - root_bits <=
191
+ BROTLI_REVERSE_BITS_MAX);
192
+
193
+ while (symbol_lists[max_length] == 0xFFFF) max_length--;
194
+ max_length += BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1;
195
+
196
+ table = root_table;
197
+ table_bits = root_bits;
198
+ table_size = 1 << table_bits;
199
+ total_size = table_size;
200
+
201
+ /* Fill in the root table. Reduce the table size to if possible,
202
+ and create the repetitions by memcpy. */
203
+ if (table_bits > max_length) {
204
+ table_bits = max_length;
205
+ table_size = 1 << table_bits;
206
+ }
207
+ key = 0;
208
+ key_step = BROTLI_REVERSE_BITS_LOWEST;
209
+ bits = 1;
210
+ step = 2;
211
+ do {
212
+ symbol = bits - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
213
+ for (bits_count = count[bits]; bits_count != 0; --bits_count) {
214
+ symbol = symbol_lists[symbol];
215
+ code = ConstructHuffmanCode((uint8_t)bits, (uint16_t)symbol);
216
+ ReplicateValue(&table[BrotliReverseBits(key)], step, table_size, code);
217
+ key += key_step;
218
+ }
219
+ step <<= 1;
220
+ key_step >>= 1;
221
+ } while (++bits <= table_bits);
222
+
223
+ /* If root_bits != table_bits then replicate to fill the remaining slots. */
224
+ while (total_size != table_size) {
225
+ memcpy(&table[table_size], &table[0],
226
+ (size_t)table_size * sizeof(table[0]));
227
+ table_size <<= 1;
228
+ }
229
+
230
+ /* Fill in 2nd level tables and add pointers to root table. */
231
+ key_step = BROTLI_REVERSE_BITS_LOWEST >> (root_bits - 1);
232
+ sub_key = (BROTLI_REVERSE_BITS_LOWEST << 1);
233
+ sub_key_step = BROTLI_REVERSE_BITS_LOWEST;
234
+ for (len = root_bits + 1, step = 2; len <= max_length; ++len) {
235
+ symbol = len - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
236
+ for (; count[len] != 0; --count[len]) {
237
+ if (sub_key == (BROTLI_REVERSE_BITS_LOWEST << 1U)) {
238
+ table += table_size;
239
+ table_bits = NextTableBitSize(count, len, root_bits);
240
+ table_size = 1 << table_bits;
241
+ total_size += table_size;
242
+ sub_key = BrotliReverseBits(key);
243
+ key += key_step;
244
+ root_table[sub_key] = ConstructHuffmanCode(
245
+ (uint8_t)(table_bits + root_bits),
246
+ (uint16_t)(((size_t)(table - root_table)) - sub_key));
247
+ sub_key = 0;
248
+ }
249
+ symbol = symbol_lists[symbol];
250
+ code = ConstructHuffmanCode((uint8_t)(len - root_bits), (uint16_t)symbol);
251
+ ReplicateValue(
252
+ &table[BrotliReverseBits(sub_key)], step, table_size, code);
253
+ sub_key += sub_key_step;
254
+ }
255
+ step <<= 1;
256
+ sub_key_step >>= 1;
257
+ }
258
+ return (uint32_t)total_size;
259
+ }
260
+
261
+ uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
262
+ int root_bits,
263
+ uint16_t* val,
264
+ uint32_t num_symbols) {
265
+ uint32_t table_size = 1;
266
+ const uint32_t goal_size = 1U << root_bits;
267
+ switch (num_symbols) {
268
+ case 0:
269
+ table[0] = ConstructHuffmanCode(0, val[0]);
270
+ break;
271
+ case 1:
272
+ if (val[1] > val[0]) {
273
+ table[0] = ConstructHuffmanCode(1, val[0]);
274
+ table[1] = ConstructHuffmanCode(1, val[1]);
275
+ } else {
276
+ table[0] = ConstructHuffmanCode(1, val[1]);
277
+ table[1] = ConstructHuffmanCode(1, val[0]);
278
+ }
279
+ table_size = 2;
280
+ break;
281
+ case 2:
282
+ table[0] = ConstructHuffmanCode(1, val[0]);
283
+ table[2] = ConstructHuffmanCode(1, val[0]);
284
+ if (val[2] > val[1]) {
285
+ table[1] = ConstructHuffmanCode(2, val[1]);
286
+ table[3] = ConstructHuffmanCode(2, val[2]);
287
+ } else {
288
+ table[1] = ConstructHuffmanCode(2, val[2]);
289
+ table[3] = ConstructHuffmanCode(2, val[1]);
290
+ }
291
+ table_size = 4;
292
+ break;
293
+ case 3: {
294
+ int i, k;
295
+ for (i = 0; i < 3; ++i) {
296
+ for (k = i + 1; k < 4; ++k) {
297
+ if (val[k] < val[i]) {
298
+ uint16_t t = val[k];
299
+ val[k] = val[i];
300
+ val[i] = t;
301
+ }
302
+ }
303
+ }
304
+ table[0] = ConstructHuffmanCode(2, val[0]);
305
+ table[2] = ConstructHuffmanCode(2, val[1]);
306
+ table[1] = ConstructHuffmanCode(2, val[2]);
307
+ table[3] = ConstructHuffmanCode(2, val[3]);
308
+ table_size = 4;
309
+ break;
310
+ }
311
+ case 4: {
312
+ if (val[3] < val[2]) {
313
+ uint16_t t = val[3];
314
+ val[3] = val[2];
315
+ val[2] = t;
316
+ }
317
+ table[0] = ConstructHuffmanCode(1, val[0]);
318
+ table[1] = ConstructHuffmanCode(2, val[1]);
319
+ table[2] = ConstructHuffmanCode(1, val[0]);
320
+ table[3] = ConstructHuffmanCode(3, val[2]);
321
+ table[4] = ConstructHuffmanCode(1, val[0]);
322
+ table[5] = ConstructHuffmanCode(2, val[1]);
323
+ table[6] = ConstructHuffmanCode(1, val[0]);
324
+ table[7] = ConstructHuffmanCode(3, val[3]);
325
+ table_size = 8;
326
+ break;
327
+ }
328
+ }
329
+ while (table_size != goal_size) {
330
+ memcpy(&table[table_size], &table[0],
331
+ (size_t)table_size * sizeof(table[0]));
332
+ table_size <<= 1;
333
+ }
334
+ return goal_size;
335
+ }
336
+
337
+ #if defined(__cplusplus) || defined(c_plusplus)
338
+ } /* extern "C" */
339
+ #endif
@@ -0,0 +1,121 @@
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
+ /* Utilities for building Huffman decoding tables. */
8
+
9
+ #ifndef BROTLI_DEC_HUFFMAN_H_
10
+ #define BROTLI_DEC_HUFFMAN_H_
11
+
12
+ #include "brotli_common_platform.h"
13
+ #include "brotli_types.h"
14
+
15
+ #if defined(__cplusplus) || defined(c_plusplus)
16
+ extern "C" {
17
+ #endif
18
+
19
+ #define BROTLI_HUFFMAN_MAX_CODE_LENGTH 15
20
+
21
+ /* BROTLI_NUM_BLOCK_LEN_SYMBOLS == 26 */
22
+ #define BROTLI_HUFFMAN_MAX_SIZE_26 396
23
+ /* BROTLI_MAX_BLOCK_TYPE_SYMBOLS == 258 */
24
+ #define BROTLI_HUFFMAN_MAX_SIZE_258 632
25
+ /* BROTLI_MAX_CONTEXT_MAP_SYMBOLS == 272 */
26
+ #define BROTLI_HUFFMAN_MAX_SIZE_272 646
27
+
28
+ #define BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH 5
29
+
30
+ #if ((defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_32)) && \
31
+ BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0))
32
+ #define BROTLI_HUFFMAN_CODE_FAST_LOAD
33
+ #endif
34
+
35
+ #if !defined(BROTLI_HUFFMAN_CODE_FAST_LOAD)
36
+ /* Do not create this struct directly - use the ConstructHuffmanCode
37
+ * constructor below! */
38
+ typedef struct {
39
+ uint8_t bits; /* number of bits used for this symbol */
40
+ uint16_t value; /* symbol value or table offset */
41
+ } HuffmanCode;
42
+
43
+ static BROTLI_INLINE HuffmanCode ConstructHuffmanCode(const uint8_t bits,
44
+ const uint16_t value) {
45
+ HuffmanCode h;
46
+ h.bits = bits;
47
+ h.value = value;
48
+ return h;
49
+ }
50
+
51
+ /* Please use the following macros to optimize HuffmanCode accesses in hot
52
+ * paths.
53
+ *
54
+ * For example, assuming |table| contains a HuffmanCode pointer:
55
+ *
56
+ * BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
57
+ * BROTLI_HC_ADJUST_TABLE_INDEX(table, index_into_table);
58
+ * *bits = BROTLI_HC_GET_BITS(table);
59
+ * *value = BROTLI_HC_GET_VALUE(table);
60
+ * BROTLI_HC_ADJUST_TABLE_INDEX(table, offset);
61
+ * *bits2 = BROTLI_HC_GET_BITS(table);
62
+ * *value2 = BROTLI_HC_GET_VALUE(table);
63
+ *
64
+ */
65
+
66
+ #define BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(H)
67
+ #define BROTLI_HC_ADJUST_TABLE_INDEX(H, V) H += (V)
68
+
69
+ /* These must be given a HuffmanCode pointer! */
70
+ #define BROTLI_HC_FAST_LOAD_BITS(H) (H->bits)
71
+ #define BROTLI_HC_FAST_LOAD_VALUE(H) (H->value)
72
+
73
+ #else /* BROTLI_HUFFMAN_CODE_FAST_LOAD */
74
+
75
+ typedef BROTLI_ALIGNED(4) uint32_t HuffmanCode;
76
+
77
+ static BROTLI_INLINE HuffmanCode ConstructHuffmanCode(const uint8_t bits,
78
+ const uint16_t value) {
79
+ return (HuffmanCode) ((value & 0xFFFF) << 16) | (bits & 0xFF);
80
+ }
81
+
82
+ #define BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(H) uint32_t __fastload_##H = (*H)
83
+ #define BROTLI_HC_ADJUST_TABLE_INDEX(H, V) H += (V); __fastload_##H = (*H)
84
+
85
+ /* These must be given a HuffmanCode pointer! */
86
+ #define BROTLI_HC_FAST_LOAD_BITS(H) ((__fastload_##H) & 0xFF)
87
+ #define BROTLI_HC_FAST_LOAD_VALUE(H) ((__fastload_##H) >> 16)
88
+ #endif /* BROTLI_HUFFMAN_CODE_FAST_LOAD */
89
+
90
+ /* Builds Huffman lookup table assuming code lengths are in symbol order. */
91
+ BROTLI_INTERNAL void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* root_table,
92
+ const uint8_t* const code_lengths, uint16_t* count);
93
+
94
+ /* Builds Huffman lookup table assuming code lengths are in symbol order.
95
+ Returns size of resulting table. */
96
+ BROTLI_INTERNAL uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
97
+ int root_bits, const uint16_t* const symbol_lists, uint16_t* count);
98
+
99
+ /* Builds a simple Huffman table. The |num_symbols| parameter is to be
100
+ interpreted as follows: 0 means 1 symbol, 1 means 2 symbols,
101
+ 2 means 3 symbols, 3 means 4 symbols with lengths [2, 2, 2, 2],
102
+ 4 means 4 symbols with lengths [1, 2, 3, 3]. */
103
+ BROTLI_INTERNAL uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
104
+ int root_bits, uint16_t* symbols, uint32_t num_symbols);
105
+
106
+ /* Contains a collection of Huffman trees with the same alphabet size. */
107
+ /* alphabet_size_limit is needed due to simple codes, since
108
+ log2(alphabet_size_max) could be greater than log2(alphabet_size_limit). */
109
+ typedef struct {
110
+ HuffmanCode** htrees;
111
+ HuffmanCode* codes;
112
+ uint16_t alphabet_size_max;
113
+ uint16_t alphabet_size_limit;
114
+ uint16_t num_htrees;
115
+ } HuffmanTreeGroup;
116
+
117
+ #if defined(__cplusplus) || defined(c_plusplus)
118
+ } /* extern "C" */
119
+ #endif
120
+
121
+ #endif /* BROTLI_DEC_HUFFMAN_H_ */