brotli 0.2.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +34 -0
  3. data/.github/workflows/publish.yml +34 -0
  4. data/Gemfile +6 -3
  5. data/Rakefile +16 -9
  6. data/brotli.gemspec +7 -13
  7. data/ext/brotli/brotli.c +209 -31
  8. data/ext/brotli/buffer.c +1 -7
  9. data/ext/brotli/buffer.h +1 -1
  10. data/ext/brotli/extconf.rb +20 -18
  11. data/lib/brotli/version.rb +1 -1
  12. data/test/brotli_test.rb +104 -0
  13. data/test/brotli_writer_test.rb +36 -0
  14. data/test/test_helper.rb +8 -0
  15. data/vendor/brotli/c/common/constants.c +15 -0
  16. data/vendor/brotli/c/common/constants.h +136 -0
  17. data/vendor/brotli/c/common/context.c +156 -0
  18. data/vendor/brotli/c/common/context.h +4 -152
  19. data/vendor/brotli/c/common/dictionary.bin.br +0 -0
  20. data/vendor/brotli/c/common/dictionary.c +10 -1
  21. data/vendor/brotli/c/common/platform.c +22 -0
  22. data/vendor/brotli/c/common/platform.h +43 -17
  23. data/vendor/brotli/c/common/transform.c +59 -3
  24. data/vendor/brotli/c/common/transform.h +5 -0
  25. data/vendor/brotli/c/common/version.h +2 -2
  26. data/vendor/brotli/c/dec/bit_reader.c +28 -0
  27. data/vendor/brotli/c/dec/bit_reader.h +58 -16
  28. data/vendor/brotli/c/dec/decode.c +353 -251
  29. data/vendor/brotli/c/dec/huffman.h +6 -12
  30. data/vendor/brotli/c/dec/prefix.h +0 -18
  31. data/vendor/brotli/c/dec/state.c +9 -14
  32. data/vendor/brotli/c/dec/state.h +144 -37
  33. data/vendor/brotli/c/enc/backward_references.c +8 -7
  34. data/vendor/brotli/c/enc/backward_references.h +5 -4
  35. data/vendor/brotli/c/enc/backward_references_hq.c +51 -33
  36. data/vendor/brotli/c/enc/backward_references_hq.h +11 -8
  37. data/vendor/brotli/c/enc/backward_references_inc.h +24 -14
  38. data/vendor/brotli/c/enc/block_splitter.c +3 -3
  39. data/vendor/brotli/c/enc/block_splitter_inc.h +15 -6
  40. data/vendor/brotli/c/enc/brotli_bit_stream.c +13 -30
  41. data/vendor/brotli/c/enc/cluster_inc.h +6 -3
  42. data/vendor/brotli/c/enc/command.c +28 -0
  43. data/vendor/brotli/c/enc/command.h +12 -12
  44. data/vendor/brotli/c/enc/compress_fragment_two_pass.c +1 -1
  45. data/vendor/brotli/c/enc/dictionary_hash.c +1826 -1100
  46. data/vendor/brotli/c/enc/dictionary_hash.h +2 -1
  47. data/vendor/brotli/c/enc/encode.c +104 -39
  48. data/vendor/brotli/c/enc/encoder_dict.c +3 -2
  49. data/vendor/brotli/c/enc/encoder_dict.h +3 -1
  50. data/vendor/brotli/c/enc/entropy_encode.c +2 -0
  51. data/vendor/brotli/c/enc/entropy_encode.h +2 -2
  52. data/vendor/brotli/c/enc/fast_log.c +105 -0
  53. data/vendor/brotli/c/enc/fast_log.h +19 -100
  54. data/vendor/brotli/c/enc/find_match_length.h +2 -3
  55. data/vendor/brotli/c/enc/hash.h +80 -90
  56. data/vendor/brotli/c/enc/hash_composite_inc.h +52 -63
  57. data/vendor/brotli/c/enc/hash_forgetful_chain_inc.h +88 -49
  58. data/vendor/brotli/c/enc/hash_longest_match64_inc.h +50 -50
  59. data/vendor/brotli/c/enc/hash_longest_match_inc.h +53 -50
  60. data/vendor/brotli/c/enc/hash_longest_match_quickly_inc.h +91 -60
  61. data/vendor/brotli/c/enc/hash_rolling_inc.h +23 -27
  62. data/vendor/brotli/c/enc/hash_to_binary_tree_inc.h +39 -38
  63. data/vendor/brotli/c/enc/memory.h +24 -12
  64. data/vendor/brotli/c/enc/metablock.c +23 -27
  65. data/vendor/brotli/c/enc/metablock_inc.h +1 -1
  66. data/vendor/brotli/c/enc/params.h +3 -1
  67. data/vendor/brotli/c/enc/ringbuffer.h +4 -1
  68. data/vendor/brotli/c/enc/utf8_util.c +1 -1
  69. data/vendor/brotli/c/enc/write_bits.h +27 -25
  70. data/vendor/brotli/c/include/brotli/encode.h +22 -1
  71. data/vendor/brotli/c/include/brotli/port.h +14 -0
  72. metadata +17 -97
  73. data/.travis.yml +0 -31
  74. data/docs/Brotli.html +0 -485
  75. data/docs/Brotli/Error.html +0 -124
  76. data/docs/_index.html +0 -122
  77. data/docs/class_list.html +0 -51
  78. data/docs/css/common.css +0 -1
  79. data/docs/css/full_list.css +0 -58
  80. data/docs/css/style.css +0 -496
  81. data/docs/file.README.html +0 -127
  82. data/docs/file_list.html +0 -56
  83. data/docs/frames.html +0 -17
  84. data/docs/index.html +0 -127
  85. data/docs/js/app.js +0 -292
  86. data/docs/js/full_list.js +0 -216
  87. data/docs/js/jquery.js +0 -4
  88. data/docs/method_list.html +0 -67
  89. data/docs/top-level-namespace.html +0 -110
  90. data/spec/brotli_spec.rb +0 -88
  91. data/spec/inflate_spec.rb +0 -75
  92. data/spec/spec_helper.rb +0 -4
