ruby-lzws 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5e42a999e18187b07931b4c7127274339f8d6eb61490d2c3bcd504180c674d43
4
+ data.tar.gz: 8516d4a94686aeeb2587fcb6bd862dc85ff651ac6e71ae0449e3797a85653f78
5
+ SHA512:
6
+ metadata.gz: 4c8f80f27ac4b2e12bc3628468b94bbebe5b00b688a6dc586013797b5eabb8a1a85da39fdd2ba5d48ed81d71d77df463800f6ef8c285d41bf057c1d306ed2727
7
+ data.tar.gz: f4ced4337b346873836d004c57ca6411f62ba604d32a69001658db3705c4098f1a938e23c2242092bd76e645792824daeba93680ea3d3da5c4529872279095cc
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ Andrew Aladjev
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 AUTHORS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # Ruby bindings for lzws library
2
+
3
+ [![Travis build status](https://travis-ci.org/andrew-aladev/ruby-lzws.svg?branch=master)](https://travis-ci.org/andrew-aladev/ruby-lzws)
4
+ [![AppVeyor build 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)
5
+
6
+ See [lzws library](https://github.com/andrew-aladev/lzws).
7
+
8
+ ## Installation
9
+
10
+ Please install lzws library first.
11
+
12
+ ```sh
13
+ gem install ruby-lzws
14
+ ```
15
+
16
+ You can build it from source.
17
+
18
+ ```sh
19
+ rake gem
20
+ gem install pkg/ruby-lzws-*.gem
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ There are simple APIs: `String` and `File`. Also you can use generic streaming API: `Stream::Writer` and `Stream::Reader`.
26
+
27
+ ```ruby
28
+ require "lzws"
29
+
30
+ data = LZWS::String.compress "TOBEORNOTTOBEORTOBEORNOT"
31
+ puts LZWS::String.decompress(data)
32
+
33
+ LZWS::File.compress "file.txt", "file.txt.Z"
34
+ LZWS::File.decompress "file.txt.Z", "file.txt"
35
+
36
+ LZWS::Stream::Writer.open("file.txt.Z") { |writer| writer << "TOBEORNOTTOBEORTOBEORNOT" }
37
+ puts LZWS::Stream::Reader.open("file.txt.Z") { |reader| reader.read }
38
+ ```
39
+
40
+ You can create and read `tar.Z` archives with `minitar` for example.
41
+ LZWS is fully compatible with UNIX compress (with default options).
42
+
43
+ ```ruby
44
+ require "lzws"
45
+ require "minitar"
46
+
47
+ LZWS::Stream::Writer.open "file.tar.Z" do |writer|
48
+ Minitar::Writer.open writer do |tar|
49
+ tar.add_file_simple "file", :data => "TOBEORNOTTOBEORTOBEORNOT"
50
+ end
51
+ end
52
+
53
+ LZWS::Stream::Reader.open "file.tar.Z" do |reader|
54
+ Minitar::Reader.open reader do |tar|
55
+ tar.each_entry do |entry|
56
+ puts entry.name
57
+ puts entry.read
58
+ end
59
+ end
60
+ end
61
+ ```
62
+
63
+ Each API supports additional options, please read lzws docs for more info.
64
+
65
+ Compressor:
66
+
67
+ ```
68
+ :max_code_bit_length
69
+ :block_mode
70
+ :buffer_length
71
+ :without_magic_header
72
+ :msb
73
+ :unaligned_bit_groups
74
+ :quiet
75
+ ```
76
+
77
+ Decompressor:
78
+
79
+ ```
80
+ :buffer_length
81
+ :without_magic_header
82
+ :msb
83
+ :unaligned_bit_groups
84
+ :quiet
85
+ ```
86
+
87
+ ```ruby
88
+ require "lzws"
89
+
90
+ data = LZWS::String.compress "TOBEORNOTTOBEORTOBEORNOT", :msb => true
91
+ puts LZWS::String.decompress(data, :msb => true)
92
+ ```
93
+
94
+ You can use `Content-Encoding: compress`.
95
+
96
+ ```ruby
97
+ require "lzws"
98
+ require "sinatra"
99
+
100
+ get "/" do
101
+ headers["Content-Encoding"] = "compress"
102
+ LZWS::String.compress "TOBEORNOTTOBEORTOBEORNOT"
103
+ end
104
+ ```
105
+
106
+ ## Docs
107
+
108
+ `LZWS::String`:
109
+
110
+ ```
111
+ ::compress(source, options = {})
112
+ ::decompress(source, options = {})
113
+ ```
114
+
115
+ `LZWS::File`:
116
+
117
+ ```
118
+ ::compress(source, destination, options = {})
119
+ ::decompress(source, destination, options = {})
120
+ ```
121
+
122
+ `LZWS::Stream::Writer` and `LZWS::Stream::Reader`:
123
+
124
+ ```
125
+ ::open(file_path, options = {}, :external_encoding => nil, :internal_encoding => nil, &block)
126
+ #io
127
+ #stat
128
+ #external_encoding
129
+ #internal_encoding
130
+ #pos
131
+ #tell
132
+ #advise
133
+ #set_encoding(external_encoding, internal_encoding, transcode_options)
134
+ #rewind
135
+ #close
136
+ #closed?
137
+ #to_io
138
+ ```
139
+
140
+ `Stream::Writer`:
141
+
142
+ ```
143
+ ::new(destination_io, options = {}, :external_encoding => nil)
144
+ #write(*objects)
145
+ #flush
146
+ #write_nonblock(object, *options)
147
+ #flush_nonblock(*options)
148
+ #rewind_nonblock(*options)
149
+ #close_nonblock(*options)
150
+ #<<(object)
151
+ #print(*objects)
152
+ #printf(*args)
153
+ #putc(object, encoding: ::Encoding::BINARY)
154
+ #puts(*objects)
155
+ ```
156
+
157
+ `Stream::Reader`:
158
+
159
+ ```
160
+ ::new(source_io, options = {}, :external_encoding => nil, :internal_encoding => nil)
161
+ #lineno
162
+ #lineno=
163
+ #read(bytes_to_read = nil, out_buffer = nil)
164
+ #readpartial(bytes_to_read = nil, out_buffer = nil)
165
+ #read_nonblock(bytes_to_read, out_buffer = nil, *options)
166
+ #eof?
167
+ #getbyte
168
+ #each_byte(&block)
169
+ #readbyte
170
+ #ungetbyte(byte)
171
+ #getc
172
+ #readchar
173
+ #each_char(&block)
174
+ #ungetc(char)
175
+ #gets(separator = $OUTPUT_RECORD_SEPARATOR, limit = nil)
176
+ #readline
177
+ #readlines
178
+ #each(&block)
179
+ #each_line(&block)
180
+ #ungetline(line)
181
+ ```
182
+
183
+ `LZWS::Stream::Writer` and `LZWS::Stream::Reader` behaviour is the same as builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.3/libdoc/zlib/rdoc/Zlib/GzipReader.html), [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.3/libdoc/zlib/rdoc/Zlib/GzipWriter.html) and [`IO`](https://ruby-doc.org/core-2.6.3/IO.html).
184
+ Please read these method descriptions in ruby doc.
185
+
186
+ ## License
187
+
188
+ MIT license, see LICENSE and AUTHORS.
data/ext/extconf.rb ADDED
@@ -0,0 +1,77 @@
1
+ # Ruby bindings for lzws library.
2
+ # Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ require "mkmf"
5
+
6
+ def require_header(name)
7
+ abort "Can't find #{name} header" unless find_header name
8
+ end
9
+
10
+ require_header "lzws/buffer.h"
11
+ require_header "lzws/compressor/common.h"
12
+ require_header "lzws/compressor/header.h"
13
+ require_header "lzws/compressor/main.h"
14
+ require_header "lzws/compressor/state.h"
15
+ require_header "lzws/decompressor/common.h"
16
+ require_header "lzws/decompressor/header.h"
17
+ require_header "lzws/decompressor/main.h"
18
+ require_header "lzws/decompressor/state.h"
19
+ require_header "lzws/file.h"
20
+ require_header "lzws/string.h"
21
+
22
+ def require_library(name, functions)
23
+ functions.each do |function|
24
+ abort "Can't find #{name} library and #{function} function" unless find_library name, function
25
+ end
26
+ end
27
+
28
+ functions = %w[
29
+ lzws_create_buffer_for_compressor
30
+ lzws_create_buffer_for_decompressor
31
+ lzws_resize_buffer
32
+
33
+ lzws_compress_string
34
+ lzws_decompress_string
35
+
36
+ lzws_compress_file
37
+ lzws_decompress_file
38
+
39
+ lzws_compressor_write_magic_header
40
+ lzws_compressor_get_initial_state
41
+ lzws_compress
42
+ lzws_flush_compressor
43
+ lzws_compressor_free_state
44
+
45
+ lzws_decompressor_read_magic_header
46
+ lzws_decompressor_get_initial_state
47
+ lzws_decompress
48
+ lzws_decompressor_free_state
49
+ ]
50
+ .freeze
51
+
52
+ require_library "lzws", functions
53
+
54
+ extension_name = "lzws_ext".freeze
55
+ dir_config extension_name
56
+
57
+ sources = %w[
58
+ stream/compressor
59
+ stream/decompressor
60
+ error
61
+ io
62
+ main
63
+ option
64
+ string
65
+ ]
66
+ .freeze
67
+
68
+ # rubocop:disable Style/GlobalVars
69
+ $srcs = sources
70
+ .map { |name| "src/#{extension_name}/#{name}.c" }
71
+ .freeze
72
+
73
+ $CFLAGS << " -Wno-declaration-after-statement"
74
+ $VPATH << "$(srcdir)/#{extension_name}:$(srcdir)/#{extension_name}/stream"
75
+ # rubocop:enable Style/GlobalVars
76
+
77
+ create_makefile extension_name
@@ -0,0 +1,9 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(LZWS_EXT_COMMON_H)
5
+ #define LZWS_EXT_COMMON_H
6
+
7
+ #define LZWS_EXT_MODULE_NAME "LZWS"
8
+
9
+ #endif // LZWS_EXT_COMMON_H
@@ -0,0 +1,14 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #include "ruby.h"
5
+
6
+ #include "lzws_ext/common.h"
7
+ #include "lzws_ext/error.h"
8
+
9
+ void lzws_ext_raise_error(const char* name, const char* description)
10
+ {
11
+ VALUE module = rb_define_module(LZWS_EXT_MODULE_NAME);
12
+ VALUE error = rb_const_get(module, rb_intern(name));
13
+ rb_raise(error, "%s", description);
14
+ }
@@ -0,0 +1,11 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(LZWS_EXT_ERROR_H)
5
+ #define LZWS_EXT_ERROR_H
6
+
7
+ #include "ruby.h"
8
+
9
+ NORETURN(void lzws_ext_raise_error(const char* name, const char* description));
10
+
11
+ #endif // LZWS_EXT_ERROR_H
data/ext/lzws_ext/io.c ADDED
@@ -0,0 +1,92 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #include <lzws/file.h>
5
+
6
+ #include "ruby.h"
7
+ #include "ruby/io.h"
8
+
9
+ #include "lzws_ext/error.h"
10
+ #include "lzws_ext/io.h"
11
+ #include "lzws_ext/macro.h"
12
+ #include "lzws_ext/option.h"
13
+
14
+ #define GET_FILE(target) \
15
+ Check_Type(target, T_FILE); \
16
+ \
17
+ rb_io_t *target##_io; \
18
+ GetOpenFile(target, target##_io); \
19
+ \
20
+ FILE *target##_file = rb_io_stdio_file(target##_io); \
21
+ if (target##_file == NULL) { \
22
+ lzws_ext_raise_error("AccessIOError", "failed to access IO"); \
23
+ }
24
+
25
+ VALUE lzws_ext_compress_io(VALUE LZWS_EXT_UNUSED(self), VALUE source, VALUE destination, VALUE options)
26
+ {
27
+ GET_FILE(source);
28
+ GET_FILE(destination);
29
+ LZWS_EXT_GET_COMPRESSOR_OPTIONS(options);
30
+
31
+ lzws_result_t result = lzws_compress_file(
32
+ source_file, buffer_length,
33
+ destination_file, buffer_length,
34
+ without_magic_header, max_code_bit_length, block_mode, msb, unaligned_bit_groups, quiet);
35
+
36
+ if (result == LZWS_FILE_ALLOCATE_FAILED) {
37
+ lzws_ext_raise_error("AllocateError", "allocate error");
38
+ }
39
+ else if (result == LZWS_FILE_VALIDATE_FAILED) {
40
+ lzws_ext_raise_error("ValidateError", "validate error");
41
+ }
42
+ else if (result == LZWS_FILE_READ_FAILED) {
43
+ lzws_ext_raise_error("ReadIOError", "failed to read IO");
44
+ }
45
+ else if (result == LZWS_FILE_WRITE_FAILED) {
46
+ lzws_ext_raise_error("WriteIOError", "failed to write IO");
47
+ }
48
+ else if (result != 0) {
49
+ lzws_ext_raise_error("UnexpectedError", "unexpected error");
50
+ }
51
+
52
+ // Ruby itself won't flush stdio file before closing fd, flush is required.
53
+ fflush(destination_file);
54
+
55
+ return Qnil;
56
+ }
57
+
58
+ VALUE lzws_ext_decompress_io(VALUE LZWS_EXT_UNUSED(self), VALUE source, VALUE destination, VALUE options)
59
+ {
60
+ GET_FILE(source);
61
+ GET_FILE(destination);
62
+ LZWS_EXT_GET_DECOMPRESSOR_OPTIONS(options);
63
+
64
+ lzws_result_t result = lzws_decompress_file(
65
+ source_file, buffer_length,
66
+ destination_file, buffer_length,
67
+ without_magic_header, msb, unaligned_bit_groups, quiet);
68
+
69
+ if (result == LZWS_FILE_ALLOCATE_FAILED) {
70
+ lzws_ext_raise_error("AllocateError", "allocate error");
71
+ }
72
+ else if (result == LZWS_FILE_VALIDATE_FAILED) {
73
+ lzws_ext_raise_error("ValidateError", "validate error");
74
+ }
75
+ else if (result == LZWS_FILE_DECOMPRESSOR_CORRUPTED_SOURCE) {
76
+ lzws_ext_raise_error("DecompressorCorruptedSourceError", "decompressor received corrupted source");
77
+ }
78
+ else if (result == LZWS_FILE_READ_FAILED) {
79
+ lzws_ext_raise_error("ReadIOError", "failed to read IO");
80
+ }
81
+ else if (result == LZWS_FILE_WRITE_FAILED) {
82
+ lzws_ext_raise_error("WriteIOError", "failed to write IO");
83
+ }
84
+ else if (result != 0) {
85
+ lzws_ext_raise_error("UnexpectedError", "unexpected error");
86
+ }
87
+
88
+ // Ruby itself won't flush stdio file before closing fd, flush is required.
89
+ fflush(destination_file);
90
+
91
+ return Qnil;
92
+ }
data/ext/lzws_ext/io.h ADDED
@@ -0,0 +1,12 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(LZWS_EXT_IO_H)
5
+ #define LZWS_EXT_IO_H
6
+
7
+ #include "ruby.h"
8
+
9
+ VALUE lzws_ext_compress_io(VALUE self, VALUE source, VALUE destination, VALUE options);
10
+ VALUE lzws_ext_decompress_io(VALUE self, VALUE source, VALUE destination, VALUE options);
11
+
12
+ #endif // LZWS_EXT_IO_H
@@ -0,0 +1,15 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(LZWS_EXT_MACRO_H)
5
+ #define LZWS_EXT_MACRO_H
6
+
7
+ #if defined(__GNUC__)
8
+ #define LZWS_EXT_UNUSED(x) x __attribute__((__unused__))
9
+ #else
10
+ #define LZWS_EXT_UNUSED(x) x
11
+ #endif
12
+
13
+ #define LZWS_EXT_UNUSED_VARIABLE(x) (void)(x)
14
+
15
+ #endif // LZWS_EXT_MACRO_H
@@ -0,0 +1,42 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #include "ruby.h"
5
+
6
+ #include "lzws_ext/common.h"
7
+ #include "lzws_ext/io.h"
8
+ #include "lzws_ext/stream/compressor.h"
9
+ #include "lzws_ext/stream/decompressor.h"
10
+ #include "lzws_ext/string.h"
11
+
12
+ void Init_lzws_ext()
13
+ {
14
+ VALUE root = rb_define_module(LZWS_EXT_MODULE_NAME);
15
+
16
+ // It is better to use these functions internally and prepare pretty wrappers for public usage.
17
+ rb_define_module_function(root, "_native_compress_io", RUBY_METHOD_FUNC(lzws_ext_compress_io), 3);
18
+ rb_define_module_function(root, "_native_decompress_io", RUBY_METHOD_FUNC(lzws_ext_decompress_io), 3);
19
+ rb_define_module_function(root, "_native_compress_string", RUBY_METHOD_FUNC(lzws_ext_compress_string), 2);
20
+ rb_define_module_function(root, "_native_decompress_string", RUBY_METHOD_FUNC(lzws_ext_decompress_string), 2);
21
+
22
+ // -----
23
+
24
+ VALUE stream = rb_define_module_under(root, "Stream");
25
+
26
+ VALUE compressor = rb_define_class_under(stream, "NativeCompressor", rb_cObject);
27
+ rb_define_alloc_func(compressor, lzws_ext_allocate_compressor);
28
+ rb_define_method(compressor, "initialize", lzws_ext_initialize_compressor, 1);
29
+ rb_define_method(compressor, "write_magic_header", lzws_ext_compressor_write_magic_header, 0);
30
+ rb_define_method(compressor, "write", lzws_ext_compress, 1);
31
+ rb_define_method(compressor, "flush", lzws_ext_flush_compressor, 0);
32
+ rb_define_method(compressor, "read_result", lzws_ext_compressor_read_result, 0);
33
+ rb_define_method(compressor, "close", lzws_ext_compressor_close, 0);
34
+
35
+ VALUE decompressor = rb_define_class_under(stream, "NativeDecompressor", rb_cObject);
36
+ rb_define_alloc_func(decompressor, lzws_ext_allocate_decompressor);
37
+ rb_define_method(decompressor, "initialize", lzws_ext_initialize_decompressor, 1);
38
+ rb_define_method(decompressor, "read_magic_header", lzws_ext_decompressor_read_magic_header, 1);
39
+ rb_define_method(decompressor, "read", lzws_ext_decompress, 1);
40
+ rb_define_method(decompressor, "read_result", lzws_ext_decompressor_read_result, 0);
41
+ rb_define_method(decompressor, "close", lzws_ext_decompressor_close, 0);
42
+ }
@@ -0,0 +1,22 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #include "ruby.h"
5
+
6
+ #include "lzws_ext/option.h"
7
+
8
+ VALUE lzws_ext_get_option(VALUE options, const char* name)
9
+ {
10
+ VALUE name_symbol = ID2SYM(rb_intern(name));
11
+ return rb_funcall(options, rb_intern("[]"), 1, name_symbol);
12
+ }
13
+
14
+ void lzws_ext_check_bool_type(VALUE option, const char* name)
15
+ {
16
+ int type = TYPE(option);
17
+
18
+ if (type != T_TRUE && type != T_FALSE) {
19
+ VALUE message = rb_sprintf("wrong value for \"%s\" (expected true or false)", name);
20
+ rb_exc_raise(rb_exc_new_str(rb_eFatal, message));
21
+ }
22
+ }
@@ -0,0 +1,60 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(LZWS_EXT_OPTIONS_H)
5
+ #define LZWS_EXT_OPTIONS_H
6
+
7
+ #include "ruby.h"
8
+
9
+ VALUE lzws_ext_get_option(VALUE options, const char* name);
10
+ void lzws_ext_check_bool_type(VALUE option, const char* name);
11
+
12
+ #define LZWS_EXT_GET_COMPRESSOR_OPTIONS(options) \
13
+ Check_Type(options, T_HASH); \
14
+ \
15
+ VALUE buffer_length_value = lzws_ext_get_option(options, "buffer_length"); \
16
+ VALUE without_magic_header_value = lzws_ext_get_option(options, "without_magic_header"); \
17
+ VALUE max_code_bit_length_value = lzws_ext_get_option(options, "max_code_bit_length"); \
18
+ VALUE block_mode_value = lzws_ext_get_option(options, "block_mode"); \
19
+ VALUE msb_value = lzws_ext_get_option(options, "msb"); \
20
+ VALUE unaligned_bit_groups_value = lzws_ext_get_option(options, "unaligned_bit_groups"); \
21
+ VALUE quiet_value = lzws_ext_get_option(options, "quiet"); \
22
+ \
23
+ Check_Type(buffer_length_value, T_FIXNUM); \
24
+ lzws_ext_check_bool_type(without_magic_header_value, "without_magic_header"); \
25
+ Check_Type(max_code_bit_length_value, T_FIXNUM); \
26
+ lzws_ext_check_bool_type(block_mode_value, "block_mode"); \
27
+ lzws_ext_check_bool_type(msb_value, "msb"); \
28
+ lzws_ext_check_bool_type(unaligned_bit_groups_value, "unaligned_bit_groups"); \
29
+ lzws_ext_check_bool_type(quiet_value, "quiet"); \
30
+ \
31
+ size_t buffer_length = rb_num2uint(buffer_length_value); \
32
+ bool without_magic_header = TYPE(without_magic_header_value) == T_TRUE; \
33
+ uint_fast8_t max_code_bit_length = rb_num2uint(max_code_bit_length_value); \
34
+ bool block_mode = TYPE(block_mode_value) == T_TRUE; \
35
+ bool msb = TYPE(msb_value) == T_TRUE; \
36
+ bool unaligned_bit_groups = TYPE(unaligned_bit_groups_value) == T_TRUE; \
37
+ bool quiet = TYPE(quiet_value) == T_TRUE;
38
+
39
+ #define LZWS_EXT_GET_DECOMPRESSOR_OPTIONS(options) \
40
+ Check_Type(options, T_HASH); \
41
+ \
42
+ VALUE buffer_length_value = lzws_ext_get_option(options, "buffer_length"); \
43
+ VALUE without_magic_header_value = lzws_ext_get_option(options, "without_magic_header"); \
44
+ VALUE msb_value = lzws_ext_get_option(options, "msb"); \
45
+ VALUE unaligned_bit_groups_value = lzws_ext_get_option(options, "unaligned_bit_groups"); \
46
+ VALUE quiet_value = lzws_ext_get_option(options, "quiet"); \
47
+ \
48
+ Check_Type(buffer_length_value, T_FIXNUM); \
49
+ lzws_ext_check_bool_type(without_magic_header_value, "without_magic_header"); \
50
+ lzws_ext_check_bool_type(msb_value, "msb"); \
51
+ lzws_ext_check_bool_type(unaligned_bit_groups_value, "unaligned_bit_groups"); \
52
+ lzws_ext_check_bool_type(quiet_value, "quiet"); \
53
+ \
54
+ size_t buffer_length = rb_num2uint(buffer_length_value); \
55
+ bool without_magic_header = TYPE(without_magic_header_value) == T_TRUE; \
56
+ bool msb = TYPE(msb_value) == T_TRUE; \
57
+ bool unaligned_bit_groups = TYPE(unaligned_bit_groups_value) == T_TRUE; \
58
+ bool quiet = TYPE(quiet_value) == T_TRUE;
59
+
60
+ #endif // LZWS_EXT_OPTIONS_H