extzstd 0.3.2 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -3
  3. data/contrib/zstd/CHANGELOG +225 -1
  4. data/contrib/zstd/CONTRIBUTING.md +158 -75
  5. data/contrib/zstd/LICENSE +4 -4
  6. data/contrib/zstd/Makefile +106 -69
  7. data/contrib/zstd/Package.swift +36 -0
  8. data/contrib/zstd/README.md +64 -36
  9. data/contrib/zstd/SECURITY.md +15 -0
  10. data/contrib/zstd/TESTING.md +2 -3
  11. data/contrib/zstd/lib/BUCK +5 -7
  12. data/contrib/zstd/lib/Makefile +117 -199
  13. data/contrib/zstd/lib/README.md +37 -7
  14. data/contrib/zstd/lib/common/allocations.h +55 -0
  15. data/contrib/zstd/lib/common/bits.h +200 -0
  16. data/contrib/zstd/lib/common/bitstream.h +80 -86
  17. data/contrib/zstd/lib/common/compiler.h +225 -63
  18. data/contrib/zstd/lib/common/cpu.h +37 -1
  19. data/contrib/zstd/lib/common/debug.c +7 -1
  20. data/contrib/zstd/lib/common/debug.h +21 -12
  21. data/contrib/zstd/lib/common/entropy_common.c +15 -37
  22. data/contrib/zstd/lib/common/error_private.c +9 -2
  23. data/contrib/zstd/lib/common/error_private.h +93 -5
  24. data/contrib/zstd/lib/common/fse.h +12 -87
  25. data/contrib/zstd/lib/common/fse_decompress.c +37 -117
  26. data/contrib/zstd/lib/common/huf.h +97 -172
  27. data/contrib/zstd/lib/common/mem.h +58 -58
  28. data/contrib/zstd/lib/common/pool.c +38 -17
  29. data/contrib/zstd/lib/common/pool.h +10 -4
  30. data/contrib/zstd/lib/common/portability_macros.h +158 -0
  31. data/contrib/zstd/lib/common/threading.c +74 -14
  32. data/contrib/zstd/lib/common/threading.h +5 -10
  33. data/contrib/zstd/lib/common/xxhash.c +6 -814
  34. data/contrib/zstd/lib/common/xxhash.h +6930 -195
  35. data/contrib/zstd/lib/common/zstd_common.c +1 -36
  36. data/contrib/zstd/lib/common/zstd_deps.h +1 -1
  37. data/contrib/zstd/lib/common/zstd_internal.h +68 -154
  38. data/contrib/zstd/lib/common/zstd_trace.h +163 -0
  39. data/contrib/zstd/lib/compress/clevels.h +134 -0
  40. data/contrib/zstd/lib/compress/fse_compress.c +75 -155
  41. data/contrib/zstd/lib/compress/hist.c +1 -1
  42. data/contrib/zstd/lib/compress/hist.h +1 -1
  43. data/contrib/zstd/lib/compress/huf_compress.c +810 -259
  44. data/contrib/zstd/lib/compress/zstd_compress.c +2864 -919
  45. data/contrib/zstd/lib/compress/zstd_compress_internal.h +523 -192
  46. data/contrib/zstd/lib/compress/zstd_compress_literals.c +117 -40
  47. data/contrib/zstd/lib/compress/zstd_compress_literals.h +16 -6
  48. data/contrib/zstd/lib/compress/zstd_compress_sequences.c +28 -19
  49. data/contrib/zstd/lib/compress/zstd_compress_sequences.h +1 -1
  50. data/contrib/zstd/lib/compress/zstd_compress_superblock.c +251 -412
  51. data/contrib/zstd/lib/compress/zstd_compress_superblock.h +1 -1
  52. data/contrib/zstd/lib/compress/zstd_cwksp.h +284 -97
  53. data/contrib/zstd/lib/compress/zstd_double_fast.c +382 -133
  54. data/contrib/zstd/lib/compress/zstd_double_fast.h +14 -2
  55. data/contrib/zstd/lib/compress/zstd_fast.c +732 -260
  56. data/contrib/zstd/lib/compress/zstd_fast.h +3 -2
  57. data/contrib/zstd/lib/compress/zstd_lazy.c +1177 -390
  58. data/contrib/zstd/lib/compress/zstd_lazy.h +129 -14
  59. data/contrib/zstd/lib/compress/zstd_ldm.c +280 -210
  60. data/contrib/zstd/lib/compress/zstd_ldm.h +3 -2
  61. data/contrib/zstd/lib/compress/zstd_ldm_geartab.h +106 -0
  62. data/contrib/zstd/lib/compress/zstd_opt.c +516 -285
  63. data/contrib/zstd/lib/compress/zstd_opt.h +32 -8
  64. data/contrib/zstd/lib/compress/zstdmt_compress.c +202 -131
  65. data/contrib/zstd/lib/compress/zstdmt_compress.h +9 -6
  66. data/contrib/zstd/lib/decompress/huf_decompress.c +1149 -555
  67. data/contrib/zstd/lib/decompress/huf_decompress_amd64.S +595 -0
  68. data/contrib/zstd/lib/decompress/zstd_ddict.c +4 -4
  69. data/contrib/zstd/lib/decompress/zstd_ddict.h +1 -1
  70. data/contrib/zstd/lib/decompress/zstd_decompress.c +583 -106
  71. data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1054 -379
  72. data/contrib/zstd/lib/decompress/zstd_decompress_block.h +14 -3
  73. data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +56 -6
  74. data/contrib/zstd/lib/deprecated/zbuff.h +1 -1
  75. data/contrib/zstd/lib/deprecated/zbuff_common.c +1 -1
  76. data/contrib/zstd/lib/deprecated/zbuff_compress.c +24 -4
  77. data/contrib/zstd/lib/deprecated/zbuff_decompress.c +3 -1
  78. data/contrib/zstd/lib/dictBuilder/cover.c +60 -44
  79. data/contrib/zstd/lib/dictBuilder/cover.h +6 -11
  80. data/contrib/zstd/lib/dictBuilder/divsufsort.c +1 -1
  81. data/contrib/zstd/lib/dictBuilder/fastcover.c +26 -18
  82. data/contrib/zstd/lib/dictBuilder/zdict.c +100 -101
  83. data/contrib/zstd/lib/legacy/zstd_legacy.h +38 -1
  84. data/contrib/zstd/lib/legacy/zstd_v01.c +18 -53
  85. data/contrib/zstd/lib/legacy/zstd_v01.h +1 -1
  86. data/contrib/zstd/lib/legacy/zstd_v02.c +28 -85
  87. data/contrib/zstd/lib/legacy/zstd_v02.h +1 -1
  88. data/contrib/zstd/lib/legacy/zstd_v03.c +29 -88
  89. data/contrib/zstd/lib/legacy/zstd_v03.h +1 -1
  90. data/contrib/zstd/lib/legacy/zstd_v04.c +27 -80
  91. data/contrib/zstd/lib/legacy/zstd_v04.h +1 -1
  92. data/contrib/zstd/lib/legacy/zstd_v05.c +36 -85
  93. data/contrib/zstd/lib/legacy/zstd_v05.h +1 -1
  94. data/contrib/zstd/lib/legacy/zstd_v06.c +44 -96
  95. data/contrib/zstd/lib/legacy/zstd_v06.h +1 -1
  96. data/contrib/zstd/lib/legacy/zstd_v07.c +37 -92
  97. data/contrib/zstd/lib/legacy/zstd_v07.h +1 -1
  98. data/contrib/zstd/lib/libzstd.mk +237 -0
  99. data/contrib/zstd/lib/libzstd.pc.in +4 -3
  100. data/contrib/zstd/lib/module.modulemap +35 -0
  101. data/contrib/zstd/lib/{dictBuilder/zdict.h → zdict.h} +202 -33
  102. data/contrib/zstd/lib/zstd.h +1030 -332
  103. data/contrib/zstd/lib/{common/zstd_errors.h → zstd_errors.h} +27 -8
  104. data/ext/extconf.rb +26 -7
  105. data/ext/extzstd.c +51 -24
  106. data/ext/extzstd.h +33 -6
  107. data/ext/extzstd_stream.c +74 -31
  108. data/ext/libzstd_conf.h +0 -1
  109. data/ext/zstd_decompress_asm.S +1 -0
  110. metadata +17 -7
  111. data/contrib/zstd/appveyor.yml +0 -292
  112. data/ext/depend +0 -2
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -20,19 +20,31 @@ extern "C" {
20
20
 
21
21
 
22
22
  /* ===== ZSTDERRORLIB_API : control library symbols visibility ===== */
23
- #ifndef ZSTDERRORLIB_VISIBILITY
24
- # if defined(__GNUC__) && (__GNUC__ >= 4)
25
- # define ZSTDERRORLIB_VISIBILITY __attribute__ ((visibility ("default")))
23
+ #ifndef ZSTDERRORLIB_VISIBLE
24
+ /* Backwards compatibility with old macro name */
25
+ # ifdef ZSTDERRORLIB_VISIBILITY
26
+ # define ZSTDERRORLIB_VISIBLE ZSTDERRORLIB_VISIBILITY
27
+ # elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
28
+ # define ZSTDERRORLIB_VISIBLE __attribute__ ((visibility ("default")))
26
29
  # else
27
- # define ZSTDERRORLIB_VISIBILITY
30
+ # define ZSTDERRORLIB_VISIBLE
28
31
  # endif
29
32
  #endif
33
+
34
+ #ifndef ZSTDERRORLIB_HIDDEN
35
+ # if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
36
+ # define ZSTDERRORLIB_HIDDEN __attribute__ ((visibility ("hidden")))
37
+ # else
38
+ # define ZSTDERRORLIB_HIDDEN
39
+ # endif
40
+ #endif
41
+
30
42
  #if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1)
31
- # define ZSTDERRORLIB_API __declspec(dllexport) ZSTDERRORLIB_VISIBILITY
43
+ # define ZSTDERRORLIB_API __declspec(dllexport) ZSTDERRORLIB_VISIBLE
32
44
  #elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1)
33
- # define ZSTDERRORLIB_API __declspec(dllimport) ZSTDERRORLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
45
+ # define ZSTDERRORLIB_API __declspec(dllimport) ZSTDERRORLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
34
46
  #else
35
- # define ZSTDERRORLIB_API ZSTDERRORLIB_VISIBILITY
47
+ # define ZSTDERRORLIB_API ZSTDERRORLIB_VISIBLE
36
48
  #endif
37
49
 
38
50
  /*-*********************************************
@@ -58,14 +70,17 @@ typedef enum {
58
70
  ZSTD_error_frameParameter_windowTooLarge = 16,
59
71
  ZSTD_error_corruption_detected = 20,
60
72
  ZSTD_error_checksum_wrong = 22,
73
+ ZSTD_error_literals_headerWrong = 24,
61
74
  ZSTD_error_dictionary_corrupted = 30,
62
75
  ZSTD_error_dictionary_wrong = 32,
63
76
  ZSTD_error_dictionaryCreation_failed = 34,
64
77
  ZSTD_error_parameter_unsupported = 40,
78
+ ZSTD_error_parameter_combination_unsupported = 41,
65
79
  ZSTD_error_parameter_outOfBound = 42,
66
80
  ZSTD_error_tableLog_tooLarge = 44,
67
81
  ZSTD_error_maxSymbolValue_tooLarge = 46,
68
82
  ZSTD_error_maxSymbolValue_tooSmall = 48,
83
+ ZSTD_error_stabilityCondition_notRespected = 50,
69
84
  ZSTD_error_stage_wrong = 60,
70
85
  ZSTD_error_init_missing = 62,
71
86
  ZSTD_error_memory_allocation = 64,
@@ -73,11 +88,15 @@ typedef enum {
73
88
  ZSTD_error_dstSize_tooSmall = 70,
74
89
  ZSTD_error_srcSize_wrong = 72,
75
90
  ZSTD_error_dstBuffer_null = 74,
91
+ ZSTD_error_noForwardProgress_destFull = 80,
92
+ ZSTD_error_noForwardProgress_inputEmpty = 82,
76
93
  /* following error codes are __NOT STABLE__, they can be removed or changed in future versions */
77
94
  ZSTD_error_frameIndex_tooLarge = 100,
78
95
  ZSTD_error_seekableIO = 102,
79
96
  ZSTD_error_dstBuffer_wrong = 104,
80
97
  ZSTD_error_srcBuffer_wrong = 105,
98
+ ZSTD_error_sequenceProducer_failed = 106,
99
+ ZSTD_error_externalSequences_invalid = 107,
81
100
  ZSTD_error_maxCode = 120 /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */
82
101
  } ZSTD_ErrorCode;
