ruby-lzws 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e42a999e18187b07931b4c7127274339f8d6eb61490d2c3bcd504180c674d43
4
- data.tar.gz: 8516d4a94686aeeb2587fcb6bd862dc85ff651ac6e71ae0449e3797a85653f78
3
+ metadata.gz: '08551ca534634f131621d9bea42ec6d06bf7b1be6f3f7f3cb33bd11f9744ec1a'
4
+ data.tar.gz: db0b8c35c381df919bb9b21b9064abd4d88bdc28a82cdead9365f97c4e698b96
5
5
  SHA512:
6
- metadata.gz: 4c8f80f27ac4b2e12bc3628468b94bbebe5b00b688a6dc586013797b5eabb8a1a85da39fdd2ba5d48ed81d71d77df463800f6ef8c285d41bf057c1d306ed2727
7
- data.tar.gz: f4ced4337b346873836d004c57ca6411f62ba604d32a69001658db3705c4098f1a938e23c2242092bd76e645792824daeba93680ea3d3da5c4529872279095cc
6
+ metadata.gz: 0063ee032bf5b6cac9d7e16e696e235c18acec9a6ae48a66c5516906ca290b1c30fb6a0867d371b7b2404706a7523130e00e3b7bb17c1484017a0862a0c7c03f
7
+ data.tar.gz: eb1905eb2a128c716ffec1693b5be4ce94fb52894ea60adcb446ae03cc3263d8b51b62092e7e164085e875dac752a328b110c68bfdcfc631356d294ec3c50bd6
data/README.md CHANGED
@@ -38,7 +38,7 @@ puts LZWS::Stream::Reader.open("file.txt.Z") { |reader| reader.read }
38
38
  ```
39
39
 
40
40
  You can create and read `tar.Z` archives with `minitar` for example.
41
- LZWS is fully compatible with UNIX compress (with default options).
41
+ LZWS is compatible with UNIX compress (with default options).
42
42
 
43
43
  ```ruby
44
44
  require "lzws"
@@ -60,30 +60,86 @@ LZWS::Stream::Reader.open "file.tar.Z" do |reader|
60
60
  end
61
61
  ```
62
62
 
63
- Each API supports additional options, please read lzws docs for more info.
63
+ ## Options
64
64
 
65
- Compressor:
65
+ Each API supports several options:
66
+
67
+ ```
68
+ :source_buffer_length
69
+ :destination_buffer_length
70
+ ```
71
+
72
+ There are internal buffers for compressed and decompressed data.
73
+ For example you want to use 1 KB as source buffer length for compressor - please use 256 B as destination buffer length.
74
+ You want to use 256 B as source buffer length for decompressor - please use 1 KB as destination buffer length.
75
+
76
+ Values: 0, 2 - infinity, default value: 0.
77
+ 0 means automatic buffer length selection.
78
+ 1 byte is not enough, 2 bytes is minimal buffer length.
66
79
 
67
80
  ```
68
81
  :max_code_bit_length
82
+ ```
83
+
84
+ Values: 9 - 16, default value: 16.
85
+
86
+ ```
69
87
  :block_mode
70
- :buffer_length
88
+ ```
89
+
90
+ Values: true/false, default value: true.
91
+
92
+ ```
71
93
  :without_magic_header
94
+ ```
95
+
96
+ Values: true/false, default value: false.
97
+
98
+ ```
72
99
  :msb
100
+ ```
101
+
102
+ Values: true/false, default value: false.
103
+
104
+ ```
73
105
  :unaligned_bit_groups
106
+ ```
107
+
108
+ Values: true/false, default value: false.
109
+
110
+ ```
74
111
  :quiet
75
112
  ```
76
113
 
77
- Decompressor:
114
+ Values: true/false, default value: false.
115
+ Disables lzws library logging.
116
+
117
+ Please read lzws docs for more info about options.
118
+
119
+ Possible compressor options:
120
+ ```
121
+ :source_buffer_length
122
+ :destination_buffer_length
123
+ :max_code_bit_length
124
+ :block_mode
125
+ :without_magic_header
126
+ :msb
127
+ :unaligned_bit_groups
128
+ :quiet
129
+ ```
78
130
 
131
+ Possible decompressor options:
79
132
  ```
