ruby-lzws 1.1.5 → 1.3.1
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 +4 -4
- data/README.md +75 -74
- data/ext/extconf.rb +12 -3
- data/ext/lzws_ext/buffer.c +21 -7
- data/ext/lzws_ext/buffer.h +5 -5
- data/ext/lzws_ext/error.c +11 -11
- data/ext/lzws_ext/error.h +2 -1
- data/ext/lzws_ext/gvl.h +24 -0
- data/ext/lzws_ext/io.c +83 -19
- data/ext/lzws_ext/main.c +2 -0
- data/ext/lzws_ext/option.c +46 -10
- data/ext/lzws_ext/option.h +30 -24
- data/ext/lzws_ext/stream/compressor.c +84 -40
- data/ext/lzws_ext/stream/compressor.h +4 -1
- data/ext/lzws_ext/stream/decompressor.c +56 -29
- data/ext/lzws_ext/stream/decompressor.h +4 -1
- data/ext/lzws_ext/string.c +159 -92
- data/lib/lzws/file.rb +2 -2
- data/lib/lzws/option.rb +60 -31
- data/lib/lzws/stream/abstract.rb +5 -3
- data/lib/lzws/stream/reader.rb +3 -2
- data/lib/lzws/stream/reader_helpers.rb +1 -1
- data/lib/lzws/validation.rb +3 -1
- data/lib/lzws/version.rb +1 -1
- metadata +74 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72fd9e1b55088bd5ba7a6d57edc857322ede1d9764b6b2eb3aeafe85193605ad
|
4
|
+
data.tar.gz: 2f08eb4371bef83f138233ab62a5a54b5fa01f5a2904d6d1f64ee00fb9aebd1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: beff1dd2f2016bb9660f26bd62f3eaf1fdab8af9e70c24a65bfda4090190c4c02ef66ff943346b9483f5b588ceff6b5964f33d32dfc15e017b3e7964877ce7f9
|
7
|
+
data.tar.gz: a5c0074902b21193725bb0f215cef8ebaad55b3a029e20d0d0b54c0382e527a86c3460feca7a36ed7754b96254497eacb4a08900a425c7bfda70fa44153e60b6
|
data/README.md
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# Ruby bindings for lzws library
|
2
2
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
| [](https://ci.appveyor.com/project/andrew-aladev/ruby-lzws/branch/master) | [](https://circleci.com/gh/andrew-aladev/ruby-lzws/tree/master) | [](https://github.com/andrew-aladev/ruby-lzws/actions) | [](https://codecov.io/gh/andrew-aladev/ruby-lzws) | [](https://rubygems.org/gems/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.
|
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`.
|
@@ -59,8 +61,8 @@ ensure
|
|
59
61
|
end
|
60
62
|
```
|
61
63
|
|
62
|
-
You can create and read `tar.Z` archives with
|
63
|
-
LZWS is compatible with UNIX compress (with default options).
|
64
|
+
You can create and read `tar.Z` archives with [minitar](https://github.com/halostatue/minitar).
|
65
|
+
LZWS is compatible with [UNIX compress](https://en.wikipedia.org/wiki/Compress) (with default options).
|
64
66
|
|
65
67
|
```ruby
|
66
68
|
require "lzws"
|
@@ -82,66 +84,63 @@ LZWS::Stream::Reader.open "file.tar.Z" do |reader|
|
|
82
84
|
end
|
83
85
|
```
|
84
86
|
|
85
|
-
|
86
|
-
|
87
|
-
Each API supports several options:
|
88
|
-
|
89
|
-
```
|
90
|
-
:source_buffer_length
|
91
|
-
:destination_buffer_length
|
92
|
-
```
|
93
|
-
|
94
|
-
There are internal buffers for compressed and decompressed data.
|
95
|
-
For example you want to use 1 KB as source buffer length for compressor - please use 256 B as destination buffer length.
|
96
|
-
You want to use 256 B as source buffer length for decompressor - please use 1 KB as destination buffer length.
|
97
|
-
|
98
|
-
Values: 0, 2 - infinity, default value: 0.
|
99
|
-
0 means automatic buffer length selection.
|
100
|
-
1 byte is not enough, 2 bytes is minimal buffer length.
|
101
|
-
|
102
|
-
```
|
103
|
-
:max_code_bit_length
|
104
|
-
```
|
87
|
+
You can also use `Content-Encoding: compress` with [sinatra](http://sinatrarb.com):
|
105
88
|
|
106
|
-
|
89
|
+
```ruby
|
90
|
+
require "lzws"
|
91
|
+
require "sinatra"
|
107
92
|
|
108
|
-
|
109
|
-
|
93
|
+
get "/" do
|
94
|
+
headers["Content-Encoding"] = "compress"
|
95
|
+
LZWS::String.compress "TOBEORNOTTOBEORTOBEORNOT"
|
96
|
+
end
|
110
97
|
```
|
111
98
|
|
112
|
-
|
99
|
+
All functionality (including streaming) can be used inside multiple threads with [parallel](https://github.com/grosser/parallel).
|
100
|
+
This code will provide heavy load for your CPU.
|
113
101
|
|
114
|
-
```
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
Values: true/false, default value: false.
|
102
|
+
```ruby
|
103
|
+
require "lzws"
|
104
|
+
require "parallel"
|
119
105
|
|
120
|
-
|
121
|
-
|
106
|
+
Parallel.each large_datas do |large_data|
|
107
|
+
LZWS::String.compress large_data
|
108
|
+
end
|
122
109
|
```
|
123
110
|
|
124
|
-
|
111
|
+
## Options
|
125
112
|
|
126
|
-
|
127
|
-
|
128
|
-
|
113
|
+
| Option | Values | Default | Description |
|
114
|
+
|-----------------------------|------------|----------|-------------|
|
115
|
+
| `source_buffer_length` | 0, 2 - inf | 0 (auto) | internal buffer length for source data |
|
116
|
+
| `destination_buffer_length` | 0, 2 - inf | 0 (auto) | internal buffer length for description data |
|
117
|
+
| `gvl` | true/false | false | enables global VM lock where possible |
|
118
|
+
| `max_code_bit_length` | 9 - 16 | 16 | max code bit length |
|
119
|
+
| `block_mode` | true/false | true | enables block mode |
|
120
|
+
| `without_magic_header` | true/false | false | disables magic header |
|
121
|
+
| `msb` | true/false | false | enables most significant bit mode |
|
122
|
+
| `unaligned_bit_groups` | true/false | false | enables unaligned bit groups |
|
123
|
+
| `quiet` | true/false | false | disables lzws library logging |
|
129
124
|
|
130
|
-
|
125
|
+
There are internal buffers for compressed and decompressed data.
|
126
|
+
For example you want to use 1 KB as `source_buffer_length` for compressor - please use 256 B as `destination_buffer_length`.
|
127
|
+
You want to use 256 B as `source_buffer_length` for decompressor - please use 1 KB as `destination_buffer_length`.
|
131
128
|
|
132
|
-
|
133
|
-
|
134
|
-
|
129
|
+
`gvl` is disabled by default, this mode allows running multiple compressors/decompressors in different threads simultaneously.
|
130
|
+
Please consider enabling `gvl` if you don't want to launch processors in separate threads.
|
131
|
+
If `gvl` is enabled ruby won't waste time on acquiring/releasing VM lock.
|
135
132
|
|
136
|
-
|
137
|
-
Disables lzws library logging.
|
133
|
+
You can also read lzws docs for more info about options.
|
138
134
|
|
139
|
-
|
135
|
+
| Option | Related constants |
|
136
|
+
|-----------------------|-------------------|
|
137
|
+
| `max_code_bit_length` | `LZWS::Option::LOWEST_MAX_CODE_BIT_LENGTH` = 9, `LZWS::Option::BIGGEST_MAX_CODE_BIT_LENGTH` = 16 |
|
140
138
|
|
141
139
|
Possible compressor options:
|
142
140
|
```
|
143
141
|
:source_buffer_length
|
144
142
|
:destination_buffer_length
|
143
|
+
:gvl
|
145
144
|
:max_code_bit_length
|
146
145
|
:block_mode
|
147
146
|
:without_magic_header
|
@@ -154,6 +153,7 @@ Possible decompressor options:
|
|
154
153
|
```
|
155
154
|
:source_buffer_length
|
156
155
|
:destination_buffer_length
|
156
|
+
:gvl
|
157
157
|
:without_magic_header
|
158
158
|
:msb
|
159
159
|
:unaligned_bit_groups
|
@@ -169,18 +169,6 @@ data = LZWS::String.compress "TOBEORNOTTOBEORTOBEORNOT", :msb => true
|
|
169
169
|
puts LZWS::String.decompress(data, :msb => true)
|
170
170
|
```
|
171
171
|
|
172
|
-
Default options are compatible with UNIX compress (`Content-Encoding: compress`):
|
173
|
-
|
174
|
-
```ruby
|
175
|
-
require "lzws"
|
176
|
-
require "sinatra"
|
177
|
-
|
178
|
-
get "/" do
|
179
|
-
headers["Content-Encoding"] = "compress"
|
180
|
-
LZWS::String.compress "TOBEORNOTTOBEORTOBEORNOT"
|
181
|
-
end
|
182
|
-
```
|
183
|
-
|
184
172
|
Please read more about compatibility in lzws docs.
|
185
173
|
|
186
174
|
## String
|
@@ -207,7 +195,7 @@ File maintains both source and destination buffers, it accepts both `source_buff
|
|
207
195
|
|
208
196
|
## Stream::Writer
|
209
197
|
|
210
|
-
Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib
|
198
|
+
Its behaviour is similar to builtin [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipWriter.html).
|
211
199
|
|
212
200
|
Writer maintains destination buffer only, so it accepts `destination_buffer_length` option only.
|
213
201
|
|
@@ -241,7 +229,7 @@ Set another encodings, `nil` is just for compatibility with `IO`.
|
|
241
229
|
#tell
|
242
230
|
```
|
243
231
|
|
244
|
-
See [`IO`](https://ruby-doc.org/core
|
232
|
+
See [`IO`](https://ruby-doc.org/core/IO.html) docs.
|
245
233
|
|
246
234
|
```
|
247
235
|
#write(*objects)
|
@@ -251,7 +239,7 @@ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
|
|
251
239
|
#closed?
|
252
240
|
```
|
253
241
|
|
254
|
-
See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib
|
242
|
+
See [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
|
255
243
|
|
256
244
|
```
|
257
245
|
#write_nonblock(object, *options)
|
@@ -265,6 +253,9 @@ Special asynchronous methods missing in `Zlib::GzipWriter`.
|
|
265
253
|
So it is possible to have asynchronous variants for these synchronous methods.
|
266
254
|
Behaviour is the same as `IO#write_nonblock` method.
|
267
255
|
|
256
|
+
All nonblock operations for file will raise `EBADF` error on Windows.
|
257
|
+
Setting file into nonblocking mode is [not available on Windows](https://github.com/ruby/ruby/blob/master/win32/win32.c#L4388).
|
258
|
+
|
268
259
|
```
|
269
260
|
#<<(object)
|
270
261
|
#print(*objects)
|
@@ -273,11 +264,11 @@ Behaviour is the same as `IO#write_nonblock` method.
|
|
273
264
|
#puts(*objects)
|
274
265
|
```
|
275
266
|
|
276
|
-
Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib
|
267
|
+
Typical helpers, see [`Zlib::GzipWriter`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipWriter.html) docs.
|
277
268
|
|
278
269
|
## Stream::Reader
|
279
270
|
|
280
|
-
Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib
|
271
|
+
Its behaviour is similar to builtin [`Zlib::GzipReader`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipReader.html).
|
281
272
|
|
282
273
|
Reader maintains both source and destination buffers, it accepts both `source_buffer_length` and `destination_buffer_length` options.
|
283
274
|
|
@@ -312,7 +303,7 @@ Set another encodings.
|
|
312
303
|
#tell
|
313
304
|
```
|
314
305
|
|
315
|
-
See [`IO`](https://ruby-doc.org/core
|
306
|
+
See [`IO`](https://ruby-doc.org/core/IO.html) docs.
|
316
307
|
|
317
308
|
```
|
318
309
|
#read(bytes_to_read = nil, out_buffer = nil)
|
@@ -322,14 +313,14 @@ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
|
|
322
313
|
#closed?
|
323
314
|
```
|
324
315
|
|
325
|
-
See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib
|
316
|
+
See [`Zlib::GzipReader`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
|
326
317
|
|
327
318
|
```
|
328
319
|
#readpartial(bytes_to_read = nil, out_buffer = nil)
|
329
320
|
#read_nonblock(bytes_to_read, out_buffer = nil, *options)
|
330
321
|
```
|
331
322
|
|
332
|
-
See [`IO`](https://ruby-doc.org/core
|
323
|
+
See [`IO`](https://ruby-doc.org/core/IO.html) docs.
|
333
324
|
|
334
325
|
```
|
335
326
|
#getbyte
|
@@ -352,16 +343,26 @@ See [`IO`](https://ruby-doc.org/core-2.7.0/IO.html) docs.
|
|
352
343
|
#ungetline(line)
|
353
344
|
```
|
354
345
|
|
355
|
-
Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib
|
346
|
+
Typical helpers, see [`Zlib::GzipReader`](https://ruby-doc.org/stdlib/libdoc/zlib/rdoc/Zlib/GzipReader.html) docs.
|
347
|
+
|
348
|
+
## Thread safety
|
349
|
+
|
350
|
+
`:gvl` option is disabled by default, you can use bindings effectively in multiple threads.
|
351
|
+
Please be careful: bindings are not thread safe.
|
352
|
+
You should lock all shared data between threads.
|
353
|
+
|
354
|
+
For example: you should not use same compressor/decompressor inside multiple threads.
|
355
|
+
Please verify that you are using each processor inside single thread at the same time.
|
356
|
+
|
357
|
+
## Operating systems
|
358
|
+
|
359
|
+
GNU/Linux, FreeBSD, OSX, Windows (MinGW).
|
356
360
|
|
357
361
|
## CI
|
358
362
|
|
359
|
-
See universal test script [scripts/ci_test.sh](scripts/ci_test.sh) for CI.
|
360
363
|
Please visit [scripts/test-images](scripts/test-images).
|
361
|
-
|
362
|
-
|
363
|
-
Cirrus CI uses `x86_64-pc-linux-gnu` image, Circle CI - `x86_64-gentoo-linux-musl` image.
|
364
|
+
See universal test script [scripts/ci_test.sh](scripts/ci_test.sh) for CI.
|
364
365
|
|
365
366
|
## License
|
366
367
|
|
367
|
-
MIT license, see LICENSE and AUTHORS.
|
368
|
+
MIT license, see [LICENSE](LICENSE) and [AUTHORS](AUTHORS).
|
data/ext/extconf.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
|
4
4
|
require "mkmf"
|
5
5
|
|
6
|
+
have_func "rb_thread_call_without_gvl", "ruby/thread.h"
|
7
|
+
|
6
8
|
def require_header(name, types = [])
|
7
9
|
abort "Can't find #{name} header" unless find_header name
|
8
10
|
|
@@ -13,10 +15,10 @@ end
|
|
13
15
|
|
14
16
|
require_header "lzws/buffer.h"
|
15
17
|
require_header "lzws/common.h", %w[lzws_result_t]
|
16
|
-
require_header "lzws/compressor/common.h"
|
18
|
+
require_header "lzws/compressor/common.h", %w[lzws_compressor_options_t]
|
17
19
|
require_header "lzws/compressor/main.h"
|
18
20
|
require_header "lzws/compressor/state.h", %w[lzws_compressor_state_t]
|
19
|
-
require_header "lzws/decompressor/common.h"
|
21
|
+
require_header "lzws/decompressor/common.h", %w[lzws_decompressor_options_t]
|
20
22
|
require_header "lzws/decompressor/main.h"
|
21
23
|
require_header "lzws/decompressor/state.h", %w[lzws_decompressor_state_t]
|
22
24
|
require_header "lzws/file.h"
|
@@ -66,7 +68,14 @@ $srcs = %w[
|
|
66
68
|
.map { |name| "src/#{extension_name}/#{name}.c" }
|
67
69
|
.freeze
|
68
70
|
|
69
|
-
|
71
|
+
# Removing library duplicates.
|
72
|
+
$libs = $libs.split(%r{\s})
|
73
|
+
.reject(&:empty?)
|
74
|
+
.sort
|
75
|
+
.uniq
|
76
|
+
.join " "
|
77
|
+
|
78
|
+
if ENV["CI"]
|
70
79
|
$CFLAGS << " --coverage"
|
71
80
|
$LDFLAGS << " --coverage"
|
72
81
|
end
|
data/ext/lzws_ext/buffer.c
CHANGED
@@ -12,10 +12,11 @@ VALUE lzws_ext_create_string_buffer(VALUE length)
|
|
12
12
|
return rb_str_new(NULL, NUM2SIZET(length));
|
13
13
|
}
|
14
14
|
|
15
|
-
VALUE lzws_ext_resize_string_buffer(VALUE
|
15
|
+
VALUE lzws_ext_resize_string_buffer(VALUE buffer_args)
|
16
16
|
{
|
17
|
-
VALUE buffer = rb_ary_entry(
|
18
|
-
VALUE length = rb_ary_entry(
|
17
|
+
VALUE buffer = rb_ary_entry(buffer_args, 0);
|
18
|
+
VALUE length = rb_ary_entry(buffer_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(
|
27
|
-
|
28
|
-
|
29
|
-
rb_define_const(
|
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
|
}
|
data/ext/lzws_ext/buffer.h
CHANGED
@@ -11,12 +11,12 @@ VALUE lzws_ext_create_string_buffer(VALUE length);
|
|
11
11
|
#define LZWS_EXT_CREATE_STRING_BUFFER(buffer, length, exception) \
|
12
12
|
VALUE buffer = rb_protect(lzws_ext_create_string_buffer, SIZET2NUM(length), &exception);
|
13
13
|
|
14
|
-
VALUE lzws_ext_resize_string_buffer(VALUE
|
14
|
+
VALUE lzws_ext_resize_string_buffer(VALUE buffer_args);
|
15
15
|
|
16
|
-
#define LZWS_EXT_RESIZE_STRING_BUFFER(buffer, length, exception)
|
17
|
-
VALUE
|
18
|
-
buffer
|
19
|
-
RB_GC_GUARD(
|
16
|
+
#define LZWS_EXT_RESIZE_STRING_BUFFER(buffer, length, exception) \
|
17
|
+
VALUE buffer_args = rb_ary_new_from_args(2, buffer, SIZET2NUM(length)); \
|
18
|
+
buffer = rb_protect(lzws_ext_resize_string_buffer, buffer_args, &exception); \
|
19
|
+
RB_GC_GUARD(buffer_args);
|
20
20
|
|
21
21
|
void lzws_ext_buffer_exports(VALUE root_module);
|
22
22
|
|
data/ext/lzws_ext/error.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
#include "ruby.h"
|
7
7
|
|
8
|
-
static inline NORETURN(void
|
8
|
+
static inline NORETURN(void raise_error(const char* name, const char* description))
|
9
9
|
{
|
10
10
|
VALUE module = rb_define_module(LZWS_EXT_MODULE_NAME);
|
11
11
|
VALUE error = rb_const_get(module, rb_intern(name));
|
@@ -16,28 +16,28 @@ void lzws_ext_raise_error(lzws_ext_result_t ext_result)
|
|
16
16
|
{
|
17
17
|
switch (ext_result) {
|
18
18
|
case LZWS_EXT_ERROR_ALLOCATE_FAILED:
|
19
|
-
|
19
|
+
raise_error("AllocateError", "allocate error");
|
20
20
|
case LZWS_EXT_ERROR_VALIDATE_FAILED:
|
21
|
-
|
21
|
+
raise_error("ValidateError", "validate error");
|
22
22
|
|
23
23
|
case LZWS_EXT_ERROR_USED_AFTER_CLOSE:
|
24
|
-
|
24
|
+
raise_error("UsedAfterCloseError", "used after closed");
|
25
25
|
case LZWS_EXT_ERROR_NOT_ENOUGH_SOURCE_BUFFER:
|
26
|
-
|
26
|
+
raise_error("NotEnoughSourceBufferError", "not enough source buffer");
|
27
27
|
case LZWS_EXT_ERROR_NOT_ENOUGH_DESTINATION_BUFFER:
|
28
|
-
|
28
|
+
raise_error("NotEnoughDestinationBufferError", "not enough destination buffer");
|
29
29
|
case LZWS_EXT_ERROR_DECOMPRESSOR_CORRUPTED_SOURCE:
|
30
|
-
|
30
|
+
raise_error("DecompressorCorruptedSourceError", "decompressor received corrupted source");
|
31
31
|
|
32
32
|
case LZWS_EXT_ERROR_ACCESS_IO:
|
33
|
-
|
33
|
+
raise_error("AccessIOError", "failed to access IO");
|
34
34
|
case LZWS_EXT_ERROR_READ_IO:
|
35
|
-
|
35
|
+
raise_error("ReadIOError", "failed to read IO");
|
36
36
|
case LZWS_EXT_ERROR_WRITE_IO:
|
37
|
-
|
37
|
+
raise_error("WriteIOError", "failed to write IO");
|
38
38
|
|
39
39
|
default:
|
40
40
|
// LZWS_EXT_ERROR_UNEXPECTED
|
41
|
-
|
41
|
+
raise_error("UnexpectedError", "unexpected error");
|
42
42
|
}
|
43
43
|
}
|
data/ext/lzws_ext/error.h
CHANGED
data/ext/lzws_ext/gvl.h
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
// Ruby bindings for lzws library.
|
2
|
+
// Copyright (c) 2019 AUTHORS, MIT License.
|
3
|
+
|
4
|
+
#if !defined(LZWS_EXT_GVL_H)
|
5
|
+
#define LZWS_EXT_GVL_H
|
6
|
+
|
7
|
+
#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
8
|
+
|
9
|
+
#include "ruby/thread.h"
|
10
|
+
|
11
|
+
#define LZWS_EXT_GVL_WRAP(gvl, function, data) \
|
12
|
+
if (gvl) { \
|
13
|
+
function((void*) data); \
|
14
|
+
} else { \
|
15
|
+
rb_thread_call_without_gvl(function, (void*) data, RUBY_UBF_IO, NULL); \
|
16
|
+
}
|
17
|
+
|
18
|
+
#else
|
19
|
+
|
20
|
+
#define LZWS_EXT_GVL_WRAP(_gvl, function, data) function((void*) data);
|
21
|
+
|
22
|
+
#endif
|
23
|
+
|
24
|
+
#endif // LZWS_EXT_GVL_H
|