83
102
 
data/ext/extconf.rb CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  require "mkmf"
4
4
 
5
+ using Module.new {
6
+ refine Object do
7
+ def has_function_modifier?(modifier_code)
8
+ try_compile(<<~CODE)
9
+ #{modifier_code}
10
+ void
11
+ func1(void) {
12
+ }
13
+ CODE
14
+ end
15
+ end
16
+ }
17
+
5
18
  $INCFLAGS = %w(
6
19
  -I$(srcdir)/../contrib
7
20
  -I$(srcdir)/../contrib/zstd/lib
@@ -10,12 +23,13 @@ $INCFLAGS = %w(
10
23
  -I$(srcdir)/../contrib/zstd/lib/legacy
11
24
  ).join(" ") + " #$INCFLAGS"
12
25
 
13
- #dir = File.dirname(__FILE__).gsub(/[\[\{\?\*]/, "[\\0]")
14
- #filepattern = "{.,../contrib/zstd}/**/*.c"
15
- #target = File.join(dir, filepattern)
16
- #files = Dir.glob(target).sort.map { |n| File.basename n }
17
- #$srcs = files
18
- #$VPATH.push "$(srcdir)/../contrib/zstd", "$(srcdir)/../contrib/zstd/legacy"
26
+ #if libzstd が 1.5.1 以降で gcc/clang であれば
27
+ dir = __dir__
28
+ dir1 = dir.gsub(/[\[\{\?\*]/, "[\\0]")
29
+ filepattern = "**/*.[cS]"
30
+ target = File.join(dir1, filepattern)
31
+ $srcs = Dir.glob(target).sort
32
+ #end
19
33
 
20
34
  if RbConfig::CONFIG["arch"] =~ /mingw/i
21
35
  $LDFLAGS << " -static-libgcc" if try_ldflags("-static-libgcc")
@@ -25,9 +39,14 @@ __attribute__ ((visibility("hidden"))) int conftest(void) { return 0; }
25
39
  VISIBILITY
26
40
  if try_cflags("-fvisibility=hidden")
27
41
  $CFLAGS << " -fvisibility=hidden"
28
- $defs << %('-DRBEXT_API=__attribute__ ((visibility("default")))')
42
+ $defs << %(-DRBEXT_API='__attribute__ ((visibility("default")))')
29
43
  end
30
44
  end
31
45
  end
32
46
 
47
+ mod = %w(__attribute__((__noreturn__)) __declspec(noreturn) [[noreturn]] _Noreturn).find { |m|
48
+ has_function_modifier?(m)
49
+ }
50
+ $defs << %(-DRBEXT_NORETURN='#{mod}')
51
+
33
52
  create_makefile File.join(RUBY_VERSION.slice(/\d+\.\d+/), "extzstd")
data/ext/extzstd.c CHANGED
@@ -71,6 +71,7 @@ extzstd_check_error(ssize_t errcode)
71
71
  }
72
72
  }
73
73
 
74
+ RBEXT_NORETURN
74
75
  void
75
76
  extzstd_error(ssize_t errcode)
76
77
  {
@@ -80,8 +81,6 @@ extzstd_error(ssize_t errcode)
80
81
  VALUE
81
82
  extzstd_make_errorf(ssize_t errcode, const char *fmt, ...)
82
83
  {
83
- VALUE e;
84
-
85
84
  if (fmt && strlen(fmt) > 0) {
86
85
  VALUE args[] = { SSIZET2NUM(errcode), Qnil };
87
86
  va_list va;
@@ -171,13 +170,14 @@ init_constants(void)
171
170
  rb_define_const(mConstants, "ZSTD_HASHLOG_MIN", INT2NUM(ZSTD_HASHLOG_MIN));
172
171
  rb_define_const(mConstants, "ZSTD_CHAINLOG_MAX", INT2NUM(ZSTD_CHAINLOG_MAX));
173
172
  rb_define_const(mConstants, "ZSTD_CHAINLOG_MIN", INT2NUM(ZSTD_CHAINLOG_MIN));
174
- rb_define_const(mConstants, "ZSTD_HASHLOG3_MAX", INT2NUM(ZSTD_HASHLOG3_MAX));
175
173
  rb_define_const(mConstants, "ZSTD_SEARCHLOG_MAX", INT2NUM(ZSTD_SEARCHLOG_MAX));
176
174
  rb_define_const(mConstants, "ZSTD_SEARCHLOG_MIN", INT2NUM(ZSTD_SEARCHLOG_MIN));
177
- //rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
178
- //rb_define_const(mConstants, "ZSTD_SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
179
- //rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
180
- //rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
175
+ rb_define_const(mConstants, "ZSTD_MINMATCH_MAX", INT2NUM(ZSTD_MINMATCH_MAX));
176
+ rb_define_const(mConstants, "ZSTD_MINMATCH_MIN", INT2NUM(ZSTD_MINMATCH_MIN));
177
+ rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
178
+ rb_define_const(mConstants, "ZSTD_TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
179
+ rb_define_const(mConstants, "ZSTD_STRATEGY_MIN", INT2NUM(ZSTD_STRATEGY_MIN));
180
+ rb_define_const(mConstants, "ZSTD_STRATEGY_MAX", INT2NUM(ZSTD_STRATEGY_MAX));
181
181
 
182
182
  rb_define_const(mConstants, "FAST", INT2NUM(ZSTD_fast));
183
183
  rb_define_const(mConstants, "DFAST", INT2NUM(ZSTD_dfast));
@@ -194,13 +194,15 @@ init_constants(void)
194
194
  rb_define_const(mConstants, "HASHLOG_MIN", INT2NUM(ZSTD_HASHLOG_MIN));
195
195
  rb_define_const(mConstants, "CHAINLOG_MAX", INT2NUM(ZSTD_CHAINLOG_MAX));
196
196
  rb_define_const(mConstants, "CHAINLOG_MIN", INT2NUM(ZSTD_CHAINLOG_MIN));
197
- rb_define_const(mConstants, "HASHLOG3_MAX", INT2NUM(ZSTD_HASHLOG3_MAX));
198
197
  rb_define_const(mConstants, "SEARCHLOG_MAX", INT2NUM(ZSTD_SEARCHLOG_MAX));
199
198
  rb_define_const(mConstants, "SEARCHLOG_MIN", INT2NUM(ZSTD_SEARCHLOG_MIN));
200
- //rb_define_const(mConstants, "SEARCHLENGTH_MAX", INT2NUM(ZSTD_SEARCHLENGTH_MAX));
201
- //rb_define_const(mConstants, "SEARCHLENGTH_MIN", INT2NUM(ZSTD_SEARCHLENGTH_MIN));
202
- //rb_define_const(mConstants, "TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
203
- //rb_define_const(mConstants, "TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
199
+ rb_define_const(mConstants, "MINMATCH_MAX", INT2NUM(ZSTD_MINMATCH_MAX));
200
+ rb_define_const(mConstants, "MINMATCH_MIN", INT2NUM(ZSTD_MINMATCH_MIN));
201
+ rb_define_const(mConstants, "TARGETLENGTH_MAX", INT2NUM(ZSTD_TARGETLENGTH_MAX));
202
+ rb_define_const(mConstants, "TARGETLENGTH_MIN", INT2NUM(ZSTD_TARGETLENGTH_MIN));
203
+ rb_define_const(mConstants, "STRATEGY_MIN", INT2NUM(ZSTD_STRATEGY_MIN));
204
+ rb_define_const(mConstants, "STRATEGY_MAX", INT2NUM(ZSTD_STRATEGY_MAX));
205
+
204
206
  }
205
207
 
206
208
  /*
@@ -458,17 +460,22 @@ static VALUE
458
460
  dict_s_add_entropy_tables_from_buffer(VALUE mod, VALUE dict, VALUE dict_capacity, VALUE sample)
459
461
  {
460
462
  /*
461
- * size_t ZDICT_addEntropyTablesFromBuffer(
462
- * void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity,
463
- * const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples);
463
+ * ZDICTLIB_API size_t ZDICT_finalizeDictionary(void* dstDictBuffer, size_t maxDictSize,
464
+ * const void* dictContent, size_t dictContentSize,
465
+ * const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
466
+ * ZDICT_params_t parameters);
464
467
  */
465
468
 
466
469
  rb_check_type(dict, RUBY_T_STRING);
467
470
  rb_check_type(sample, RUBY_T_STRING);
468
471
  size_t capa = NUM2SIZET(dict_capacity);
469
472
  aux_str_modify_expand(dict, capa);
473
+ char *destptr = RSTRING_PTR(dict);
474
+ size_t destlen = RSTRING_LEN(dict);
475
+ const char *sampleptr = RSTRING_PTR(sample);
470
476
  size_t samplesize = RSTRING_LEN(sample);
471
- size_t s = ZDICT_addEntropyTablesFromBuffer(RSTRING_PTR(dict), RSTRING_LEN(dict), capa, RSTRING_PTR(sample), &samplesize, 1);
477
+ ZDICT_params_t params = { 0, 0, 0 };
478
+ size_t s = ZDICT_finalizeDictionary(destptr, capa, destptr, destlen, sampleptr, &samplesize, 1, params);
472
479
  extzstd_check_error(s);
473
480
  rb_str_set_len(dict, s);
474
481
  return dict;
@@ -536,15 +543,32 @@ less_s_encode(VALUE mod, VALUE src, VALUE dest, VALUE maxdest, VALUE predict, VA
536
543
 
537
544
  if (extzstd_params_p(params)) {
538
545
  /*
539
- * ZSTDLIB_API size_t ZSTD_compress_advanced(
540
- * ZSTD_CCtx* ctx,
541
- * void* dst, size_t dstCapacity,
542
- * const void* src, size_t srcSize,
543
- * const void* dict,size_t dictSize,
544
- * ZSTD_parameters params);
546
+ * ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx,
547
+ * void* dst, size_t dstCapacity,
548
+ * const void* src, size_t srcSize);
549
+ * ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value);
550
+ * ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
545
551
  */
546
552
  ZSTD_CCtx *zstd = ZSTD_createCCtx();
547
- size_t s = ZSTD_compress_advanced(zstd, r, rsize, q, qsize, d, dsize, *extzstd_getparams(params));
553
+ ZSTD_parameters *param = extzstd_getparams(params);
554
+
555
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_windowLog, param->cParams.windowLog);
556
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_chainLog, param->cParams.chainLog);
557
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_hashLog, param->cParams.hashLog);
558
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_searchLog, param->cParams.searchLog);
559
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_minMatch, param->cParams.minMatch);
560
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_targetLength, param->cParams.targetLength);
561
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_strategy, param->cParams.strategy);
562
+
563
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_contentSizeFlag, param->fParams.contentSizeFlag);
564
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_checksumFlag, param->fParams.checksumFlag);
565
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_dictIDFlag, !param->fParams.noDictIDFlag);
566
+
567
+ //aux_ZSTD_CCtx_setPledgedSrcSize(zstd, (unsigned long long)qsize);
568
+
569
+ aux_ZSTD_CCtx_loadDictionary(zstd, d, dsize);
570
+
571
+ size_t s = ZSTD_compress2(zstd, r, rsize, q, qsize);
548
572
  ZSTD_freeCCtx(zstd);