@@ -18,6 +18,8 @@
18
18
  extern "C" {
19
19
  #endif
20
20
 
21
+ const size_t kBrotliShellGaps[] = {132, 57, 23, 10, 4, 1};
22
+
21
23
  BROTLI_BOOL BrotliSetDepth(
22
24
  int p0, HuffmanTree* pool, uint8_t* depth, int max_depth) {
23
25
  int stack[16];
@@ -76,12 +76,12 @@ BROTLI_INTERNAL void BrotliConvertBitDepthsToSymbols(const uint8_t* depth,
76
76
  size_t len,
77
77
  uint16_t* bits);
78
78
 
79
+ BROTLI_INTERNAL extern const size_t kBrotliShellGaps[6];
79
80
  /* Input size optimized Shell sort. */
80
81
  typedef BROTLI_BOOL (*HuffmanTreeComparator)(
81
82
  const HuffmanTree*, const HuffmanTree*);
82
83
  static BROTLI_INLINE void SortHuffmanTreeItems(HuffmanTree* items,
83
84
  const size_t n, HuffmanTreeComparator comparator) {
84
- static const size_t gaps[] = {132, 57, 23, 10, 4, 1};
85
85
  if (n < 13) {
86
86
  /* Insertion sort. */
87
87
  size_t i;
@@ -101,7 +101,7 @@ static BROTLI_INLINE void SortHuffmanTreeItems(HuffmanTree* items,
101
101
  /* Shell sort. */
102
102
  int g = n < 57 ? 2 : 0;
103
103
  for (; g < 6; ++g) {
104
- size_t gap = gaps[g];
104
+ size_t gap = kBrotliShellGaps[g];
105
105
  size_t i;
106
106
  for (i = gap; i < n; ++i) {
107
107
  size_t j = i;
@@ -0,0 +1,105 @@
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
+ #include "./fast_log.h"
8
+
9
+ #if defined(__cplusplus) || defined(c_plusplus)
10
+ extern "C" {
11
+ #endif
12
+
13
+ /* ", ".join(["%.16ff" % x for x in [0.0]+[log2(x) for x in range(1, 256)]]) */
14
+ const double kBrotliLog2Table[BROTLI_LOG2_TABLE_SIZE] = {
15
+ 0.0000000000000000f, 0.0000000000000000f, 1.0000000000000000f,
16
+ 1.5849625007211563f, 2.0000000000000000f, 2.3219280948873622f,
17
+ 2.5849625007211561f, 2.8073549220576042f, 3.0000000000000000f,
18
+ 3.1699250014423126f, 3.3219280948873626f, 3.4594316186372978f,
19
+ 3.5849625007211565f, 3.7004397181410922f, 3.8073549220576037f,
20
+ 3.9068905956085187f, 4.0000000000000000f, 4.0874628412503400f,
21
+ 4.1699250014423122f, 4.2479275134435852f, 4.3219280948873626f,
22
+ 4.3923174227787607f, 4.4594316186372973f, 4.5235619560570131f,
23
+ 4.5849625007211570f, 4.6438561897747244f, 4.7004397181410926f,
24
+ 4.7548875021634691f, 4.8073549220576037f, 4.8579809951275728f,
25
+ 4.9068905956085187f, 4.9541963103868758f, 5.0000000000000000f,
26
+ 5.0443941193584534f, 5.0874628412503400f, 5.1292830169449664f,
27
+ 5.1699250014423122f, 5.2094533656289501f, 5.2479275134435852f,
28
+ 5.2854022188622487f, 5.3219280948873626f, 5.3575520046180838f,
29
+ 5.3923174227787607f, 5.4262647547020979f, 5.4594316186372973f,
30
+ 5.4918530963296748f, 5.5235619560570131f, 5.5545888516776376f,
31
+ 5.5849625007211570f, 5.6147098441152083f, 5.6438561897747244f,
32
+ 5.6724253419714961f, 5.7004397181410926f, 5.7279204545631996f,
33
+ 5.7548875021634691f, 5.7813597135246599f, 5.8073549220576046f,
34
+ 5.8328900141647422f, 5.8579809951275719f, 5.8826430493618416f,
35
+ 5.9068905956085187f, 5.9307373375628867f, 5.9541963103868758f,
36
+ 5.9772799234999168f, 6.0000000000000000f, 6.0223678130284544f,
37
+ 6.0443941193584534f, 6.0660891904577721f, 6.0874628412503400f,
38
+ 6.1085244567781700f, 6.1292830169449672f, 6.1497471195046822f,
39
+ 6.1699250014423122f, 6.1898245588800176f, 6.2094533656289510f,
40
+ 6.2288186904958804f, 6.2479275134435861f, 6.2667865406949019f,
41
+ 6.2854022188622487f, 6.3037807481771031f, 6.3219280948873617f,
42
+ 6.3398500028846252f, 6.3575520046180847f, 6.3750394313469254f,
43
+ 6.3923174227787598f, 6.4093909361377026f, 6.4262647547020979f,
44
+ 6.4429434958487288f, 6.4594316186372982f, 6.4757334309663976f,
45
+ 6.4918530963296748f, 6.5077946401986964f, 6.5235619560570131f,
46
+ 6.5391588111080319f, 6.5545888516776376f, 6.5698556083309478f,
47
+ 6.5849625007211561f, 6.5999128421871278f, 6.6147098441152092f,
48
+ 6.6293566200796095f, 6.6438561897747253f, 6.6582114827517955f,
49
+ 6.6724253419714952f, 6.6865005271832185f, 6.7004397181410917f,
50
+ 6.7142455176661224f, 6.7279204545631988f, 6.7414669864011465f,
51
+ 6.7548875021634691f, 6.7681843247769260f, 6.7813597135246599f,
52
+ 6.7944158663501062f, 6.8073549220576037f, 6.8201789624151887f,
53
+ 6.8328900141647422f, 6.8454900509443757f, 6.8579809951275719f,
54
+ 6.8703647195834048f, 6.8826430493618416f, 6.8948177633079437f,
55
+ 6.9068905956085187f, 6.9188632372745955f, 6.9307373375628867f,
56
+ 6.9425145053392399f, 6.9541963103868758f, 6.9657842846620879f,
57
+ 6.9772799234999168f, 6.9886846867721664f, 7.0000000000000000f,
58
+ 7.0112272554232540f, 7.0223678130284544f, 7.0334230015374501f,
59
+ 7.0443941193584534f, 7.0552824355011898f, 7.0660891904577721f,
60
+ 7.0768155970508317f, 7.0874628412503400f, 7.0980320829605272f,
61
+ 7.1085244567781700f, 7.1189410727235076f, 7.1292830169449664f,
62
+ 7.1395513523987937f, 7.1497471195046822f, 7.1598713367783891f,
63
+ 7.1699250014423130f, 7.1799090900149345f, 7.1898245588800176f,
64
+ 7.1996723448363644f, 7.2094533656289492f, 7.2191685204621621f,
65
+ 7.2288186904958804f, 7.2384047393250794f, 7.2479275134435861f,
66
+ 7.2573878426926521f, 7.2667865406949019f, 7.2761244052742384f,
67
+ 7.2854022188622487f, 7.2946207488916270f, 7.3037807481771031f,
68
+ 7.3128829552843557f, 7.3219280948873617f, 7.3309168781146177f,
69
+ 7.3398500028846243f, 7.3487281542310781f, 7.3575520046180847f,
70
+ 7.3663222142458151f, 7.3750394313469254f, 7.3837042924740528f,
71
+ 7.3923174227787607f, 7.4008794362821844f, 7.4093909361377026f,
72
+ 7.4178525148858991f, 7.4262647547020979f, 7.4346282276367255f,
73
+ 7.4429434958487288f, 7.4512111118323299f, 7.4594316186372973f,
74
+ 7.4676055500829976f, 7.4757334309663976f, 7.4838157772642564f,
75
+ 7.4918530963296748f, 7.4998458870832057f, 7.5077946401986964f,
76
+ 7.5156998382840436f, 7.5235619560570131f, 7.5313814605163119f,
77
+ 7.5391588111080319f, 7.5468944598876373f, 7.5545888516776376f,
78
+ 7.5622424242210728f, 7.5698556083309478f, 7.5774288280357487f,
79
+ 7.5849625007211561f, 7.5924570372680806f, 7.5999128421871278f,
80
+ 7.6073303137496113f, 7.6147098441152075f, 7.6220518194563764f,
81
+ 7.6293566200796095f, 7.6366246205436488f, 7.6438561897747244f,
82
+ 7.6510516911789290f, 7.6582114827517955f, 7.6653359171851765f,
83
+ 7.6724253419714952f, 7.6794800995054464f, 7.6865005271832185f,
84
+ 7.6934869574993252f, 7.7004397181410926f, 7.7073591320808825f,
85
+ 7.7142455176661224f, 7.7210991887071856f, 7.7279204545631996f,
86
+ 7.7347096202258392f, 7.7414669864011465f, 7.7481928495894596f,
87
+ 7.7548875021634691f, 7.7615512324444795f, 7.7681843247769260f,
88
+ 7.7747870596011737f, 7.7813597135246608f, 7.7879025593914317f,
89
+ 7.7944158663501062f, 7.8008998999203047f, 7.8073549220576037f,
90
+ 7.8137811912170374f, 7.8201789624151887f, 7.8265484872909159f,
91
+ 7.8328900141647422f, 7.8392037880969445f, 7.8454900509443757f,
92
+ 7.8517490414160571f, 7.8579809951275719f, 7.8641861446542798f,
93
+ 7.8703647195834048f, 7.8765169465650002f, 7.8826430493618425f,
94
+ 7.8887432488982601f, 7.8948177633079446f, 7.9008668079807496f,
95
+ 7.9068905956085187f, 7.9128893362299619f, 7.9188632372745955f,
96
+ 7.9248125036057813f, 7.9307373375628867f, 7.9366379390025719f,
97
+ 7.9425145053392399f, 7.9483672315846778f, 7.9541963103868758f,
98
+ 7.9600019320680806f, 7.9657842846620870f, 7.9715435539507720f,
99
+ 7.9772799234999168f, 7.9829935746943104f, 7.9886846867721664f,
100
+ 7.9943534368588578f
101
+ };
102
+
103
+ #if defined(__cplusplus) || defined(c_plusplus)
104
+ } /* extern "C" */
105
+ #endif
@@ -19,10 +19,8 @@ extern "C" {
19
19
  #endif
20
20
 
21
21
  static BROTLI_INLINE uint32_t Log2FloorNonZero(size_t n) {
22
- /* TODO: generalize and move to platform.h */
23
- #if BROTLI_GNUC_HAS_BUILTIN(__builtin_clz, 3, 4, 0) || \
24
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
25
- return 31u ^ (uint32_t)__builtin_clz((uint32_t)n);
22
+ #if defined(BROTLI_BSR32)
23
+ return BROTLI_BSR32((uint32_t)n);
26
24
  #else
27
25
  uint32_t result = 0;
28
26
  while (n >>= 1) result++;
@@ -30,110 +28,31 @@ static BROTLI_INLINE uint32_t Log2FloorNonZero(size_t n) {
30
28
  #endif
31
29
  }
32
30
 
31
+ #define BROTLI_LOG2_TABLE_SIZE 256
32
+
33
33
  /* A lookup table for small values of log2(int) to be used in entropy
34
- computation.
34
+ computation. */
35
+ BROTLI_INTERNAL extern const double kBrotliLog2Table[BROTLI_LOG2_TABLE_SIZE];
35
36
 
36
- ", ".join(["%.16ff" % x for x in [0.0]+[log2(x) for x in range(1, 256)]]) */
37
- static const float kLog2Table[] = {
38
- 0.0000000000000000f, 0.0000000000000000f, 1.0000000000000000f,
39
- 1.5849625007211563f, 2.0000000000000000f, 2.3219280948873622f,
40
- 2.5849625007211561f, 2.8073549220576042f, 3.0000000000000000f,
41
- 3.1699250014423126f, 3.3219280948873626f, 3.4594316186372978f,
42
- 3.5849625007211565f, 3.7004397181410922f, 3.8073549220576037f,
43
- 3.9068905956085187f, 4.0000000000000000f, 4.0874628412503400f,
44
- 4.1699250014423122f, 4.2479275134435852f, 4.3219280948873626f,
45
- 4.3923174227787607f, 4.4594316186372973f, 4.5235619560570131f,
46
- 4.5849625007211570f, 4.6438561897747244f, 4.7004397181410926f,
47
- 4.7548875021634691f, 4.8073549220576037f, 4.8579809951275728f,
48
- 4.9068905956085187f, 4.9541963103868758f, 5.0000000000000000f,
49
- 5.0443941193584534f, 5.0874628412503400f, 5.1292830169449664f,
50
- 5.1699250014423122f, 5.2094533656289501f, 5.2479275134435852f,
51
- 5.2854022188622487f, 5.3219280948873626f, 5.3575520046180838f,
52
- 5.3923174227787607f, 5.4262647547020979f, 5.4594316186372973f,
53
- 5.4918530963296748f, 5.5235619560570131f, 5.5545888516776376f,
54
- 5.5849625007211570f, 5.6147098441152083f, 5.6438561897747244f,
55
- 5.6724253419714961f, 5.7004397181410926f, 5.7279204545631996f,
56
- 5.7548875021634691f, 5.7813597135246599f, 5.8073549220576046f,
57
- 5.8328900141647422f, 5.8579809951275719f, 5.8826430493618416f,
58
- 5.9068905956085187f, 5.9307373375628867f, 5.9541963103868758f,
59
- 5.9772799234999168f, 6.0000000000000000f, 6.0223678130284544f,
60
- 6.0443941193584534f, 6.0660891904577721f, 6.0874628412503400f,
61
- 6.1085244567781700f, 6.1292830169449672f, 6.1497471195046822f,
62
- 6.1699250014423122f, 6.1898245588800176f, 6.2094533656289510f,
63
- 6.2288186904958804f, 6.2479275134435861f, 6.2667865406949019f,
64
- 6.2854022188622487f, 6.3037807481771031f, 6.3219280948873617f,
65
- 6.3398500028846252f, 6.3575520046180847f, 6.3750394313469254f,
66
- 6.3923174227787598f, 6.4093909361377026f, 6.4262647547020979f,
67
- 6.4429434958487288f, 6.4594316186372982f, 6.4757334309663976f,
68
- 6.4918530963296748f, 6.5077946401986964f, 6.5235619560570131f,
69
- 6.5391588111080319f, 6.5545888516776376f, 6.5698556083309478f,
70
- 6.5849625007211561f, 6.5999128421871278f, 6.6147098441152092f,
71
- 6.6293566200796095f, 6.6438561897747253f, 6.6582114827517955f,
72
- 6.6724253419714952f, 6.6865005271832185f, 6.7004397181410917f,
73
- 6.7142455176661224f, 6.7279204545631988f, 6.7414669864011465f,
74
- 6.7548875021634691f, 6.7681843247769260f, 6.7813597135246599f,
75
- 6.7944158663501062f, 6.8073549220576037f, 6.8201789624151887f,
76
- 6.8328900141647422f, 6.8454900509443757f, 6.8579809951275719f,
77
- 6.8703647195834048f, 6.8826430493618416f, 6.8948177633079437f,
78
- 6.9068905956085187f, 6.9188632372745955f, 6.9307373375628867f,
79
- 6.9425145053392399f, 6.9541963103868758f, 6.9657842846620879f,
80
- 6.9772799234999168f, 6.9886846867721664f, 7.0000000000000000f,
81
- 7.0112272554232540f, 7.0223678130284544f, 7.0334230015374501f,
82
- 7.0443941193584534f, 7.0552824355011898f, 7.0660891904577721f,
83
- 7.0768155970508317f, 7.0874628412503400f, 7.0980320829605272f,
84
- 7.1085244567781700f, 7.1189410727235076f, 7.1292830169449664f,
85
- 7.1395513523987937f, 7.1497471195046822f, 7.1598713367783891f,
86
- 7.1699250014423130f, 7.1799090900149345f, 7.1898245588800176f,
87
- 7.1996723448363644f, 7.2094533656289492f, 7.2191685204621621f,
88
- 7.2288186904958804f, 7.2384047393250794f, 7.2479275134435861f,
89
- 7.2573878426926521f, 7.2667865406949019f, 7.2761244052742384f,
90
- 7.2854022188622487f, 7.2946207488916270f, 7.3037807481771031f,
91
- 7.3128829552843557f, 7.3219280948873617f, 7.3309168781146177f,
92
- 7.3398500028846243f, 7.3487281542310781f, 7.3575520046180847f,
93
- 7.3663222142458151f, 7.3750394313469254f, 7.3837042924740528f,
94
- 7.3923174227787607f, 7.4008794362821844f, 7.4093909361377026f,
95
- 7.4178525148858991f, 7.4262647547020979f, 7.4346282276367255f,
96
- 7.4429434958487288f, 7.4512111118323299f, 7.4594316186372973f,
97
- 7.4676055500829976f, 7.4757334309663976f, 7.4838157772642564f,
98
- 7.4918530963296748f, 7.4998458870832057f, 7.5077946401986964f,
99
- 7.5156998382840436f, 7.5235619560570131f, 7.5313814605163119f,
100
- 7.5391588111080319f, 7.5468944598876373f, 7.5545888516776376f,
101
- 7.5622424242210728f, 7.5698556083309478f, 7.5774288280357487f,
102
- 7.5849625007211561f, 7.5924570372680806f, 7.5999128421871278f,
103
- 7.6073303137496113f, 7.6147098441152075f, 7.6220518194563764f,
104
- 7.6293566200796095f, 7.6366246205436488f, 7.6438561897747244f,
105
- 7.6510516911789290f, 7.6582114827517955f, 7.6653359171851765f,
106
- 7.6724253419714952f, 7.6794800995054464f, 7.6865005271832185f,
107
- 7.6934869574993252f, 7.7004397181410926f, 7.7073591320808825f,
108
- 7.7142455176661224f, 7.7210991887071856f, 7.7279204545631996f,
109
- 7.7347096202258392f, 7.7414669864011465f, 7.7481928495894596f,
110
- 7.7548875021634691f, 7.7615512324444795f, 7.7681843247769260f,
111
- 7.7747870596011737f, 7.7813597135246608f, 7.7879025593914317f,
112
- 7.7944158663501062f, 7.8008998999203047f, 7.8073549220576037f,
113
- 7.8137811912170374f, 7.8201789624151887f, 7.8265484872909159f,
114
- 7.8328900141647422f, 7.8392037880969445f, 7.8454900509443757f,
115
- 7.8517490414160571f, 7.8579809951275719f, 7.8641861446542798f,
116
- 7.8703647195834048f, 7.8765169465650002f, 7.8826430493618425f,
117
- 7.8887432488982601f, 7.8948177633079446f, 7.9008668079807496f,
118
- 7.9068905956085187f, 7.9128893362299619f, 7.9188632372745955f,
119
- 7.9248125036057813f, 7.9307373375628867f, 7.9366379390025719f,
120
- 7.9425145053392399f, 7.9483672315846778f, 7.9541963103868758f,
121
- 7.9600019320680806f, 7.9657842846620870f, 7.9715435539507720f,
122
- 7.9772799234999168f, 7.9829935746943104f, 7.9886846867721664f,
123
- 7.9943534368588578f
124
- };
37
+ /* Visual Studio 2012 and Android API levels < 18 do not have the log2()
38
+ * function defined, so we use log() and a multiplication instead. */
39
+ #if !defined(BROTLI_HAVE_LOG2)
40
+ #if ((defined(_MSC_VER) && _MSC_VER <= 1700) || \
41
+ (defined(__ANDROID_API__) && __ANDROID_API__ < 18))
42
+ #define BROTLI_HAVE_LOG2 0
43
+ #else
44
+ #define BROTLI_HAVE_LOG2 1
45
+ #endif
46
+ #endif
125
47
 
126
48
  #define LOG_2_INV 1.4426950408889634
127
49
 
128
50
  /* Faster logarithm for small integers, with the property of log2(0) == 0. */
129
51
  static BROTLI_INLINE double FastLog2(size_t v) {
130
- if (v < sizeof(kLog2Table) / sizeof(kLog2Table[0])) {
131
- return kLog2Table[v];
52
+ if (v < BROTLI_LOG2_TABLE_SIZE) {
53
+ return kBrotliLog2Table[v];
132
54
  }
133
- #if (defined(_MSC_VER) && _MSC_VER <= 1700) || \
134
- (defined(__ANDROID_API__) && __ANDROID_API__ < 18)
135
- /* Visual Studio 2012 and Android API levels < 18 do not have the log2()
136
- * function defined, so we use log() and a multiplication instead. */
55
+ #if !(BROTLI_HAVE_LOG2)
137
56
  return log((double)v) * LOG_2_INV;
138
57
  #else
139
58
  return log2((double)v);
@@ -17,8 +17,7 @@ extern "C" {
17
17
  #endif
18
18
 
19
19
  /* Separate implementation for little-endian 64-bit targets, for speed. */
20
- #if defined(__GNUC__) && defined(_LP64) && defined(BROTLI_LITTLE_ENDIAN)
21
-
20
+ #if defined(BROTLI_TZCNT64) && BROTLI_64_BITS && BROTLI_LITTLE_ENDIAN
22
21
  static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,
23
22
  const uint8_t* s2,
24
23
  size_t limit) {
@@ -32,7 +31,7 @@ static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,
32
31
  } else {
33
32
  uint64_t x = BROTLI_UNALIGNED_LOAD64LE(s2) ^
34
33
  BROTLI_UNALIGNED_LOAD64LE(s1 + matched);
35
- size_t matching_bits = (size_t)__builtin_ctzll(x);
34
+ size_t matching_bits = (size_t)BROTLI_TZCNT64(x);
36
35
  matched += matching_bits >> 3;
37
36
  return matched;
38
37
  }
@@ -27,34 +27,19 @@
27
27
  extern "C" {
28
28
  #endif
29
29
 
30
- /* Pointer to hasher data.
31
- *
32
- * Excluding initialization and destruction, hasher can be passed as
33
- * HasherHandle by value.
34
- *
35
- * Typically hasher data consists of 3 sections:
36
- * * HasherCommon structure
37
- * * private structured hasher data, depending on hasher type
38
- * * private dynamic hasher data, depending on hasher type and parameters
39
- *
40
- * Using "define" instead of "typedef", because on MSVC __restrict does not work
41
- * on typedef pointer types. */
42
- #define HasherHandle uint8_t*
43
-
44
30
  typedef struct {
31
+ /* Dynamically allocated area; first member for quickest access. */
32
+ void* extra;
33
+
34
+ size_t dict_num_lookups;
35
+ size_t dict_num_matches;
36
+
45
37
  BrotliHasherParams params;
46
38
 
47
39
  /* False if hasher needs to be "prepared" before use. */
48
40
  BROTLI_BOOL is_prepared_;
49
-
50
- size_t dict_num_lookups;
51
- size_t dict_num_matches;
52
41
  } HasherCommon;
53
42
 
54
- static BROTLI_INLINE HasherCommon* GetHasherCommon(HasherHandle handle) {
55
- return (HasherCommon*)handle;
56
- }
57
-
58
43
  #define score_t size_t
59
44
 
60
45
  static const uint32_t kCutoffTransformsCount = 10;
@@ -149,17 +134,13 @@ static BROTLI_INLINE score_t BackwardReferencePenaltyUsingLastDistance(
149
134
  }
150
135
 
151
136
  static BROTLI_INLINE BROTLI_BOOL TestStaticDictionaryItem(
152
- const BrotliEncoderDictionary* dictionary, size_t item,
137
+ const BrotliEncoderDictionary* dictionary, size_t len, size_t word_idx,
153
138
  const uint8_t* data, size_t max_length, size_t max_backward,
154
139
  size_t max_distance, HasherSearchResult* out) {
155
- size_t len;
156
- size_t word_idx;
157
140
  size_t offset;
158
141
  size_t matchlen;
159
142
  size_t backward;
160
143
  score_t score;
161
- len = item & 0x1F;
162
- word_idx = item >> 5;
163
144
  offset = dictionary->words->offsets_by_length[len] + len * word_idx;
164
145
  if (len > max_length) {
165
146
  return BROTLI_FALSE;
@@ -193,25 +174,24 @@ static BROTLI_INLINE BROTLI_BOOL TestStaticDictionaryItem(
193
174
 
194
175
  static BROTLI_INLINE void SearchInStaticDictionary(
195
176
  const BrotliEncoderDictionary* dictionary,
196
- HasherHandle handle, const uint8_t* data, size_t max_length,
177
+ HasherCommon* common, const uint8_t* data, size_t max_length,
197
178
  size_t max_backward, size_t max_distance,
198
179
  HasherSearchResult* out, BROTLI_BOOL shallow) {
199
180
  size_t key;
200
181
  size_t i;
201
- HasherCommon* self = GetHasherCommon(handle);
202
- if (self->dict_num_matches < (self->dict_num_lookups >> 7)) {
182
+ if (common->dict_num_matches < (common->dict_num_lookups >> 7)) {
203
183
  return;
204
184
  }
205
185
  key = Hash14(data) << 1;
206
186
  for (i = 0; i < (shallow ? 1u : 2u); ++i, ++key) {
207
- size_t item = dictionary->hash_table[key];
208
- self->dict_num_lookups++;
209
- if (item != 0) {
187
+ common->dict_num_lookups++;
188
+ if (dictionary->hash_table_lengths[key] != 0) {
210
189
  BROTLI_BOOL item_matches = TestStaticDictionaryItem(
211
- dictionary, item, data,
190
+ dictionary, dictionary->hash_table_lengths[key],
191
+ dictionary->hash_table_words[key], data,
212
192
  max_length, max_backward, max_distance, out);
213
193
  if (item_matches) {
214
- self->dict_num_matches++;
194
+ common->dict_num_matches++;
215
195
  }
216
196
  }
217
197
  }
@@ -260,37 +240,37 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
260
240
  /* MAX_NUM_MATCHES == 64 + MAX_TREE_SEARCH_DEPTH */
261
241
  #define MAX_NUM_MATCHES_H10 128
262
242
 
263
- /* For BUCKET_SWEEP == 1, enabling the dictionary lookup makes compression
243
+ /* For BUCKET_SWEEP_BITS == 0, enabling the dictionary lookup makes compression
264
244
  a little faster (0.5% - 1%) and it compresses 0.15% better on small text
265
245
  and HTML inputs. */
266
246
 
267
247
  #define HASHER() H2
268
248
  #define BUCKET_BITS 16
269
- #define BUCKET_SWEEP 1
249
+ #define BUCKET_SWEEP_BITS 0
270
250
  #define HASH_LEN 5
271
251
  #define USE_DICTIONARY 1
272
252
  #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
273
- #undef BUCKET_SWEEP
253
+ #undef BUCKET_SWEEP_BITS
274
254
  #undef USE_DICTIONARY
275
255
  #undef HASHER
276
256
 
277
257
  #define HASHER() H3
278
- #define BUCKET_SWEEP 2
258
+ #define BUCKET_SWEEP_BITS 1
279
259
  #define USE_DICTIONARY 0
280
260
  #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
281
261
  #undef USE_DICTIONARY
282
- #undef BUCKET_SWEEP
262
+ #undef BUCKET_SWEEP_BITS
283
263
  #undef BUCKET_BITS
284
264
  #undef HASHER
285
265
 
286
266
  #define HASHER() H4
287
267
  #define BUCKET_BITS 17
288
- #define BUCKET_SWEEP 4
268
+ #define BUCKET_SWEEP_BITS 2
289
269
  #define USE_DICTIONARY 1
290
270
  #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
291
271
  #undef USE_DICTIONARY
292
272
  #undef HASH_LEN
293
- #undef BUCKET_SWEEP
273
+ #undef BUCKET_SWEEP_BITS
294
274
  #undef BUCKET_BITS
295
275
  #undef HASHER
296
276
 
@@ -334,13 +314,13 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
334
314
 
335
315
  #define HASHER() H54
336
316
  #define BUCKET_BITS 20
337
- #define BUCKET_SWEEP 4
317
+ #define BUCKET_SWEEP_BITS 2
338
318
  #define HASH_LEN 7
339
319
  #define USE_DICTIONARY 0
340
320
  #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
341
321
  #undef USE_DICTIONARY
342
322
  #undef HASH_LEN
343
- #undef BUCKET_SWEEP
323
+ #undef BUCKET_SWEEP_BITS
344
324
  #undef BUCKET_BITS
345
325
  #undef HASHER
346
326
 
@@ -393,97 +373,107 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
393
373
  #undef CAT
394
374
  #undef EXPAND_CAT
395
375
 
396
- #define FOR_GENERIC_HASHERS(H) H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54)\
397
- H(35) H(55) H(65)
376
+ #define FOR_SIMPLE_HASHERS(H) H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54)
377
+ #define FOR_COMPOSITE_HASHERS(H) H(35) H(55) H(65)
378
+ #define FOR_GENERIC_HASHERS(H) FOR_SIMPLE_HASHERS(H) FOR_COMPOSITE_HASHERS(H)
398
379
  #define FOR_ALL_HASHERS(H) FOR_GENERIC_HASHERS(H) H(10)
399
380
 
400
- static BROTLI_INLINE void DestroyHasher(
401
- MemoryManager* m, HasherHandle* handle) {
402
- if (*handle == NULL) return;
403
- BROTLI_FREE(m, *handle);
381
+ typedef struct {
382
+ HasherCommon common;
383
+
384
+ union {
385
+ #define MEMBER_(N) \
386
+ H ## N _H ## N;
387
+ FOR_ALL_HASHERS(MEMBER_)
388
+ #undef MEMBER_
389
+ } privat;
390
+ } Hasher;
391
+
392
+ /* MUST be invoked before any other method. */
393
+ static BROTLI_INLINE void HasherInit(Hasher* hasher) {
394
+ hasher->common.extra = NULL;
404
395
  }
405
396
 
406
- static BROTLI_INLINE void HasherReset(HasherHandle handle) {
407
- if (handle == NULL) return;
408
- GetHasherCommon(handle)->is_prepared_ = BROTLI_FALSE;
397
+ static BROTLI_INLINE void DestroyHasher(MemoryManager* m, Hasher* hasher) {
398
+ if (hasher->common.extra == NULL) return;
399
+ BROTLI_FREE(m, hasher->common.extra);
400
+ }
401
+
402
+ static BROTLI_INLINE void HasherReset(Hasher* hasher) {
403
+ hasher->common.is_prepared_ = BROTLI_FALSE;
409
404
  }
410
405
 
411
406
  static BROTLI_INLINE size_t HasherSize(const BrotliEncoderParams* params,
412
407
  BROTLI_BOOL one_shot, const size_t input_size) {
413
- size_t result = sizeof(HasherCommon);
414
408
  switch (params->hasher.type) {
415
- #define SIZE_(N) \
416
- case N: \
417
- result += HashMemAllocInBytesH ## N(params, one_shot, input_size); \
418
- break;
409
+ #define SIZE_(N) \
410
+ case N: \
411
+ return HashMemAllocInBytesH ## N(params, one_shot, input_size);
419
412
  FOR_ALL_HASHERS(SIZE_)
420
413
  #undef SIZE_
421
414
  default:
422
415
  break;
423
416
  }
424
- return result;
417
+ return 0; /* Default case. */
425
418
  }
426
419
 
427
- static BROTLI_INLINE void HasherSetup(MemoryManager* m, HasherHandle* handle,
420
+ static BROTLI_INLINE void HasherSetup(MemoryManager* m, Hasher* hasher,
428
421
  BrotliEncoderParams* params, const uint8_t* data, size_t position,
429
422
  size_t input_size, BROTLI_BOOL is_last) {
430
- HasherHandle self = NULL;
431
- HasherCommon* common = NULL;
432
423
  BROTLI_BOOL one_shot = (position == 0 && is_last);
433
- if (*handle == NULL) {
424
+ if (hasher->common.extra == NULL) {
434
425
  size_t alloc_size;
435
426
  ChooseHasher(params, &params->hasher);
436
427
  alloc_size = HasherSize(params, one_shot, input_size);
437
- self = BROTLI_ALLOC(m, uint8_t, alloc_size);
438
- if (BROTLI_IS_OOM(m)) return;
439
- *handle = self;
440
- common = GetHasherCommon(self);
441
- common->params = params->hasher;
442
- switch (common->params.type) {
443
- #define INITIALIZE_(N) \
444
- case N: \
445
- InitializeH ## N(*handle, params); \
428
+ hasher->common.extra = BROTLI_ALLOC(m, uint8_t, alloc_size);
429
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(hasher->common.extra)) return;
430
+ hasher->common.params = params->hasher;
431
+ switch (hasher->common.params.type) {
432
+ #define INITIALIZE_(N) \
433
+ case N: \
434
+ InitializeH ## N(&hasher->common, \
435
+ &hasher->privat._H ## N, params); \
446
436
  break;
447
437
  FOR_ALL_HASHERS(INITIALIZE_);
448
438
  #undef INITIALIZE_
449
439
  default:
450
440
  break;
451
441
  }
452
- HasherReset(*handle);
442
+ HasherReset(hasher);
453
443
  }
454
444
 
455
- self = *handle;
456
- common = GetHasherCommon(self);
457
- if (!common->is_prepared_) {
458
- switch (common->params.type) {
459
- #define PREPARE_(N) \
460
- case N: \
461
- PrepareH ## N(self, one_shot, input_size, data); \
445
+ if (!hasher->common.is_prepared_) {
446
+ switch (hasher->common.params.type) {
447
+ #define PREPARE_(N) \
448
+ case N: \
449
+ PrepareH ## N( \
450
+ &hasher->privat._H ## N, \
451
+ one_shot, input_size, data); \
462
452
  break;
463
453
  FOR_ALL_HASHERS(PREPARE_)
464
454
  #undef PREPARE_
465
455
  default: break;
466
456
  }
467
457
  if (position == 0) {
468
- common->dict_num_lookups = 0;
469
- common->dict_num_matches = 0;
458
+ hasher->common.dict_num_lookups = 0;
459
+ hasher->common.dict_num_matches = 0;
470
460
  }
471
- common->is_prepared_ = BROTLI_TRUE;
461
+ hasher->common.is_prepared_ = BROTLI_TRUE;
472
462
  }
473
463
  }
474
464
 
475
465
  static BROTLI_INLINE void InitOrStitchToPreviousBlock(
476
- MemoryManager* m, HasherHandle* handle, const uint8_t* data, size_t mask,
466
+ MemoryManager* m, Hasher* hasher, const uint8_t* data, size_t mask,
477
467
  BrotliEncoderParams* params, size_t position, size_t input_size,
478
468
  BROTLI_BOOL is_last) {
479
- HasherHandle self;
480
- HasherSetup(m, handle, params, data, position, input_size, is_last);
469
+ HasherSetup(m, hasher, params, data, position, input_size, is_last);
481
470
  if (BROTLI_IS_OOM(m)) return;
482
- self = *handle;
483
- switch (GetHasherCommon(self)->params.type) {
484
- #define INIT_(N) \
485
- case N: \
486
- StitchToPreviousBlockH ## N(self, input_size, position, data, mask); \
471
+ switch (hasher->common.params.type) {
472
+ #define INIT_(N) \
473
+ case N: \
474
+ StitchToPreviousBlockH ## N( \
475
+ &hasher->privat._H ## N, \
476
+ input_size, position, data, mask); \
487
477
  break;
488
478
  FOR_ALL_HASHERS(INIT_)
489
479
  #undef INIT_