ruby-lzws 1.1.3 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68638ae503703523496d753cb9c343dcfd258eb0a1cbf2da1c4fa0888df53d05
4
- data.tar.gz: cdbfd18419ca03bb13c3db8908b5afed42500ff40d45bd412191fca723b3e51b
3
+ metadata.gz: 62d885a3a75f291ea4b808da4ef4e47a68574e74dae8fe39aad61d228a62643c
4
+ data.tar.gz: 90e5fc29ea554392dcf93bb391a38361707c14306099b6654765e399d111ea9d
5
5
  SHA512:
6
- metadata.gz: bfa3497c91ca513e97a82d540d3302cb330d7addadda117eab1fe3f7d615bbb774f3bf00f037c8cb4dcd0f2abb9ec92e240459eca7fab5f9689307f70130c38c
7
- data.tar.gz: beef34ff8bdf2f20ab9ab9dcd797a7587d4d74c79e82dea0eff3aa64cd11e1222eefab566a6d45baa6e9ee34427ca8dcfd46ab6769bedc44a6758d2276527627
6
+ metadata.gz: 66c07c08d7094be0e9f2d802c01796529e0c14bcde067752aa629d7e3337218e0d6a08e7cfe08725659097fb0e3be90e7565a872a3c79dc96813afa6b235e4ab
7
+ data.tar.gz: a1d74a3408881c23f816818931685ec084bd2a0e9c114be212f8a059e37af8da882e9235f3780524e5e67557b3c9945f33b3ecab8535768e4737e972fc724d87
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # Ruby bindings for lzws library
2
2
 
