extzstd 0.2 → 0.3
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/HISTORY.ja.md +13 -0
- data/README.md +17 -14
- data/contrib/zstd/{NEWS → CHANGELOG} +115 -2
- data/contrib/zstd/CODE_OF_CONDUCT.md +5 -0
- data/contrib/zstd/Makefile +99 -53
- data/contrib/zstd/README.md +59 -39
- data/contrib/zstd/TESTING.md +1 -1
- data/contrib/zstd/appveyor.yml +17 -6
- data/contrib/zstd/lib/BUCK +29 -2
- data/contrib/zstd/lib/Makefile +118 -21
- data/contrib/zstd/lib/README.md +84 -44
- data/contrib/zstd/lib/common/bitstream.h +17 -33
- data/contrib/zstd/lib/common/compiler.h +62 -8
- data/contrib/zstd/lib/common/cpu.h +215 -0
- data/contrib/zstd/lib/common/debug.c +44 -0
- data/contrib/zstd/lib/common/debug.h +134 -0
- data/contrib/zstd/lib/common/entropy_common.c +16 -1
- data/contrib/zstd/lib/common/error_private.c +7 -0
- data/contrib/zstd/lib/common/fse.h +48 -44
- data/contrib/zstd/lib/common/fse_decompress.c +3 -3
- data/contrib/zstd/lib/common/huf.h +169 -113
- data/contrib/zstd/lib/common/mem.h +20 -2
- data/contrib/zstd/lib/common/pool.c +135 -49
- data/contrib/zstd/lib/common/pool.h +40 -21
- data/contrib/zstd/lib/common/threading.c +2 -2
- data/contrib/zstd/lib/common/threading.h +12 -12
- data/contrib/zstd/lib/common/xxhash.c +3 -2
- data/contrib/zstd/lib/common/zstd_common.c +3 -6
- data/contrib/zstd/lib/common/zstd_errors.h +17 -7
- data/contrib/zstd/lib/common/zstd_internal.h +76 -48
- data/contrib/zstd/lib/compress/fse_compress.c +89 -209
- data/contrib/zstd/lib/compress/hist.c +203 -0
- data/contrib/zstd/lib/compress/hist.h +95 -0
- data/contrib/zstd/lib/compress/huf_compress.c +188 -80
- data/contrib/zstd/lib/compress/zstd_compress.c +2500 -1203
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +463 -62
- data/contrib/zstd/lib/compress/zstd_double_fast.c +321 -131
- data/contrib/zstd/lib/compress/zstd_double_fast.h +13 -4
- data/contrib/zstd/lib/compress/zstd_fast.c +335 -108
- data/contrib/zstd/lib/compress/zstd_fast.h +12 -6
- data/contrib/zstd/lib/compress/zstd_lazy.c +654 -313
- data/contrib/zstd/lib/compress/zstd_lazy.h +44 -16
- data/contrib/zstd/lib/compress/zstd_ldm.c +310 -420
- data/contrib/zstd/lib/compress/zstd_ldm.h +63 -26
- data/contrib/zstd/lib/compress/zstd_opt.c +773 -325
- data/contrib/zstd/lib/compress/zstd_opt.h +31 -5
- data/contrib/zstd/lib/compress/zstdmt_compress.c +1468 -518
- data/contrib/zstd/lib/compress/zstdmt_compress.h +96 -45
- data/contrib/zstd/lib/decompress/huf_decompress.c +518 -282
- data/contrib/zstd/lib/decompress/zstd_ddict.c +240 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.h +44 -0
- data/contrib/zstd/lib/decompress/zstd_decompress.c +613 -1513
- data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1311 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_block.h +59 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +175 -0
- data/contrib/zstd/lib/dictBuilder/cover.c +194 -113
- data/contrib/zstd/lib/dictBuilder/cover.h +112 -0
- data/contrib/zstd/lib/dictBuilder/divsufsort.c +3 -3
- data/contrib/zstd/lib/dictBuilder/fastcover.c +740 -0
- data/contrib/zstd/lib/dictBuilder/zdict.c +142 -106
- data/contrib/zstd/lib/dictBuilder/zdict.h +115 -49
- data/contrib/zstd/lib/legacy/zstd_legacy.h +44 -12
- data/contrib/zstd/lib/legacy/zstd_v01.c +41 -10
- data/contrib/zstd/lib/legacy/zstd_v01.h +12 -7
- data/contrib/zstd/lib/legacy/zstd_v02.c +37 -12
- data/contrib/zstd/lib/legacy/zstd_v02.h +12 -7
- data/contrib/zstd/lib/legacy/zstd_v03.c +38 -12
- data/contrib/zstd/lib/legacy/zstd_v03.h +12 -7
- data/contrib/zstd/lib/legacy/zstd_v04.c +55 -174
- data/contrib/zstd/lib/legacy/zstd_v04.h +12 -7
- data/contrib/zstd/lib/legacy/zstd_v05.c +59 -31
- data/contrib/zstd/lib/legacy/zstd_v05.h +12 -7
- data/contrib/zstd/lib/legacy/zstd_v06.c +48 -20
- data/contrib/zstd/lib/legacy/zstd_v06.h +10 -5
- data/contrib/zstd/lib/legacy/zstd_v07.c +62 -29
- data/contrib/zstd/lib/legacy/zstd_v07.h +10 -5
- data/contrib/zstd/lib/zstd.h +1346 -832
- data/ext/extzstd.c +27 -19
- data/ext/extzstd_stream.c +20 -4
- data/ext/zstd_compress.c +1 -0
- data/ext/zstd_decompress.c +4 -0
- data/ext/zstd_dictbuilder.c +4 -0
- data/ext/zstd_dictbuilder_fastcover.c +5 -0
- data/lib/extzstd.rb +52 -220
- data/lib/extzstd/version.rb +1 -1
- metadata +21 -7
- data/contrib/zstd/circle.yml +0 -63
data/ext/extzstd.c
CHANGED
|
@@ -79,13 +79,15 @@ extzstd_make_errorf(ssize_t errcode, const char *fmt, ...)
|
|
|
79
79
|
VALUE e;
|
|
80
80
|
|
|
81
81
|
if (fmt && strlen(fmt) > 0) {
|
|
82
|
+
VALUE args[] = { SSIZET2NUM(errcode), Qnil };
|
|
82
83
|
va_list va;
|
|
83
84
|
va_start(va, fmt);
|
|
84
|
-
|
|
85
|
+
args[1] = rb_vsprintf(fmt, va);
|
|
85
86
|
va_end(va);
|
|
86
|
-
return
|
|
87
|
+
return rb_class_new_instance(2, args, extzstd_eError);
|
|
87
88
|
} else {
|
|
88
|
-
|
|
89
|
+
VALUE args[] = { SSIZET2NUM(errcode) };
|
|
90
|
+
return rb_class_new_instance(1, args, extzstd_eError);
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
|
|
@@ -158,6 +160,7 @@ init_constants(void)
|
|
|
158
160
|
rb_define_const(mConstants, "ZSTD_BTLAZY2", INT2NUM(ZSTD_btlazy2));
|
|
159
161
|
rb_define_const(mConstants, "ZSTD_BTOPT", INT2NUM(ZSTD_btopt));
|
|
160
162
|
rb_define_const(mConstants, "ZSTD_BTULTRA", INT2NUM(ZSTD_btultra));
|
|
163
|
+
rb_define_const(mConstants, "ZSTD_BTULTRA2", INT2NUM(ZSTD_btultra2));
|
|
161
164
|
rb_define_const(mConstants, "ZSTD_WINDOWLOG_MAX", INT2NUM(ZSTD_WINDOWLOG_MAX));
|
|
162
165
|
rb_define_const(mConstants, "ZSTD_WINDOWLOG_MIN", INT2NUM(ZSTD_WINDOWLOG_MIN));
|
|
163
166
|
rb_define_const(mConstants, "ZSTD_HASHLOG_MAX", INT2NUM(ZSTD_HASHLOG_MAX));
|
|
@@ -167,10 +170,10 @@ init_constants(void)
|
|
|
167
170
|
rb_define_const(mConstants, "ZSTD_HASHLOG3_MAX", INT2NUM(ZSTD_HASHLOG3_MAX));
|
|
168
171
|
rb_define_const(mConstants, "ZSTD_SEARCHLOG_MAX", INT2NUM(ZSTD_SEARCHLOG_MAX));
|
|
169
172
|
rb_define_const(mConstants, "ZSTD_SEARCHLOG_MIN", INT2NUM(ZSTD_SEARCHLOG_MIN));
|
|
170
|
-
rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
|
|
171
|
-
rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
|
|
172
|
-
rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
|
|
173
|
-
rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
|
|
173
|
+
//rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
|
|
174
|
+
//rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
|
|
175
|
+
//rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
|
|
176
|
+
//rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
|
|
174
177
|
|
|
175
178
|
rb_define_const(mConstants, "FAST", INT2NUM(ZSTD_fast));
|
|
176
179
|
rb_define_const(mConstants, "DFAST", INT2NUM(ZSTD_dfast));
|
|
@@ -180,6 +183,7 @@ init_constants(void)
|
|
|
180
183
|
rb_define_const(mConstants, "BTLAZY2", INT2NUM(ZSTD_btlazy2));
|
|
181
184
|
rb_define_const(mConstants, "BTOPT", INT2NUM(ZSTD_btopt));
|
|
182
185
|
rb_define_const(mConstants, "BTULTRA", INT2NUM(ZSTD_btultra));
|
|
186
|
+
rb_define_const(mConstants, "BTULTRA2", INT2NUM(ZSTD_btultra2));
|
|
183
187
|
rb_define_const(mConstants, "WINDOWLOG_MAX", INT2NUM(ZSTD_WINDOWLOG_MAX));
|
|
184
188
|
rb_define_const(mConstants, "WINDOWLOG_MIN", INT2NUM(ZSTD_WINDOWLOG_MIN));
|
|
185
189
|
rb_define_const(mConstants, "HASHLOG_MAX", INT2NUM(ZSTD_HASHLOG_MAX));
|
|
@@ -189,10 +193,10 @@ init_constants(void)
|
|
|
189
193
|
rb_define_const(mConstants, "HASHLOG3_MAX", INT2NUM(ZSTD_HASHLOG3_MAX));
|
|
190
194
|
rb_define_const(mConstants, "SEARCHLOG_MAX", INT2NUM(ZSTD_SEARCHLOG_MAX));
|
|
191
195
|
rb_define_const(mConstants, "SEARCHLOG_MIN", INT2NUM(ZSTD_SEARCHLOG_MIN));
|
|
192
|
-
rb_define_const(mConstants, "SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
|
|
193
|
-
rb_define_const(mConstants, "SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
|
|
194
|
-
rb_define_const(mConstants, "TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
|
|
195
|
-
rb_define_const(mConstants, "TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
|
|
196
|
+
//rb_define_const(mConstants, "SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
|
|
197
|
+
//rb_define_const(mConstants, "SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
|
|
198
|
+
//rb_define_const(mConstants, "TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
|
|
199
|
+
//rb_define_const(mConstants, "TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
|
|
196
200
|
}
|
|
197
201
|
|
|
198
202
|
/*
|
|
@@ -243,7 +247,7 @@ extzstd_params_alloc(ZSTD_parameters **p)
|
|
|
243
247
|
* [opts contentlog: nil]
|
|
244
248
|
* [opts hashlog: nil]
|
|
245
249
|
* [opts searchlog: nil]
|
|
246
|
-
* [opts
|
|
250
|
+
* [opts minmatch: nil]
|
|
247
251
|
* [opts targetlength: nil]
|
|
248
252
|
* [opts strategy: nil]
|
|
249
253
|
*/
|
|
@@ -276,9 +280,12 @@ params_init(int argc, VALUE argv[], VALUE v)
|
|
|
276
280
|
SETUP_PARAM(p->cParams.chainLog, opts, "chainlog", NUM2UINT);
|
|
277
281
|
SETUP_PARAM(p->cParams.hashLog, opts, "hashlog", NUM2UINT);
|
|
278
282
|
SETUP_PARAM(p->cParams.searchLog, opts, "searchlog", NUM2UINT);
|
|
279
|
-
SETUP_PARAM(p->cParams.
|
|
283
|
+
SETUP_PARAM(p->cParams.minMatch, opts, "minmatch", NUM2UINT);
|
|
280
284
|
SETUP_PARAM(p->cParams.targetLength, opts, "targetlength", NUM2UINT);
|
|
281
285
|
SETUP_PARAM(p->cParams.strategy, opts, "strategy", NUM2UINT);
|
|
286
|
+
SETUP_PARAM(p->fParams.contentSizeFlag, opts, "contentsize", RTEST);
|
|
287
|
+
SETUP_PARAM(p->fParams.checksumFlag, opts, "checksum", RTEST);
|
|
288
|
+
SETUP_PARAM(p->fParams.noDictIDFlag, opts, "nodictid", RTEST);
|
|
282
289
|
#undef SETUP_PARAM
|
|
283
290
|
}
|
|
284
291
|
|
|
@@ -322,7 +329,7 @@ IMP_PARAMS(params_windowlog, params_set_windowlog, windowLog);
|
|
|
322
329
|
IMP_PARAMS(params_chainlog, params_set_chainlog, chainLog);
|
|
323
330
|
IMP_PARAMS(params_hashlog, params_set_hashlog, hashLog);
|
|
324
331
|
IMP_PARAMS(params_searchlog, params_set_searchlog, searchLog);
|
|
325
|
-
IMP_PARAMS(
|
|
332
|
+
IMP_PARAMS(params_minmatch, params_set_minmatch, minMatch);
|
|
326
333
|
IMP_PARAMS(params_targetlength, params_set_targetlength, targetLength);
|
|
327
334
|
IMP_PARAMS(params_strategy, params_set_strategy, strategy);
|
|
328
335
|
|
|
@@ -375,8 +382,8 @@ params_s_get_preset(int argc, VALUE argv[], VALUE mod)
|
|
|
375
382
|
* Document-method: Zstd::Parameters#hashlog=
|
|
376
383
|
* Document-method: Zstd::Parameters#searchlog
|
|
377
384
|
* Document-method: Zstd::Parameters#searchlog=
|
|
378
|
-
* Document-method: Zstd::Parameters#
|
|
379
|
-
* Document-method: Zstd::Parameters#
|
|
385
|
+
* Document-method: Zstd::Parameters#minmatch
|
|
386
|
+
* Document-method: Zstd::Parameters#minmatch=
|
|
380
387
|
* Document-method: Zstd::Parameters#targetlength
|
|
381
388
|
* Document-method: Zstd::Parameters#targetlength=
|
|
382
389
|
* Document-method: Zstd::Parameters#strategy
|
|
@@ -403,8 +410,8 @@ init_params(void)
|
|
|
403
410
|
rb_define_method(extzstd_cParams, "hashlog=", RUBY_METHOD_FUNC(params_set_hashlog), 1);
|
|
404
411
|
rb_define_method(extzstd_cParams, "searchlog", RUBY_METHOD_FUNC(params_searchlog), 0);
|
|
405
412
|
rb_define_method(extzstd_cParams, "searchlog=", RUBY_METHOD_FUNC(params_set_searchlog), 1);
|
|
406
|
-
rb_define_method(extzstd_cParams, "
|
|
407
|
-
rb_define_method(extzstd_cParams, "
|
|
413
|
+
rb_define_method(extzstd_cParams, "minmatch", RUBY_METHOD_FUNC(params_minmatch), 0);
|
|
414
|
+
rb_define_method(extzstd_cParams, "minmatch=", RUBY_METHOD_FUNC(params_set_minmatch), 1);
|
|
408
415
|
rb_define_method(extzstd_cParams, "targetlength", RUBY_METHOD_FUNC(params_targetlength), 0);
|
|
409
416
|
rb_define_method(extzstd_cParams, "targetlength=", RUBY_METHOD_FUNC(params_set_targetlength), 1);
|
|
410
417
|
rb_define_method(extzstd_cParams, "strategy", RUBY_METHOD_FUNC(params_strategy), 0);
|
|
@@ -432,7 +439,8 @@ dict_s_train_from_buffer(VALUE mod, VALUE src, VALUE dict_capacity)
|
|
|
432
439
|
size_t capa = NUM2SIZET(dict_capacity);
|
|
433
440
|
VALUE dict = rb_str_buf_new(capa);
|
|
434
441
|
size_t srcsize = RSTRING_LEN(src);
|
|
435
|
-
|
|
442
|
+
const ZDICT_legacy_params_t params = { 0 };
|
|
443
|
+
size_t s = ZDICT_trainFromBuffer_legacy(RSTRING_PTR(dict), capa, RSTRING_PTR(src), &srcsize, 1, params);
|
|
436
444
|
extzstd_check_error(s);
|
|
437
445
|
rb_str_set_len(dict, s);
|
|
438
446
|
return dict;
|
data/ext/extzstd_stream.c
CHANGED
|
@@ -145,7 +145,7 @@ enc_init(int argc, VALUE argv[], VALUE self)
|
|
|
145
145
|
|
|
146
146
|
if (extzstd_params_p(params)) {
|
|
147
147
|
ZSTD_parameters *paramsp = extzstd_getparams(params);
|
|
148
|
-
size_t s = ZSTD_initCStream_advanced(p->context, predictp, predictsize, *paramsp,
|
|
148
|
+
size_t s = ZSTD_initCStream_advanced(p->context, predictp, predictsize, *paramsp, -1);
|
|
149
149
|
extzstd_check_error(s);
|
|
150
150
|
} else {
|
|
151
151
|
size_t s = ZSTD_initCStream_usingDict(p->context, predictp, predictsize, aux_num2int(params, 1));
|
|
@@ -166,7 +166,7 @@ enc_write(VALUE self, VALUE src)
|
|
|
166
166
|
*/
|
|
167
167
|
|
|
168
168
|
struct encoder *p = encoder_context(self);
|
|
169
|
-
|
|
169
|
+
src = rb_String(src);
|
|
170
170
|
ZSTD_inBuffer input = { RSTRING_PTR(src), RSTRING_LEN(src), 0 };
|
|
171
171
|
|
|
172
172
|
while (input.pos < input.size) {
|
|
@@ -463,7 +463,7 @@ dec_read_args(int argc, VALUE argv[], VALUE self, VALUE *buf, ssize_t *size)
|
|
|
463
463
|
if (NIL_P(argv[0])) {
|
|
464
464
|
*size = -1;
|
|
465
465
|
|
|
466
|
-
if (argc == 1) {
|
|
466
|
+
if (argc == 1 || NIL_P(argv[1])) {
|
|
467
467
|
*buf = rb_str_buf_new(EXT_READ_GROWUP_SIZE);
|
|
468
468
|
} else {
|
|
469
469
|
rb_check_type(argv[1], RUBY_T_STRING);
|
|
@@ -479,7 +479,7 @@ dec_read_args(int argc, VALUE argv[], VALUE self, VALUE *buf, ssize_t *size)
|
|
|
479
479
|
(intptr_t)*size);
|
|
480
480
|
}
|
|
481
481
|
|
|
482
|
-
if (argc == 1) {
|
|
482
|
+
if (argc == 1 || NIL_P(argv[1])) {
|
|
483
483
|
*buf = rb_str_buf_new(*size);
|
|
484
484
|
} else {
|
|
485
485
|
rb_check_type(argv[1], RUBY_T_STRING);
|
|
@@ -553,6 +553,13 @@ dec_eof(VALUE self)
|
|
|
553
553
|
return (decoder_context(self)->reached_eof == 0 ? Qfalse : Qtrue);
|
|
554
554
|
}
|
|
555
555
|
|
|
556
|
+
static VALUE
|
|
557
|
+
dec_close(VALUE self)
|
|
558
|
+
{
|
|
559
|
+
decoder_context(self)->reached_eof = 1;
|
|
560
|
+
return Qnil;
|
|
561
|
+
}
|
|
562
|
+
|
|
556
563
|
static VALUE
|
|
557
564
|
dec_reset(VALUE self)
|
|
558
565
|
{
|
|
@@ -576,6 +583,13 @@ dec_sizeof(VALUE self)
|
|
|
576
583
|
return SIZET2NUM(s);
|
|
577
584
|
}
|
|
578
585
|
|
|
586
|
+
static VALUE
|
|
587
|
+
dec_pos(VALUE self)
|
|
588
|
+
{
|
|
589
|
+
decoder_context(self); /* check only */
|
|
590
|
+
return INT2FIX(0);
|
|
591
|
+
}
|
|
592
|
+
|
|
579
593
|
static void
|
|
580
594
|
init_decoder(void)
|
|
581
595
|
{
|
|
@@ -587,8 +601,10 @@ init_decoder(void)
|
|
|
587
601
|
rb_define_method(cStreamDecoder, "read", dec_read, -1);
|
|
588
602
|
rb_define_method(cStreamDecoder, "eof", dec_eof, 0);
|
|
589
603
|
rb_define_alias(cStreamDecoder, "eof?", "eof");
|
|
604
|
+
rb_define_method(cStreamDecoder, "close", dec_close, 0);
|
|
590
605
|
rb_define_method(cStreamDecoder, "reset", dec_reset, 0);
|
|
591
606
|
rb_define_method(cStreamDecoder, "sizeof", dec_sizeof, 0);
|
|
607
|
+
rb_define_method(cStreamDecoder, "pos", dec_pos, 0);
|
|
592
608
|
}
|
|
593
609
|
|
|
594
610
|
/*
|
data/ext/zstd_compress.c
CHANGED
data/ext/zstd_decompress.c
CHANGED
|
@@ -3,4 +3,8 @@
|
|
|
3
3
|
#define visibility(v) visibility("hidden")
|
|
4
4
|
|
|
5
5
|
#include "../contrib/zstd/lib/decompress/zstd_decompress.c"
|
|
6
|
+
#include "../contrib/zstd/lib/decompress/zstd_decompress_block.c"
|
|
7
|
+
|
|
8
|
+
#undef CHECK_F
|
|
6
9
|
#include "../contrib/zstd/lib/decompress/huf_decompress.c"
|
|
10
|
+
#include "../contrib/zstd/lib/decompress/zstd_ddict.c"
|
data/ext/zstd_dictbuilder.c
CHANGED
data/lib/extzstd.rb
CHANGED
|
@@ -12,6 +12,32 @@ require "stringio"
|
|
|
12
12
|
# This is ruby bindings for zstd <https://github.com/Cyan4973/zstd> the compression library.
|
|
13
13
|
#
|
|
14
14
|
module Zstd
|
|
15
|
+
module Aux
|
|
16
|
+
EMPTY_BUFFER = "".force_encoding(Encoding::BINARY).freeze
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
refine String do
|
|
20
|
+
def to_zstd(params = nil, dict: nil)
|
|
21
|
+
ContextLess.encode(self, Aux::EMPTY_BUFFER.dup, nil, dict, params)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def unzstd(size = nil, dict: nil)
|
|
25
|
+
Decoder.open(self, dict) { |d| return d.read(size) }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
refine Object do
|
|
30
|
+
def to_zstd(params = nil, dict: nil, &block)
|
|
31
|
+
Encoder.open(self, params, dict, &block)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def unzstd(dict: nil, &block)
|
|
35
|
+
Decoder.open(self, dict, &block)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
using Zstd
|
|
40
|
+
|
|
15
41
|
#
|
|
16
42
|
# call-seq:
|
|
17
43
|
# encode(src_string, level = nil, opts = {}) -> zstd string
|
|
@@ -26,12 +52,8 @@ module Zstd
|
|
|
26
52
|
# [level = nil (integer or nil)]
|
|
27
53
|
# [encode_params (instance of Zstd::Parameters)]
|
|
28
54
|
# [opts dict: nil (string or nil)]
|
|
29
|
-
def self.encode(src,
|
|
30
|
-
|
|
31
|
-
return ContextLess.encode(src, Aux::EMPTY_BUFFER.dup, nil, dict, params)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
Encoder.open(src, params, dict, &block)
|
|
55
|
+
def self.encode(src, *args, &block)
|
|
56
|
+
src.to_zstd(*args, &block)
|
|
35
57
|
end
|
|
36
58
|
|
|
37
59
|
#
|
|
@@ -40,25 +62,17 @@ module Zstd
|
|
|
40
62
|
# decode(zstd_stream, dict: nil) -> zstd decoder
|
|
41
63
|
# decode(zstd_stream, dict: nil) { |decoder| ... } -> yield returned value
|
|
42
64
|
#
|
|
43
|
-
def self.decode(src, *args,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
when 0
|
|
47
|
-
return ContextLess.decode(src, Aux::EMPTY_BUFFER.dup, nil, dict)
|
|
48
|
-
when 1
|
|
49
|
-
Decoder.open(src, dict) { |d| return d.read(args[0].to_i) }
|
|
50
|
-
else
|
|
51
|
-
raise ArgumentError, "wrong argument number (given #{args.size}, expect 1 or 2)"
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
unless args.empty?
|
|
56
|
-
raise ArgumentError, "wrong argument number (given #{args.size}, expect 1)"
|
|
57
|
-
end
|
|
65
|
+
def self.decode(src, *args, &block)
|
|
66
|
+
src.unzstd(*args, &block)
|
|
67
|
+
end
|
|
58
68
|
|
|
59
|
-
|
|
69
|
+
class << Zstd
|
|
70
|
+
alias compress encode
|
|
71
|
+
alias decompress decode
|
|
72
|
+
alias uncompress decode
|
|
60
73
|
end
|
|
61
74
|
|
|
75
|
+
Compressor = Encoder
|
|
62
76
|
StreamEncoder = Encoder
|
|
63
77
|
|
|
64
78
|
class Encoder
|
|
@@ -75,82 +89,21 @@ module Zstd
|
|
|
75
89
|
begin
|
|
76
90
|
yield e
|
|
77
91
|
ensure
|
|
78
|
-
e.close
|
|
92
|
+
e.close unless e.eof?
|
|
79
93
|
end
|
|
80
94
|
end
|
|
81
|
-
end
|
|
82
95
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
# call-seq:
|
|
86
|
-
# open(outport, level = nil, dict = nil) -> zstd encoder
|
|
87
|
-
# open(outport, encode_params, dict = nil) { |encoder| ... } -> yield returned value
|
|
88
|
-
#
|
|
89
|
-
def self.open(outport, *args)
|
|
90
|
-
e = new(outport, *args)
|
|
91
|
-
|
|
92
|
-
return e unless block_given?
|
|
93
|
-
|
|
94
|
-
begin
|
|
95
|
-
yield e
|
|
96
|
-
ensure
|
|
97
|
-
e.close rescue nil unless e.eof?
|
|
98
|
-
end
|
|
96
|
+
def self.encode(src, params = nil, dest: nil, dict: nil)
|
|
97
|
+
ContextLess.encode(src, dest || Aux::EMPTY_BUFFER.dup, nil, dict, params)
|
|
99
98
|
end
|
|
100
99
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
# initialize(outport, level = nil, dict = nil)
|
|
104
|
-
# initialize(outport, encode_params, dict = nil)
|
|
105
|
-
#
|
|
106
|
-
# +outport+ need has +.<<+ method.
|
|
107
|
-
#
|
|
108
|
-
def initialize(outport, params = nil, dict = nil)
|
|
109
|
-
encoder = StreamEncoder.new(params, dict)
|
|
110
|
-
super encoder, outport, "".force_encoding(Encoding::BINARY), [true]
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def eof
|
|
114
|
-
!status[0]
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
alias eof? eof
|
|
118
|
-
|
|
119
|
-
def close
|
|
120
|
-
return nil if eof?
|
|
121
|
-
encoder.end(destbuf, StreamEncoder::OUTSIZE)
|
|
122
|
-
outport << destbuf
|
|
123
|
-
status[0] = false
|
|
124
|
-
nil
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def write(buf)
|
|
128
|
-
raise IOError, "closed stream" if eof?
|
|
129
|
-
|
|
130
|
-
off = 0
|
|
131
|
-
rest = buf.bytesize
|
|
132
|
-
outsize = StreamEncoder::OUTSIZE
|
|
133
|
-
while off && off < rest
|
|
134
|
-
off = encoder.update(buf, off, destbuf, outsize)
|
|
135
|
-
outport << destbuf
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
self
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
alias << write
|
|
142
|
-
|
|
143
|
-
def flush
|
|
144
|
-
raise IOError, "closed stream" if eof?
|
|
145
|
-
|
|
146
|
-
off = 0
|
|
147
|
-
encoder.flush(destbuf, StreamEncoder::OUTSIZE)
|
|
148
|
-
outport << destbuf
|
|
149
|
-
|
|
150
|
-
self
|
|
100
|
+
class << Encoder
|
|
101
|
+
alias compress encode
|
|
151
102
|
end
|
|
152
|
-
end
|
|
103
|
+
end
|
|
153
104
|
|
|
105
|
+
Uncompressor = Decoder
|
|
106
|
+
Decompressor = Decoder
|
|
154
107
|
StreamDecoder = Decoder
|
|
155
108
|
|
|
156
109
|
class Decoder
|
|
@@ -175,122 +128,19 @@ module Zstd
|
|
|
175
128
|
dec.close rescue nil
|
|
176
129
|
end
|
|
177
130
|
end
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
class Decoder
|
|
181
|
-
attr_reader :decoder, :inport, :readbuf, :destbuf, :status, :pos
|
|
182
|
-
|
|
183
|
-
STATUS_CLOSED = nil
|
|
184
|
-
STATUS_READY = 0
|
|
185
|
-
STATUS_INPORT_EOF = 1
|
|
186
|
-
|
|
187
|
-
#
|
|
188
|
-
# call-seq:
|
|
189
|
-
# open(inport, dict = nil) -> decoder
|
|
190
|
-
# open(inport, dict = nil) { |decoder| ... } -> yield returned value
|
|
191
|
-
#
|
|
192
|
-
# [inport]
|
|
193
|
-
# String instance or +read+ method haved Object.
|
|
194
|
-
#
|
|
195
|
-
def self.open(inport, dict = nil)
|
|
196
|
-
inport = StringIO.new(inport) if inport.kind_of?(String)
|
|
197
|
-
|
|
198
|
-
dec = new(inport, dict)
|
|
199
|
-
|
|
200
|
-
return dec unless block_given?
|
|
201
131
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
dec.close rescue nil
|
|
206
|
-
end
|
|
207
|
-
end
|
|
132
|
+
def self.decode(src, dest: nil, dict: nil)
|
|
133
|
+
# NOTE: ContextLess.decode は伸長時のサイズが必要なため、常に利用できるわけではない
|
|
134
|
+
# ContextLess.decode(src, dest || Aux::EMPTY_BUFFER.dup, nil, dict)
|
|
208
135
|
|
|
209
|
-
|
|
210
|
-
raise Error, "require .read method - <%s:0x%08x>" % [inport.class, inport.object_id << 1] unless inport.respond_to?(:read)
|
|
211
|
-
@decoder = StreamDecoder.new(dict)
|
|
212
|
-
@inport = inport
|
|
213
|
-
@readbuf = StringIO.new(Aux::EMPTY_BUFFER.dup)
|
|
214
|
-
@destbuf = StringIO.new(Aux::EMPTY_BUFFER.dup)
|
|
215
|
-
@status = STATUS_READY
|
|
216
|
-
@pos = 0
|
|
136
|
+
new(StringIO.new(src), dict).read(nil, dest)
|
|
217
137
|
end
|
|
218
138
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
destbuf.truncate 0
|
|
223
|
-
@status = STATUS_CLOSED
|
|
224
|
-
nil
|
|
139
|
+
class << Decoder
|
|
140
|
+
alias decompress decode
|
|
141
|
+
alias uncompress decode
|
|
225
142
|
end
|
|
226
|
-
|
|
227
|
-
def eof
|
|
228
|
-
!status
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
alias eof? eof
|
|
232
|
-
|
|
233
|
-
def read(size = nil, dest = Aux::EMPTY_BUFFER.dup)
|
|
234
|
-
dest ||= Aux::EMPTY_BUFFER.dup
|
|
235
|
-
size &&= size.to_i
|
|
236
|
-
Aux.change_binary(dest) do
|
|
237
|
-
#dest.clear
|
|
238
|
-
dest[0 .. -1] = Aux::EMPTY_BUFFER unless dest.empty? # keep allocated heap
|
|
239
|
-
return dest unless !size || size > 0
|
|
240
|
-
|
|
241
|
-
d = Aux::EMPTY_BUFFER.dup
|
|
242
|
-
until size && size <= 0
|
|
243
|
-
if destbuf.eof?
|
|
244
|
-
break unless fetch
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
destbuf.read(size, d)
|
|
248
|
-
dest << d
|
|
249
|
-
|
|
250
|
-
size -= d.bytesize if size
|
|
251
|
-
end
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
if dest.empty?
|
|
255
|
-
nil
|
|
256
|
-
else
|
|
257
|
-
@pos += dest.bytesize
|
|
258
|
-
dest
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
private
|
|
263
|
-
def fetch
|
|
264
|
-
return nil if eof?
|
|
265
|
-
|
|
266
|
-
destbuf.rewind
|
|
267
|
-
destbuf.truncate 0
|
|
268
|
-
|
|
269
|
-
while true
|
|
270
|
-
if readbuf.eof? && status != STATUS_INPORT_EOF
|
|
271
|
-
readbuf.rewind
|
|
272
|
-
unless inport.read StreamDecoder::INSIZE, readbuf.string
|
|
273
|
-
@status = STATUS_INPORT_EOF
|
|
274
|
-
end
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
begin
|
|
278
|
-
off = decoder.update readbuf.string, readbuf.pos, destbuf.string, StreamDecoder::OUTSIZE
|
|
279
|
-
readbuf.pos = off if off
|
|
280
|
-
return self if destbuf.size > 0
|
|
281
|
-
break if readbuf.eof? && status == STATUS_INPORT_EOF
|
|
282
|
-
rescue Zstd::InitMissingError
|
|
283
|
-
break if readbuf.eof? && status == STATUS_INPORT_EOF
|
|
284
|
-
raise
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
# when readbuf.eof? && status == STATUS_INPORT_EOF
|
|
289
|
-
|
|
290
|
-
@status = nil
|
|
291
|
-
nil
|
|
292
|
-
end
|
|
293
|
-
end if false
|
|
143
|
+
end
|
|
294
144
|
|
|
295
145
|
class Parameters
|
|
296
146
|
def inspect
|
|
@@ -318,22 +168,4 @@ module Zstd
|
|
|
318
168
|
end
|
|
319
169
|
end
|
|
320
170
|
end
|
|
321
|
-
|
|
322
|
-
module Aux
|
|
323
|
-
EMPTY_BUFFER = "".force_encoding(Encoding::BINARY).freeze
|
|
324
|
-
|
|
325
|
-
def self.io_read(io, size, buf)
|
|
326
|
-
raise Error, "encounted EOF (read error)" unless io.read(size, buf)
|
|
327
|
-
raise Error, "read size too small (read error)" unless buf.bytesize == size
|
|
328
|
-
buf
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
def self.change_binary(str)
|
|
332
|
-
e = str.encoding
|
|
333
|
-
str.force_encoding(Encoding::BINARY)
|
|
334
|
-
yield
|
|
335
|
-
ensure
|
|
336
|
-
str.force_encoding e rescue nil if e
|
|
337
|
-
end
|
|
338
|
-
end
|
|
339
171
|
end
|