549
573
  extzstd_check_error(s);
550
574
  rb_str_set_len(dest, s);
@@ -584,7 +608,7 @@ less_s_decode(VALUE mod, VALUE src, VALUE dest, VALUE maxdest, VALUE predict)
584
608
  aux_string_pointer(src, &q, &qsize);
585
609
 
586
610
  char *r;
587
- size_t rsize = (NIL_P(maxdest)) ? ZSTD_getDecompressedSize(q, qsize) : NUM2SIZET(maxdest);
611
+ size_t rsize = (NIL_P(maxdest)) ? ZSTD_getFrameContentSize(q, qsize) : NUM2SIZET(maxdest);
588
612
  aux_string_expand_pointer(dest, &r, rsize);
589
613
  rb_obj_infect(dest, src);
590
614
 
@@ -631,4 +655,7 @@ Init_extzstd(void)
631
655
  init_dictionary();
632
656
  init_contextless();
633
657
  extzstd_init_stream();
658
+
659
+ (void)params_alloc_dummy;
660
+ (void)getparamsp;
634
661
  }
data/ext/extzstd.h CHANGED
@@ -35,7 +35,7 @@ extern VALUE extzstd_eError;
35
35
  extern void init_extzstd_stream(void);
36
36
  extern void extzstd_init_buffered(void);