3
- | Travis | AppVeyor | Cirrus | Circle | Codecov |
4
- | :---: | :---: | :---: | :---: | :---: |
5
- | [![Travis test status](https://travis-ci.com/andrew-aladev/ruby-lzws.svg?branch=master)](https://travis-ci.com/andrew-aladev/ruby-lzws) | [![AppVeyor test status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ruby-lzws?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ruby-lzws/branch/master) | [![Cirrus test status](https://api.cirrus-ci.com/github/andrew-aladev/ruby-lzws.svg?branch=master)](https://cirrus-ci.com/github/andrew-aladev/ruby-lzws) | [![Circle test status](https://circleci.com/gh/andrew-aladev/ruby-lzws/tree/master.svg?style=shield)](https://circleci.com/gh/andrew-aladev/ruby-lzws/tree/master) | [![Codecov](https://codecov.io/gh/andrew-aladev/ruby-lzws/branch/master/graph/badge.svg)](https://codecov.io/gh/andrew-aladev/ruby-lzws) |
3
+ | Travis | AppVeyor | Circle | Codecov |
4
+ | :---: | :---: | :---: | :---: |
5
+ | [![Travis test status](https://travis-ci.com/andrew-aladev/ruby-lzws.svg?branch=master)](https://travis-ci.com/andrew-aladev/ruby-lzws) | [![AppVeyor test status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ruby-lzws?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ruby-lzws/branch/master) | [![Circle test status](https://circleci.com/gh/andrew-aladev/ruby-lzws/tree/master.svg?style=shield)](https://circleci.com/gh/andrew-aladev/ruby-lzws/tree/master) | [![Codecov](https://codecov.io/gh/andrew-aladev/ruby-lzws/branch/master/graph/badge.svg)](https://codecov.io/gh/andrew-aladev/ruby-lzws) |
6
6
 
7
7
  See [lzws library](https://github.com/andrew-aladev/lzws).
8
8
 
9
9
  ## Installation
10
10
 
11
- Please install lzws library first, use latest 1.3.0+ version.
11
+ Please install lzws library first, use latest 1.4.0+ version.
12
12
 
13
13
  ```sh
14
14
  gem install ruby-lzws
@@ -21,6 +21,8 @@ rake gem
21
21
  gem install pkg/ruby-lzws-*.gem
22
22
  ```
23
23
 
24
+ You can also use [overlay](https://github.com/andrew-aladev/overlay) for gentoo.
25
+
24
26
  ## Usage
25
27
 
26
28
  There are simple APIs: `String` and `File`. Also you can use generic streaming API: `Stream::Writer` and `Stream::Reader`.
@@ -36,6 +38,27 @@ LZWS::File.decompress "file.txt.Z", "file.txt"
36
38
 
37
39
  LZWS::Stream::Writer.open("file.txt.Z") { |writer| writer << "TOBEORNOTTOBEORTOBEORNOT" }
38
40
  puts LZWS::Stream::Reader.open("file.txt.Z") { |reader| reader.read }
41
+
42
+ writer = LZWS::Stream::Writer.new output_socket
43
+ begin
44
+ bytes_written = writer.write_nonblock "TOBEORNOTTOBEORTOBEORNOT"
45
+ # handle "bytes_written"
46
+ rescue IO::WaitWritable
47
+ # handle wait
48
+ ensure
49
+ writer.close
50
+ end
51
+
52
+ reader = LZWS::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
39
62
  ```
40
63
 
41
64
  You can create and read `tar.Z` archives with `minitar` for example.
@@ -63,59 +86,26 @@ end
63
86
 
64
87
  ## Options
65
88
 
66
- Each API supports several options:
67
-
68
- ```
69
- :source_buffer_length
70
- :destination_buffer_length
71
- ```
89
+ | Option | Values | Default | Description |
90
+ |-----------------------------|------------|----------|-------------|
91
+ | `source_buffer_length` | 0, 2 - inf | 0 (auto) | internal buffer length for source data |
92
+ | `destination_buffer_length` | 0, 2 - inf | 0 (auto) | internal buffer length for description data |
93
+ | `max_code_bit_length` | 9 - 16 | 16 | max code bit length |
94
+ | `block_mode` | true/false | true | enables block mode |
95
+ | `without_magic_header` | true/false | false | disables magic header |
96
+ | `msb` | true/false | false | enables most significant bit mode |
97
+ | `unaligned_bit_groups` | true/false | false | enables unaligned bit groups |
98
+ | `quiet` | true/false | false | disables lzws library logging |
72
99
 
73
100
  There are internal buffers for compressed and decompressed data.
74
- For example you want to use 1 KB as source buffer length for compressor - please use 256 B as destination buffer length.
75
- You want to use 256 B as source buffer length for decompressor - please use 1 KB as destination buffer length.
76
-
77
- Values: 0, 2 - infinity, default value: 0.
78
- 0 means automatic buffer length selection.
79
- 1 byte is not enough, 2 bytes is minimal buffer length.
80
-
81
- ```
82
- :max_code_bit_length
83
- ```
84
-
85
- Values: `LZWS::Option::LOWEST_MAX_CODE_BIT_LENGTH` - `LZWS::Option::BIGGEST_MAX_CODE_BIT_LENGTH`, default value: `LZWS::Option::BIGGEST_MAX_CODE_BIT_LENGTH`.
86
-
87
- ```
88
- :block_mode
89
- ```
90
-
91
- Values: true/false, default value: true.
92
-
93
- ```
94
- :without_magic_header
95
- ```
96
-
97
- Values: true/false, default value: false.
98
-
99
- ```
100
- :msb
101
- ```
102
-
103
- Values: true/false, default value: false.
104
-
105
- ```
106
- :unaligned_bit_groups
107
- ```
108
-
109
- Values: true/false, default value: false.
110
-
111
- ```
112
- :quiet
113
- ```
101
+ For example you want to use 1 KB as `source_buffer_length` for compressor - please use 256 B as `destination_buffer_length`.
102
+ You want to use 256 B as `source_buffer_length` for decompressor - please use 1 KB as `destination_buffer_length`.
114
103
 
115
- Values: true/false, default value: false.
116
- Disables lzws library logging.
104
+ You can also read lzws docs for more info about options.
117
105
 
118
- Please read lzws docs for more info about options.
106
+ | Option | Related constants |
107
+ |-----------------------|-------------------|
108
+ | `max_code_bit_length` | `LZWS::Option::LOWEST_MAX_CODE_BIT_LENGTH` = 9, `LZWS::Option::BIGGEST_MAX_CODE_BIT_LENGTH` = 16 |
119
109
 
120
110
  Possible compressor options:
121
111
  ```
@@ -186,7 +176,7 @@ File maintains both source and destination buffers, it accepts both `source_buff
186
176
 
187
177
  ## Stream::Writer
188
178
 
189
- Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
179
+ Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
190
180
 
191
181
  Writer maintains destination buffer only, so it accepts `destination_buffer_length` option only.
192
182
 
@@ -220,7 +210,7 @@ Set another encodings, `nil` is just for compatibility with `IO`.
220
210
  #tell
221
211
  ```
222
212
 
223
- See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
213
+ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
224
214
 
225
215
  ```
226
216
  #write(*objects)
@@ -230,7 +220,7 @@ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
230
220
  #closed?
231
221
  ```
232
222
 
233
- See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
223
+ See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
234
224
 
235
225
  ```
236
226
  #write_nonblock(object, *options)
@@ -252,11 +242,11 @@ Behaviour is the same as `IO#write_nonblock` method.
252
242
  #puts(*objects)
253
243
  ```
254
244
 
255
- Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
245
+ Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
256
246
 
257
247
  ## Stream::Reader
258
248
 
259
- Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html).
249
+ Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html).
260
250
 
261
251
  Reader maintains both source and destination buffers, it accepts both `source_buffer_length` and `destination_buffer_length` options.
262
252
 
@@ -291,7 +281,7 @@ Set another encodings.
291
281
  #tell
292
282
  ```
293
283
 
294
- See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
284
+ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
295
285
 
296
286
  ```
297
287
  #read(bytes_to_read = nil, out_buffer = nil)
@@ -301,14 +291,14 @@ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
301
291
  #closed?
302
292
  ```
303
293
 
304
- See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
294
+ See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
305
295
 
306
296
  ```
307
297
  #readpartial(bytes_to_read = nil, out_buffer = nil)
308
298
  #read_nonblock(bytes_to_read, out_buffer = nil, *options)
309
299
  ```
310
300
 
311
- See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
301
+ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
312
302
 
313
303
  ```
314
304
  #getbyte
@@ -331,13 +321,13 @@ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
331
321
  #ungetline(line)
332
322
  ```
333
323
 
334
- Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
324
+ Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.7.0/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
335
325
 
336
326
  ## CI
337
327
 
338
- Travis and Appveyor CI uses [scripts/ci_test.sh](scripts/ci_test.sh) directly.
339
- Cirrus and Circle CI uses prebuilt [scripts/test-images](scripts/test-images).
340
- Cirrus CI uses amd64 image, Circle CI - i686.
328
+ See universal test script [scripts/ci_test.sh](scripts/ci_test.sh) for CI.
329
+ Please visit [scripts/test-images](scripts/test-images).
330
+ You can run this test script using many native and cross images.
341
331
 
342
332
  ## License
343
333
 
@@ -13,10 +13,10 @@ end
13
13
 
14
14
  require_header "lzws/buffer.h"
15
15
  require_header "lzws/common.h", %w[lzws_result_t]
16
- require_header "lzws/compressor/common.h"
16
+ require_header "lzws/compressor/common.h", %w[lzws_compressor_options_t]
17
17
  require_header "lzws/compressor/main.h"
18
18
  require_header "lzws/compressor/state.h", %w[lzws_compressor_state_t]
19
- require_header "lzws/decompressor/common.h"
19
+ require_header "lzws/decompressor/common.h", %w[lzws_decompressor_options_t]
20
20
  require_header "lzws/decompressor/main.h"
21
21
  require_header "lzws/decompressor/state.h", %w[lzws_decompressor_state_t]
22
22
  require_header "lzws/file.h"
@@ -66,6 +66,13 @@ $srcs = %w[
66
66
  .map { |name| "src/#{extension_name}/#{name}.c" }
67
67
  .freeze
68
68
 
69
+ # Removing library duplicates.
70
+ $libs = $libs.split(%r{\s})
71
+ .reject(&:empty?)
72
+ .sort
73
+ .uniq
74
+ .join " "
75
+
69
76
  if ENV["CI"] || ENV["COVERAGE"]
70
77
  $CFLAGS << " --coverage"
71
78
  $LDFLAGS << " --coverage"
@@ -16,6 +16,7 @@ VALUE lzws_ext_resize_string_buffer(VALUE args)
16
16
  {
17
17
  VALUE buffer = rb_ary_entry(args, 0);
18
18
  VALUE length = rb_ary_entry(args, 1);
19
+
19
20
  return rb_str_resize(buffer, NUM2SIZET(length));
20
21
  }
21
22
 
@@ -23,8 +24,21 @@ void lzws_ext_buffer_exports(VALUE root_module)
23
24
  {
24
25
  VALUE module = rb_define_module_under(root_module, "Buffer");
25
26
 
26
- rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(LZWS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
27
- rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(LZWS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
28
- rb_define_const(module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(LZWS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
29
- rb_define_const(module, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR", SIZET2NUM(LZWS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
27
+ rb_define_const(
28
+ module, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", SIZET2NUM(LZWS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
29
+
30
+ rb_define_const(
31
+ module,
32
+ "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR",
33
+ SIZET2NUM(LZWS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
34
+
35
+ rb_define_const(
36
+ module,
37
+ "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR",
38
+ SIZET2NUM(LZWS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
39
+
40
+ rb_define_const(
41
+ module,
42
+ "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR",
43
+ SIZET2NUM(LZWS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
30
44
  }
@@ -10,4 +10,7 @@
10
10
 
11
11
  typedef uint_fast8_t lzws_ext_result_t;
12
12
 
13
+ typedef uint8_t lzws_ext_byte_t;
14
+ typedef uint_fast8_t lzws_ext_byte_fast_t;
15
+
13
16
  #endif // LZWS_EXT_COMMON_H
@@ -3,7 +3,6 @@
3
3
 
4
4
  #include "lzws_ext/error.h"
5
5
 
6
- #include "lzws_ext/common.h"
7
6
  #include "ruby.h"
8
7
 
9
8
  static inline NORETURN(void raise(const char* name, const char* description))
@@ -9,7 +9,8 @@
9
9
 
10
10
  // Results for errors listed in "lib/lzws/error" used in c extension.
11
11
 
12
- enum {
12
+ enum
13
+ {
13
14
  LZWS_EXT_ERROR_ALLOCATE_FAILED = 1,
14
15
  LZWS_EXT_ERROR_VALIDATE_FAILED,
15
16
 
@@ -1,17 +1,15 @@
1
1
  // Ruby bindings for lzws library.
2
2
  // Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
- #include "ruby/io.h"
4
+ #include "lzws_ext/io.h"
5
5
 
6
- #include <lzws/common.h>
7
6
  #include <lzws/file.h>
8
7
 
9
- #include "lzws_ext/common.h"
10
8
  #include "lzws_ext/error.h"
11
- #include "lzws_ext/io.h"
12
9
  #include "lzws_ext/macro.h"
13
10
  #include "lzws_ext/option.h"
14
11
  #include "ruby.h"
12
+ #include "ruby/io.h"
15
13
 
16
14
  #define GET_FILE(target) \
17
15
  Check_Type(target, T_FILE); \
@@ -59,9 +57,7 @@ VALUE lzws_ext_compress_io(VALUE LZWS_EXT_UNUSED(self), VALUE source, VALUE dest
59
57
  LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, destination_buffer_length);
60
58
 
61
59
  lzws_result_t result = lzws_compress_file(
62
- source_file, source_buffer_length,
63
- destination_file, destination_buffer_length,
64
- without_magic_header, max_code_bit_length, block_mode, msb, unaligned_bit_groups, quiet);
60
+ source_file, source_buffer_length, destination_file, destination_buffer_length, &compressor_options);
65
61
 
66
62
  if (result != 0) {
67
63
  lzws_ext_raise_error(get_file_error(result));
@@ -83,9 +79,7 @@ VALUE lzws_ext_decompress_io(VALUE LZWS_EXT_UNUSED(self), VALUE source, VALUE de
83
79
  LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, destination_buffer_length);
84
80
 
85
81
  lzws_result_t result = lzws_decompress_file(
86
- source_file, source_buffer_length,
87
- destination_file, destination_buffer_length,
88
- without_magic_header, msb, unaligned_bit_groups, quiet);
82
+ source_file, source_buffer_length, destination_file, destination_buffer_length, &decompressor_options);
89
83
 
90
84
  if (result != 0) {
91
85
  lzws_ext_raise_error(get_file_error(result));
@@ -2,8 +2,8 @@
2
2
  // Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
4
  #include "lzws_ext/buffer.h"
5
- #include "lzws_ext/common.h"
6
5
  #include "lzws_ext/io.h"
6
+ #include "lzws_ext/option.h"
7
7
  #include "lzws_ext/stream/compressor.h"
8
8
  #include "lzws_ext/stream/decompressor.h"
9
9
  #include "lzws_ext/string.h"
@@ -15,6 +15,7 @@ void Init_lzws_ext()
15
15
 
16
16
  lzws_ext_buffer_exports(root_module);
17
17
  lzws_ext_io_exports(root_module);
18
+ lzws_ext_option_exports(root_module);
18
19
  lzws_ext_compressor_exports(root_module);
19
20
  lzws_ext_decompressor_exports(root_module);
20
21
  lzws_ext_string_exports(root_module);
@@ -3,36 +3,41 @@
3
3
 
4
4
  #include "lzws_ext/option.h"
5
5
 
6
- #include <stdbool.h>
7
- #include <stdlib.h>
8
-
9
6
  #include "lzws_ext/error.h"
10
7
  #include "ruby.h"
11
8
 
9
+ // -- values --
10
+
12
11
  static inline VALUE get_raw_option_value(VALUE options, const char* name)
13
12
  {
14
13
  return rb_funcall(options, rb_intern("[]"), 1, ID2SYM(rb_intern(name)));
15
14
  }
16
15
 
17
- bool lzws_ext_get_bool_option_value(VALUE options, const char* name)
16
+ void lzws_ext_get_bool_option(VALUE options, bool* option, const char* name)
18
17
  {
19
18
  VALUE raw_value = get_raw_option_value(options, name);
19
+ if (raw_value == Qnil) {
20
+ return;
21
+ }
20
22
 
21
23
  int raw_type = TYPE(raw_value);
22
24
  if (raw_type != T_TRUE && raw_type != T_FALSE) {
23
25
  lzws_ext_raise_error(LZWS_EXT_ERROR_VALIDATE_FAILED);
24
26
  }
25
27
 
26
- return raw_type == T_TRUE;
28
+ *option = raw_type == T_TRUE;
27
29
  }
28
30
 
29
- unsigned int lzws_ext_get_uint_option_value(VALUE options, const char* name)
31
+ void lzws_ext_get_max_code_bit_length_option(VALUE options, lzws_byte_fast_t* option, const char* name)
30
32
  {
31
33
  VALUE raw_value = get_raw_option_value(options, name);
34
+ if (raw_value == Qnil) {
35
+ return;
36
+ }
32
37
 
33
38
  Check_Type(raw_value, T_FIXNUM);
34
39
 
35
- return NUM2UINT(raw_value);
40
+ *option = NUM2UINT(raw_value);
36
41
  }
37
42
 
38
43
  size_t lzws_ext_get_size_option_value(VALUE options, const char* name)
@@ -43,3 +48,13 @@ size_t lzws_ext_get_size_option_value(VALUE options, const char* name)
43
48
 
44
49
  return NUM2SIZET(raw_value);
45
50
  }
51
+
52
+ // -- exports --
53
+
54
+ void lzws_ext_option_exports(VALUE root_module)
55
+ {
56
+ VALUE module = rb_define_module_under(root_module, "Option");
57
+
58
+ rb_define_const(module, "LOWEST_MAX_CODE_BIT_LENGTH", UINT2NUM(LZWS_LOWEST_MAX_CODE_BIT_LENGTH));
59
+ rb_define_const(module, "BIGGEST_MAX_CODE_BIT_LENGTH", UINT2NUM(LZWS_BIGGEST_MAX_CODE_BIT_LENGTH));
60
+ }
@@ -4,39 +4,44 @@
4
4
  #if !defined(LZWS_EXT_OPTIONS_H)
5
5
  #define LZWS_EXT_OPTIONS_H
6
6
 
7
+ #include <lzws/compressor/common.h>
8
+ #include <lzws/decompressor/common.h>
7
9
  #include <stdbool.h>
8
10
  #include <stdlib.h>
9
11
 
10
12
  #include "ruby.h"
11
13
 
12
- bool lzws_ext_get_bool_option_value(VALUE options, const char* name);
13
- unsigned int lzws_ext_get_uint_option_value(VALUE options, const char* name);
14
- size_t lzws_ext_get_size_option_value(VALUE options, const char* name);
14
+ void lzws_ext_get_bool_option(VALUE options, bool* option, const char* name);
15
+ void lzws_ext_get_max_code_bit_length_option(VALUE options, lzws_byte_fast_t* option, const char* name);
15
16
 
16
- #define LZWS_EXT_GET_BOOL_OPTION(options, name) \
17
- bool name = lzws_ext_get_bool_option_value(options, #name);
17
+ #define LZWS_EXT_GET_BOOL_OPTION(options, target_options, name) \
18
+ lzws_ext_get_bool_option(options, &target_options.name, #name);
18
19
 
19
- #define LZWS_EXT_GET_UINT_OPTION(options, type, name) \
20
- type name = lzws_ext_get_uint_option_value(options, #name);
20
+ #define LZWS_EXT_GET_MAX_CODE_BIT_LENGTH_OPTION(options, target_options, name) \
21
+ lzws_ext_get_max_code_bit_length_option(options, &target_options.name, #name);
21
22
 
22
- #define LZWS_EXT_GET_SIZE_OPTION(options, name) \
23
- size_t name = lzws_ext_get_size_option_value(options, #name);
23
+ #define LZWS_EXT_GET_COMPRESSOR_OPTIONS(options) \
24
+ lzws_compressor_options_t compressor_options = LZWS_COMPRESSOR_DEFAULT_OPTIONS; \
25
+ \
26
+ LZWS_EXT_GET_BOOL_OPTION(options, compressor_options, without_magic_header); \
27
+ LZWS_EXT_GET_MAX_CODE_BIT_LENGTH_OPTION(options, compressor_options, max_code_bit_length); \
28
+ LZWS_EXT_GET_BOOL_OPTION(options, compressor_options, block_mode); \
29
+ LZWS_EXT_GET_BOOL_OPTION(options, compressor_options, msb); \
30
+ LZWS_EXT_GET_BOOL_OPTION(options, compressor_options, unaligned_bit_groups); \
31
+ LZWS_EXT_GET_BOOL_OPTION(options, compressor_options, quiet);
24
32
 
25
- #define LZWS_EXT_GET_COMPRESSOR_OPTIONS(options) \
26
- LZWS_EXT_GET_BOOL_OPTION(options, without_magic_header); \
27
- LZWS_EXT_GET_UINT_OPTION(options, uint_fast8_t, max_code_bit_length); \
28
- LZWS_EXT_GET_BOOL_OPTION(options, block_mode); \
29
- LZWS_EXT_GET_BOOL_OPTION(options, msb); \
30
- LZWS_EXT_GET_BOOL_OPTION(options, unaligned_bit_groups); \
31
- LZWS_EXT_GET_BOOL_OPTION(options, quiet);
33
+ #define LZWS_EXT_GET_DECOMPRESSOR_OPTIONS(options) \
34
+ lzws_decompressor_options_t decompressor_options = LZWS_DECOMPRESSOR_DEFAULT_OPTIONS; \
35
+ \
36
+ LZWS_EXT_GET_BOOL_OPTION(options, decompressor_options, without_magic_header); \
37
+ LZWS_EXT_GET_BOOL_OPTION(options, decompressor_options, msb); \
38
+ LZWS_EXT_GET_BOOL_OPTION(options, decompressor_options, unaligned_bit_groups); \
39
+ LZWS_EXT_GET_BOOL_OPTION(options, decompressor_options, quiet);
32
40
 
33
- #define LZWS_EXT_GET_DECOMPRESSOR_OPTIONS(options) \
34
- LZWS_EXT_GET_BOOL_OPTION(options, without_magic_header); \
35
- LZWS_EXT_GET_BOOL_OPTION(options, msb); \
36
- LZWS_EXT_GET_BOOL_OPTION(options, unaligned_bit_groups); \
37
- LZWS_EXT_GET_BOOL_OPTION(options, quiet);
41
+ size_t lzws_ext_get_size_option_value(VALUE options, const char* name);
38
42
 
39
- #define LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, name) \
40
- LZWS_EXT_GET_SIZE_OPTION(options, name);
43
+ #define LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, name) size_t name = lzws_ext_get_size_option_value(options, #name);
44
+
45
+ void lzws_ext_option_exports(VALUE root_module);
41
46
 
42
47
  #endif // LZWS_EXT_OPTIONS_H