ruby-brs 1.0.1 → 1.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 779dc2709fa1dc4c1316cafb41ec7ca289ddab6e3e93302c8c9d730d5e13062c
4
- data.tar.gz: b9e44118ae67ccc3ddc80a4976c946ef1b4d0801192b5b2f7f286bbf7b6f1446
3
+ metadata.gz: 169f9d5837ac233e808610055a4edee6c5e133c78bd1047e951c218bd731e74d
4
+ data.tar.gz: bd9ddc4653f00f5a5dd855a14f5c2b8013fd90ffce741334f523197621cacb15
5
5
  SHA512:
6
- metadata.gz: fd2f3127fa61d8e5d1523c331edbb96823976622d81ba61ff4d10965ed9f536773a2abbea59c3fd1a03b9d6df9b4fbe9662a0d47cdaed5aa19e481544cc9952a
7
- data.tar.gz: d487532c19995e7307f68b1b5ccc091e9445e02b8a53c3c9039765e8fbb6dd11960563d6860aaba236dc7b7b424674d12f471163cd52940511dbd4803799a250
6
+ metadata.gz: 1f7014703dbf00857e5c829aef7742c85d6251858047ed7bb234ec6b18c433615a5c72f0a48ce943cd34c9074f4104af23077beb27763ad6d8d68aa2a0cace6a
7
+ data.tar.gz: 581c2b4e7d0b2cbab7c8b54427c05305238ecda8ef8e6f1a98493e01176f7e98b5a0f1009ec2f95beeb54ed6562511a08994ae24d7f75d0fed4ac7017f7eb21c
data/README.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # Ruby bindings for brotli library
2
2
 