37
37
  extern void extzstd_init_stream(void);
38
- extern void extzstd_error(ssize_t errcode);
38
+ extern RBEXT_NORETURN void extzstd_error(ssize_t errcode);
39
39
  extern void extzstd_check_error(ssize_t errcode);
40
40
  extern VALUE extzstd_make_error(ssize_t errcode);
41
41
  extern VALUE extzstd_make_errorf(ssize_t errcode, const char *fmt, ...);
@@ -44,7 +44,7 @@ extern ZSTD_parameters *extzstd_getparams(VALUE v);
44
44
  extern int extzstd_params_p(VALUE v);
45
45
  extern VALUE extzstd_params_alloc(ZSTD_parameters **p);
46
46
 
47
- static inline void
47
+ static RBEXT_NORETURN inline void
48
48
  referror(VALUE v)
49
49
  {
50
50
  rb_raise(rb_eRuntimeError,
@@ -52,7 +52,7 @@ referror(VALUE v)
52
52
  rb_obj_classname(v), (void *)v);
53
53
  }
54
54
 
55
- static inline void
55
+ static RBEXT_NORETURN inline void
56
56
  reiniterror(VALUE v)
57
57
  {
58
58
  rb_raise(rb_eRuntimeError,
@@ -200,14 +200,14 @@ aux_const_dig_str_0(VALUE obj, const char *p[], const char **pp)
200
200
  #endif
201
201
 
202
202
 
203
- static void
203
+ static inline void
204
204
  aux_string_pointer(VALUE str, const char **ptr, size_t *size)
205
205
  {
206
206
  rb_check_type(str, RUBY_T_STRING);
207
207
  RSTRING_GETMEM(str, *ptr, *size);
208
208
  }
209
209
 
210
- static void
210
+ static inline void
211
211
  aux_string_pointer_with_nil(VALUE str, const char **ptr, size_t *size)
212
212
  {
213
213
  if (NIL_P(str)) {
@@ -218,7 +218,7 @@ aux_string_pointer_with_nil(VALUE str, const char **ptr, size_t *size)
218
218
  }
219
219
  }
220
220
 
221
- static void
221
+ static inline void
222
222
  aux_string_expand_pointer(VALUE str, char **ptr, size_t size)
223
223
  {
224
224
  rb_check_type(str, RUBY_T_STRING);
@@ -232,4 +232,31 @@ aux_string_expand_pointer(VALUE str, char **ptr, size_t size)
232
232
  # define rb_obj_infect(dest, src) ((void)(dest), (void)(src))
233
233
  #endif
234
234
 
235
+ #define MAKE_AUX_FUNC(auxdecl, funcall, cleanup) \
236
+ static inline size_t \
237
+ auxdecl \
238
+ { \
239
+ size_t s = funcall; \
240
+ \
241
+ if (ZSTD_isError(s)) { \
242
+ cleanup; \
243
+ extzstd_error(s); \
244
+ } \
245
+ \
246
+ return s; \
247
+ } \
248
+
249
+ MAKE_AUX_FUNC(aux_ZSTD_CCtx_reset(ZSTD_CCtx *zstd, ZSTD_ResetDirective reset),
250
+ ZSTD_CCtx_reset(zstd, reset),
251
+ ZSTD_freeCCtx(zstd))
252
+ MAKE_AUX_FUNC(aux_ZSTD_CCtx_setParameter(ZSTD_CCtx *ctx, ZSTD_cParameter param, int value),
253
+ ZSTD_CCtx_setParameter(ctx, param, value),
254
+ ZSTD_freeCCtx(ctx))
255
+ MAKE_AUX_FUNC(aux_ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx *ctx, unsigned long long pledgedSrcSize),
256
+ ZSTD_CCtx_setPledgedSrcSize(ctx, pledgedSrcSize),
257
+ ZSTD_freeCCtx(ctx))
258
+ MAKE_AUX_FUNC(aux_ZSTD_CCtx_loadDictionary(ZSTD_CCtx *ctx, const void* dict, size_t dictSize),
259
+ ZSTD_CCtx_loadDictionary(ctx, dict, dictSize),
260
+ ZSTD_freeCCtx(ctx))
261
+
235
262
  #endif /* EXTZSTD_H */
data/ext/extzstd_stream.c CHANGED
@@ -9,12 +9,13 @@ enum {
9
9
  };
10
10
 
11
11
  static inline VALUE
12
- aux_str_buf_recycle(VALUE str, size_t capacity)
12
+ aux_str_buf_recycle(VALUE *str, size_t capacity)
13
13
  {
14
- if (!RTEST(str) || rb_obj_frozen_p(str) || !rb_type_p(str, RUBY_T_STRING)) {
15
- return rb_str_buf_new(capacity);
14
+ if (!RTEST(*str) || rb_obj_frozen_p(*str) || !rb_type_p(*str, RUBY_T_STRING)) {
15
+ *str = rb_str_buf_new(capacity);
16
+ return *str;
16
17
  } else {
17
- return aux_str_modify_expand(str, capacity);
18
+ return aux_str_modify_expand(*str, capacity);
18
19
  }
19
20
  }
20
21
 
@@ -128,10 +129,6 @@ enc_init(int argc, VALUE argv[], VALUE self)
128
129
  rb_obj_classname(self), (void *)self);
129
130
  }
130
131
 
131
- AUX_TRY_WITH_GC(
132
- p->context = ZSTD_createCStream(),
133
- "failed ZSTD_createCStream()");
134
-
135
132
  const void *predictp;
136
133
  size_t predictsize;
137
134
  if (NIL_P(predict)) {
@@ -143,13 +140,39 @@ enc_init(int argc, VALUE argv[], VALUE self)
143
140
  RSTRING_GETMEM(predict, predictp, predictsize);
144
141
  }
145
142
 
143
+ AUX_TRY_WITH_GC(
144
+ p->context = ZSTD_createCStream(),
145
+ "failed ZSTD_createCStream()");
146
+
146
147
  if (extzstd_params_p(params)) {
147
148
  ZSTD_parameters *paramsp = extzstd_getparams(params);
148
- size_t s = ZSTD_initCStream_advanced(p->context, predictp, predictsize, *paramsp, -1);
149
- extzstd_check_error(s);
149
+ ZSTD_CCtx *zstd = p->context;
150
+ p->context = NULL; // 一時的に無効化する
151
+
152
+ aux_ZSTD_CCtx_reset(zstd, ZSTD_reset_session_and_parameters);
153
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_windowLog, paramsp->cParams.windowLog);
154
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_chainLog, paramsp->cParams.chainLog);
155
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_hashLog, paramsp->cParams.hashLog);
156
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_searchLog, paramsp->cParams.searchLog);
157
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_minMatch, paramsp->cParams.minMatch);
158
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_targetLength, paramsp->cParams.targetLength);
159
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_strategy, paramsp->cParams.strategy);
160
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_contentSizeFlag, paramsp->fParams.contentSizeFlag);
161
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_checksumFlag, paramsp->fParams.checksumFlag);
162
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_dictIDFlag, !paramsp->fParams.noDictIDFlag);
163
+ aux_ZSTD_CCtx_loadDictionary(zstd, predictp, predictsize);
164
+
165
+ p->context = zstd;
150
166
  } else {
151
- size_t s = ZSTD_initCStream_usingDict(p->context, predictp, predictsize, aux_num2int(params, 1));
152
- extzstd_check_error(s);
167
+ int clevel = aux_num2int(params, ZSTD_CLEVEL_DEFAULT);
168
+ ZSTD_CCtx *zstd = p->context;
169
+ p->context = NULL; // 一時的に無効化する
170
+
171
+ aux_ZSTD_CCtx_reset(zstd, ZSTD_reset_session_and_parameters);
172
+ aux_ZSTD_CCtx_setParameter(zstd, ZSTD_c_compressionLevel, clevel);
173
+ aux_ZSTD_CCtx_loadDictionary(zstd, predictp, predictsize);
174
+
175
+ p->context = zstd;
153
176
  }