80
- :buffer_length
133
+ :source_buffer_length
134
+ :destination_buffer_length
81
135
  :without_magic_header
82
136
  :msb
83
137
  :unaligned_bit_groups
84
138
  :quiet
85
139
  ```
86
140
 
141
+ Example:
142
+
87
143
  ```ruby
88
144
  require "lzws"
89
145
 
@@ -91,7 +147,7 @@ data = LZWS::String.compress "TOBEORNOTTOBEORTOBEORNOT", :msb => true
91
147
  puts LZWS::String.decompress(data, :msb => true)
92
148
  ```
93
149
 
94
- You can use `Content-Encoding: compress`.
150
+ Default options are compatible with UNIX compress (`Content-Encoding: compress`):
95
151
 
96
152
  ```ruby
97
153
  require "lzws"
@@ -103,50 +159,91 @@ get "/" do
103
159
  end
104
160
  ```
105
161
 
106
- ## Docs
162
+ Please read more about compatibility in lzws docs.
163
+
164
+ ## String
107
165
 
108
- `LZWS::String`:
166
+ String maintains destination buffer only, so it accepts `destination_buffer_length` option only.
109
167
 
110
168
  ```
111
169
  ::compress(source, options = {})
112
170
  ::decompress(source, options = {})
113
171
  ```
114
172
 
115
- `LZWS::File`:
173
+ `source` is a source string.
174
+
175
+ ## File
176
+
177
+ File maintains both source and destination buffers, it accepts both `source_buffer_length` and `destination_buffer_length` options.
116
178
 
117
179
  ```
118
180
  ::compress(source, destination, options = {})
119
181
  ::decompress(source, destination, options = {})
120
182
  ```
121
183
 
122
- `LZWS::Stream::Writer` and `LZWS::Stream::Reader`:
184
+ `source` and `destination` are file pathes.
185
+
186
+ ## Stream::Writer
187
+
188
+ Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
189
+
190
+ Writer maintains destination buffer only, so it accepts `destination_buffer_length` option only.
191
+
192
+ ```
193
+ ::open(file_path, options = {}, :external_encoding => nil, :transcode_options => {}, &block)
194
+ ```
195
+
196
+ Open file path and create stream writer associated with opened file.
197
+ Data will be transcoded to `:external_encoding` using `:transcode_options` before compressing.
198
+
199
+ ```
200
+ ::new(destination_io, options = {}, :external_encoding => nil, :transcode_options => {})
201
+ ```
202
+
203
+ Create stream writer associated with destination io.
204
+ Data will be transcoded to `:external_encoding` using `:transcode_options` before compressing.
205
+
206
+ ```
207
+ #set_encoding(external_encoding, nil, transcode_options)
208
+ ```
209
+
210
+ Set another encodings, `nil` is just for compatibility with `IO`.
123
211
 
124
212
  ```
125
- ::open(file_path, options = {}, :external_encoding => nil, :internal_encoding => nil, &block)
126
213
  #io
214
+ #to_io
127
215
  #stat
128
216
  #external_encoding
129
- #internal_encoding
217
+ #transcode_options
130
218
  #pos
131
219
  #tell
132
- #advise
133
- #set_encoding(external_encoding, internal_encoding, transcode_options)
220
+ ```
221
+
222
+ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
223
+
224
+ ```
225
+ #write(*objects)
226
+ #flush
134
227
  #rewind
135
228
  #close
136
229
  #closed?
137
- #to_io
138
230
  ```
139
231
 
140
- `Stream::Writer`:
232
+ See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
141
233
 
142
234
  ```
143
- ::new(destination_io, options = {}, :external_encoding => nil)
144
- #write(*objects)
145
- #flush
146
235
  #write_nonblock(object, *options)
147
236
  #flush_nonblock(*options)
148
237
  #rewind_nonblock(*options)
149
238
  #close_nonblock(*options)
239
+ ```
240
+
241
+ Special asynchronous methods missing in `Zlib::GzipWriter`.
242
+ `rewind` wants to `close`, `close` wants to `write` something and `flush`, `flush` want to `write` something.
243
+ So it is possible to have asynchronous variants for these synchronous methods.
244
+ Behaviour is the same as `IO#write_nonblock` method.
245
+
246
+ ```
150
247
  #<<(object)
151
248
  #print(*objects)
152
249
  #printf(*args)
@@ -154,24 +251,77 @@ end
154
251
  #puts(*objects)
155
252
  ```
