ruby-lzws 1.1.0 → 1.1.5
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 +43 -13
- data/ext/extconf.rb +35 -27
- data/ext/lzws_ext/buffer.c +17 -5
- data/ext/lzws_ext/buffer.h +12 -0
- data/ext/lzws_ext/common.h +3 -0
- data/ext/lzws_ext/error.c +2 -3
- data/ext/lzws_ext/error.h +1 -1
- data/ext/lzws_ext/io.c +3 -5
- data/ext/lzws_ext/main.c +0 -1
- data/ext/lzws_ext/option.c +10 -3
- data/ext/lzws_ext/option.h +17 -11
- data/ext/lzws_ext/stream/compressor.c +18 -18
- data/ext/lzws_ext/stream/compressor.h +3 -3
- data/ext/lzws_ext/stream/decompressor.c +18 -18
- data/ext/lzws_ext/stream/decompressor.h +3 -3
- data/ext/lzws_ext/string.c +52 -67
- data/lib/lzws.rb +1 -0
- data/lib/lzws/file.rb +4 -0
- data/lib/lzws/option.rb +3 -2
- data/lib/lzws/stream/abstract.rb +9 -12
- data/lib/lzws/stream/raw/abstract.rb +4 -2
- data/lib/lzws/stream/raw/compressor.rb +4 -4
- data/lib/lzws/stream/raw/decompressor.rb +1 -3
- data/lib/lzws/stream/reader.rb +71 -52
- data/lib/lzws/stream/reader_helpers.rb +2 -0
- data/lib/lzws/stream/writer.rb +10 -5
- data/lib/lzws/stream/writer_helpers.rb +8 -10
- data/lib/lzws/validation.rb +15 -2
- data/lib/lzws/version.rb +1 -1
- metadata +61 -19
@@ -4,11 +4,10 @@
|
|
4
4
|
#include "lzws_ext/stream/compressor.h"
|
5
5
|
|
6
6
|
#include <lzws/buffer.h>
|
7
|
+
#include <lzws/common.h>
|
7
8
|
#include <lzws/compressor/common.h>
|
8
9
|
#include <lzws/compressor/main.h>
|
9
10
|
#include <lzws/compressor/state.h>
|
10
|
-
#include <stdint.h>
|
11
|
-
#include <stdlib.h>
|
12
11
|
|
13
12
|
#include "lzws_ext/error.h"
|
14
13
|
#include "lzws_ext/option.h"
|
@@ -21,7 +20,7 @@ static void free_compressor(lzws_ext_compressor_t* compressor_ptr)
|
|
21
20
|
lzws_compressor_free_state(state_ptr);
|
22
21
|
}
|
23
22
|
|
24
|
-
|
23
|
+
lzws_ext_byte_t* destination_buffer = compressor_ptr->destination_buffer;
|
25
24
|
if (destination_buffer != NULL) {
|
26
25
|
free(destination_buffer);
|
27
26
|
}
|
@@ -72,7 +71,7 @@ VALUE lzws_ext_initialize_compressor(VALUE self, VALUE options)
|
|
72
71
|
}
|
73
72
|
}
|
74
73
|
|
75
|
-
|
74
|
+
lzws_ext_byte_t* destination_buffer;
|
76
75
|
|
77
76
|
result = lzws_create_destination_buffer_for_compressor(&destination_buffer, &destination_buffer_length, quiet);
|
78
77
|
if (result != 0) {
|
@@ -94,13 +93,13 @@ VALUE lzws_ext_initialize_compressor(VALUE self, VALUE options)
|
|
94
93
|
lzws_ext_raise_error(LZWS_EXT_ERROR_USED_AFTER_CLOSE); \
|
95
94
|
}
|
96
95
|
|
97
|
-
#define GET_SOURCE_DATA(source_value)
|
98
|
-
Check_Type(source_value, T_STRING);
|
99
|
-
|
100
|
-
const char*
|
101
|
-
size_t
|
102
|
-
|
103
|
-
size_t
|
96
|
+
#define GET_SOURCE_DATA(source_value) \
|
97
|
+
Check_Type(source_value, T_STRING); \
|
98
|
+
\
|
99
|
+
const char* source = RSTRING_PTR(source_value); \
|
100
|
+
size_t source_length = RSTRING_LEN(source_value); \
|
101
|
+
lzws_ext_byte_t* remaining_source = (lzws_ext_byte_t*)source; \
|
102
|
+
size_t remaining_source_length = source_length;
|
104
103
|
|
105
104
|
VALUE lzws_ext_compress(VALUE self, VALUE source_value)
|
106
105
|
{
|
@@ -119,7 +118,7 @@ VALUE lzws_ext_compress(VALUE self, VALUE source_value)
|
|
119
118
|
lzws_ext_raise_error(LZWS_EXT_ERROR_UNEXPECTED);
|
120
119
|
}
|
121
120
|
|
122
|
-
VALUE bytes_written =
|
121
|
+
VALUE bytes_written = SIZET2NUM(source_length - remaining_source_length);
|
123
122
|
VALUE needs_more_destination = result == LZWS_COMPRESSOR_NEEDS_MORE_DESTINATION ? Qtrue : Qfalse;
|
124
123
|
|
125
124
|
return rb_ary_new_from_args(2, bytes_written, needs_more_destination);
|
@@ -150,9 +149,9 @@ VALUE lzws_ext_compressor_read_result(VALUE self)
|
|
150
149
|
GET_COMPRESSOR(self);
|
151
150
|
DO_NOT_USE_AFTER_CLOSE(compressor_ptr);
|
152
151
|
|
153
|
-
|
154
|
-
size_t
|
155
|
-
size_t
|
152
|
+
lzws_ext_byte_t* destination_buffer = compressor_ptr->destination_buffer;
|
153
|
+
size_t destination_buffer_length = compressor_ptr->destination_buffer_length;
|
154
|
+
size_t remaining_destination_buffer_length = compressor_ptr->remaining_destination_buffer_length;
|
156
155
|
|
157
156
|
const char* result = (const char*)destination_buffer;
|
158
157
|
size_t result_length = destination_buffer_length - remaining_destination_buffer_length;
|
@@ -177,7 +176,7 @@ VALUE lzws_ext_compressor_close(VALUE self)
|
|
177
176
|
compressor_ptr->state_ptr = NULL;
|
178
177
|
}
|
179
178
|
|
180
|
-
|
179
|
+
lzws_ext_byte_t* destination_buffer = compressor_ptr->destination_buffer;
|
181
180
|
if (destination_buffer != NULL) {
|
182
181
|
free(destination_buffer);
|
183
182
|
|
@@ -192,9 +191,10 @@ VALUE lzws_ext_compressor_close(VALUE self)
|
|
192
191
|
|
193
192
|
void lzws_ext_compressor_exports(VALUE root_module)
|
194
193
|
{
|
195
|
-
VALUE
|
194
|
+
VALUE module = rb_define_module_under(root_module, "Stream");
|
195
|
+
|
196
|
+
VALUE compressor = rb_define_class_under(module, "NativeCompressor", rb_cObject);
|
196
197
|
|
197
|
-
VALUE compressor = rb_define_class_under(stream, "NativeCompressor", rb_cObject);
|
198
198
|
rb_define_alloc_func(compressor, lzws_ext_allocate_compressor);
|
199
199
|
rb_define_method(compressor, "initialize", lzws_ext_initialize_compressor, 1);
|
200
200
|
rb_define_method(compressor, "write", lzws_ext_compress, 1);
|
@@ -5,16 +5,16 @@
|
|
5
5
|
#define LZWS_EXT_STREAM_COMPRESSOR_H
|
6
6
|
|
7
7
|
#include <lzws/compressor/state.h>
|
8
|
-
#include <stdint.h>
|
9
8
|
#include <stdlib.h>
|
10
9
|
|
10
|
+
#include "lzws_ext/common.h"
|
11
11
|
#include "ruby.h"
|
12
12
|
|
13
13
|
typedef struct {
|
14
14
|
lzws_compressor_state_t* state_ptr;
|
15
|
-
|
15
|
+
lzws_ext_byte_t* destination_buffer;
|
16
16
|
size_t destination_buffer_length;
|
17
|
-
|
17
|
+
lzws_ext_byte_t* remaining_destination_buffer;
|
18
18
|
size_t remaining_destination_buffer_length;
|
19
19
|
} lzws_ext_compressor_t;
|
20
20
|
|
@@ -4,11 +4,10 @@
|
|
4
4
|
#include "lzws_ext/stream/decompressor.h"
|
5
5
|
|
6
6
|
#include <lzws/buffer.h>
|
7
|
+
#include <lzws/common.h>
|
7
8
|
#include <lzws/decompressor/common.h>
|
8
9
|
#include <lzws/decompressor/main.h>
|
9
10
|
#include <lzws/decompressor/state.h>
|
10
|
-
#include <stdint.h>
|
11
|
-
#include <stdlib.h>
|
12
11
|
|
13
12
|
#include "lzws_ext/error.h"
|
14
13
|
#include "lzws_ext/option.h"
|
@@ -21,7 +20,7 @@ static void free_decompressor(lzws_ext_decompressor_t* decompressor_ptr)
|
|
21
20
|
lzws_decompressor_free_state(state_ptr);
|
22
21
|
}
|
23
22
|
|
24
|
-
|
23
|
+
lzws_ext_byte_t* destination_buffer = decompressor_ptr->destination_buffer;
|
25
24
|
if (destination_buffer != NULL) {
|
26
25
|
free(destination_buffer);
|
27
26
|
}
|
@@ -70,7 +69,7 @@ VALUE lzws_ext_initialize_decompressor(VALUE self, VALUE options)
|
|
70
69
|
}
|
71
70
|
}
|
72
71
|
|
73
|
-
|
72
|
+
lzws_ext_byte_t* destination_buffer;
|
74
73
|
|
75
74
|
result = lzws_create_destination_buffer_for_decompressor(&destination_buffer, &destination_buffer_length, quiet);
|
76
75
|
if (result != 0) {
|
@@ -92,13 +91,13 @@ VALUE lzws_ext_initialize_decompressor(VALUE self, VALUE options)
|
|
92
91
|
lzws_ext_raise_error(LZWS_EXT_ERROR_USED_AFTER_CLOSE); \
|
93
92
|
}
|
94
93
|
|
95
|
-
#define GET_SOURCE_DATA(source_value)
|
96
|
-
Check_Type(source_value, T_STRING);
|
97
|
-
|
98
|
-
const char*
|
99
|
-
size_t
|
100
|
-
|
101
|
-
size_t
|
94
|
+
#define GET_SOURCE_DATA(source_value) \
|
95
|
+
Check_Type(source_value, T_STRING); \
|
96
|
+
\
|
97
|
+
const char* source = RSTRING_PTR(source_value); \
|
98
|
+
size_t source_length = RSTRING_LEN(source_value); \
|
99
|
+
lzws_ext_byte_t* remaining_source = (lzws_ext_byte_t*)source; \
|
100
|
+
size_t remaining_source_length = source_length;
|
102
101
|
|
103
102
|
VALUE lzws_ext_decompress(VALUE self, VALUE source_value)
|
104
103
|
{
|
@@ -125,7 +124,7 @@ VALUE lzws_ext_decompress(VALUE self, VALUE source_value)
|
|
125
124
|
}
|
126
125
|
}
|
127
126
|
|
128
|
-
VALUE bytes_read =
|
127
|
+
VALUE bytes_read = SIZET2NUM(source_length - remaining_source_length);
|
129
128
|
VALUE needs_more_destination = result == LZWS_DECOMPRESSOR_NEEDS_MORE_DESTINATION ? Qtrue : Qfalse;
|
130
129
|
|
131
130
|
return rb_ary_new_from_args(2, bytes_read, needs_more_destination);
|
@@ -136,9 +135,9 @@ VALUE lzws_ext_decompressor_read_result(VALUE self)
|
|
136
135
|
GET_DECOMPRESSOR(self);
|
137
136
|
DO_NOT_USE_AFTER_CLOSE(decompressor_ptr);
|
138
137
|
|
139
|
-
|
140
|
-
size_t
|
141
|
-
size_t
|
138
|
+
lzws_ext_byte_t* destination_buffer = decompressor_ptr->destination_buffer;
|
139
|
+
size_t destination_buffer_length = decompressor_ptr->destination_buffer_length;
|
140
|
+
size_t remaining_destination_buffer_length = decompressor_ptr->remaining_destination_buffer_length;
|
142
141
|
|
143
142
|
const char* result = (const char*)destination_buffer;
|
144
143
|
size_t result_length = destination_buffer_length - remaining_destination_buffer_length;
|
@@ -163,7 +162,7 @@ VALUE lzws_ext_decompressor_close(VALUE self)
|
|
163
162
|
decompressor_ptr->state_ptr = NULL;
|
164
163
|
}
|
165
164
|
|
166
|
-
|
165
|
+
lzws_ext_byte_t* destination_buffer = decompressor_ptr->destination_buffer;
|
167
166
|
if (destination_buffer != NULL) {
|
168
167
|
free(destination_buffer);
|
169
168
|
|
@@ -178,9 +177,10 @@ VALUE lzws_ext_decompressor_close(VALUE self)
|
|
178
177
|
|
179
178
|
void lzws_ext_decompressor_exports(VALUE root_module)
|
180
179
|
{
|
181
|
-
VALUE
|
180
|
+
VALUE module = rb_define_module_under(root_module, "Stream");
|
181
|
+
|
182
|
+
VALUE decompressor = rb_define_class_under(module, "NativeDecompressor", rb_cObject);
|
182
183
|
|
183
|
-
VALUE decompressor = rb_define_class_under(stream, "NativeDecompressor", rb_cObject);
|
184
184
|
rb_define_alloc_func(decompressor, lzws_ext_allocate_decompressor);
|
185
185
|
rb_define_method(decompressor, "initialize", lzws_ext_initialize_decompressor, 1);
|
186
186
|
rb_define_method(decompressor, "read", lzws_ext_decompress, 1);
|
@@ -5,16 +5,16 @@
|
|
5
5
|
#define LZWS_EXT_STREAM_DECOMPRESSOR_H
|
6
6
|
|
7
7
|
#include <lzws/decompressor/state.h>
|
8
|
-
#include <stdint.h>
|
9
8
|
#include <stdlib.h>
|
10
9
|
|
10
|
+
#include "lzws_ext/common.h"
|
11
11
|
#include "ruby.h"
|
12
12
|
|
13
13
|
typedef struct {
|
14
14
|
lzws_decompressor_state_t* state_ptr;
|
15
|
-
|
15
|
+
lzws_ext_byte_t* destination_buffer;
|
16
16
|
size_t destination_buffer_length;
|
17
|
-
|
17
|
+
lzws_ext_byte_t* remaining_destination_buffer;
|
18
18
|
size_t remaining_destination_buffer_length;
|
19
19
|
} lzws_ext_decompressor_t;
|
20
20
|
|
data/ext/lzws_ext/string.c
CHANGED
@@ -4,15 +4,16 @@
|
|
4
4
|
#include "lzws_ext/string.h"
|
5
5
|
|
6
6
|
#include <lzws/buffer.h>
|
7
|
+
#include <lzws/common.h>
|
7
8
|
#include <lzws/compressor/common.h>
|
8
9
|
#include <lzws/compressor/main.h>
|
9
10
|
#include <lzws/compressor/state.h>
|
10
11
|
#include <lzws/decompressor/common.h>
|
11
12
|
#include <lzws/decompressor/main.h>
|
12
13
|
#include <lzws/decompressor/state.h>
|
13
|
-
#include <stdint.h>
|
14
14
|
#include <stdlib.h>
|
15
15
|
|
16
|
+
#include "lzws_ext/buffer.h"
|
16
17
|
#include "lzws_ext/error.h"
|
17
18
|
#include "lzws_ext/macro.h"
|
18
19
|
#include "lzws_ext/option.h"
|
@@ -20,26 +21,6 @@
|
|
20
21
|
|
21
22
|
// -- buffer --
|
22
23
|
|
23
|
-
static inline VALUE create_buffer(VALUE length)
|
24
|
-
{
|
25
|
-
return rb_str_new(NULL, NUM2UINT(length));
|
26
|
-
}
|
27
|
-
|
28
|
-
#define CREATE_BUFFER(buffer, length, exception) \
|
29
|
-
VALUE buffer = rb_protect(create_buffer, UINT2NUM(length), &exception);
|
30
|
-
|
31
|
-
static inline VALUE resize_buffer(VALUE args)
|
32
|
-
{
|
33
|
-
VALUE buffer = rb_ary_entry(args, 0);
|
34
|
-
VALUE length = rb_ary_entry(args, 1);
|
35
|
-
return rb_str_resize(buffer, NUM2UINT(length));
|
36
|
-
}
|
37
|
-
|
38
|
-
#define RESIZE_BUFFER(buffer, length, exception) \
|
39
|
-
VALUE resize_buffer_args = rb_ary_new_from_args(2, buffer, UINT2NUM(length)); \
|
40
|
-
buffer = rb_protect(resize_buffer, resize_buffer_args, &exception); \
|
41
|
-
RB_GC_GUARD(resize_buffer_args);
|
42
|
-
|
43
24
|
static inline lzws_ext_result_t increase_destination_buffer(
|
44
25
|
VALUE destination_value, size_t destination_length,
|
45
26
|
size_t* remaining_destination_buffer_length_ptr, size_t destination_buffer_length)
|
@@ -51,7 +32,7 @@ static inline lzws_ext_result_t increase_destination_buffer(
|
|
51
32
|
|
52
33
|
int exception;
|
53
34
|
|
54
|
-
|
35
|
+
LZWS_EXT_RESIZE_STRING_BUFFER(destination_value, destination_length + destination_buffer_length, exception);
|
55
36
|
if (exception != 0) {
|
56
37
|
return LZWS_EXT_ERROR_ALLOCATE_FAILED;
|
57
38
|
}
|
@@ -63,54 +44,55 @@ static inline lzws_ext_result_t increase_destination_buffer(
|
|
63
44
|
|
64
45
|
// -- utils --
|
65
46
|
|
66
|
-
#define GET_SOURCE_DATA(source_value)
|
67
|
-
Check_Type(source_value, T_STRING);
|
68
|
-
|
69
|
-
const char* source
|
70
|
-
size_t source_length
|
71
|
-
uint8_t* remaining_source = (uint8_t*)source; \
|
72
|
-
size_t remaining_source_length = source_length;
|
47
|
+
#define GET_SOURCE_DATA(source_value) \
|
48
|
+
Check_Type(source_value, T_STRING); \
|
49
|
+
\
|
50
|
+
const char* source = RSTRING_PTR(source_value); \
|
51
|
+
size_t source_length = RSTRING_LEN(source_value);
|
73
52
|
|
74
53
|
// -- compress --
|
75
54
|
|
76
|
-
#define BUFFERED_COMPRESS(function, ...)
|
77
|
-
while (true) {
|
78
|
-
|
79
|
-
size_t
|
80
|
-
|
81
|
-
result = function(__VA_ARGS__, &remaining_destination_buffer, &remaining_destination_buffer_length);
|
82
|
-
|
83
|
-
if (
|
84
|
-
result != 0 &&
|
85
|
-
result != LZWS_COMPRESSOR_NEEDS_MORE_DESTINATION) {
|
86
|
-
return LZWS_EXT_ERROR_UNEXPECTED;
|
87
|
-
}
|
88
|
-
|
89
|
-
destination_length += prev_remaining_destination_buffer_length - remaining_destination_buffer_length;
|
90
|
-
|
91
|
-
if (result == LZWS_COMPRESSOR_NEEDS_MORE_DESTINATION) {
|
92
|
-
ext_result = increase_destination_buffer(
|
93
|
-
destination_value, destination_length,
|
94
|
-
&remaining_destination_buffer_length, destination_buffer_length);
|
95
|
-
|
96
|
-
if (ext_result != 0) {
|
97
|
-
return ext_result;
|
98
|
-
}
|
99
|
-
|
100
|
-
continue;
|
101
|
-
}
|
102
|
-
|
103
|
-
break;
|
55
|
+
#define BUFFERED_COMPRESS(function, ...) \
|
56
|
+
while (true) { \
|
57
|
+
lzws_ext_byte_t* remaining_destination_buffer = (lzws_ext_byte_t*)RSTRING_PTR(destination_value) + destination_length; \
|
58
|
+
size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length; \
|
59
|
+
\
|
60
|
+
result = function(__VA_ARGS__, &remaining_destination_buffer, &remaining_destination_buffer_length); \
|
61
|
+
\
|
62
|
+
if ( \
|
63
|
+
result != 0 && \
|
64
|
+
result != LZWS_COMPRESSOR_NEEDS_MORE_DESTINATION) { \
|
65
|
+
return LZWS_EXT_ERROR_UNEXPECTED; \
|
66
|
+
} \
|
67
|
+
\
|
68
|
+
destination_length += prev_remaining_destination_buffer_length - remaining_destination_buffer_length; \
|
69
|
+
\
|
70
|
+
if (result == LZWS_COMPRESSOR_NEEDS_MORE_DESTINATION) { \
|
71
|
+
ext_result = increase_destination_buffer( \
|
72
|
+
destination_value, destination_length, \
|
73
|
+
&remaining_destination_buffer_length, destination_buffer_length); \
|
74
|
+
\
|
75
|
+
if (ext_result != 0) { \
|
76
|
+
return ext_result; \
|
77
|
+
} \
|
78
|
+
\
|
79
|
+
continue; \
|
80
|
+
} \
|
81
|
+
\
|
82
|
+
break; \
|
104
83
|
}
|
105
84
|
|
106
85
|
static inline lzws_ext_result_t compress(
|
107
86
|
lzws_compressor_state_t* state_ptr,
|
108
|
-
|
87
|
+
const char* source, size_t source_length,
|
109
88
|
VALUE destination_value, size_t destination_buffer_length)
|
110
89
|
{
|
111
90
|
lzws_result_t result;
|
112
91
|
lzws_ext_result_t ext_result;
|
113
92
|
|
93
|
+
lzws_ext_byte_t* remaining_source = (lzws_ext_byte_t*)source;
|
94
|
+
size_t remaining_source_length = source_length;
|
95
|
+
|
114
96
|
size_t destination_length = 0;
|
115
97
|
size_t remaining_destination_buffer_length = destination_buffer_length;
|
116
98
|
|
@@ -119,7 +101,7 @@ static inline lzws_ext_result_t compress(
|
|
119
101
|
|
120
102
|
int exception;
|
121
103
|
|
122
|
-
|
104
|
+
LZWS_EXT_RESIZE_STRING_BUFFER(destination_value, destination_length, exception);
|
123
105
|
if (exception != 0) {
|
124
106
|
return LZWS_EXT_ERROR_ALLOCATE_FAILED;
|
125
107
|
}
|
@@ -157,7 +139,7 @@ VALUE lzws_ext_compress_string(VALUE LZWS_EXT_UNUSED(self), VALUE source_value,
|
|
157
139
|
|
158
140
|
int exception;
|
159
141
|
|
160
|
-
|
142
|
+
LZWS_EXT_CREATE_STRING_BUFFER(destination_value, destination_buffer_length, exception);
|
161
143
|
if (exception != 0) {
|
162
144
|
lzws_compressor_free_state(state_ptr);
|
163
145
|
lzws_ext_raise_error(LZWS_EXT_ERROR_ALLOCATE_FAILED);
|
@@ -165,7 +147,7 @@ VALUE lzws_ext_compress_string(VALUE LZWS_EXT_UNUSED(self), VALUE source_value,
|
|
165
147
|
|
166
148
|
lzws_ext_result_t ext_result = compress(
|
167
149
|
state_ptr,
|
168
|
-
|
150
|
+
source, source_length,
|
169
151
|
destination_value, destination_buffer_length);
|
170
152
|
|
171
153
|
lzws_compressor_free_state(state_ptr);
|
@@ -181,18 +163,21 @@ VALUE lzws_ext_compress_string(VALUE LZWS_EXT_UNUSED(self), VALUE source_value,
|
|
181
163
|
|
182
164
|
static inline lzws_ext_result_t decompress(
|
183
165
|
lzws_decompressor_state_t* state_ptr,
|
184
|
-
|
166
|
+
const char* source, size_t source_length,
|
185
167
|
VALUE destination_value, size_t destination_buffer_length)
|
186
168
|
{
|
187
169
|
lzws_result_t result;
|
188
170
|
lzws_ext_result_t ext_result;
|
189
171
|
|
172
|
+
lzws_ext_byte_t* remaining_source = (lzws_ext_byte_t*)source;
|
173
|
+
size_t remaining_source_length = source_length;
|
174
|
+
|
190
175
|
size_t destination_length = 0;
|
191
176
|
size_t remaining_destination_buffer_length = destination_buffer_length;
|
192
177
|
|
193
178
|
while (true) {
|
194
|
-
|
195
|
-
size_t
|
179
|
+
lzws_ext_byte_t* remaining_destination_buffer = (lzws_ext_byte_t*)RSTRING_PTR(destination_value) + destination_length;
|
180
|
+
size_t prev_remaining_destination_buffer_length = remaining_destination_buffer_length;
|
196
181
|
|
197
182
|
result = lzws_decompress(
|
198
183
|
state_ptr,
|
@@ -232,7 +217,7 @@ static inline lzws_ext_result_t decompress(
|
|
232
217
|
|
233
218
|
int exception;
|
234
219
|
|
235
|
-
|
220
|
+
LZWS_EXT_RESIZE_STRING_BUFFER(destination_value, destination_length, exception);
|
236
221
|
if (exception != 0) {
|
237
222
|
return LZWS_EXT_ERROR_ALLOCATE_FAILED;
|
238
223
|
}
|
@@ -268,7 +253,7 @@ VALUE lzws_ext_decompress_string(VALUE LZWS_EXT_UNUSED(self), VALUE source_value
|
|
268
253
|
|
269
254
|
int exception;
|
270
255
|
|
271
|
-
|
256
|
+
LZWS_EXT_CREATE_STRING_BUFFER(destination_value, destination_buffer_length, exception);
|
272
257
|
if (exception != 0) {
|
273
258
|
lzws_decompressor_free_state(state_ptr);
|
274
259
|
lzws_ext_raise_error(LZWS_EXT_ERROR_ALLOCATE_FAILED);
|
@@ -276,7 +261,7 @@ VALUE lzws_ext_decompress_string(VALUE LZWS_EXT_UNUSED(self), VALUE source_value
|
|
276
261
|
|
277
262
|
lzws_ext_result_t ext_result = decompress(
|
278
263
|
state_ptr,
|
279
|
-
|
264
|
+
source, source_length,
|
280
265
|
destination_value, destination_buffer_length);
|
281
266
|
|
282
267
|
lzws_decompressor_free_state(state_ptr);
|
data/lib/lzws.rb
CHANGED