extbrotli 0.0.1.PROTOTYPE
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.
- checksums.yaml +7 -0
- data/LICENSE +28 -0
- data/README.md +67 -0
- data/Rakefile +158 -0
- data/contrib/brotli/LICENSE +202 -0
- data/contrib/brotli/README.md +18 -0
- data/contrib/brotli/dec/bit_reader.c +55 -0
- data/contrib/brotli/dec/bit_reader.h +256 -0
- data/contrib/brotli/dec/context.h +260 -0
- data/contrib/brotli/dec/decode.c +1573 -0
- data/contrib/brotli/dec/decode.h +160 -0
- data/contrib/brotli/dec/dictionary.h +9494 -0
- data/contrib/brotli/dec/huffman.c +325 -0
- data/contrib/brotli/dec/huffman.h +77 -0
- data/contrib/brotli/dec/port.h +148 -0
- data/contrib/brotli/dec/prefix.h +756 -0
- data/contrib/brotli/dec/state.c +149 -0
- data/contrib/brotli/dec/state.h +185 -0
- data/contrib/brotli/dec/streams.c +99 -0
- data/contrib/brotli/dec/streams.h +100 -0
- data/contrib/brotli/dec/transform.h +315 -0
- data/contrib/brotli/dec/types.h +36 -0
- data/contrib/brotli/enc/backward_references.cc +769 -0
- data/contrib/brotli/enc/backward_references.h +50 -0
- data/contrib/brotli/enc/bit_cost.h +147 -0
- data/contrib/brotli/enc/block_splitter.cc +418 -0
- data/contrib/brotli/enc/block_splitter.h +78 -0
- data/contrib/brotli/enc/brotli_bit_stream.cc +884 -0
- data/contrib/brotli/enc/brotli_bit_stream.h +149 -0
- data/contrib/brotli/enc/cluster.h +290 -0
- data/contrib/brotli/enc/command.h +140 -0
- data/contrib/brotli/enc/context.h +185 -0
- data/contrib/brotli/enc/dictionary.h +9485 -0
- data/contrib/brotli/enc/dictionary_hash.h +4125 -0
- data/contrib/brotli/enc/encode.cc +715 -0
- data/contrib/brotli/enc/encode.h +196 -0
- data/contrib/brotli/enc/encode_parallel.cc +354 -0
- data/contrib/brotli/enc/encode_parallel.h +37 -0
- data/contrib/brotli/enc/entropy_encode.cc +492 -0
- data/contrib/brotli/enc/entropy_encode.h +88 -0
- data/contrib/brotli/enc/fast_log.h +179 -0
- data/contrib/brotli/enc/find_match_length.h +87 -0
- data/contrib/brotli/enc/hash.h +686 -0
- data/contrib/brotli/enc/histogram.cc +76 -0
- data/contrib/brotli/enc/histogram.h +100 -0
- data/contrib/brotli/enc/literal_cost.cc +172 -0
- data/contrib/brotli/enc/literal_cost.h +38 -0
- data/contrib/brotli/enc/metablock.cc +544 -0
- data/contrib/brotli/enc/metablock.h +88 -0
- data/contrib/brotli/enc/port.h +151 -0
- data/contrib/brotli/enc/prefix.h +85 -0
- data/contrib/brotli/enc/ringbuffer.h +108 -0
- data/contrib/brotli/enc/static_dict.cc +441 -0
- data/contrib/brotli/enc/static_dict.h +40 -0
- data/contrib/brotli/enc/static_dict_lut.h +12063 -0
- data/contrib/brotli/enc/streams.cc +127 -0
- data/contrib/brotli/enc/streams.h +129 -0
- data/contrib/brotli/enc/transform.h +250 -0
- data/contrib/brotli/enc/write_bits.h +91 -0
- data/ext/extbrotli.cc +24 -0
- data/ext/extbrotli.h +73 -0
- data/ext/extconf.rb +35 -0
- data/ext/lldecoder.c +220 -0
- data/ext/llencoder.cc +433 -0
- data/gemstub.rb +21 -0
- data/lib/extbrotli.rb +243 -0
- data/lib/extbrotli/version.rb +3 -0
- metadata +140 -0
@@ -0,0 +1,149 @@
|
|
1
|
+
/* Copyright 2015 Google Inc. All Rights Reserved.
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
*/
|
15
|
+
|
16
|
+
#include "./huffman.h"
|
17
|
+
#include "./state.h"
|
18
|
+
|
19
|
+
#include <stdlib.h>
|
20
|
+
#include <string.h>
|
21
|
+
|
22
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
23
|
+
extern "C" {
|
24
|
+
#endif
|
25
|
+
|
26
|
+
void BrotliStateInit(BrotliState* s) {
|
27
|
+
s->state = BROTLI_STATE_UNINITED;
|
28
|
+
s->sub0_state = BROTLI_STATE_SUB0_NONE;
|
29
|
+
s->sub1_state = BROTLI_STATE_SUB1_NONE;
|
30
|
+
|
31
|
+
s->block_type_trees = NULL;
|
32
|
+
s->block_len_trees = NULL;
|
33
|
+
s->ringbuffer = NULL;
|
34
|
+
|
35
|
+
s->context_map = NULL;
|
36
|
+
s->context_modes = NULL;
|
37
|
+
s->dist_context_map = NULL;
|
38
|
+
s->context_map_slice = NULL;
|
39
|
+
s->dist_context_map_slice = NULL;
|
40
|
+
|
41
|
+
s->literal_hgroup.codes = NULL;
|
42
|
+
s->literal_hgroup.htrees = NULL;
|
43
|
+
s->insert_copy_hgroup.codes = NULL;
|
44
|
+
s->insert_copy_hgroup.htrees = NULL;
|
45
|
+
s->distance_hgroup.codes = NULL;
|
46
|
+
s->distance_hgroup.htrees = NULL;
|
47
|
+
|
48
|
+
s->custom_dict = NULL;
|
49
|
+
s->custom_dict_size = 0;
|
50
|
+
|
51
|
+
s->input_end = 0;
|
52
|
+
s->window_bits = 0;
|
53
|
+
s->max_distance = 0;
|
54
|
+
s->dist_rb[0] = 16;
|
55
|
+
s->dist_rb[1] = 15;
|
56
|
+
s->dist_rb[2] = 11;
|
57
|
+
s->dist_rb[3] = 4;
|
58
|
+
s->dist_rb_idx = 0;
|
59
|
+
s->block_type_trees = NULL;
|
60
|
+
s->block_len_trees = NULL;
|
61
|
+
|
62
|
+
/* Make small negative indexes addressable. */
|
63
|
+
s->symbol_lists = &s->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
|
64
|
+
|
65
|
+
s->mtf_upper_bound = 255;
|
66
|
+
}
|
67
|
+
|
68
|
+
void BrotliStateMetablockBegin(BrotliState* s) {
|
69
|
+
s->meta_block_remaining_len = 0;
|
70
|
+
s->block_length[0] = 1 << 28;
|
71
|
+
s->block_length[1] = 1 << 28;
|
72
|
+
s->block_length[2] = 1 << 28;
|
73
|
+
s->num_block_types[0] = 1;
|
74
|
+
s->num_block_types[1] = 1;
|
75
|
+
s->num_block_types[2] = 1;
|
76
|
+
s->block_type_rb[0] = 1;
|
77
|
+
s->block_type_rb[1] = 0;
|
78
|
+
s->block_type_rb[2] = 1;
|
79
|
+
s->block_type_rb[3] = 0;
|
80
|
+
s->block_type_rb[4] = 1;
|
81
|
+
s->block_type_rb[5] = 0;
|
82
|
+
s->context_map = NULL;
|
83
|
+
s->context_modes = NULL;
|
84
|
+
s->dist_context_map = NULL;
|
85
|
+
s->context_map_slice = NULL;
|
86
|
+
s->literal_htree_index = 0;
|
87
|
+
s->literal_htree = NULL;
|
88
|
+
s->dist_context_map_slice = NULL;
|
89
|
+
s->dist_htree_index = 0;
|
90
|
+
s->context_lookup1 = NULL;
|
91
|
+
s->context_lookup2 = NULL;
|
92
|
+
s->literal_hgroup.codes = NULL;
|
93
|
+
s->literal_hgroup.htrees = NULL;
|
94
|
+
s->insert_copy_hgroup.codes = NULL;
|
95
|
+
s->insert_copy_hgroup.htrees = NULL;
|
96
|
+
s->distance_hgroup.codes = NULL;
|
97
|
+
s->distance_hgroup.htrees = NULL;
|
98
|
+
}
|
99
|
+
|
100
|
+
void BrotliStateCleanupAfterMetablock(BrotliState* s) {
|
101
|
+
if (s->context_modes != 0) {
|
102
|
+
free(s->context_modes);
|
103
|
+
s->context_modes = NULL;
|
104
|
+
}
|
105
|
+
if (s->context_map != 0) {
|
106
|
+
free(s->context_map);
|
107
|
+
s->context_map = NULL;
|
108
|
+
}
|
109
|
+
if (s->dist_context_map != 0) {
|
110
|
+
free(s->dist_context_map);
|
111
|
+
s->dist_context_map = NULL;
|
112
|
+
}
|
113
|
+
|
114
|
+
BrotliHuffmanTreeGroupRelease(&s->literal_hgroup);
|
115
|
+
BrotliHuffmanTreeGroupRelease(&s->insert_copy_hgroup);
|
116
|
+
BrotliHuffmanTreeGroupRelease(&s->distance_hgroup);
|
117
|
+
s->literal_hgroup.codes = NULL;
|
118
|
+
s->literal_hgroup.htrees = NULL;
|
119
|
+
s->insert_copy_hgroup.codes = NULL;
|
120
|
+
s->insert_copy_hgroup.htrees = NULL;
|
121
|
+
s->distance_hgroup.codes = NULL;
|
122
|
+
s->distance_hgroup.htrees = NULL;
|
123
|
+
}
|
124
|
+
|
125
|
+
void BrotliStateCleanup(BrotliState* s) {
|
126
|
+
if (s->context_modes != 0) {
|
127
|
+
free(s->context_modes);
|
128
|
+
}
|
129
|
+
if (s->context_map != 0) {
|
130
|
+
free(s->context_map);
|
131
|
+
}
|
132
|
+
if (s->dist_context_map != 0) {
|
133
|
+
free(s->dist_context_map);
|
134
|
+
}
|
135
|
+
BrotliHuffmanTreeGroupRelease(&s->literal_hgroup);
|
136
|
+
BrotliHuffmanTreeGroupRelease(&s->insert_copy_hgroup);
|
137
|
+
BrotliHuffmanTreeGroupRelease(&s->distance_hgroup);
|
138
|
+
|
139
|
+
if (s->ringbuffer != 0) {
|
140
|
+
free(s->ringbuffer);
|
141
|
+
}
|
142
|
+
if (s->block_type_trees != 0) {
|
143
|
+
free(s->block_type_trees);
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
148
|
+
} /* extern "C" */
|
149
|
+
#endif
|
@@ -0,0 +1,185 @@
|
|
1
|
+
/* Copyright 2015 Google Inc. All Rights Reserved.
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
*/
|
15
|
+
|
16
|
+
/* Brotli state for partial streaming decoding. */
|
17
|
+
|
18
|
+
#ifndef BROTLI_DEC_STATE_H_
|
19
|
+
#define BROTLI_DEC_STATE_H_
|
20
|
+
|
21
|
+
#include <stdio.h>
|
22
|
+
#include "./bit_reader.h"
|
23
|
+
#include "./huffman.h"
|
24
|
+
#include "./streams.h"
|
25
|
+
#include "./types.h"
|
26
|
+
|
27
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
28
|
+
extern "C" {
|
29
|
+
#endif
|
30
|
+
|
31
|
+
typedef enum {
|
32
|
+
BROTLI_STATE_UNINITED,
|
33
|
+
BROTLI_STATE_BITREADER_WARMUP,
|
34
|
+
BROTLI_STATE_METABLOCK_BEGIN,
|
35
|
+
BROTLI_STATE_METABLOCK_HEADER_1,
|
36
|
+
BROTLI_STATE_METABLOCK_HEADER_2,
|
37
|
+
BROTLI_STATE_COMMAND_BEGIN,
|
38
|
+
BROTLI_STATE_COMMAND_INNER,
|
39
|
+
BROTLI_STATE_UNCOMPRESSED,
|
40
|
+
BROTLI_STATE_METADATA,
|
41
|
+
BROTLI_STATE_COMMAND_INNER_WRITE,
|
42
|
+
BROTLI_STATE_METABLOCK_DONE,
|
43
|
+
BROTLI_STATE_COMMAND_POST_WRITE_1,
|
44
|
+
BROTLI_STATE_COMMAND_POST_WRITE_2,
|
45
|
+
BROTLI_STATE_COMMAND_POST_WRAP_COPY,
|
46
|
+
BROTLI_STATE_HUFFMAN_CODE_0,
|
47
|
+
BROTLI_STATE_HUFFMAN_CODE_1,
|
48
|
+
BROTLI_STATE_HUFFMAN_CODE_2,
|
49
|
+
BROTLI_STATE_CONTEXT_MAP_1,
|
50
|
+
BROTLI_STATE_CONTEXT_MAP_2,
|
51
|
+
BROTLI_STATE_TREE_GROUP,
|
52
|
+
BROTLI_STATE_DONE
|
53
|
+
} BrotliRunningState;
|
54
|
+
|
55
|
+
typedef enum {
|
56
|
+
BROTLI_STATE_SUB0_NONE,
|
57
|
+
BROTLI_STATE_SUB0_UNCOMPRESSED_SHORT,
|
58
|
+
BROTLI_STATE_SUB0_UNCOMPRESSED_FILL,
|
59
|
+
BROTLI_STATE_SUB0_UNCOMPRESSED_COPY,
|
60
|
+
BROTLI_STATE_SUB0_UNCOMPRESSED_WARMUP,
|
61
|
+
BROTLI_STATE_SUB0_UNCOMPRESSED_WRITE_1,
|
62
|
+
BROTLI_STATE_SUB0_UNCOMPRESSED_WRITE_2,
|
63
|
+
BROTLI_STATE_SUB0_UNCOMPRESSED_WRITE_3,
|
64
|
+
BROTLI_STATE_SUB0_TREE_GROUP,
|
65
|
+
BROTLI_STATE_SUB0_CONTEXT_MAP_HUFFMAN,
|
66
|
+
BROTLI_STATE_SUB0_CONTEXT_MAPS
|
67
|
+
} BrotliRunningSub0State;
|
68
|
+
|
69
|
+
typedef enum {
|
70
|
+
BROTLI_STATE_SUB1_NONE,
|
71
|
+
BROTLI_STATE_SUB1_HUFFMAN_LENGTH_SYMBOLS
|
72
|
+
} BrotliRunningSub1State;
|
73
|
+
|
74
|
+
typedef struct {
|
75
|
+
BrotliRunningState state;
|
76
|
+
/* This counter is reused for several disjoint loops. */
|
77
|
+
BrotliBitReader br;
|
78
|
+
int loop_counter;
|
79
|
+
int pos;
|
80
|
+
int max_backward_distance;
|
81
|
+
int max_backward_distance_minus_custom_dict_size;
|
82
|
+
int max_distance;
|
83
|
+
int ringbuffer_size;
|
84
|
+
int ringbuffer_mask;
|
85
|
+
int dist_rb_idx;
|
86
|
+
int dist_rb[4];
|
87
|
+
uint8_t* ringbuffer;
|
88
|
+
uint8_t* ringbuffer_end;
|
89
|
+
HuffmanCode* htree_command;
|
90
|
+
const uint8_t* context_lookup1;
|
91
|
+
const uint8_t* context_lookup2;
|
92
|
+
uint8_t* context_map_slice;
|
93
|
+
uint8_t* dist_context_map_slice;
|
94
|
+
|
95
|
+
/* This ring buffer holds a few past copy distances that will be used by */
|
96
|
+
/* some special distance codes. */
|
97
|
+
HuffmanTreeGroup literal_hgroup;
|
98
|
+
HuffmanTreeGroup insert_copy_hgroup;
|
99
|
+
HuffmanTreeGroup distance_hgroup;
|
100
|
+
HuffmanCode* block_type_trees;
|
101
|
+
HuffmanCode* block_len_trees;
|
102
|
+
/* This is true if the literal context map histogram type always matches the
|
103
|
+
block type. It is then not needed to keep the context (faster decoding). */
|
104
|
+
int trivial_literal_context;
|
105
|
+
int distance_context;
|
106
|
+
int meta_block_remaining_len;
|
107
|
+
int block_length[3];
|
108
|
+
int num_block_types[3];
|
109
|
+
int block_type_rb[6];
|
110
|
+
int distance_postfix_bits;
|
111
|
+
int num_direct_distance_codes;
|
112
|
+
int distance_postfix_mask;
|
113
|
+
uint8_t* dist_context_map;
|
114
|
+
uint8_t literal_htree_index;
|
115
|
+
HuffmanCode *literal_htree;
|
116
|
+
uint8_t dist_htree_index;
|
117
|
+
uint8_t repeat_code_len;
|
118
|
+
uint8_t prev_code_len;
|
119
|
+
|
120
|
+
int copy_length;
|
121
|
+
int distance_code;
|
122
|
+
|
123
|
+
/* For partial write operations */
|
124
|
+
int to_write;
|
125
|
+
int partially_written;
|
126
|
+
|
127
|
+
/* For ReadHuffmanCode */
|
128
|
+
uint32_t symbol;
|
129
|
+
uint32_t repeat;
|
130
|
+
uint32_t space;
|
131
|
+
|
132
|
+
HuffmanCode table[32];
|
133
|
+
/* List of of symbol chains. */
|
134
|
+
uint16_t* symbol_lists;
|
135
|
+
/* Storage from symbol_lists. */
|
136
|
+
uint16_t symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1 +
|
137
|
+
BROTLI_HUFFMAN_MAX_CODE_LENGTHS_SIZE];
|
138
|
+
/* Tails of symbol chains. */
|
139
|
+
int next_symbol[32];
|
140
|
+
uint8_t code_length_code_lengths[18];
|
141
|
+
/* Population counts for the code lengths */
|
142
|
+
uint16_t code_length_histo[16];
|
143
|
+
|
144
|
+
/* For HuffmanTreeGroupDecode */
|
145
|
+
int htree_index;
|
146
|
+
HuffmanCode* next;
|
147
|
+
|
148
|
+
/* For DecodeContextMap */
|
149
|
+
int context_index;
|
150
|
+
int max_run_length_prefix;
|
151
|
+
HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_TABLE_SIZE];
|
152
|
+
|
153
|
+
/* For InverseMoveToFrontTransform */
|
154
|
+
int mtf_upper_bound;
|
155
|
+
uint8_t mtf[256];
|
156
|
+
|
157
|
+
/* For custom dictionaries */
|
158
|
+
const uint8_t* custom_dict;
|
159
|
+
int custom_dict_size;
|
160
|
+
|
161
|
+
/* less used attributes are in the end of this struct */
|
162
|
+
BrotliRunningSub0State sub0_state; /* State inside function call */
|
163
|
+
BrotliRunningSub1State sub1_state; /* State inside function call */
|
164
|
+
|
165
|
+
int input_end;
|
166
|
+
uint32_t window_bits;
|
167
|
+
|
168
|
+
/* For CopyUncompressedBlockToOutput */
|
169
|
+
int nbytes;
|
170
|
+
|
171
|
+
int num_literal_htrees;
|
172
|
+
uint8_t* context_map;
|
173
|
+
uint8_t* context_modes;
|
174
|
+
} BrotliState;
|
175
|
+
|
176
|
+
void BrotliStateInit(BrotliState* s);
|
177
|
+
void BrotliStateCleanup(BrotliState* s);
|
178
|
+
void BrotliStateMetablockBegin(BrotliState* s);
|
179
|
+
void BrotliStateCleanupAfterMetablock(BrotliState* s);
|
180
|
+
|
181
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
182
|
+
} /* extern "C" */
|
183
|
+
#endif
|
184
|
+
|
185
|
+
#endif /* BROTLI_DEC_STATE_H_ */
|
@@ -0,0 +1,99 @@
|
|
1
|
+
/* Copyright 2013 Google Inc. All Rights Reserved.
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
*/
|
15
|
+
|
16
|
+
/* Functions for streaming input and output. */
|
17
|
+
|
18
|
+
#include <string.h>
|
19
|
+
#ifndef _WIN32
|
20
|
+
#include <unistd.h>
|
21
|
+
#endif
|
22
|
+
#include "./streams.h"
|
23
|
+
|
24
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
25
|
+
extern "C" {
|
26
|
+
#endif
|
27
|
+
|
28
|
+
int BrotliMemInputFunction(void* data, uint8_t* buf, size_t count) {
|
29
|
+
BrotliMemInput* input = (BrotliMemInput*)data;
|
30
|
+
if (input->pos > input->length) {
|
31
|
+
return -1;
|
32
|
+
}
|
33
|
+
if (input->pos + count > input->length) {
|
34
|
+
count = input->length - input->pos;
|
35
|
+
}
|
36
|
+
memcpy(buf, input->buffer + input->pos, count);
|
37
|
+
input->pos += count;
|
38
|
+
return (int)count;
|
39
|
+
}
|
40
|
+
|
41
|
+
BrotliInput BrotliInitMemInput(const uint8_t* buffer, size_t length,
|
42
|
+
BrotliMemInput* mem_input) {
|
43
|
+
BrotliInput input;
|
44
|
+
mem_input->buffer = buffer;
|
45
|
+
mem_input->length = length;
|
46
|
+
mem_input->pos = 0;
|
47
|
+
input.cb_ = &BrotliMemInputFunction;
|
48
|
+
input.data_ = mem_input;
|
49
|
+
return input;
|
50
|
+
}
|
51
|
+
|
52
|
+
int BrotliMemOutputFunction(void* data, const uint8_t* buf, size_t count) {
|
53
|
+
BrotliMemOutput* output = (BrotliMemOutput*)data;
|
54
|
+
size_t limit = output->length - output->pos;
|
55
|
+
if (count > limit) {
|
56
|
+
count = limit;
|
57
|
+
}
|
58
|
+
memcpy(output->buffer + output->pos, buf, count);
|
59
|
+
output->pos += count;
|
60
|
+
return (int)count;
|
61
|
+
}
|
62
|
+
|
63
|
+
BrotliOutput BrotliInitMemOutput(uint8_t* buffer, size_t length,
|
64
|
+
BrotliMemOutput* mem_output) {
|
65
|
+
BrotliOutput output;
|
66
|
+
mem_output->buffer = buffer;
|
67
|
+
mem_output->length = length;
|
68
|
+
mem_output->pos = 0;
|
69
|
+
output.cb_ = &BrotliMemOutputFunction;
|
70
|
+
output.data_ = mem_output;
|
71
|
+
return output;
|
72
|
+
}
|
73
|
+
|
74
|
+
int BrotliFileInputFunction(void* data, uint8_t* buf, size_t count) {
|
75
|
+
return (int)fread(buf, 1, count, (FILE*)data);
|
76
|
+
}
|
77
|
+
|
78
|
+
BrotliInput BrotliFileInput(FILE* f) {
|
79
|
+
BrotliInput in;
|
80
|
+
in.cb_ = BrotliFileInputFunction;
|
81
|
+
in.data_ = f;
|
82
|
+
return in;
|
83
|
+
}
|
84
|
+
|
85
|
+
int BrotliFileOutputFunction(void* data, const uint8_t* buf, size_t count) {
|
86
|
+
return (int)fwrite(buf, 1, count, (FILE*)data);
|
87
|
+
}
|
88
|
+
|
89
|
+
BrotliOutput BrotliFileOutput(FILE* f) {
|
90
|
+
BrotliOutput out;
|
91
|
+
out.cb_ = BrotliFileOutputFunction;
|
92
|
+
out.data_ = f;
|
93
|
+
return out;
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
98
|
+
} /* extern "C" */
|
99
|
+
#endif
|
@@ -0,0 +1,100 @@
|
|
1
|
+
/* Copyright 2013 Google Inc. All Rights Reserved.
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
*/
|
15
|
+
|
16
|
+
/* Functions for streaming input and output. */
|
17
|
+
|
18
|
+
#ifndef BROTLI_DEC_STREAMS_H_
|
19
|
+
#define BROTLI_DEC_STREAMS_H_
|
20
|
+
|
21
|
+
#include <stdio.h>
|
22
|
+
#include "./port.h"
|
23
|
+
#include "./types.h"
|
24
|
+
|
25
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
26
|
+
extern "C" {
|
27
|
+
#endif
|
28
|
+
|
29
|
+
/* Function pointer type used to read len bytes into buf. Returns the */
|
30
|
+
/* number of bytes read or -1 on error. */
|
31
|
+
typedef int (*BrotliInputFunction)(void* data, uint8_t* buf, size_t len);
|
32
|
+
|
33
|
+
/* Input callback function with associated data. */
|
34
|
+
typedef struct {
|
35
|
+
BrotliInputFunction cb_;
|
36
|
+
void* data_;
|
37
|
+
} BrotliInput;
|
38
|
+
|
39
|
+
/* Reads len bytes into buf, using the in callback. */
|
40
|
+
static BROTLI_INLINE int BrotliRead(BrotliInput in, uint8_t* buf, size_t len) {
|
41
|
+
return in.cb_(in.data_, buf, len);
|
42
|
+
}
|
43
|
+
|
44
|
+
/* Function pointer type used to write len bytes into buf. Returns the */
|
45
|
+
/* number of bytes written or -1 on error. */
|
46
|
+
typedef int (*BrotliOutputFunction)(void* data, const uint8_t* buf, size_t len);
|
47
|
+
|
48
|
+
/* Output callback function with associated data. */
|
49
|
+
typedef struct {
|
50
|
+
BrotliOutputFunction cb_;
|
51
|
+
void* data_;
|
52
|
+
} BrotliOutput;
|
53
|
+
|
54
|
+
/* Writes len bytes into buf, using the out callback. */
|
55
|
+
static BROTLI_INLINE int BrotliWrite(BrotliOutput out,
|
56
|
+
const uint8_t* buf, size_t len) {
|
57
|
+
return out.cb_(out.data_, buf, len);
|
58
|
+
}
|
59
|
+
|
60
|
+
/* Memory region with position. */
|
61
|
+
typedef struct {
|
62
|
+
const uint8_t* buffer;
|
63
|
+
size_t length;
|
64
|
+
size_t pos;
|
65
|
+
} BrotliMemInput;
|
66
|
+
|
67
|
+
/* Input callback where *data is a BrotliMemInput struct. */
|
68
|
+
int BrotliMemInputFunction(void* data, uint8_t* buf, size_t count);
|
69
|
+
|
70
|
+
/* Returns an input callback that wraps the given memory region. */
|
71
|
+
BrotliInput BrotliInitMemInput(const uint8_t* buffer, size_t length,
|
72
|
+
BrotliMemInput* mem_input);
|
73
|
+
|
74
|
+
/* Output buffer with position. */
|
75
|
+
typedef struct {
|
76
|
+
uint8_t* buffer;
|
77
|
+
size_t length;
|
78
|
+
size_t pos;
|
79
|
+
} BrotliMemOutput;
|
80
|
+
|
81
|
+
/* Output callback where *data is a BrotliMemOutput struct. */
|
82
|
+
int BrotliMemOutputFunction(void* data, const uint8_t* buf, size_t count);
|
83
|
+
|
84
|
+
/* Returns an output callback that wraps the given memory region. */
|
85
|
+
BrotliOutput BrotliInitMemOutput(uint8_t* buffer, size_t length,
|
86
|
+
BrotliMemOutput* mem_output);
|
87
|
+
|
88
|
+
/* Input callback that reads from a file. */
|
89
|
+
int BrotliFileInputFunction(void* data, uint8_t* buf, size_t count);
|
90
|
+
BrotliInput BrotliFileInput(FILE* f);
|
91
|
+
|
92
|
+
/* Output callback that writes to a file. */
|
93
|
+
int BrotliFileOutputFunction(void* data, const uint8_t* buf, size_t count);
|
94
|
+
BrotliOutput BrotliFileOutput(FILE* f);
|
95
|
+
|
96
|
+
#if defined(__cplusplus) || defined(c_plusplus)
|
97
|
+
} /* extern "C" */
|
98
|
+
#endif
|
99
|
+
|
100
|
+
#endif /* BROTLI_DEC_STREAMS_H_ */
|