ruby-lzws 1.1.0 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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