156
253
 
157
- `Stream::Reader`:
254
+ Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
255
+
256
+ ## Stream::Reader
257
+
258
+ Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html).
259
+
260
+ Reader maintains both source and destination buffers, it accepts both `source_buffer_length` and `destination_buffer_length` options.
261
+
262
+ ```
263
+ ::open(file_path, options = {}, :external_encoding => nil, :internal_encoding => nil, :transcode_options => {}, &block)
264
+ ```
265
+
266
+ Open file path and create stream reader associated with opened file.
267
+ Data will be force encoded to `:external_encoding` and transcoded to `:internal_encoding` using `:transcode_options` after decompressing.
268
+
269
+ ```
270
+ ::new(source_io, options = {}, :external_encoding => nil, :internal_encoding => nil, :transcode_options => {})
271
+ ```
272
+
273
+ Create stream reader associated with source io.
274
+ Data will be force encoded to `:external_encoding` and transcoded to `:internal_encoding` using `:transcode_options` after decompressing.
275
+
276
+ ```
277
+ #set_encoding(external_encoding, internal_encoding, transcode_options)
278
+ ```
279
+
280
+ Set another encodings.
281
+
282
+ ```
283
+ #io
284
+ #to_io
285
+ #stat
286
+ #external_encoding
287
+ #internal_encoding
288
+ #transcode_options
289
+ #pos
290
+ #tell
291
+ ```
292
+
293
+ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
158
294
 
