extzstd 0.0.3.CONCEPT → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.ja +5 -0
- data/LICENSE +6 -6
- data/README.md +35 -22
- data/contrib/zstd/LICENSE +13 -9
- data/contrib/zstd/README.md +37 -44
- data/contrib/zstd/common/entropy_common.c +33 -39
- data/contrib/zstd/common/error_private.c +43 -0
- data/contrib/zstd/common/error_private.h +11 -60
- data/contrib/zstd/common/fse.h +11 -5
- data/contrib/zstd/common/fse_decompress.c +14 -16
- data/contrib/zstd/common/huf.h +1 -1
- data/contrib/zstd/common/mem.h +36 -43
- data/contrib/zstd/common/xxhash.c +31 -18
- data/contrib/zstd/common/xxhash.h +71 -35
- data/contrib/zstd/common/zbuff.h +29 -35
- data/contrib/zstd/common/zstd_common.c +24 -32
- data/contrib/zstd/common/zstd_errors.h +60 -0
- data/contrib/zstd/common/zstd_internal.h +109 -80
- data/contrib/zstd/compress/fse_compress.c +9 -6
- data/contrib/zstd/compress/huf_compress.c +30 -74
- data/contrib/zstd/compress/zbuff_compress.c +43 -51
- data/contrib/zstd/compress/zstd_compress.c +953 -763
- data/contrib/zstd/compress/zstd_opt.h +115 -261
- data/contrib/zstd/decompress/huf_decompress.c +29 -40
- data/contrib/zstd/decompress/zbuff_decompress.c +36 -78
- data/contrib/zstd/decompress/zstd_decompress.c +976 -496
- data/contrib/zstd/dictBuilder/divsufsort.h +5 -5
- data/contrib/zstd/dictBuilder/zdict.c +194 -229
- data/contrib/zstd/dictBuilder/zdict.h +66 -68
- data/contrib/zstd/legacy/zstd_legacy.h +168 -49
- data/contrib/zstd/legacy/zstd_v01.c +95 -178
- data/contrib/zstd/legacy/zstd_v01.h +12 -32
- data/contrib/zstd/legacy/zstd_v02.c +48 -274
- data/contrib/zstd/legacy/zstd_v02.h +12 -32
- data/contrib/zstd/legacy/zstd_v03.c +48 -274
- data/contrib/zstd/legacy/zstd_v03.h +12 -32
- data/contrib/zstd/legacy/zstd_v04.c +63 -320
- data/contrib/zstd/legacy/zstd_v04.h +13 -33
- data/contrib/zstd/legacy/zstd_v05.c +80 -345
- data/contrib/zstd/legacy/zstd_v05.h +9 -31
- data/contrib/zstd/legacy/zstd_v06.c +48 -458
- data/contrib/zstd/legacy/zstd_v06.h +41 -67
- data/contrib/zstd/legacy/zstd_v07.c +4544 -0
- data/contrib/zstd/legacy/zstd_v07.h +173 -0
- data/contrib/zstd/zstd.h +640 -0
- data/ext/extconf.rb +7 -3
- data/ext/extzstd.c +263 -106
- data/ext/extzstd.h +8 -6
- data/ext/extzstd_nogvls.h +0 -117
- data/ext/extzstd_stream.c +347 -0
- data/ext/zstd_common.c +8 -0
- data/ext/zstd_compress.c +6 -0
- data/ext/zstd_decompress.c +5 -0
- data/ext/zstd_dictbuilder.c +5 -0
- data/ext/zstd_legacy_v07.c +1 -0
- data/gemstub.rb +18 -16
- data/lib/extzstd/version.rb +1 -1
- data/lib/extzstd.rb +77 -43
- data/test/test_basic.rb +11 -6
- metadata +23 -10
- data/contrib/zstd/common/error_public.h +0 -77
- data/contrib/zstd/common/zstd.h +0 -475
- data/ext/extzstd_buffered.c +0 -265
- data/ext/zstd_amalgam.c +0 -18
data/ext/extzstd.c
CHANGED
@@ -1,8 +1,36 @@
|
|
1
1
|
#include "extzstd.h"
|
2
|
-
#include <mem.h>
|
3
|
-
#include <
|
2
|
+
#include <zstd/common/mem.h>
|
3
|
+
#include <zstd_errors.h>
|
4
4
|
#include <zdict.h>
|
5
5
|
|
6
|
+
static void
|
7
|
+
aux_string_pointer(VALUE str, const char **ptr, size_t *size)
|
8
|
+
{
|
9
|
+
rb_check_type(str, RUBY_T_STRING);
|
10
|
+
RSTRING_GETMEM(str, *ptr, *size);
|
11
|
+
}
|
12
|
+
|
13
|
+
static void
|
14
|
+
aux_string_pointer_with_nil(VALUE str, const char **ptr, size_t *size)
|
15
|
+
{
|
16
|
+
if (NIL_P(str)) {
|
17
|
+
*ptr = NULL;
|
18
|
+
*size = 0;
|
19
|
+
} else {
|
20
|
+
aux_string_pointer(str, ptr, size);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
static void
|
25
|
+
aux_string_expand_pointer(VALUE str, char **ptr, size_t size)
|
26
|
+
{
|
27
|
+
rb_check_type(str, RUBY_T_STRING);
|
28
|
+
rb_str_modify(str);
|
29
|
+
rb_str_set_len(str, 0);
|
30
|
+
rb_str_modify_expand(str, size);
|
31
|
+
*ptr = RSTRING_PTR(str);
|
32
|
+
}
|
33
|
+
|
6
34
|
VALUE extzstd_mZstd;
|
7
35
|
|
8
36
|
/*
|
@@ -207,22 +235,29 @@ init_constants(void)
|
|
207
235
|
VALUE mConstants = rb_define_module_under(extzstd_mZstd, "Constants");
|
208
236
|
rb_include_module(extzstd_mZstd, mConstants);
|
209
237
|
|
238
|
+
rb_define_const(mConstants, "ZSTD_MAX_COMPRESSION_LEVEL", INT2NUM(ZSTD_maxCLevel()));
|
239
|
+
rb_define_const(mConstants, "MAX_COMPRESSION_LEVEL", INT2NUM(ZSTD_maxCLevel()));
|
240
|
+
|
210
241
|
rb_define_const(mConstants, "ZSTD_FAST", INT2NUM(ZSTD_fast));
|
211
242
|
rb_define_const(mConstants, "ZSTD_DFAST", INT2NUM(ZSTD_dfast));
|
212
243
|
rb_define_const(mConstants, "ZSTD_GREEDY", INT2NUM(ZSTD_greedy));
|
213
244
|
rb_define_const(mConstants, "ZSTD_LAZY", INT2NUM(ZSTD_lazy));
|
214
245
|
rb_define_const(mConstants, "ZSTD_LAZY2", INT2NUM(ZSTD_lazy2));
|
215
246
|
rb_define_const(mConstants, "ZSTD_BTLAZY2", INT2NUM(ZSTD_btlazy2));
|
247
|
+
rb_define_const(mConstants, "ZSTD_BTOPT", INT2NUM(ZSTD_btopt));
|
216
248
|
rb_define_const(mConstants, "ZSTD_WINDOWLOG_MAX", INT2NUM(ZSTD_WINDOWLOG_MAX));
|
217
249
|
rb_define_const(mConstants, "ZSTD_WINDOWLOG_MIN", INT2NUM(ZSTD_WINDOWLOG_MIN));
|
218
|
-
rb_define_const(mConstants, "ZSTD_CHAINLOG_MAX", INT2NUM(ZSTD_CHAINLOG_MAX));
|
219
|
-
rb_define_const(mConstants, "ZSTD_CHAINLOG_MIN", INT2NUM(ZSTD_CHAINLOG_MIN));
|
220
250
|
rb_define_const(mConstants, "ZSTD_HASHLOG_MAX", INT2NUM(ZSTD_HASHLOG_MAX));
|
221
251
|
rb_define_const(mConstants, "ZSTD_HASHLOG_MIN", INT2NUM(ZSTD_HASHLOG_MIN));
|
252
|
+
rb_define_const(mConstants, "ZSTD_CHAINLOG_MAX", INT2NUM(ZSTD_CHAINLOG_MAX));
|
253
|
+
rb_define_const(mConstants, "ZSTD_CHAINLOG_MIN", INT2NUM(ZSTD_CHAINLOG_MIN));
|
254
|
+
rb_define_const(mConstants, "ZSTD_HASHLOG3_MAX", INT2NUM(ZSTD_HASHLOG3_MAX));
|
222
255
|
rb_define_const(mConstants, "ZSTD_SEARCHLOG_MAX", INT2NUM(ZSTD_SEARCHLOG_MAX));
|
223
256
|
rb_define_const(mConstants, "ZSTD_SEARCHLOG_MIN", INT2NUM(ZSTD_SEARCHLOG_MIN));
|
224
257
|
rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
|
225
258
|
rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
|
259
|
+
rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
|
260
|
+
rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
|
226
261
|
|
227
262
|
rb_define_const(mConstants, "FAST", INT2NUM(ZSTD_fast));
|
228
263
|
rb_define_const(mConstants, "DFAST", INT2NUM(ZSTD_dfast));
|
@@ -230,16 +265,20 @@ init_constants(void)
|
|
230
265
|
rb_define_const(mConstants, "LAZY", INT2NUM(ZSTD_lazy));
|
231
266
|
rb_define_const(mConstants, "LAZY2", INT2NUM(ZSTD_lazy2));
|
232
267
|
rb_define_const(mConstants, "BTLAZY2", INT2NUM(ZSTD_btlazy2));
|
268
|
+
rb_define_const(mConstants, "BTOPT", INT2NUM(ZSTD_btopt));
|
233
269
|
rb_define_const(mConstants, "WINDOWLOG_MAX", INT2NUM(ZSTD_WINDOWLOG_MAX));
|
234
270
|
rb_define_const(mConstants, "WINDOWLOG_MIN", INT2NUM(ZSTD_WINDOWLOG_MIN));
|
235
|
-
rb_define_const(mConstants, "CHAINLOG_MAX", INT2NUM(ZSTD_CHAINLOG_MAX));
|
236
|
-
rb_define_const(mConstants, "CHAINLOG_MIN", INT2NUM(ZSTD_CHAINLOG_MIN));
|
237
271
|
rb_define_const(mConstants, "HASHLOG_MAX", INT2NUM(ZSTD_HASHLOG_MAX));
|
238
272
|
rb_define_const(mConstants, "HASHLOG_MIN", INT2NUM(ZSTD_HASHLOG_MIN));
|
273
|
+
rb_define_const(mConstants, "CHAINLOG_MAX", INT2NUM(ZSTD_CHAINLOG_MAX));
|
274
|
+
rb_define_const(mConstants, "CHAINLOG_MIN", INT2NUM(ZSTD_CHAINLOG_MIN));
|
275
|
+
rb_define_const(mConstants, "HASHLOG3_MAX", INT2NUM(ZSTD_HASHLOG3_MAX));
|
239
276
|
rb_define_const(mConstants, "SEARCHLOG_MAX", INT2NUM(ZSTD_SEARCHLOG_MAX));
|
240
277
|
rb_define_const(mConstants, "SEARCHLOG_MIN", INT2NUM(ZSTD_SEARCHLOG_MIN));
|
241
278
|
rb_define_const(mConstants, "SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
|
242
279
|
rb_define_const(mConstants, "SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
|
280
|
+
rb_define_const(mConstants, "TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
|
281
|
+
rb_define_const(mConstants, "TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
|
243
282
|
}
|
244
283
|
|
245
284
|
/*
|
@@ -249,33 +288,33 @@ init_constants(void)
|
|
249
288
|
VALUE extzstd_cParams;
|
250
289
|
|
251
290
|
AUX_IMPLEMENT_CONTEXT(
|
252
|
-
ZSTD_parameters,
|
253
|
-
|
254
|
-
|
291
|
+
ZSTD_parameters, params_type, "extzstd.Parameters",
|
292
|
+
params_alloc_dummy, NULL, free, NULL,
|
293
|
+
getparamsp, getparams, params_p);
|
255
294
|
|
256
295
|
ZSTD_parameters *
|
257
|
-
|
296
|
+
extzstd_getparams(VALUE v)
|
258
297
|
{
|
259
|
-
return
|
298
|
+
return getparams(v);
|
260
299
|
}
|
261
300
|
|
262
301
|
int
|
263
|
-
|
302
|
+
extzstd_params_p(VALUE v)
|
264
303
|
{
|
265
|
-
return
|
304
|
+
return params_p(v);
|
266
305
|
}
|
267
306
|
|
268
307
|
static VALUE
|
269
|
-
|
308
|
+
params_alloc(VALUE mod)
|
270
309
|
{
|
271
310
|
ZSTD_parameters *p;
|
272
|
-
return TypedData_Make_Struct(mod, ZSTD_parameters, &
|
311
|
+
return TypedData_Make_Struct(mod, ZSTD_parameters, ¶ms_type, p);
|
273
312
|
}
|
274
313
|
|
275
314
|
VALUE
|
276
315
|
extzstd_params_alloc(ZSTD_parameters **p)
|
277
316
|
{
|
278
|
-
return TypedData_Make_Struct(extzstd_cParams, ZSTD_parameters, &
|
317
|
+
return TypedData_Make_Struct(extzstd_cParams, ZSTD_parameters, ¶ms_type, *p);
|
279
318
|
}
|
280
319
|
|
281
320
|
/*
|
@@ -291,42 +330,22 @@ extzstd_params_alloc(ZSTD_parameters **p)
|
|
291
330
|
* [opts hashlog: nil]
|
292
331
|
* [opts searchlog: nil]
|
293
332
|
* [opts searchlength: nil]
|
333
|
+
* [opts targetlength: nil]
|
294
334
|
* [opts strategy: nil]
|
295
335
|
*/
|
296
336
|
static VALUE
|
297
|
-
|
337
|
+
params_init(int argc, VALUE argv[], VALUE v)
|
298
338
|
{
|
299
|
-
ZSTD_parameters *p =
|
339
|
+
ZSTD_parameters *p = getparams(v);
|
300
340
|
uint64_t sizehint;
|
301
341
|
size_t dictsize;
|
302
342
|
int level;
|
303
343
|
VALUE opts = Qnil;
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
}
|
310
|
-
}
|
311
|
-
if (argc == 0) {
|
312
|
-
level = 0;
|
313
|
-
sizehint = 0;
|
314
|
-
dictsize = 0;
|
315
|
-
} else if (argc == 1) {
|
316
|
-
level = aux_num2int(argv[0], 0);
|
317
|
-
sizehint = 0;
|
318
|
-
dictsize = 0;
|
319
|
-
} else if (argc == 2) {
|
320
|
-
level = aux_num2int(argv[0], 0);
|
321
|
-
sizehint = aux_num2int_u64(argv[1], 0);
|
322
|
-
dictsize = 0;
|
323
|
-
} else if (argc == 3) {
|
324
|
-
level = aux_num2int(argv[0], 0);
|
325
|
-
sizehint = aux_num2int_u64(argv[1], 0);
|
326
|
-
dictsize = aux_num2int_u64(argv[2], 0);
|
327
|
-
} else {
|
328
|
-
rb_raise(rb_eArgError, "wrong number of argument (%d for 0..3 with keywords)", argc0);
|
329
|
-
}
|
344
|
+
|
345
|
+
argc = rb_scan_args(argc, argv, "03:", NULL, NULL, NULL, &opts);
|
346
|
+
level = argc > 0 ? aux_num2int(argv[0], 0) : 0;
|
347
|
+
sizehint = argc > 1 ? aux_num2int_u64(argv[1], 0) : 0;
|
348
|
+
dictsize = argc > 2 ? aux_num2int_u64(argv[2], 0) : 0;
|
330
349
|
|
331
350
|
*p = ZSTD_getParams(level, sizehint, dictsize);
|
332
351
|
|
@@ -344,6 +363,7 @@ encparams_init(int argc, VALUE argv[], VALUE v)
|
|
344
363
|
SETUP_PARAM(p->cParams.hashLog, opts, "hashlog", NUM2UINT);
|
345
364
|
SETUP_PARAM(p->cParams.searchLog, opts, "searchlog", NUM2UINT);
|
346
365
|
SETUP_PARAM(p->cParams.searchLength, opts, "searchlength", NUM2UINT);
|
366
|
+
SETUP_PARAM(p->cParams.targetLength, opts, "targetlength", NUM2UINT);
|
347
367
|
SETUP_PARAM(p->cParams.strategy, opts, "strategy", NUM2UINT);
|
348
368
|
#undef SETUP_PARAM
|
349
369
|
}
|
@@ -352,10 +372,10 @@ encparams_init(int argc, VALUE argv[], VALUE v)
|
|
352
372
|
}
|
353
373
|
|
354
374
|
static VALUE
|
355
|
-
|
375
|
+
params_init_copy(VALUE params, VALUE src)
|
356
376
|
{
|
357
|
-
ZSTD_parameters *a =
|
358
|
-
ZSTD_parameters *b =
|
377
|
+
ZSTD_parameters *a = getparams(params);
|
378
|
+
ZSTD_parameters *b = getparams(src);
|
359
379
|
rb_check_frozen(params);
|
360
380
|
rb_obj_infect(params, src);
|
361
381
|
memcpy(a, b, sizeof(*a));
|
@@ -363,9 +383,9 @@ encparams_init_copy(VALUE params, VALUE src)
|
|
363
383
|
}
|
364
384
|
|
365
385
|
//static VALUE
|
366
|
-
//
|
386
|
+
//params_validate(VALUE v)
|
367
387
|
//{
|
368
|
-
// ZSTD_validateParams(
|
388
|
+
// ZSTD_validateParams(getparams(v));
|
369
389
|
// return v;
|
370
390
|
//}
|
371
391
|
|
@@ -373,28 +393,29 @@ encparams_init_copy(VALUE params, VALUE src)
|
|
373
393
|
static VALUE \
|
374
394
|
GETTER(VALUE v) \
|
375
395
|
{ \
|
376
|
-
return UINT2NUM(
|
396
|
+
return UINT2NUM(getparams(v)->cParams.FIELD); \
|
377
397
|
} \
|
378
398
|
\
|
379
399
|
static VALUE \
|
380
400
|
SETTER(VALUE v, VALUE n) \
|
381
401
|
{ \
|
382
|
-
|
402
|
+
getparams(v)->cParams.FIELD = NUM2UINT(n); \
|
383
403
|
return n; \
|
384
404
|
} \
|
385
405
|
|
386
|
-
//IMP_PARAMS(
|
387
|
-
IMP_PARAMS(
|
388
|
-
IMP_PARAMS(
|
389
|
-
IMP_PARAMS(
|
390
|
-
IMP_PARAMS(
|
391
|
-
IMP_PARAMS(
|
392
|
-
IMP_PARAMS(
|
406
|
+
//IMP_PARAMS(params_srcsize, params_set_srcsize, srcSize);
|
407
|
+
IMP_PARAMS(params_windowlog, params_set_windowlog, windowLog);
|
408
|
+
IMP_PARAMS(params_chainlog, params_set_chainlog, chainLog);
|
409
|
+
IMP_PARAMS(params_hashlog, params_set_hashlog, hashLog);
|
410
|
+
IMP_PARAMS(params_searchlog, params_set_searchlog, searchLog);
|
411
|
+
IMP_PARAMS(params_searchlength, params_set_searchlength, searchLength);
|
412
|
+
IMP_PARAMS(params_targetlength, params_set_targetlength, targetLength);
|
413
|
+
IMP_PARAMS(params_strategy, params_set_strategy, strategy);
|
393
414
|
|
394
415
|
#undef IMP_PARAMS
|
395
416
|
|
396
417
|
static VALUE
|
397
|
-
|
418
|
+
params_s_get_preset(int argc, VALUE argv[], VALUE mod)
|
398
419
|
{
|
399
420
|
int level;
|
400
421
|
uint64_t sizehint;
|
@@ -426,66 +447,72 @@ encparams_s_get_preset(int argc, VALUE argv[], VALUE mod)
|
|
426
447
|
}
|
427
448
|
|
428
449
|
ZSTD_parameters *p;
|
429
|
-
VALUE v = TypedData_Make_Struct(mod, ZSTD_parameters, &
|
450
|
+
VALUE v = TypedData_Make_Struct(mod, ZSTD_parameters, ¶ms_type, p);
|
430
451
|
*p = ZSTD_getParams(level, sizehint, dictsize);
|
431
452
|
return v;
|
432
453
|
}
|
433
454
|
|
434
455
|
/*
|
435
|
-
* Document-method: Zstd::
|
436
|
-
* Document-method: Zstd::
|
437
|
-
* Document-method: Zstd::
|
438
|
-
* Document-method: Zstd::
|
439
|
-
* Document-method: Zstd::
|
440
|
-
* Document-method: Zstd::
|
441
|
-
* Document-method: Zstd::
|
442
|
-
* Document-method: Zstd::
|
443
|
-
* Document-method: Zstd::
|
444
|
-
* Document-method: Zstd::
|
445
|
-
* Document-method: Zstd::
|
446
|
-
* Document-method: Zstd::
|
456
|
+
* Document-method: Zstd::Parameters#windowlog
|
457
|
+
* Document-method: Zstd::Parameters#windowlog=
|
458
|
+
* Document-method: Zstd::Parameters#chainlog
|
459
|
+
* Document-method: Zstd::Parameters#chainlog=
|
460
|
+
* Document-method: Zstd::Parameters#hashlog
|
461
|
+
* Document-method: Zstd::Parameters#hashlog=
|
462
|
+
* Document-method: Zstd::Parameters#searchlog
|
463
|
+
* Document-method: Zstd::Parameters#searchlog=
|
464
|
+
* Document-method: Zstd::Parameters#searchlength
|
465
|
+
* Document-method: Zstd::Parameters#searchlength=
|
466
|
+
* Document-method: Zstd::Parameters#targetlength
|
467
|
+
* Document-method: Zstd::Parameters#targetlength=
|
468
|
+
* Document-method: Zstd::Parameters#strategy
|
469
|
+
* Document-method: Zstd::Parameters#strategy=
|
447
470
|
*
|
448
471
|
* Get/Set any field from/to struct ZSTD_parameters of C layer.
|
449
472
|
*/
|
450
473
|
|
451
474
|
static void
|
452
|
-
|
475
|
+
init_params(void)
|
453
476
|
{
|
454
|
-
extzstd_cParams = rb_define_class_under(extzstd_mZstd, "
|
455
|
-
rb_define_alloc_func(extzstd_cParams,
|
456
|
-
rb_define_method(extzstd_cParams, "initialize", RUBY_METHOD_FUNC(
|
457
|
-
rb_define_method(extzstd_cParams, "initialize_copy", RUBY_METHOD_FUNC(
|
458
|
-
//rb_define_method(extzstd_cParams, "validate", RUBY_METHOD_FUNC(
|
459
|
-
//rb_define_method(extzstd_cParams, "srcsize", RUBY_METHOD_FUNC(
|
460
|
-
//rb_define_method(extzstd_cParams, "srcsize=", RUBY_METHOD_FUNC(
|
461
|
-
rb_define_method(extzstd_cParams, "windowlog", RUBY_METHOD_FUNC(
|
462
|
-
rb_define_method(extzstd_cParams, "windowlog=", RUBY_METHOD_FUNC(
|
463
|
-
rb_define_method(extzstd_cParams, "chainlog", RUBY_METHOD_FUNC(
|
464
|
-
rb_define_method(extzstd_cParams, "chainlog=", RUBY_METHOD_FUNC(
|
465
|
-
rb_define_method(extzstd_cParams, "hashlog", RUBY_METHOD_FUNC(
|
466
|
-
rb_define_method(extzstd_cParams, "hashlog=", RUBY_METHOD_FUNC(
|
467
|
-
rb_define_method(extzstd_cParams, "searchlog", RUBY_METHOD_FUNC(
|
468
|
-
rb_define_method(extzstd_cParams, "searchlog=", RUBY_METHOD_FUNC(
|
469
|
-
rb_define_method(extzstd_cParams, "searchlength", RUBY_METHOD_FUNC(
|
470
|
-
rb_define_method(extzstd_cParams, "searchlength=", RUBY_METHOD_FUNC(
|
471
|
-
rb_define_method(extzstd_cParams, "
|
472
|
-
rb_define_method(extzstd_cParams, "
|
473
|
-
|
474
|
-
|
477
|
+
extzstd_cParams = rb_define_class_under(extzstd_mZstd, "Parameters", rb_cObject);
|
478
|
+
rb_define_alloc_func(extzstd_cParams, params_alloc);
|
479
|
+
rb_define_method(extzstd_cParams, "initialize", RUBY_METHOD_FUNC(params_init), -1);
|
480
|
+
rb_define_method(extzstd_cParams, "initialize_copy", RUBY_METHOD_FUNC(params_init_copy), 1);
|
481
|
+
//rb_define_method(extzstd_cParams, "validate", RUBY_METHOD_FUNC(params_validate), 0);
|
482
|
+
//rb_define_method(extzstd_cParams, "srcsize", RUBY_METHOD_FUNC(params_srcsize), 0);
|
483
|
+
//rb_define_method(extzstd_cParams, "srcsize=", RUBY_METHOD_FUNC(params_set_srcsize), 1);
|
484
|
+
rb_define_method(extzstd_cParams, "windowlog", RUBY_METHOD_FUNC(params_windowlog), 0);
|
485
|
+
rb_define_method(extzstd_cParams, "windowlog=", RUBY_METHOD_FUNC(params_set_windowlog), 1);
|
486
|
+
rb_define_method(extzstd_cParams, "chainlog", RUBY_METHOD_FUNC(params_chainlog), 0);
|
487
|
+
rb_define_method(extzstd_cParams, "chainlog=", RUBY_METHOD_FUNC(params_set_chainlog), 1);
|
488
|
+
rb_define_method(extzstd_cParams, "hashlog", RUBY_METHOD_FUNC(params_hashlog), 0);
|
489
|
+
rb_define_method(extzstd_cParams, "hashlog=", RUBY_METHOD_FUNC(params_set_hashlog), 1);
|
490
|
+
rb_define_method(extzstd_cParams, "searchlog", RUBY_METHOD_FUNC(params_searchlog), 0);
|
491
|
+
rb_define_method(extzstd_cParams, "searchlog=", RUBY_METHOD_FUNC(params_set_searchlog), 1);
|
492
|
+
rb_define_method(extzstd_cParams, "searchlength", RUBY_METHOD_FUNC(params_searchlength), 0);
|
493
|
+
rb_define_method(extzstd_cParams, "searchlength=", RUBY_METHOD_FUNC(params_set_searchlength), 1);
|
494
|
+
rb_define_method(extzstd_cParams, "targetlength", RUBY_METHOD_FUNC(params_targetlength), 0);
|
495
|
+
rb_define_method(extzstd_cParams, "targetlength=", RUBY_METHOD_FUNC(params_set_targetlength), 1);
|
496
|
+
rb_define_method(extzstd_cParams, "strategy", RUBY_METHOD_FUNC(params_strategy), 0);
|
497
|
+
rb_define_method(extzstd_cParams, "strategy=", RUBY_METHOD_FUNC(params_set_strategy), 1);
|
498
|
+
|
499
|
+
rb_define_singleton_method(extzstd_cParams, "preset", RUBY_METHOD_FUNC(params_s_get_preset), -1);
|
475
500
|
rb_define_alias(rb_singleton_class(extzstd_cParams), "[]", "preset");
|
476
501
|
}
|
477
502
|
|
478
503
|
|
479
504
|
/*
|
480
|
-
*
|
505
|
+
* module Zstd::Dictionary
|
481
506
|
*/
|
482
507
|
|
508
|
+
static VALUE mDictionary;
|
509
|
+
|
483
510
|
/*
|
484
511
|
* call-seq:
|
485
|
-
*
|
512
|
+
* train_from_buffer(src, dict_capacity) -> dictionary'd string
|
486
513
|
*/
|
487
514
|
static VALUE
|
488
|
-
|
515
|
+
dict_s_train_from_buffer(VALUE mod, VALUE src, VALUE dict_capacity)
|
489
516
|
{
|
490
517
|
rb_check_type(src, RUBY_T_STRING);
|
491
518
|
size_t capa = NUM2SIZET(dict_capacity);
|
@@ -499,14 +526,15 @@ ext_s_dict_train_from_buffer(VALUE mod, VALUE src, VALUE dict_capacity)
|
|
499
526
|
|
500
527
|
/*
|
501
528
|
* call-seq:
|
502
|
-
*
|
529
|
+
* add_entropy_tables_from_buffer(dict, dict_capacity, sample) -> dict
|
503
530
|
*/
|
504
531
|
static VALUE
|
505
|
-
|
532
|
+
dict_s_add_entropy_tables_from_buffer(VALUE mod, VALUE dict, VALUE dict_capacity, VALUE sample)
|
506
533
|
{
|
507
534
|
/*
|
508
|
-
* size_t ZDICT_addEntropyTablesFromBuffer(
|
509
|
-
*
|
535
|
+
* size_t ZDICT_addEntropyTablesFromBuffer(
|
536
|
+
* void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity,
|
537
|
+
* const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples);
|
510
538
|
*/
|
511
539
|
|
512
540
|
rb_check_type(dict, RUBY_T_STRING);
|
@@ -514,19 +542,147 @@ ext_s_dict_add_entropy_tables_from_buffer(VALUE mod, VALUE dict, VALUE dict_capa
|
|
514
542
|
size_t capa = NUM2SIZET(dict_capacity);
|
515
543
|
aux_str_modify_expand(dict, capa);
|
516
544
|
size_t samplesize = RSTRING_LEN(sample);
|
517
|
-
size_t s = ZDICT_addEntropyTablesFromBuffer(RSTRING_PTR(dict), RSTRING_LEN(dict), capa, RSTRING_PTR(
|
545
|
+
size_t s = ZDICT_addEntropyTablesFromBuffer(RSTRING_PTR(dict), RSTRING_LEN(dict), capa, RSTRING_PTR(sample), &samplesize, 1);
|
518
546
|
extzstd_check_error(s);
|
519
547
|
rb_str_set_len(dict, s);
|
520
548
|
return dict;
|
521
549
|
}
|
522
550
|
|
551
|
+
static VALUE
|
552
|
+
dict_s_getid(VALUE mod, VALUE dict)
|
553
|
+
{
|
554
|
+
/*
|
555
|
+
* ZDICTLIB_API unsigned ZDICT_getDictID(const void* dictBuffer, size_t dictSize);
|
556
|
+
*/
|
557
|
+
|
558
|
+
rb_check_type(dict, RUBY_T_STRING);
|
559
|
+
const char *p;
|
560
|
+
size_t psize;
|
561
|
+
RSTRING_GETMEM(dict, p, psize);
|
562
|
+
|
563
|
+
size_t s = ZDICT_getDictID(p, psize);
|
564
|
+
extzstd_check_error(s);
|
565
|
+
|
566
|
+
return SIZET2NUM(s);
|
567
|
+
}
|
568
|
+
|
523
569
|
static void
|
524
570
|
init_dictionary(void)
|
525
571
|
{
|
526
|
-
|
527
|
-
rb_define_singleton_method(
|
572
|
+
mDictionary = rb_define_module_under(extzstd_mZstd, "Dictionary");
|
573
|
+
rb_define_singleton_method(mDictionary, "train_from_buffer", dict_s_train_from_buffer, 2);
|
574
|
+
rb_define_singleton_method(mDictionary, "add_entropy_tables_from_buffer", dict_s_add_entropy_tables_from_buffer, 3);
|
575
|
+
rb_define_singleton_method(mDictionary, "getid", dict_s_getid, 1);
|
576
|
+
}
|
577
|
+
|
578
|
+
/*
|
579
|
+
* module Zstd::ContextLess
|
580
|
+
*/
|
581
|
+
|
582
|
+
static VALUE mContextLess;
|
583
|
+
|
584
|
+
/*
|
585
|
+
* call-seq:
|
586
|
+
* encode(src, dest, maxdest, params)
|
587
|
+
*
|
588
|
+
* [RETURN] dest
|
589
|
+
* [src (string)]
|
590
|
+
* [dest (string)]
|
591
|
+
* [maxdest (integer or nil)]
|
592
|
+
* [params (nil, integer or Zstd::Parameters)]
|
593
|
+
*/
|
594
|
+
static VALUE
|
595
|
+
less_s_encode(VALUE mod, VALUE src, VALUE dest, VALUE maxdest, VALUE predict, VALUE params)
|
596
|
+
{
|
597
|
+
const char *q;
|
598
|
+
size_t qsize;
|
599
|
+
aux_string_pointer(src, &q, &qsize);
|
600
|
+
|
601
|
+
char *r;
|
602
|
+
size_t rsize = (NIL_P(maxdest)) ? ZSTD_compressBound(qsize) : NUM2SIZET(maxdest);
|
603
|
+
aux_string_expand_pointer(dest, &r, rsize);
|
604
|
+
rb_obj_infect(dest, src);
|
605
|
+
|
606
|
+
const char *d;
|
607
|
+
size_t dsize;
|
608
|
+
aux_string_pointer_with_nil(predict, &d, &dsize);
|
609
|
+
rb_obj_infect(dest, predict);
|
610
|
+
|
611
|
+
if (extzstd_params_p(params)) {
|
612
|
+
/*
|
613
|
+
* ZSTDLIB_API size_t ZSTD_compress_advanced(
|
614
|
+
* ZSTD_CCtx* ctx,
|
615
|
+
* void* dst, size_t dstCapacity,
|
616
|
+
* const void* src, size_t srcSize,
|
617
|
+
* const void* dict,size_t dictSize,
|
618
|
+
* ZSTD_parameters params);
|
619
|
+
*/
|
620
|
+
ZSTD_CCtx *zstd = ZSTD_createCCtx();
|
621
|
+
size_t s = ZSTD_compress_advanced(zstd, r, rsize, q, qsize, d, dsize, *extzstd_getparams(params));
|
622
|
+
ZSTD_freeCCtx(zstd);
|
623
|
+
extzstd_check_error(s);
|
624
|
+
rb_str_set_len(dest, s);
|
625
|
+
return dest;
|
626
|
+
} else {
|
627
|
+
/*
|
628
|
+
* ZSTDLIB_API size_t ZSTD_compress_usingDict(
|
629
|
+
* ZSTD_CCtx* ctx,
|
630
|
+
* void* dst, size_t dstCapacity,
|
631
|
+
* const void* src, size_t srcSize,
|
632
|
+
* const void* dict,size_t dictSize,
|
633
|
+
* int compressionLevel);
|
634
|
+
*/
|
635
|
+
ZSTD_CCtx *zstd = ZSTD_createCCtx();
|
636
|
+
size_t s = ZSTD_compress_usingDict(zstd, r, rsize, q, qsize, d, dsize, aux_num2int(params, 0));
|
637
|
+
ZSTD_freeCCtx(zstd);
|
638
|
+
extzstd_check_error(s);
|
639
|
+
rb_str_set_len(dest, s);
|
640
|
+
return dest;
|
641
|
+
}
|
642
|
+
}
|
643
|
+
|
644
|
+
/*
|
645
|
+
* call-seq:
|
646
|
+
* decode(src, dest, maxdest)
|
647
|
+
*
|
648
|
+
* [RETURN] dest
|
649
|
+
* [src (string)]
|
650
|
+
* [dest (string)]
|
651
|
+
* [maxdest (integer or nil)]
|
652
|
+
*/
|
653
|
+
static VALUE
|
654
|
+
less_s_decode(VALUE mod, VALUE src, VALUE dest, VALUE maxdest, VALUE predict)
|
655
|
+
{
|
656
|
+
const char *q;
|
657
|
+
size_t qsize;
|
658
|
+
aux_string_pointer(src, &q, &qsize);
|
659
|
+
|
660
|
+
char *r;
|
661
|
+
size_t rsize = (NIL_P(maxdest)) ? ZSTD_getDecompressedSize(q, qsize) : NUM2SIZET(maxdest);
|
662
|
+
aux_string_expand_pointer(dest, &r, rsize);
|
663
|
+
rb_obj_infect(dest, src);
|
664
|
+
|
665
|
+
const char *d;
|
666
|
+
size_t dsize;
|
667
|
+
aux_string_pointer_with_nil(predict, &d, &dsize);
|
668
|
+
rb_obj_infect(dest, predict);
|
669
|
+
|
670
|
+
ZSTD_DCtx *z = ZSTD_createDCtx();
|
671
|
+
size_t s = ZSTD_decompress_usingDict(z, r, rsize, q, qsize, d, dsize);
|
672
|
+
ZSTD_freeDCtx(z);
|
673
|
+
extzstd_check_error(s);
|
674
|
+
rb_str_set_len(dest, s);
|
675
|
+
|
676
|
+
return dest;
|
528
677
|
}
|
529
678
|
|
679
|
+
static void
|
680
|
+
init_contextless(void)
|
681
|
+
{
|
682
|
+
mContextLess = rb_define_module_under(extzstd_mZstd, "ContextLess");
|
683
|
+
rb_define_singleton_method(mContextLess, "encode", less_s_encode, 5);
|
684
|
+
rb_define_singleton_method(mContextLess, "decode", less_s_decode, 4);
|
685
|
+
}
|
530
686
|
|
531
687
|
/*
|
532
688
|
* library initializer
|
@@ -540,7 +696,8 @@ Init_extzstd(void)
|
|
540
696
|
init_libver();
|
541
697
|
init_error();
|
542
698
|
init_constants();
|
543
|
-
|
699
|
+
init_params();
|
544
700
|
init_dictionary();
|
545
|
-
|
701
|
+
init_contextless();
|
702
|
+
extzstd_init_stream();
|
546
703
|
}
|
data/ext/extzstd.h
CHANGED
@@ -2,8 +2,9 @@
|
|
2
2
|
#define EXTZSTD_H 1
|
3
3
|
|
4
4
|
#define ZSTD_LEGACY_SUPPORT 1
|
5
|
-
#define
|
6
|
-
#
|
5
|
+
#define ZDICT_STATIC_LINKING_ONLY 1
|
6
|
+
#define ZSTD_STATIC_LINKING_ONLY 1
|
7
|
+
#include <zstd.h>
|
7
8
|
#include <stdarg.h>
|
8
9
|
#include <ruby.h>
|
9
10
|
#include <ruby/thread.h>
|
@@ -23,7 +24,7 @@ extern VALUE extzstd_mZstd;
|
|
23
24
|
RDOCFAKE(extzstd_mZstd = rb_define_module("Zstd"));
|
24
25
|
|
25
26
|
extern VALUE extzstd_cParams;
|
26
|
-
RDOCFAKE(extzstd_cParams = rb_define_class_under(extzstd_mZstd, "
|
27
|
+
RDOCFAKE(extzstd_cParams = rb_define_class_under(extzstd_mZstd, "Parameters", rb_cObject));
|
27
28
|
|
28
29
|
extern VALUE extzstd_mExceptions;
|
29
30
|
extern VALUE extzstd_eError;
|
@@ -48,13 +49,14 @@ extern VALUE extzstd_eDictionaryWrongError;
|
|
48
49
|
|
49
50
|
extern void init_extzstd_stream(void);
|
50
51
|
extern void extzstd_init_buffered(void);
|
52
|
+
extern void extzstd_init_stream(void);
|
51
53
|
extern void extzstd_error(ssize_t errcode);
|
52
54
|
extern void extzstd_check_error(ssize_t errcode);
|
53
55
|
extern VALUE extzstd_make_error(ssize_t errcode);
|
54
56
|
extern VALUE extzstd_make_errorf(VALUE exc, const char *fmt, ...);
|
55
57
|
|
56
|
-
extern ZSTD_parameters *
|
57
|
-
extern int
|
58
|
+
extern ZSTD_parameters *extzstd_getparams(VALUE v);
|
59
|
+
extern int extzstd_params_p(VALUE v);
|
58
60
|
extern VALUE extzstd_params_alloc(ZSTD_parameters **p);
|
59
61
|
|
60
62
|
static inline void
|
@@ -161,7 +163,7 @@ aux_num2int_u64(VALUE v, uint64_t default_value)
|
|
161
163
|
}
|
162
164
|
|
163
165
|
static inline VALUE
|
164
|
-
aux_const_dig_str_0(VALUE obj, const char *p[], const char
|
166
|
+
aux_const_dig_str_0(VALUE obj, const char *p[], const char **pp)
|
165
167
|
{
|
166
168
|
for (; p < pp; p ++) {
|
167
169
|
obj = rb_const_get(obj, rb_intern(*p));
|