154
177
 
155
178
  p->predict = predict;
@@ -170,7 +193,7 @@ enc_write(VALUE self, VALUE src)
170
193
  ZSTD_inBuffer input = { RSTRING_PTR(src), RSTRING_LEN(src), 0 };
171
194
 
172
195
  while (input.pos < input.size) {
173
- p->destbuf = aux_str_buf_recycle(p->destbuf, ZSTD_CStreamOutSize() * 2);
196
+ aux_str_buf_recycle(&p->destbuf, ZSTD_CStreamOutSize() * 2);
174
197
  rb_str_set_len(p->destbuf, 0);
175
198
  rb_obj_infect(self, src);
176
199
  rb_obj_infect(p->destbuf, self);
@@ -195,7 +218,7 @@ enc_sync(VALUE self)
195
218
  */
196
219
 
197
220
  struct encoder *p = encoder_context(self);
198
- aux_str_buf_recycle(p->destbuf, ZSTD_CStreamOutSize());
221
+ aux_str_buf_recycle(&p->destbuf, ZSTD_CStreamOutSize());
199
222
  rb_str_set_len(p->destbuf, 0);
200
223
  rb_obj_infect(p->destbuf, self);
201
224
  ZSTD_outBuffer output = { RSTRING_PTR(p->destbuf), rb_str_capacity(p->destbuf), 0 };
@@ -216,7 +239,7 @@ enc_close(VALUE self)
216
239
  */
217
240
 
218
241
  struct encoder *p = encoder_context(self);
219
- aux_str_buf_recycle(p->destbuf, ZSTD_CStreamOutSize());
242
+ aux_str_buf_recycle(&p->destbuf, ZSTD_CStreamOutSize());
220
243
  rb_str_set_len(p->destbuf, 0);
221
244
  rb_obj_infect(p->destbuf, self);
222
245
  ZSTD_outBuffer output = { RSTRING_PTR(p->destbuf), rb_str_capacity(p->destbuf), 0 };
@@ -241,11 +264,18 @@ static VALUE
241
264
  enc_reset(VALUE self, VALUE pledged_srcsize)
242
265
  {
243
266
  /*
244
- * ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
267
+ * ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset);
245
268
  */
246
269
 
247
- size_t s = ZSTD_resetCStream(encoder_context(self)->context, NUM2ULL(pledged_srcsize));
270
+ size_t s = ZSTD_CCtx_reset(encoder_context(self)->context, ZSTD_reset_session_only);
248
271
  extzstd_check_error(s);
272
+
273
+ if (pledged_srcsize == Qnil) {
274
+ ZSTD_CCtx_setPledgedSrcSize(encoder_context(self)->context, ZSTD_CONTENTSIZE_UNKNOWN);
275
+ } else {
276
+ ZSTD_CCtx_setPledgedSrcSize(encoder_context(self)->context, NUM2ULL(pledged_srcsize));
277
+ }
278
+
249
279
  return self;
250
280
  }
251
281
 
@@ -281,6 +311,10 @@ init_encoder(void)
281
311
  rb_define_alias(cStreamEncoder, "flush", "sync");
282
312
  rb_define_alias(cStreamEncoder, "end", "close");
283
313
  rb_define_alias(cStreamEncoder, "finish", "close");
314
+
315
+ (void)encoder_alloc_dummy;
316
+ (void)getencoderp;
317
+ (void)encoder_p;
284
318
  }
