isomorfeus-ferret 0.12.6 → 0.12.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -4
  3. data/ext/isomorfeus_ferret_ext/brotli_common_constants.c +15 -0
  4. data/ext/isomorfeus_ferret_ext/brotli_common_constants.h +200 -0
  5. data/ext/isomorfeus_ferret_ext/brotli_common_context.c +156 -0
  6. data/ext/isomorfeus_ferret_ext/brotli_common_context.h +113 -0
  7. data/ext/isomorfeus_ferret_ext/brotli_common_dictionary.c +5914 -0
  8. data/ext/isomorfeus_ferret_ext/brotli_common_dictionary.h +64 -0
  9. data/ext/isomorfeus_ferret_ext/brotli_common_platform.c +22 -0
  10. data/ext/isomorfeus_ferret_ext/brotli_common_platform.h +594 -0
  11. data/ext/isomorfeus_ferret_ext/brotli_common_transform.c +291 -0
  12. data/ext/isomorfeus_ferret_ext/brotli_common_transform.h +85 -0
  13. data/ext/isomorfeus_ferret_ext/brotli_common_version.h +26 -0
  14. data/ext/isomorfeus_ferret_ext/brotli_dec_bit_reader.c +76 -0
  15. data/ext/isomorfeus_ferret_ext/brotli_dec_bit_reader.h +351 -0
  16. data/ext/isomorfeus_ferret_ext/brotli_dec_decode.c +2608 -0
  17. data/ext/isomorfeus_ferret_ext/brotli_dec_huffman.c +339 -0
  18. data/ext/isomorfeus_ferret_ext/brotli_dec_huffman.h +121 -0
  19. data/ext/isomorfeus_ferret_ext/brotli_dec_prefix.h +732 -0
  20. data/ext/isomorfeus_ferret_ext/brotli_dec_state.c +159 -0
  21. data/ext/isomorfeus_ferret_ext/brotli_dec_state.h +365 -0
  22. data/ext/isomorfeus_ferret_ext/brotli_decode.h +344 -0
  23. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references.c +145 -0
  24. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references.h +39 -0
  25. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_hq.c +843 -0
  26. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_hq.h +95 -0
  27. data/ext/isomorfeus_ferret_ext/brotli_enc_backward_references_inc.h +163 -0
  28. data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost.c +35 -0
  29. data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost.h +63 -0
  30. data/ext/isomorfeus_ferret_ext/brotli_enc_bit_cost_inc.h +127 -0
  31. data/ext/isomorfeus_ferret_ext/brotli_enc_block_encoder_inc.h +34 -0
  32. data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter.c +194 -0
  33. data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter.h +51 -0
  34. data/ext/isomorfeus_ferret_ext/brotli_enc_block_splitter_inc.h +440 -0
  35. data/ext/isomorfeus_ferret_ext/brotli_enc_brotli_bit_stream.c +1314 -0
  36. data/ext/isomorfeus_ferret_ext/brotli_enc_brotli_bit_stream.h +84 -0
  37. data/ext/isomorfeus_ferret_ext/brotli_enc_cluster.c +56 -0
  38. data/ext/isomorfeus_ferret_ext/brotli_enc_cluster.h +48 -0
  39. data/ext/isomorfeus_ferret_ext/brotli_enc_cluster_inc.h +320 -0
  40. data/ext/isomorfeus_ferret_ext/brotli_enc_command.c +28 -0
  41. data/ext/isomorfeus_ferret_ext/brotli_enc_command.h +190 -0
  42. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment.c +790 -0
  43. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment.h +61 -0
  44. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment_two_pass.c +645 -0
  45. data/ext/isomorfeus_ferret_ext/brotli_enc_compress_fragment_two_pass.h +54 -0
  46. data/ext/isomorfeus_ferret_ext/brotli_enc_dictionary_hash.c +1846 -0
  47. data/ext/isomorfeus_ferret_ext/brotli_enc_dictionary_hash.h +25 -0
  48. data/ext/isomorfeus_ferret_ext/brotli_enc_encode.c +1927 -0
  49. data/ext/isomorfeus_ferret_ext/brotli_enc_encoder_dict.c +33 -0
  50. data/ext/isomorfeus_ferret_ext/brotli_enc_encoder_dict.h +43 -0
  51. data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode.c +503 -0
  52. data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode.h +122 -0
  53. data/ext/isomorfeus_ferret_ext/brotli_enc_entropy_encode_static.h +539 -0
  54. data/ext/isomorfeus_ferret_ext/brotli_enc_fast_log.c +105 -0
  55. data/ext/isomorfeus_ferret_ext/brotli_enc_fast_log.h +66 -0
  56. data/ext/isomorfeus_ferret_ext/brotli_enc_find_match_length.h +79 -0
  57. data/ext/isomorfeus_ferret_ext/brotli_enc_hash.h +488 -0
  58. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_composite_inc.h +125 -0
  59. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_forgetful_chain_inc.h +293 -0
  60. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match64_inc.h +267 -0
  61. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match_inc.h +262 -0
  62. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_longest_match_quickly_inc.h +266 -0
  63. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_rolling_inc.h +212 -0
  64. data/ext/isomorfeus_ferret_ext/brotli_enc_hash_to_binary_tree_inc.h +329 -0
  65. data/ext/isomorfeus_ferret_ext/brotli_enc_histogram.c +100 -0
  66. data/ext/isomorfeus_ferret_ext/brotli_enc_histogram.h +63 -0
  67. data/ext/isomorfeus_ferret_ext/brotli_enc_histogram_inc.h +51 -0
  68. data/ext/isomorfeus_ferret_ext/brotli_enc_literal_cost.c +175 -0
  69. data/ext/isomorfeus_ferret_ext/brotli_enc_literal_cost.h +30 -0
  70. data/ext/isomorfeus_ferret_ext/brotli_enc_memory.c +170 -0
  71. data/ext/isomorfeus_ferret_ext/brotli_enc_memory.h +114 -0
  72. data/ext/isomorfeus_ferret_ext/brotli_enc_metablock.c +663 -0
  73. data/ext/isomorfeus_ferret_ext/brotli_enc_metablock.h +105 -0
  74. data/ext/isomorfeus_ferret_ext/brotli_enc_metablock_inc.h +183 -0
  75. data/ext/isomorfeus_ferret_ext/brotli_enc_params.h +46 -0
  76. data/ext/isomorfeus_ferret_ext/brotli_enc_prefix.h +53 -0
  77. data/ext/isomorfeus_ferret_ext/brotli_enc_quality.h +165 -0
  78. data/ext/isomorfeus_ferret_ext/brotli_enc_ringbuffer.h +167 -0
  79. data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict.c +486 -0
  80. data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict.h +40 -0
  81. data/ext/isomorfeus_ferret_ext/brotli_enc_static_dict_lut.h +5864 -0
  82. data/ext/isomorfeus_ferret_ext/brotli_enc_utf8_util.c +85 -0
  83. data/ext/isomorfeus_ferret_ext/brotli_enc_utf8_util.h +32 -0
  84. data/ext/isomorfeus_ferret_ext/brotli_enc_write_bits.h +87 -0
  85. data/ext/isomorfeus_ferret_ext/brotli_encode.h +448 -0
  86. data/ext/isomorfeus_ferret_ext/brotli_port.h +288 -0
  87. data/ext/isomorfeus_ferret_ext/brotli_types.h +83 -0
  88. data/ext/isomorfeus_ferret_ext/frb_index.c +35 -4
  89. data/ext/isomorfeus_ferret_ext/frt_document.h +1 -0
  90. data/ext/isomorfeus_ferret_ext/frt_fs_store.c +1 -0
  91. data/ext/isomorfeus_ferret_ext/frt_index.c +174 -25
  92. data/ext/isomorfeus_ferret_ext/frt_index.h +6 -3
  93. data/ext/isomorfeus_ferret_ext/frt_ram_store.c +1 -0
  94. data/ext/isomorfeus_ferret_ext/test_fields.c +57 -45
  95. data/ext/isomorfeus_ferret_ext/test_index.c +4 -1
  96. data/lib/isomorfeus/ferret/version.rb +1 -1
  97. metadata +88 -3