3
- [![Travis build status](https://travis-ci.org/andrew-aladev/ruby-brs.svg?branch=master)](https://travis-ci.org/andrew-aladev/ruby-brs)
4
- [![AppVeyor build status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ruby-brs?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ruby-brs/branch/master)
3
+ | Travis | AppVeyor | Circle | Codecov |
4
+ | :---: | :---: | :---: | :---: |
5
+ | [![Travis test status](https://travis-ci.com/andrew-aladev/ruby-brs.svg?branch=master)](https://travis-ci.com/andrew-aladev/ruby-brs) | [![AppVeyor test status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ruby-brs?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ruby-brs/branch/master) | [![Circle test status](https://circleci.com/gh/andrew-aladev/ruby-brs/tree/master.svg?style=shield)](https://circleci.com/gh/andrew-aladev/ruby-brs/tree/master) | [![Codecov](https://codecov.io/gh/andrew-aladev/ruby-brs/branch/master/graph/badge.svg)](https://codecov.io/gh/andrew-aladev/ruby-brs) |
5
6
 
6
7
  See [brotli library](https://github.com/google/brotli).
7
8
 
8
9
  ## Installation
9
10
 
10
- Please install brotli library first.
11
+ Please install brotli library first, use latest 1.0.0+ version.
11
12
 
12
13
  ```sh
13
14
  gem install ruby-brs
@@ -20,6 +21,8 @@ rake gem
20
21
  gem install pkg/ruby-brs-*.gem
21
22
  ```
22
23
 
24
+ You can also use [overlay](https://github.com/andrew-aladev/overlay) for gentoo.
25
+
23
26
  ## Usage
24
27
 
25
28
  There are simple APIs: `String` and `File`. Also you can use generic streaming API: `Stream::Writer` and `Stream::Reader`.
@@ -35,6 +38,27 @@ BRS::File.decompress "file.txt.br", "file.txt"
35
38
 
36
39
  BRS::Stream::Writer.open("file.txt.br") { |writer| writer << "sample string" }
37
40
  puts BRS::Stream::Reader.open("file.txt.br") { |reader| reader.read }
41
+
42
+ writer = BRS::Stream::Writer.new output_socket
43
+ begin
44
+ bytes_written = writer.write_nonblock "sample string"
45
+ # handle "bytes_written"
46
+ rescue IO::WaitWritable
47
+ # handle wait
48
+ ensure
49
+ writer.close
50
+ end
51
+
52
+ reader = BRS::Stream::Reader.new input_socket
53
+ begin
54
+ puts reader.read_nonblock(512)
55
+ rescue IO::WaitReadable
56
+ # handle wait
57
+ rescue ::EOFError
58
+ # handle eof
59
+ ensure
60
+ reader.close
61
+ end
38
62
  ```
39
63
 
40
64
  You can create and read `tar.br` archives with `minitar` for example.
@@ -61,72 +85,38 @@ end
61
85
 
62
86
  ## Options
63
87
 
64
- Each API supports several options:
65
-
66
- ```
67
- :source_buffer_length
68
- :destination_buffer_length
69
- ```
88
+ | Option | Values | Default | Description |
89
+ |------------------------------------|--------------|--------------|-------------|
90
+ | `source_buffer_length` | `0 - inf` | `0 (auto)` | internal buffer length for source data |
91
+ | `destination_buffer_length` | `0 - inf` | `0 (auto)` | internal buffer length for description data |
92
+ | `mode` | `MODES` | `:generic` | compressor mode |
93
+ | `quality` | `0 - 11` | `11` | compression level |
94
+ | `lgwin` | `10 - 24` | `22` | compressor window size |
95
+ | `lgblock` | `16 - 24` | `nil (auto)` | compressor input block size |
96
+ | `disable_literal_context_modeling` | `true/false` | `false` | disables literal context modeling format |
97
+ | `disable_ring_buffer_reallocation` | `true/false` | `false` | disables ring buffer reallocation |
98
+ | `size_hint` | `0 - inf` | `0 (auto)` | size of input (if known) |
99
+ | `large_window` | `true/false` | `false` | enables large window |
70
100
 
71
101
  There are internal buffers for compressed and decompressed data.
72
- For example you want to use 1 KB as source buffer length for compressor - please use 256 B as destination buffer length.
73
- You want to use 256 B as source buffer length for decompressor - please use 1 KB as destination buffer length.
102
+ For example you want to use 1 KB as `source_buffer_length` for compressor - please use 256 B as `destination_buffer_length`.
103
+ You want to use 256 B as `source_buffer_length` for decompressor - please use 1 KB as `destination_buffer_length`.
74
104
 
75
- Values: 0 - infinity, default value: 0.
76
- 0 means automatic buffer length selection.
105
+ `String` and `File` will set `:size_hint` automaticaly.
77
106
 
78
- ```
79
- :mode
80
- ```
107
+ You can also read brotli docs for more info about options.
81
108
 
82
- Values: [`:text`, `:font`, `:generic`], default value: `:generic`.
83
-
84
- ```
85
- :quality
86
- ```
87
-
88
- Values: 0 - 11, default value: 11.
89
-
90
- ```
91
- :lgwin
92
- ```
93
-
94
- Values: 10 - 24, default value: 22.
95
-
96
- ```
97
- :lgblock
98
- ```
99
-
100
- Values: 16 - 24, default value: none.
101
-
102
- ```
103
- :disable_literal_context_modeling
104
- ```
105
-
106
- Values: true/false, default value: false.
107
-
108
- ```
109
- :disable_ring_buffer_reallocation
110
- ```
111
-
112
- Values: true/false, default value: false.
113
-
114
- ```
115
- :size_hint
116
- ```
117
-
118
- Values: 0 - infinity, default value: 0.
119
-
120
- ```
121
- :large_window
122
- ```
123
-
124
- Values: true/false, default value: false.
125
-
126
- Please read brotli docs for more info about options.
109
+ | Option | Related constants |
110
+ |-----------|-------------------|
111
+ | `mode` | `BRS::Option::MODES = %i[text font generic]` |
112
+ | `quality` | `BRS::Option::MIN_QUALITY = 0`, `BRS::Option::MAX_QUALITY = 11` |
113
+ | `lgwin` | `BRS::Option::MIN_LGWIN = 10`, `BRS::Option::MAX_LGWIN = 24` |
114
+ | `lgblock` | `BRS::Option::MIN_LGBLOCK = 16`, `BRS::Option::MAX_LGBLOCK = 24` |
127
115
 
128
116
  Possible compressor options:
129
117
  ```
118
+ :source_buffer_length
119
+ :destination_buffer_length
130
120
  :mode
131
121
  :quality
132
122
  :lgwin
@@ -138,6 +128,8 @@ Possible compressor options:
138
128
 
139
129
  Possible decompressor options:
140
130
  ```
131
+ :source_buffer_length
132
+ :destination_buffer_length
141
133
  :disable_ring_buffer_reallocation
142
134
  :large_window
143
135
  ```
@@ -151,7 +143,7 @@ data = BRS::String.compress "sample string", :quality => 5
151
143
  puts BRS::String.decompress(data, :disable_ring_buffer_reallocation => true)
152
144
  ```
153
145
 
154
- Default options are compatible with HTTP (`Content-Encoding: br`):
146
+ HTTP encoding (`Content-Encoding: br`) using default options:
155
147
 
156
148
  ```ruby
157
149
  require "brs"
@@ -187,7 +179,7 @@ File maintains both source and destination buffers, it accepts both `source_buff
187
179
 
188
180
  ## Stream::Writer
189
181
 
190
- Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
182
+ Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
191
183
 
192
184
  Writer maintains destination buffer only, so it accepts `destination_buffer_length` option only.
193
185
 
@@ -198,6 +190,8 @@ Writer maintains destination buffer only, so it accepts `destination_buffer_leng
198
190
  Open file path and create stream writer associated with opened file.
199
191
  Data will be transcoded to `:external_encoding` using `:transcode_options` before compressing.
200
192
 
193
+ It may be tricky to use both `:size_hint` and `:transcode_options`. You have to provide size of transcoded input.
194
+
201
195
  ```
202
196
  ::new(destination_io, options = {}, :external_encoding => nil, :transcode_options => {})
203
197
  ```
@@ -205,6 +199,8 @@ Data will be transcoded to `:external_encoding` using `:transcode_options` befor
205
199
  Create stream writer associated with destination io.
206
200
  Data will be transcoded to `:external_encoding` using `:transcode_options` before compressing.
207
201
 
202
+ It may be tricky to use both `:size_hint` and `:transcode_options`. You have to provide size of transcoded input.
203
+
208
204
  ```
209
205
  #set_encoding(external_encoding, nil, transcode_options)
210
206
  ```
@@ -221,7 +217,7 @@ Set another encodings, `nil` is just for compatibility with `IO`.
221
217
  #tell
222
218
  ```
223
219
 
224
- See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
220
+ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
225
221
 
226
222
  ```
227
223
  #write(*objects)
@@ -231,7 +227,7 @@ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
231
227
  #closed?
232
228
  ```
233
229
 
234
- See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
230
+ See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
235
231
 
236
232
  ```
237
233
  #write_nonblock(object, *options)
@@ -253,11 +249,11 @@ Behaviour is the same as `IO#write_nonblock` method.
253
249
  #puts(*objects)
254
250
  ```
255
251
 
256
- Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
252
+ Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
257
253
 
258
254
  ## Stream::Reader
259
255
 
260
- Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html).
256
+ Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html).
261
257
 
262
258
  Reader maintains both source and destination buffers, it accepts both `source_buffer_length` and `destination_buffer_length` options.
263
259
 
@@ -292,7 +288,7 @@ Set another encodings.
292
288
  #tell
293
289
  ```
294
290
 
295
- See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
291
+ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
296
292
 
297
293
  ```
298
294
  #read(bytes_to_read = nil, out_buffer = nil)
@@ -302,14 +298,14 @@ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
302
298
  #closed?
303
299
  ```
304
300
 
305
- See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
301
+ See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
306
302
 
307
303
  ```
308
304
  #readpartial(bytes_to_read = nil, out_buffer = nil)
309
305
  #read_nonblock(bytes_to_read, out_buffer = nil, *options)
310
306
  ```
311
307
 
312
- See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
308
+ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
313
309
 
314
310
  ```
315
311
  #getbyte
@@ -332,7 +328,13 @@ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
332
328
  #ungetline(line)
333
329
  ```
334
330
 
335
- Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
331
+ Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
332
+
333
+ ## CI
334
+
335
+ See universal test script [scripts/ci_test.sh](scripts/ci_test.sh) for CI.
336
+ Please visit [scripts/test-images](scripts/test-images).
337
+ You can run this test script using many native and cross images.
336
338
 
337
339
  ## License
338
340
 
@@ -5,12 +5,24 @@
5
5
 
6
6
  #include "ruby.h"
7
7
 
8
+ VALUE brs_ext_create_string_buffer(VALUE length)
9
+ {
10
+ return rb_str_new(NULL, NUM2SIZET(length));
11
+ }
12
+
13
+ VALUE brs_ext_resize_string_buffer(VALUE args)
14
+ {
15
+ VALUE buffer = rb_ary_entry(args, 0);
16
+ VALUE length = rb_ary_entry(args, 1);
17
+ return rb_str_resize(buffer, NUM2SIZET(length));
18
+ }
19
+
8
20
  void brs_ext_buffer_exports(VALUE root_module)
9
21
  {
10
- VALUE option = rb_define_module_under(root_module, "Buffer");
22
+ VALUE module = rb_define_module_under(root_module, "Buffer");
11
23
 
12
- rb_define_const(option, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", UINT2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
13
- rb_define_const(option, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR", UINT2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
14
- rb_define_const(option, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR", UINT2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
15
- rb_define_const(option, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR", UINT2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
24
+ rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
25
+ rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
26
+ rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
27
+ rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
16
28
  }
@@ -12,6 +12,18 @@
12
12
  #define BRS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR (1 << 16) // 64 KB
13
13
  #define BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR (1 << 18) // 256 KB
14
14
 
15
+ VALUE brs_ext_create_string_buffer(VALUE length);
16
+
17
+ #define BRS_EXT_CREATE_STRING_BUFFER(buffer, length, exception) \
18
+ VALUE buffer = rb_protect(brs_ext_create_string_buffer, SIZET2NUM(length), &exception);
19
+
20
+ VALUE brs_ext_resize_string_buffer(VALUE args);
21
+
22
+ #define BRS_EXT_RESIZE_STRING_BUFFER(buffer, length, exception) \
23
+ VALUE args = rb_ary_new_from_args(2, buffer, SIZET2NUM(length)); \
24
+ buffer = rb_protect(brs_ext_resize_string_buffer, args, &exception); \
25
+ RB_GC_GUARD(args);
26
+
15
27
  void brs_ext_buffer_exports(VALUE root_module);
16
28
 
17
29
  #endif // BRS_EXT_BUFFER_H
@@ -10,4 +10,7 @@
10
10
 
11
11
  typedef uint_fast8_t brs_ext_result_t;
12
12
 
13
+ typedef uint8_t brs_ext_byte_t;
14
+ typedef uint_fast8_t brs_ext_byte_fast_t;
15
+
13
16
  #endif // BRS_EXT_COMMON_H
@@ -5,7 +5,6 @@
5
5
 
6
6
  #include <brotli/decode.h>
7
7
 
8
- #include "brs_ext/common.h"
9
8
  #include "ruby.h"
10
9
 
11
10
  brs_ext_result_t brs_ext_get_decompressor_error(BrotliDecoderErrorCode error_code)
@@ -47,9 +46,9 @@ static inline NORETURN(void raise(const char* name, const char* description))
47
46
  rb_raise(error, "%s", description);
48
47
  }
49
48
 
50
- void brs_ext_raise_error(brs_ext_result_t result)
49
+ void brs_ext_raise_error(brs_ext_result_t ext_result)
51
50
  {
52
- switch (result) {
51
+ switch (ext_result) {
53
52
  case BRS_EXT_ERROR_ALLOCATE_FAILED:
54
53
  raise("AllocateError", "allocate error");
55
54
  case BRS_EXT_ERROR_VALIDATE_FAILED:
@@ -29,6 +29,6 @@ enum {
29
29
 
30
30
  brs_ext_result_t brs_ext_get_decompressor_error(BrotliDecoderErrorCode error_code);
31
31
 
32
- NORETURN(void brs_ext_raise_error(brs_ext_result_t result));
32
+ NORETURN(void brs_ext_raise_error(brs_ext_result_t ext_result));
33
33
 
34
34
  #endif // BRS_EXT_ERROR_H
@@ -5,13 +5,12 @@
5
5
 
6
6
  #include <brotli/decode.h>
7
7
  #include <brotli/encode.h>
8
- #include <stdint.h>
8
+ #include <brotli/types.h>
9
9
  #include <stdio.h>
10
10
  #include <stdlib.h>
11
11
  #include <string.h>
12
12
 
13
13
  #include "brs_ext/buffer.h"
14
- #include "brs_ext/common.h"
15
14
  #include "brs_ext/error.h"
16
15
  #include "brs_ext/io.h"
17
16
  #include "brs_ext/macro.h"
@@ -25,7 +24,7 @@ enum {
25
24
 
26
25
  // -- file --
27
26
 
28
- static inline brs_ext_result_t read_file(FILE* source_file, uint8_t* source_buffer, size_t* source_length_ptr, size_t source_buffer_length)
27
+ static inline brs_ext_result_t read_file(FILE* source_file, brs_ext_byte_t* source_buffer, size_t* source_length_ptr, size_t source_buffer_length)
29
28
  {
30
29
  size_t read_length = fread(source_buffer, 1, source_buffer_length, source_file);
31
30
  if (read_length == 0 && feof(source_file)) {
@@ -41,7 +40,7 @@ static inline brs_ext_result_t read_file(FILE* source_file, uint8_t* source_buff
41
40
  return 0;
42
41
  }
43
42
 
44
- static inline brs_ext_result_t write_file(FILE* destination_file, uint8_t* destination_buffer, size_t destination_length)
43
+ static inline brs_ext_result_t write_file(FILE* destination_file, brs_ext_byte_t* destination_buffer, size_t destination_length)
45
44
  {
46
45
  size_t written_length = fwrite(destination_buffer, 1, destination_length, destination_file);
47
46
  if (written_length != destination_length) {
@@ -54,15 +53,15 @@ static inline brs_ext_result_t write_file(FILE* destination_file, uint8_t* desti
54
53
  // -- buffer --
55
54
 
56
55
  static inline brs_ext_result_t create_buffers(
57
- uint8_t** source_buffer_ptr, size_t source_buffer_length,
58
- uint8_t** destination_buffer_ptr, size_t destination_buffer_length)
56
+ brs_ext_byte_t** source_buffer_ptr, size_t source_buffer_length,
57
+ brs_ext_byte_t** destination_buffer_ptr, size_t destination_buffer_length)
59
58
  {
60
- uint8_t* source_buffer = malloc(source_buffer_length);
59
+ brs_ext_byte_t* source_buffer = malloc(source_buffer_length);
61
60
  if (source_buffer == NULL) {
62
61
  return BRS_EXT_ERROR_ALLOCATE_FAILED;
63
62
  }
64
63
 
65
- uint8_t* destination_buffer = malloc(destination_buffer_length);
64
+ brs_ext_byte_t* destination_buffer = malloc(destination_buffer_length);
66
65
  if (destination_buffer == NULL) {
67
66
  free(source_buffer);
68
67
  return BRS_EXT_ERROR_ALLOCATE_FAILED;
@@ -81,12 +80,12 @@ static inline brs_ext_result_t create_buffers(
81
80
  // Algorithm can use same buffer again.
82
81
 
83
82
  static inline brs_ext_result_t read_more_source(
84
- FILE* source_file,
85
- const uint8_t** source_ptr, size_t* source_length_ptr,
86
- uint8_t* source_buffer, size_t source_buffer_length)
83
+ FILE* source_file,
84
+ const brs_ext_byte_t** source_ptr, size_t* source_length_ptr,
85
+ brs_ext_byte_t* source_buffer, size_t source_buffer_length)
87
86
  {
88
- const uint8_t* source = *source_ptr;
89
- size_t source_length = *source_length_ptr;
87
+ const brs_ext_byte_t* source = *source_ptr;
88
+ size_t source_length = *source_length_ptr;
90
89
 
91
90
  if (source != source_buffer) {
92
91
  if (source_length != 0) {
@@ -103,8 +102,8 @@ static inline brs_ext_result_t read_more_source(
103
102
  return BRS_EXT_ERROR_NOT_ENOUGH_SOURCE_BUFFER;
104
103
  }
105
104
 
106
- uint8_t* remaining_source_buffer = source_buffer + source_length;
107
- size_t new_source_length;
105
+ brs_ext_byte_t* remaining_source_buffer = source_buffer + source_length;
106
+ size_t new_source_length;
108
107
 
109
108
  brs_ext_result_t ext_result = read_file(source_file, remaining_source_buffer, &new_source_length, remaining_source_buffer_length);
110
109
  if (ext_result != 0) {
@@ -116,37 +115,51 @@ static inline brs_ext_result_t read_more_source(
116
115
  return 0;
117
116
  }
118
117
 
119
- #define BUFFERED_READ_SOURCE(function, ...) \
120
- while (true) { \
121
- ext_result = function(__VA_ARGS__); \
122
- if (ext_result != 0) { \
123
- return ext_result; \
124
- } \
125
- \
126
- ext_result = read_more_source( \
127
- source_file, \
128
- &source, &source_length, \
129
- source_buffer, source_buffer_length); \
130
- \
131
- if (ext_result == BRS_EXT_FILE_READ_FINISHED) { \
132
- if (source_length != 0) { \
133
- /* Brotli wont provide any remainder by design. */ \
134
- return BRS_EXT_ERROR_READ_IO; \
135
- } \
136
- break; \
137
- } \
138
- else if (ext_result != 0) { \
139
- return ext_result; \
140
- } \
141
- }
118
+ #define BUFFERED_READ_SOURCE(function, ...) \
119
+ do { \
120
+ bool is_function_called = false; \
121
+ \
122
+ while (true) { \
123
+ ext_result = read_more_source( \
124
+ source_file, \
125
+ &source, &source_length, \
126
+ source_buffer, source_buffer_length); \
127
+ \
128
+ if (ext_result == BRS_EXT_FILE_READ_FINISHED) { \
129
+ if (source_length != 0) { \
130
+ /* Brotli won't provide any remainder by design. */ \
131
+ return BRS_EXT_ERROR_READ_IO; \
132
+ } \
133
+ break; \
134
+ } \
135
+ else if (ext_result != 0) { \
136
+ return ext_result; \
137
+ } \
138
+ \
139
+ ext_result = function(__VA_ARGS__); \
140
+ if (ext_result != 0) { \
141
+ return ext_result; \
142
+ } \
143
+ \
144
+ is_function_called = true; \
145
+ } \
146
+ \
147
+ if (!is_function_called) { \
148
+ /* Function should be called at least once. */ \
149
+ ext_result = function(__VA_ARGS__); \
150
+ if (ext_result != 0) { \
151
+ return ext_result; \
152
+ } \
153
+ } \
154
+ } while (false);
142
155
 
143
156
  // Algorithm has written data into destination buffer.
144
157
  // We need to write this data into file.
145
158
  // Than algorithm can use same buffer again.
146
159
 
147
160
  static inline brs_ext_result_t flush_destination_buffer(
148
- FILE* destination_file,
149
- uint8_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
161
+ FILE* destination_file,
162
+ brs_ext_byte_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
150
163
  {
151
164
  if (*destination_length_ptr == 0) {
152
165
  // We want to write more data at once, than buffer has.
@@ -163,7 +176,7 @@ static inline brs_ext_result_t flush_destination_buffer(
163
176
  return 0;
164
177
  }
165
178
 
166
- static inline brs_ext_result_t write_remaining_destination(FILE* destination_file, uint8_t* destination_buffer, size_t destination_length)
179
+ static inline brs_ext_result_t write_remaining_destination(FILE* destination_file, brs_ext_byte_t* destination_buffer, size_t destination_length)
167
180
  {
168
181
  if (destination_length == 0) {
169
182
  return 0;
@@ -188,18 +201,19 @@ static inline brs_ext_result_t write_remaining_destination(FILE* destination_fil
188
201
  // -- compress --
189
202
 
190
203
  static inline brs_ext_result_t buffered_compress(
191
- BrotliEncoderState* state_ptr,
192
- const uint8_t** source_ptr, size_t* source_length_ptr,
193
- FILE* destination_file, uint8_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
204
+ BrotliEncoderState* state_ptr,
205
+ const brs_ext_byte_t** source_ptr, size_t* source_length_ptr,
206
+ FILE* destination_file, brs_ext_byte_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
194
207
  {
208
+ BROTLI_BOOL result;
195
209
  brs_ext_result_t ext_result;
196
210
 
197
211
  while (true) {
198
- uint8_t* remaining_destination_buffer = destination_buffer + *destination_length_ptr;
199
- size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
200
- size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
212
+ brs_ext_byte_t* remaining_destination_buffer = destination_buffer + *destination_length_ptr;
213
+ size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
214
+ size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
201
215
 
202
- BROTLI_BOOL result = BrotliEncoderCompressStream(
216
+ result = BrotliEncoderCompressStream(
203
217
  state_ptr,
204
218
  BROTLI_OPERATION_PROCESS,
205
219
  source_length_ptr, source_ptr,
@@ -232,19 +246,20 @@ static inline brs_ext_result_t buffered_compress(
232
246
 
233
247
  static inline brs_ext_result_t buffered_compressor_finish(
234
248
  BrotliEncoderState* state_ptr,
235
- FILE* destination_file, uint8_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
249
+ FILE* destination_file, brs_ext_byte_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
236
250
  {
251
+ BROTLI_BOOL result;
237
252
  brs_ext_result_t ext_result;
238
253
 
239
- const uint8_t* source = NULL;
240
- size_t source_length = 0;
254
+ const brs_ext_byte_t* source = NULL;
255
+ size_t source_length = 0;
241
256
 
242
257
  while (true) {
243
- uint8_t* remaining_destination_buffer = destination_buffer + *destination_length_ptr;
244
- size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
245
- size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
258
+ brs_ext_byte_t* remaining_destination_buffer = destination_buffer + *destination_length_ptr;
259
+ size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
260
+ size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
246
261
 
247
- BROTLI_BOOL result = BrotliEncoderCompressStream(
262
+ result = BrotliEncoderCompressStream(
248
263
  state_ptr,
249
264
  BROTLI_OPERATION_FINISH,
250
265
  &source_length, &source,
@@ -277,14 +292,14 @@ static inline brs_ext_result_t buffered_compressor_finish(
277
292
 
278
293
  static inline brs_ext_result_t compress(
279
294
  BrotliEncoderState* state_ptr,
280
- FILE* source_file, uint8_t* source_buffer, size_t source_buffer_length,
281
- FILE* destination_file, uint8_t* destination_buffer, size_t destination_buffer_length)
295
+ FILE* source_file, brs_ext_byte_t* source_buffer, size_t source_buffer_length,
296
+ FILE* destination_file, brs_ext_byte_t* destination_buffer, size_t destination_buffer_length)
282
297
  {
283
298
  brs_ext_result_t ext_result;
284
299
 
285
- const uint8_t* source = source_buffer;
286
- size_t source_length = 0;
287
- size_t destination_length = 0;
300
+ const brs_ext_byte_t* source = source_buffer;
301
+ size_t source_length = 0;
302
+ size_t destination_length = 0;
288
303
 
289
304
  BUFFERED_READ_SOURCE(
290
305
  buffered_compress,
@@ -330,8 +345,8 @@ VALUE brs_ext_compress_io(VALUE BRS_EXT_UNUSED(self), VALUE source, VALUE destin
330
345
  destination_buffer_length = BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR;
331
346
  }
332
347
 
333
- uint8_t* source_buffer;
334
- uint8_t* destination_buffer;
348
+ brs_ext_byte_t* source_buffer;
349
+ brs_ext_byte_t* destination_buffer;
335
350
 
336
351
  ext_result = create_buffers(
337
352
  &source_buffer, source_buffer_length,
@@ -364,18 +379,19 @@ VALUE brs_ext_compress_io(VALUE BRS_EXT_UNUSED(self), VALUE source, VALUE destin
364
379
  // -- decompress --
365
380
 
366
381
  static inline brs_ext_result_t buffered_decompress(
367
- BrotliDecoderState* state_ptr,
368
- const uint8_t** source_ptr, size_t* source_length_ptr,
369
- FILE* destination_file, uint8_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
382
+ BrotliDecoderState* state_ptr,
383
+ const brs_ext_byte_t** source_ptr, size_t* source_length_ptr,
384
+ FILE* destination_file, brs_ext_byte_t* destination_buffer, size_t* destination_length_ptr, size_t destination_buffer_length)
370
385
  {
371
- brs_ext_result_t ext_result;
386
+ BrotliDecoderResult result;
387
+ brs_ext_result_t ext_result;
372
388
 
373
389
  while (true) {
374
- uint8_t* remaining_destination_buffer = destination_buffer + *destination_length_ptr;
375
- size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
376
- size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
390
+ brs_ext_byte_t* remaining_destination_buffer = destination_buffer + *destination_length_ptr;
391
+ size_t remaining_destination_buffer_length = destination_buffer_length - *destination_length_ptr;
392
+ size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
377
393
 
378
- BrotliDecoderResult result = BrotliDecoderDecompressStream(
394
+ result = BrotliDecoderDecompressStream(
379
395
  state_ptr,
380
396
  source_length_ptr, source_ptr,
381
397
  &remaining_destination_buffer_length, &remaining_destination_buffer,
@@ -411,14 +427,14 @@ static inline brs_ext_result_t buffered_decompress(
411
427
 
412
428
  static inline brs_ext_result_t decompress(
413
429
  BrotliDecoderState* state_ptr,
414
- FILE* source_file, uint8_t* source_buffer, size_t source_buffer_length,
415
- FILE* destination_file, uint8_t* destination_buffer, size_t destination_buffer_length)
430
+ FILE* source_file, brs_ext_byte_t* source_buffer, size_t source_buffer_length,
431
+ FILE* destination_file, brs_ext_byte_t* destination_buffer, size_t destination_buffer_length)
416
432
  {
417
433
  brs_ext_result_t ext_result;
418
434
 
419
- const uint8_t* source = source_buffer;
420
- size_t source_length = 0;
421
- size_t destination_length = 0;
435
+ const brs_ext_byte_t* source = source_buffer;
436
+ size_t source_length = 0;
437
+ size_t destination_length = 0;
422
438
 
423
439
  BUFFERED_READ_SOURCE(
424
440
  buffered_decompress,
@@ -456,8 +472,8 @@ VALUE brs_ext_decompress_io(VALUE BRS_EXT_UNUSED(self), VALUE source, VALUE dest
456
472
  destination_buffer_length = BRS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR;
457
473
  }
458
474
 
459
- uint8_t* source_buffer;
460
- uint8_t* destination_buffer;
475
+ brs_ext_byte_t* source_buffer;
476
+ brs_ext_byte_t* destination_buffer;
461
477
 
462
478
  ext_result = create_buffers(
463
479
  &source_buffer, source_buffer_length,