285
319
 
286
320
  /*
@@ -291,7 +325,7 @@ static VALUE cStreamDecoder;
291
325
 
292
326
  struct decoder
293
327
  {
294
- ZSTD_DStream *context;
328
+ ZSTD_DCtx *context;
295
329
  VALUE inport;
296
330
  VALUE readbuf;
297
331
  VALUE predict;
@@ -313,7 +347,7 @@ dec_free(void *pp)
313
347
  {
314
348
  struct decoder *p = (struct decoder *)pp;
315
349
  if (p->context) {
316
- ZSTD_freeDStream(p->context);
350
+ ZSTD_freeDCtx(p->context);
317
351
  p->context = NULL;
318
352
  }
319
353
  xfree(p);
@@ -352,6 +386,8 @@ static VALUE
352
386
  dec_init(int argc, VALUE argv[], VALUE self)
353
387
  {
354
388
  /*
389
+ * ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
390
+ *
355
391
  * ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds);
356
392
  * ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize);
357
393
  */
@@ -379,16 +415,19 @@ dec_init(int argc, VALUE argv[], VALUE self)
379
415
  }
380
416
 
381
417
  AUX_TRY_WITH_GC(
382
- p->context = ZSTD_createDStream(),
383
- "failed ZSTD_createDStream()");
418
+ p->context = ZSTD_createDCtx(),
419
+ "failed ZSTD_createDCtx()");
384
420
 