@@ -0,0 +1,159 @@
1
+ /* Copyright 2015 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 "brotli_dec_state.h"
8
+
9
+ #include <stdlib.h> /* free, malloc */
10
+
11
+ #include "brotli_types.h"
12
+ #include "brotli_dec_huffman.h"
13
+
14
+ #if defined(__cplusplus) || defined(c_plusplus)
15
+ extern "C" {
16
+ #endif
17
+
18
+ BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
19
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
20
+ if (!alloc_func) {
21
+ s->alloc_func = BrotliDefaultAllocFunc;
22
+ s->free_func = BrotliDefaultFreeFunc;
23
+ s->memory_manager_opaque = 0;
24
+ } else {
25
+ s->alloc_func = alloc_func;
26
+ s->free_func = free_func;
27
+ s->memory_manager_opaque = opaque;
28
+ }
29
+
30
+ s->error_code = 0; /* BROTLI_DECODER_NO_ERROR */
31
+
32
+ BrotliInitBitReader(&s->br);
33
+ s->state = BROTLI_STATE_UNINITED;
34
+ s->large_window = 0;
35
+ s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
36
+ s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
37
+ s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
38
+ s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
39
+
40
+ s->buffer_length = 0;
41
+ s->loop_counter = 0;
42
+ s->pos = 0;
43
+ s->rb_roundtrips = 0;
44
+ s->partial_pos_out = 0;
45
+
46
+ s->block_type_trees = NULL;
47
+ s->block_len_trees = NULL;
48
+ s->ringbuffer = NULL;
49
+ s->ringbuffer_size = 0;
50
+ s->new_ringbuffer_size = 0;
51
+ s->ringbuffer_mask = 0;
52
+
53
+ s->context_map = NULL;
54
+ s->context_modes = NULL;
55
+ s->dist_context_map = NULL;
56
+ s->context_map_slice = NULL;
57
+ s->dist_context_map_slice = NULL;
58
+
59
+ s->literal_hgroup.codes = NULL;
60
+ s->literal_hgroup.htrees = NULL;
61
+ s->insert_copy_hgroup.codes = NULL;
62
+ s->insert_copy_hgroup.htrees = NULL;
63
+ s->distance_hgroup.codes = NULL;
64
+ s->distance_hgroup.htrees = NULL;
65
+
66
+ s->is_last_metablock = 0;
67
+ s->is_uncompressed = 0;
68
+ s->is_metadata = 0;
69
+ s->should_wrap_ringbuffer = 0;
70
+ s->canny_ringbuffer_allocation = 1;
71
+
72
+ s->window_bits = 0;
73
+ s->max_distance = 0;
74
+ s->dist_rb[0] = 16;
75
+ s->dist_rb[1] = 15;
76
+ s->dist_rb[2] = 11;
77
+ s->dist_rb[3] = 4;
78
+ s->dist_rb_idx = 0;
79
+ s->block_type_trees = NULL;
80
+ s->block_len_trees = NULL;
81
+
82
+ s->mtf_upper_bound = 63;
83
+
84
+ s->dictionary = BrotliGetDictionary();
85
+ s->transforms = BrotliGetTransforms();
86
+
87
+ return BROTLI_TRUE;
88
+ }
89
+
90
+ void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
91
+ s->meta_block_remaining_len = 0;
92
+ s->block_length[0] = 1U << 24;
93
+ s->block_length[1] = 1U << 24;
94
+ s->block_length[2] = 1U << 24;
95
+ s->num_block_types[0] = 1;
96
+ s->num_block_types[1] = 1;
97
+ s->num_block_types[2] = 1;
98
+ s->block_type_rb[0] = 1;
99
+ s->block_type_rb[1] = 0;
100
+ s->block_type_rb[2] = 1;
101
+ s->block_type_rb[3] = 0;
102
+ s->block_type_rb[4] = 1;
103
+ s->block_type_rb[5] = 0;
104
+ s->context_map = NULL;
105
+ s->context_modes = NULL;
106
+ s->dist_context_map = NULL;
107
+ s->context_map_slice = NULL;
108
+ s->literal_htree = NULL;
109
+ s->dist_context_map_slice = NULL;
110
+ s->dist_htree_index = 0;
111
+ s->context_lookup = NULL;
112
+ s->literal_hgroup.codes = NULL;
113
+ s->literal_hgroup.htrees = NULL;
114
+ s->insert_copy_hgroup.codes = NULL;
115
+ s->insert_copy_hgroup.htrees = NULL;
116
+ s->distance_hgroup.codes = NULL;
117
+ s->distance_hgroup.htrees = NULL;
118
+ }
119
+
120
+ void BrotliDecoderStateCleanupAfterMetablock(BrotliDecoderState* s) {
121
+ BROTLI_DECODER_FREE(s, s->context_modes);
122
+ BROTLI_DECODER_FREE(s, s->context_map);
123
+ BROTLI_DECODER_FREE(s, s->dist_context_map);
124
+ BROTLI_DECODER_FREE(s, s->literal_hgroup.htrees);
125
+ BROTLI_DECODER_FREE(s, s->insert_copy_hgroup.htrees);
126
+ BROTLI_DECODER_FREE(s, s->distance_hgroup.htrees);
127
+ }
128
+
129
+ void BrotliDecoderStateCleanup(BrotliDecoderState* s) {
130
+ BrotliDecoderStateCleanupAfterMetablock(s);
131
+
132
+ BROTLI_DECODER_FREE(s, s->ringbuffer);
133
+ BROTLI_DECODER_FREE(s, s->block_type_trees);
134
+ }
135
+
136
+ BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState* s,
137
+ HuffmanTreeGroup* group, uint32_t alphabet_size_max,
138
+ uint32_t alphabet_size_limit, uint32_t ntrees) {
139
+ /* 376 = 256 (1-st level table) + 4 + 7 + 15 + 31 + 63 (2-nd level mix-tables)
140
+ This number is discovered "unlimited" "enough" calculator; it is actually
141
+ a wee bigger than required in several cases (especially for alphabets with
142
+ less than 16 symbols). */
143
+ const size_t max_table_size = alphabet_size_limit + 376;
144
+ const size_t code_size = sizeof(HuffmanCode) * ntrees * max_table_size;
145
+ const size_t htree_size = sizeof(HuffmanCode*) * ntrees;
146
+ /* Pointer alignment is, hopefully, wider than sizeof(HuffmanCode). */
147
+ HuffmanCode** p = (HuffmanCode**)BROTLI_DECODER_ALLOC(s,
148
+ code_size + htree_size);
149
+ group->alphabet_size_max = (uint16_t)alphabet_size_max;
150
+ group->alphabet_size_limit = (uint16_t)alphabet_size_limit;
151
+ group->num_htrees = (uint16_t)ntrees;
152
+ group->htrees = p;
153
+ group->codes = (HuffmanCode*)(&p[ntrees]);
154
+ return !!p;
155
+ }
156
+
157
+ #if defined(__cplusplus) || defined(c_plusplus)
158
+ } /* extern "C" */
159
+ #endif
@@ -0,0 +1,365 @@
1
+ /* Copyright 2015 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
+ /* Brotli state for partial streaming decoding. */
8
+
9
+ #ifndef BROTLI_DEC_STATE_H_
10
+ #define BROTLI_DEC_STATE_H_
11
+
12
+ #include "brotli_common_constants.h"
13
+ #include "brotli_common_dictionary.h"
14
+ #include "brotli_common_platform.h"
15
+ #include "brotli_common_transform.h"
16
+ #include "brotli_types.h"
17
+ #include "brotli_dec_bit_reader.h"
18
+ #include "brotli_dec_huffman.h"
19
+
20
+ #if defined(__cplusplus) || defined(c_plusplus)
21
+ extern "C" {
22
+ #endif
23
+
24
+ /* Graphviz diagram that describes state transitions:
25
+
26
+ digraph States {
27
+ graph [compound=true]
28
+ concentrate=true
29
+ node [shape="box"]
30
+
31
+ UNINITED -> {LARGE_WINDOW_BITS -> INITIALIZE}
32
+ subgraph cluster_metablock_workflow {
33
+ style="rounded"
34
+ label=< <B>METABLOCK CYCLE</B> >
35
+ METABLOCK_BEGIN -> METABLOCK_HEADER
36
+ METABLOCK_HEADER:sw -> METADATA
37
+ METABLOCK_HEADER:s -> UNCOMPRESSED
38
+ METABLOCK_HEADER:se -> METABLOCK_DONE:ne
39
+ METADATA:s -> METABLOCK_DONE:w
40
+ UNCOMPRESSED:s -> METABLOCK_DONE:n
41
+ METABLOCK_DONE:e -> METABLOCK_BEGIN:e [constraint="false"]
42
+ }
43
+ INITIALIZE -> METABLOCK_BEGIN
44
+ METABLOCK_DONE -> DONE
45
+
46
+ subgraph cluster_compressed_metablock {
47
+ style="rounded"
48
+ label=< <B>COMPRESSED METABLOCK</B> >
49
+
50
+ subgraph cluster_command {
51
+ style="rounded"
52
+ label=< <B>HOT LOOP</B> >
53
+
54
+ _METABLOCK_DONE_PORT_ [shape=point style=invis]
55
+
56
+ {
57
+ // Set different shape for nodes returning from "compressed metablock".
58
+ node [shape=invhouse]; CMD_INNER CMD_POST_DECODE_LITERALS;
59
+ CMD_POST_WRAP_COPY; CMD_INNER_WRITE; CMD_POST_WRITE_1;
60
+ }
61
+
62
+ CMD_BEGIN -> CMD_INNER -> CMD_POST_DECODE_LITERALS -> CMD_POST_WRAP_COPY
63
+
64
+ // IO ("write") nodes are not in the hot loop!
65
+ CMD_INNER_WRITE [style=dashed]
66
+ CMD_INNER -> CMD_INNER_WRITE
67
+ CMD_POST_WRITE_1 [style=dashed]
68
+ CMD_POST_DECODE_LITERALS -> CMD_POST_WRITE_1
69
+ CMD_POST_WRITE_2 [style=dashed]
70
+ CMD_POST_WRAP_COPY -> CMD_POST_WRITE_2
71
+
72
+ CMD_POST_WRITE_1 -> CMD_BEGIN:s [constraint="false"]
73
+ CMD_INNER_WRITE -> {CMD_INNER CMD_POST_DECODE_LITERALS}
74
+ [constraint="false"]
75
+ CMD_BEGIN:ne -> CMD_POST_DECODE_LITERALS [constraint="false"]
76
+ CMD_POST_WRAP_COPY -> CMD_BEGIN [constraint="false"]
77
+ CMD_POST_DECODE_LITERALS -> CMD_BEGIN:ne [constraint="false"]
78
+ CMD_POST_WRITE_2 -> CMD_POST_WRAP_COPY [constraint="false"]
79
+ {rank=same; CMD_BEGIN; CMD_INNER; CMD_POST_DECODE_LITERALS;
80
+ CMD_POST_WRAP_COPY}
81
+ {rank=same; CMD_INNER_WRITE; CMD_POST_WRITE_1; CMD_POST_WRITE_2}
82
+
83
+ {CMD_INNER CMD_POST_DECODE_LITERALS CMD_POST_WRAP_COPY} ->
84
+ _METABLOCK_DONE_PORT_ [style=invis]
85
+ {CMD_INNER_WRITE CMD_POST_WRITE_1} -> _METABLOCK_DONE_PORT_
86
+ [constraint="false" style=invis]
87
+ }
88
+
89
+ BEFORE_COMPRESSED_METABLOCK_HEADER:s -> HUFFMAN_CODE_0:n
90
+ HUFFMAN_CODE_0 -> HUFFMAN_CODE_1 -> HUFFMAN_CODE_2 -> HUFFMAN_CODE_3
91
+ HUFFMAN_CODE_0 -> METABLOCK_HEADER_2 -> CONTEXT_MODES -> CONTEXT_MAP_1
92
+ CONTEXT_MAP_1 -> CONTEXT_MAP_2 -> TREE_GROUP
93
+ TREE_GROUP -> BEFORE_COMPRESSED_METABLOCK_BODY:e
94
+ BEFORE_COMPRESSED_METABLOCK_BODY:s -> CMD_BEGIN:n
95
+
96
+ HUFFMAN_CODE_3:e -> HUFFMAN_CODE_0:ne [constraint="false"]
97
+ {rank=same; HUFFMAN_CODE_0; HUFFMAN_CODE_1; HUFFMAN_CODE_2; HUFFMAN_CODE_3}
98
+ {rank=same; METABLOCK_HEADER_2; CONTEXT_MODES; CONTEXT_MAP_1; CONTEXT_MAP_2;
99
+ TREE_GROUP}
100
+ }
101
+ METABLOCK_HEADER:e -> BEFORE_COMPRESSED_METABLOCK_HEADER:n
102
+
103
+ _METABLOCK_DONE_PORT_ -> METABLOCK_DONE:se
104
+ [constraint="false" ltail=cluster_command]
105
+
106
+ UNINITED [shape=Mdiamond];
107
+ DONE [shape=Msquare];
108
+ }
109
+
110
+
111
+ */
112
+
113
+ typedef enum {
114
+ BROTLI_STATE_UNINITED,
115
+ BROTLI_STATE_LARGE_WINDOW_BITS,
116
+ BROTLI_STATE_INITIALIZE,
117
+ BROTLI_STATE_METABLOCK_BEGIN,
118
+ BROTLI_STATE_METABLOCK_HEADER,
119
+ BROTLI_STATE_METABLOCK_HEADER_2,
120
+ BROTLI_STATE_CONTEXT_MODES,
121
+ BROTLI_STATE_COMMAND_BEGIN,
122
+ BROTLI_STATE_COMMAND_INNER,
123
+ BROTLI_STATE_COMMAND_POST_DECODE_LITERALS,
124
+ BROTLI_STATE_COMMAND_POST_WRAP_COPY,
125
+ BROTLI_STATE_UNCOMPRESSED,
126
+ BROTLI_STATE_METADATA,
127
+ BROTLI_STATE_COMMAND_INNER_WRITE,
128
+ BROTLI_STATE_METABLOCK_DONE,
129
+ BROTLI_STATE_COMMAND_POST_WRITE_1,
130
+ BROTLI_STATE_COMMAND_POST_WRITE_2,
131
+ BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER,
132
+ BROTLI_STATE_HUFFMAN_CODE_0,
133
+ BROTLI_STATE_HUFFMAN_CODE_1,
134
+ BROTLI_STATE_HUFFMAN_CODE_2,
135
+ BROTLI_STATE_HUFFMAN_CODE_3,
136
+ BROTLI_STATE_CONTEXT_MAP_1,
137
+ BROTLI_STATE_CONTEXT_MAP_2,
138
+ BROTLI_STATE_TREE_GROUP,
139
+ BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY,
140
+ BROTLI_STATE_DONE
141
+ } BrotliRunningState;
142
+
143
+ typedef enum {
144
+ BROTLI_STATE_METABLOCK_HEADER_NONE,
145
+ BROTLI_STATE_METABLOCK_HEADER_EMPTY,
146
+ BROTLI_STATE_METABLOCK_HEADER_NIBBLES,
147
+ BROTLI_STATE_METABLOCK_HEADER_SIZE,
148
+ BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED,
149
+ BROTLI_STATE_METABLOCK_HEADER_RESERVED,
150
+ BROTLI_STATE_METABLOCK_HEADER_BYTES,
151
+ BROTLI_STATE_METABLOCK_HEADER_METADATA
152
+ } BrotliRunningMetablockHeaderState;
153
+
154
+ typedef enum {
155
+ BROTLI_STATE_UNCOMPRESSED_NONE,
156
+ BROTLI_STATE_UNCOMPRESSED_WRITE
157
+ } BrotliRunningUncompressedState;
158
+
159
+ typedef enum {
160
+ BROTLI_STATE_TREE_GROUP_NONE,
161
+ BROTLI_STATE_TREE_GROUP_LOOP
162
+ } BrotliRunningTreeGroupState;
163
+
164
+ typedef enum {
165
+ BROTLI_STATE_CONTEXT_MAP_NONE,
166
+ BROTLI_STATE_CONTEXT_MAP_READ_PREFIX,
167
+ BROTLI_STATE_CONTEXT_MAP_HUFFMAN,
168
+ BROTLI_STATE_CONTEXT_MAP_DECODE,
169
+ BROTLI_STATE_CONTEXT_MAP_TRANSFORM
170
+ } BrotliRunningContextMapState;
171
+
172
+ typedef enum {
173
+ BROTLI_STATE_HUFFMAN_NONE,
174
+ BROTLI_STATE_HUFFMAN_SIMPLE_SIZE,
175
+ BROTLI_STATE_HUFFMAN_SIMPLE_READ,
176
+ BROTLI_STATE_HUFFMAN_SIMPLE_BUILD,
177
+ BROTLI_STATE_HUFFMAN_COMPLEX,
178
+ BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS
179
+ } BrotliRunningHuffmanState;
180
+
181
+ typedef enum {
182
+ BROTLI_STATE_DECODE_UINT8_NONE,
183
+ BROTLI_STATE_DECODE_UINT8_SHORT,
184
+ BROTLI_STATE_DECODE_UINT8_LONG
185
+ } BrotliRunningDecodeUint8State;
186
+
187
+ typedef enum {
188
+ BROTLI_STATE_READ_BLOCK_LENGTH_NONE,
189
+ BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX
190
+ } BrotliRunningReadBlockLengthState;
191
+
192
+ typedef struct BrotliMetablockHeaderArena {
193
+ BrotliRunningTreeGroupState substate_tree_group;
194
+ BrotliRunningContextMapState substate_context_map;
195
+ BrotliRunningHuffmanState substate_huffman;
196
+
197
+ uint32_t sub_loop_counter;
198
+
199
+ uint32_t repeat_code_len;
200
+ uint32_t prev_code_len;
201
+
202
+ /* For ReadHuffmanCode. */
203
+ uint32_t symbol;
204
+ uint32_t repeat;
205
+ uint32_t space;
206
+
207
+ /* Huffman table for "histograms". */
208
+ HuffmanCode table[32];
209
+ /* List of heads of symbol chains. */
210
+ uint16_t* symbol_lists;
211
+ /* Storage from symbol_lists. */
212
+ uint16_t symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1 +
213
+ BROTLI_NUM_COMMAND_SYMBOLS];
214
+ /* Tails of symbol chains. */
215
+ int next_symbol[32];
216
+ uint8_t code_length_code_lengths[BROTLI_CODE_LENGTH_CODES];
217
+ /* Population counts for the code lengths. */
218
+ uint16_t code_length_histo[16];
219
+
220
+ /* For HuffmanTreeGroupDecode. */
221
+ int htree_index;
222
+ HuffmanCode* next;
223
+
224
+ /* For DecodeContextMap. */
225
+ uint32_t context_index;
226
+ uint32_t max_run_length_prefix;
227
+ uint32_t code;
228
+ HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_SIZE_272];
229
+ } BrotliMetablockHeaderArena;
230
+
231
+ typedef struct BrotliMetablockBodyArena {
232
+ uint8_t dist_extra_bits[544];
233
+ uint32_t dist_offset[544];
234
+ } BrotliMetablockBodyArena;
235
+
236
+ struct BrotliDecoderStateStruct {
237
+ BrotliRunningState state;
238
+
239
+ /* This counter is reused for several disjoint loops. */
240
+ int loop_counter;
241
+
242
+ BrotliBitReader br;
243
+
244
+ brotli_alloc_func alloc_func;
245
+ brotli_free_func free_func;
246
+ void* memory_manager_opaque;
247
+
248
+ /* Temporary storage for remaining input. Brotli stream format is designed in
249
+ a way, that 64 bits are enough to make progress in decoding. */
250
+ union {
251
+ uint64_t u64;
252
+ uint8_t u8[8];
253
+ } buffer;
254
+ uint32_t buffer_length;
255
+
256
+ int pos;
257
+ int max_backward_distance;
258
+ int max_distance;
259
+ int ringbuffer_size;
260
+ int ringbuffer_mask;
261
+ int dist_rb_idx;
262
+ int dist_rb[4];
263
+ int error_code;
264
+ uint8_t* ringbuffer;
265
+ uint8_t* ringbuffer_end;
266
+ HuffmanCode* htree_command;
267
+ const uint8_t* context_lookup;
268
+ uint8_t* context_map_slice;
269
+ uint8_t* dist_context_map_slice;
270
+
271
+ /* This ring buffer holds a few past copy distances that will be used by
272
+ some special distance codes. */
273
+ HuffmanTreeGroup literal_hgroup;
274
+ HuffmanTreeGroup insert_copy_hgroup;
275
+ HuffmanTreeGroup distance_hgroup;
276
+ HuffmanCode* block_type_trees;
277
+ HuffmanCode* block_len_trees;
278
+ /* This is true if the literal context map histogram type always matches the
279
+ block type. It is then not needed to keep the context (faster decoding). */
280
+ int trivial_literal_context;
281
+ /* Distance context is actual after command is decoded and before distance is
282
+ computed. After distance computation it is used as a temporary variable. */
283
+ int distance_context;
284
+ int meta_block_remaining_len;
285
+ uint32_t block_length_index;
286
+ uint32_t block_length[3];
287
+ uint32_t num_block_types[3];
288
+ uint32_t block_type_rb[6];
289
+ uint32_t distance_postfix_bits;
290
+ uint32_t num_direct_distance_codes;
291
+ uint32_t num_dist_htrees;
292
+ uint8_t* dist_context_map;
293
+ HuffmanCode* literal_htree;
294
+ uint8_t dist_htree_index;
295
+
296
+ int copy_length;
297
+ int distance_code;
298
+
299
+ /* For partial write operations. */
300
+ size_t rb_roundtrips; /* how many times we went around the ring-buffer */
301
+ size_t partial_pos_out; /* how much output to the user in total */
302
+
303
+ /* For InverseMoveToFrontTransform. */
304
+ uint32_t mtf_upper_bound;
305
+ uint32_t mtf[64 + 1];
306
+
307
+ /* Less used attributes are at the end of this struct. */
308
+
309
+ /* States inside function calls. */
310
+ BrotliRunningMetablockHeaderState substate_metablock_header;
311
+ BrotliRunningUncompressedState substate_uncompressed;
312
+ BrotliRunningDecodeUint8State substate_decode_uint8;
313
+ BrotliRunningReadBlockLengthState substate_read_block_length;
314
+
315
+ unsigned int is_last_metablock : 1;
316
+ unsigned int is_uncompressed : 1;
317
+ unsigned int is_metadata : 1;
318
+ unsigned int should_wrap_ringbuffer : 1;
319
+ unsigned int canny_ringbuffer_allocation : 1;
320
+ unsigned int large_window : 1;
321
+ unsigned int size_nibbles : 8;
322
+ uint32_t window_bits;
323
+
324
+ int new_ringbuffer_size;
325
+
326
+ uint32_t num_literal_htrees;
327
+ uint8_t* context_map;
328
+ uint8_t* context_modes;
329
+
330
+ const BrotliDictionary* dictionary;
331
+ const BrotliTransforms* transforms;
332
+
333
+ uint32_t trivial_literal_contexts[8]; /* 256 bits */
334
+
335
+ union {
336
+ BrotliMetablockHeaderArena header;
337
+ BrotliMetablockBodyArena body;
338
+ } arena;
339
+ };
340
+
341
+ typedef struct BrotliDecoderStateStruct BrotliDecoderStateInternal;
342
+ #define BrotliDecoderState BrotliDecoderStateInternal
343
+
344
+ BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
345
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
346
+ BROTLI_INTERNAL void BrotliDecoderStateCleanup(BrotliDecoderState* s);
347
+ BROTLI_INTERNAL void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s);
348
+ BROTLI_INTERNAL void BrotliDecoderStateCleanupAfterMetablock(
349
+ BrotliDecoderState* s);
350
+ BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(
351
+ BrotliDecoderState* s, HuffmanTreeGroup* group, uint32_t alphabet_size_max,
352
+ uint32_t alphabet_size_limit, uint32_t ntrees);
353
+
354
+ #define BROTLI_DECODER_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
355
+
356
+ #define BROTLI_DECODER_FREE(S, X) { \
357
+ S->free_func(S->memory_manager_opaque, X); \
358
+ X = NULL; \
359
+ }
360
+
361
+ #if defined(__cplusplus) || defined(c_plusplus)
362
+ } /* extern "C" */
363
+ #endif
364
+
365
+ #endif /* BROTLI_DEC_STATE_H_ */