159
295
  ```
160
- ::new(source_io, options = {}, :external_encoding => nil, :internal_encoding => nil)
161
- #lineno
162
- #lineno=
163
296
  #read(bytes_to_read = nil, out_buffer = nil)
297
+ #eof?
298
+ #rewind
299
+ #close
300
+ #closed?
301
+ ```
302
+
303
+ See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
304
+
305
+ ```
164
306
  #readpartial(bytes_to_read = nil, out_buffer = nil)
165
307
  #read_nonblock(bytes_to_read, out_buffer = nil, *options)
166
- #eof?
308
+ ```
309
+
310
+ See [`IO`](https://ruby-doc.org/core-2.6.1/IO.html) docs.
311
+
312
+ ```
167
313
  #getbyte
168
314
  #each_byte(&block)
169
315
  #readbyte
170
316
  #ungetbyte(byte)
317
+
171
318
  #getc
172
319
  #readchar
173
320
  #each_char(&block)
174
321
  #ungetc(char)
322
+
323
+ #lineno
324
+ #lineno=
175
325
  #gets(separator = $OUTPUT_RECORD_SEPARATOR, limit = nil)
176
326
  #readline
177
327
  #readlines
@@ -180,8 +330,7 @@ end
180
330
  #ungetline(line)
181
331
  ```
182
332
 
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.
333
+ Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib-2.6.1/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
185
334
 
186
335
  ## License
187
336
 
data/ext/extconf.rb CHANGED
@@ -9,15 +9,12 @@ end
9
9
 
10
10
  require_header "lzws/buffer.h"
11
11
  require_header "lzws/compressor/common.h"
12
- require_header "lzws/compressor/header.h"
13
12
  require_header "lzws/compressor/main.h"
14
13
  require_header "lzws/compressor/state.h"
15
14
  require_header "lzws/decompressor/common.h"
16
- require_header "lzws/decompressor/header.h"
17
15
  require_header "lzws/decompressor/main.h"
18
16
  require_header "lzws/decompressor/state.h"
19
17
  require_header "lzws/file.h"
20
- require_header "lzws/string.h"
21
18
 
22
19
  def require_library(name, functions)
23
20
  functions.each do |function|
@@ -26,26 +23,22 @@ def require_library(name, functions)
26
23
  end
27
24
 
28
25
  functions = %w[
29
- lzws_create_buffer_for_compressor
30
- lzws_create_buffer_for_decompressor
31
- lzws_resize_buffer
26
+ lzws_create_source_buffer_for_compressor
27
+ lzws_create_destination_buffer_for_compressor
28
+ lzws_create_source_buffer_for_decompressor
29
+ lzws_create_destination_buffer_for_decompressor
32
30
 
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
31
  lzws_compressor_get_initial_state
41
- lzws_compress
42
- lzws_flush_compressor
43
32
  lzws_compressor_free_state
33
+ lzws_compress
34
+ lzws_compressor_finish
44
35
 
45
- lzws_decompressor_read_magic_header
46
36
  lzws_decompressor_get_initial_state
47
- lzws_decompress
48
37
  lzws_decompressor_free_state
38
+ lzws_decompress
39
+
40
+ lzws_compress_file
41
+ lzws_decompress_file
49
42
  ]
50
43
  .freeze
51
44
 
@@ -57,6 +50,7 @@ dir_config extension_name
57
50
  sources = %w[
58
51
  stream/compressor
59
52
  stream/decompressor
53
+ buffer
60
54
  error
61
55
  io
62
56
  main
@@ -0,0 +1,18 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #include "lzws_ext/buffer.h"
5
+
6
+ #include <lzws/buffer.h>
7
+
8
+ #include "ruby.h"
9
+
10
+ void lzws_ext_buffer_exports(VALUE root_module)
11
+ {
12
+ VALUE option = rb_define_module_under(root_module, "Buffer");
13
+
14
+ rb_define_const(option, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR", UINT2NUM(LZWS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_COMPRESSOR));
15
+ rb_define_const(option, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR", UINT2NUM(LZWS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_COMPRESSOR));
16
+ rb_define_const(option, "DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR", UINT2NUM(LZWS_DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR));
17
+ rb_define_const(option, "DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR", UINT2NUM(LZWS_DEFAULT_DESTINATION_BUFFER_LENGTH_FOR_DECOMPRESSOR));
18
+ }
@@ -0,0 +1,11 @@
1
+ // Ruby bindings for lzws library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(LZWS_EXT_BUFFER_H)
5
+ #define LZWS_EXT_BUFFER_H
6
+
7
+ #include "ruby.h"
8
+
9
+ void lzws_ext_buffer_exports(VALUE root_module);
10
+
11
+ #endif // LZWS_EXT_BUFFER_H
@@ -4,6 +4,10 @@
4
4
  #if !defined(LZWS_EXT_COMMON_H)
5
5
  #define LZWS_EXT_COMMON_H
6
6
 
7
+ #include <stdint.h>
8
+
7
9
  #define LZWS_EXT_MODULE_NAME "LZWS"
8
10
 
11
+ typedef uint_fast8_t lzws_ext_result_t;
12
+
9
13
  #endif // LZWS_EXT_COMMON_H
data/ext/lzws_ext/error.c CHANGED
@@ -1,14 +1,44 @@
1
1
  // Ruby bindings for lzws library.
2
2
  // Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
- #include "ruby.h"
4
+ #include "lzws_ext/error.h"
5
5
 
6
6
  #include "lzws_ext/common.h"
7
- #include "lzws_ext/error.h"
7
+ #include "ruby.h"
8
8
 
9
- void lzws_ext_raise_error(const char* name, const char* description)
9
+ static inline NORETURN(void raise(const char* name, const char* description))
10
10
  {
11
11
  VALUE module = rb_define_module(LZWS_EXT_MODULE_NAME);
12
12
  VALUE error = rb_const_get(module, rb_intern(name));
13
13
  rb_raise(error, "%s", description);
14
14
  }
15
+
16
+ void lzws_ext_raise_error(lzws_ext_result_t result)
17
+ {
18
+ switch (result) {
19
+ case LZWS_EXT_ERROR_ALLOCATE_FAILED:
20
+ raise("AllocateError", "allocate error");
21
+ case LZWS_EXT_ERROR_VALIDATE_FAILED:
22
+ raise("ValidateError", "validate error");
23
+
24
+ case LZWS_EXT_ERROR_USED_AFTER_CLOSE:
25
+ raise("UsedAfterCloseError", "used after closed");
26
+ case LZWS_EXT_ERROR_NOT_ENOUGH_SOURCE_BUFFER:
27
+ raise("NotEnoughSourceBufferError", "not enough source buffer");
28
+ case LZWS_EXT_ERROR_NOT_ENOUGH_DESTINATION_BUFFER:
29
+ raise("NotEnoughDestinationBufferError", "not enough destination buffer");
30
+ case LZWS_EXT_ERROR_DECOMPRESSOR_CORRUPTED_SOURCE:
31
+ raise("DecompressorCorruptedSourceError", "decompressor received corrupted source");
32
+
33
+ case LZWS_EXT_ERROR_ACCESS_IO:
34
+ raise("AccessIOError", "failed to access IO");
35
+ case LZWS_EXT_ERROR_READ_IO:
36
+ raise("ReadIOError", "failed to read IO");
37
+ case LZWS_EXT_ERROR_WRITE_IO:
38
+ raise("WriteIOError", "failed to write IO");
39
+
40
+ default:
41
+ // LZWS_EXT_ERROR_UNEXPECTED
42
+ raise("UnexpectedError", "unexpected error");
43
+ }
44
+ }
data/ext/lzws_ext/error.h CHANGED
@@ -4,8 +4,27 @@
4
4
  #if !defined(LZWS_EXT_ERROR_H)
5
5
  #define LZWS_EXT_ERROR_H
6
6
 
7
+ #include "lzws_ext/common.h"
7
8
  #include "ruby.h"
8
9
 
9
- NORETURN(void lzws_ext_raise_error(const char* name, const char* description));
10
+ // Results for errors listed in "lib/lzws/error" used in c extension.
11
+
12
+ enum {
13
+ LZWS_EXT_ERROR_ALLOCATE_FAILED = 1,
14
+ LZWS_EXT_ERROR_VALIDATE_FAILED,
15
+
16
+ LZWS_EXT_ERROR_USED_AFTER_CLOSE,
17
+ LZWS_EXT_ERROR_NOT_ENOUGH_SOURCE_BUFFER,
18
+ LZWS_EXT_ERROR_NOT_ENOUGH_DESTINATION_BUFFER,
19
+ LZWS_EXT_ERROR_DECOMPRESSOR_CORRUPTED_SOURCE,
20
+
21
+ LZWS_EXT_ERROR_ACCESS_IO,
22
+ LZWS_EXT_ERROR_READ_IO,
23
+ LZWS_EXT_ERROR_WRITE_IO,
24
+
25
+ LZWS_EXT_ERROR_UNEXPECTED
26
+ };
27
+
28
+ NORETURN(void lzws_ext_raise_error(lzws_ext_result_t result));
10
29
 
11
30
  #endif // LZWS_EXT_ERROR_H
data/ext/lzws_ext/io.c CHANGED
@@ -1,52 +1,70 @@
1
1
  // Ruby bindings for lzws library.
2
2
  // Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
- #include <lzws/file.h>
5
-
6
- #include "ruby.h"
7
4
  #include "ruby/io.h"
8
5
 
6
+ #include <lzws/file.h>
7
+
8
+ #include "lzws_ext/common.h"
9
9
  #include "lzws_ext/error.h"
10
10
  #include "lzws_ext/io.h"
11
11
  #include "lzws_ext/macro.h"
12
12
  #include "lzws_ext/option.h"
13
+ #include "ruby.h"
13
14
 
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"); \
15
+ #define GET_FILE(target) \
16
+ Check_Type(target, T_FILE); \
17
+ \
18
+ rb_io_t* target##_io; \
19
+ GetOpenFile(target, target##_io); \
20
+ \
21
+ FILE* target##_file = rb_io_stdio_file(target##_io); \
22
+ if (target##_file == NULL) { \
23
+ lzws_ext_raise_error(LZWS_EXT_ERROR_ACCESS_IO); \
23
24
  }
24
25
 
26
+ static inline lzws_ext_result_t get_file_error(lzws_result_t result)
27
+ {
28
+ switch (result) {
29
+ case LZWS_FILE_ALLOCATE_FAILED:
30
+ return LZWS_EXT_ERROR_ALLOCATE_FAILED;
31
+ case LZWS_FILE_VALIDATE_FAILED:
32
+ return LZWS_EXT_ERROR_VALIDATE_FAILED;
33
+
34
+ case LZWS_FILE_NOT_ENOUGH_SOURCE_BUFFER:
35
+ return LZWS_EXT_ERROR_NOT_ENOUGH_SOURCE_BUFFER;
36
+ case LZWS_FILE_NOT_ENOUGH_DESTINATION_BUFFER:
37
+ return LZWS_EXT_ERROR_NOT_ENOUGH_DESTINATION_BUFFER;
38
+ case LZWS_FILE_DECOMPRESSOR_CORRUPTED_SOURCE:
39
+ return LZWS_EXT_ERROR_DECOMPRESSOR_CORRUPTED_SOURCE;
40
+
41
+ case LZWS_FILE_READ_FAILED:
42
+ return LZWS_EXT_ERROR_READ_IO;
43
+ case LZWS_FILE_WRITE_FAILED:
44
+ return LZWS_EXT_ERROR_WRITE_IO;
45
+
46
+ default:
47
+ return LZWS_EXT_ERROR_UNEXPECTED;
48
+ }
49
+ }
50
+
25
51
  VALUE lzws_ext_compress_io(VALUE LZWS_EXT_UNUSED(self), VALUE source, VALUE destination, VALUE options)
26
52
  {
27
53
  GET_FILE(source);
28
54
  GET_FILE(destination);
55
+ Check_Type(options, T_HASH);
29
56
  LZWS_EXT_GET_COMPRESSOR_OPTIONS(options);
57
+ LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, source_buffer_length);
58
+ LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, destination_buffer_length);
30
59
 
31
60
  lzws_result_t result = lzws_compress_file(
32
- source_file, buffer_length,
33
- destination_file, buffer_length,
61
+ source_file, source_buffer_length,
62
+ destination_file, destination_buffer_length,
34
63
  without_magic_header, max_code_bit_length, block_mode, msb, unaligned_bit_groups, quiet);
35
64
 
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");
65
+ if (result != 0) {
66
+ lzws_ext_result_t ext_result = get_file_error(result);
67
+ lzws_ext_raise_error(ext_result);
50
68
  }
51
69
 
52
70
  // Ruby itself won't flush stdio file before closing fd, flush is required.
@@ -59,30 +77,19 @@ VALUE lzws_ext_decompress_io(VALUE LZWS_EXT_UNUSED(self), VALUE source, VALUE de
59
77
  {
60
78
  GET_FILE(source);
61
79
  GET_FILE(destination);
80
+ Check_Type(options, T_HASH);
62
81
  LZWS_EXT_GET_DECOMPRESSOR_OPTIONS(options);
82
+ LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, source_buffer_length);
83
+ LZWS_EXT_GET_BUFFER_LENGTH_OPTION(options, destination_buffer_length);
63
84
 
64
85
  lzws_result_t result = lzws_decompress_file(
65
- source_file, buffer_length,
66
- destination_file, buffer_length,
86
+ source_file, source_buffer_length,
87
+ destination_file, destination_buffer_length,
67
88
  without_magic_header, msb, unaligned_bit_groups, quiet);
68
89
 
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");
90
+ if (result != 0) {
91
+ lzws_ext_result_t ext_result = get_file_error(result);
92
+ lzws_ext_raise_error(ext_result);
86
93
  }
87
94
 
88
95
  // Ruby itself won't flush stdio file before closing fd, flush is required.
@@ -90,3 +97,9 @@ VALUE lzws_ext_decompress_io(VALUE LZWS_EXT_UNUSED(self), VALUE source, VALUE de
90
97
 
91
98
  return Qnil;
92
99
  }
100
+
101
+ void lzws_ext_io_exports(VALUE root_module)
102
+ {
103
+ rb_define_module_function(root_module, "_native_compress_io", RUBY_METHOD_FUNC(lzws_ext_compress_io), 3);
104
+ rb_define_module_function(root_module, "_native_decompress_io", RUBY_METHOD_FUNC(lzws_ext_decompress_io), 3);
105
+ }
data/ext/lzws_ext/io.h CHANGED
@@ -9,4 +9,6 @@
9
9
  VALUE lzws_ext_compress_io(VALUE self, VALUE source, VALUE destination, VALUE options);
10
10
  VALUE lzws_ext_decompress_io(VALUE self, VALUE source, VALUE destination, VALUE options);
11
11
 
12
+ void lzws_ext_io_exports(VALUE root_module);
13
+
12
14
  #endif // LZWS_EXT_IO_H
data/ext/lzws_ext/macro.h CHANGED
@@ -10,6 +10,4 @@
10
10
  #define LZWS_EXT_UNUSED(x) x
11
11
  #endif
12
12
 
13
- #define LZWS_EXT_UNUSED_VARIABLE(x) (void)(x)
14
-
15
13
  #endif // LZWS_EXT_MACRO_H