421
+ //ZSTD_DCtx_reset
422
+ //ZSTD_DCtx_loadDictionary
385
423
  if (NIL_P(predict)) {
386
- size_t s = ZSTD_initDStream(p->context);
387
- extzstd_check_error(s);
424
+ //size_t s = ZSTD_initDStream(p->context);
425
+ //extzstd_check_error(s);
388
426
  } else {
389
427
  rb_check_type(predict, RUBY_T_STRING);
390
428
  predict = rb_str_new_frozen(predict);
391
- size_t s = ZSTD_initDStream_usingDict(p->context, RSTRING_PTR(predict), RSTRING_LEN(predict));
429
+ //size_t s = ZSTD_initDStream_usingDict(p->context, RSTRING_PTR(predict), RSTRING_LEN(predict));
430
+ size_t s = ZSTD_DCtx_loadDictionary(p->context, RSTRING_PTR(predict), RSTRING_LEN(predict));
392
431
  extzstd_check_error(s);
393
432
  }
394
433
 
@@ -401,8 +440,8 @@ dec_init(int argc, VALUE argv[], VALUE self)
401
440
  static int
402
441
  dec_read_fetch(VALUE o, struct decoder *p)
403
442
  {
404
- if (!p->inbuf.src || NIL_P(p->readbuf) || p->inbuf.pos >= RSTRING_LEN(p->readbuf)) {
405
- p->readbuf = aux_str_buf_recycle(p->readbuf, EXT_PARTIAL_READ_SIZE);
443
+ if (!p->inbuf.src || NIL_P(p->readbuf) || p->inbuf.pos >= (size_t)RSTRING_LEN(p->readbuf)) {
444
+ aux_str_buf_recycle(&p->readbuf, EXT_PARTIAL_READ_SIZE);
406
445
  VALUE st = AUX_FUNCALL(p->inport, id_read, INT2FIX(EXT_PARTIAL_READ_SIZE), p->readbuf);
407
446
  if (NIL_P(st)) { return -1; }
408
447
  rb_check_type(st, RUBY_T_STRING);
@@ -420,13 +459,14 @@ dec_read_fetch(VALUE o, struct decoder *p)
420
459
  static size_t
421
460
  dec_read_decode(VALUE o, struct decoder *p, char *buf, ssize_t size)
422
461
  {
462
+
423
463
  if (p->reached_eof != 0) {
424
464
  return 0;
425
465
  }
426
466
 
427
467
  ZSTD_outBuffer output = { buf, size, 0 };
428
468
 
429
- while (size < 0 || output.pos < size) {
469
+ while (size < 0 || output.pos < (size_t)size) {
430
470
  if (dec_read_fetch(o, p) != 0) {
431
471
  if (p->reached_eof == 0) {
432
472
  rb_raise(rb_eRuntimeError,
@@ -563,10 +603,9 @@ dec_close(VALUE self)
563
603
  static VALUE
564
604
  dec_reset(VALUE self)
565
605
  {
566
- /*
567
- * ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
568
- */
569
- size_t s = ZSTD_resetDStream(decoder_context(self)->context);
606
+ //> ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset);
607
+
608
+ size_t s = ZSTD_DCtx_reset(decoder_context(self)->context, ZSTD_reset_session_only);
570
609
  extzstd_check_error(s);
571
610
  return self;
572
611
  }
@@ -605,6 +644,10 @@ init_decoder(void)
605
644
  rb_define_method(cStreamDecoder, "reset", dec_reset, 0);
606
645
  rb_define_method(cStreamDecoder, "sizeof", dec_sizeof, 0);
607
646
  rb_define_method(cStreamDecoder, "pos", dec_pos, 0);
647
+
648
+ (void)decoder_alloc_dummy;
649
+ (void)getdecoderp;
650
+ (void)decoder_p;
608
651
  }
609
652
 
610
653
  /*
data/ext/libzstd_conf.h CHANGED
@@ -2,7 +2,6 @@
2
2
  #define RUBY_ZSTD_LIBZSTD_CONF_H 1
3
3
 
4
4
  #define ZSTD_LEGACY_SUPPORT 1
5
- #define MEM_MODULE 1
6
5
  #define visibility(v) visibility("hidden")
7
6
 
8
7
  #endif /* RUBY_ZSTD_LIBZSTD_CONF_H */
@@ -0,0 +1 @@
1
+ #include "../contrib/zstd/lib/decompress/huf_decompress_amd64.S"