extzstd 0.1.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY.ja.md +18 -0
  3. data/README.md +15 -50
  4. data/contrib/zstd/CONTRIBUTING.md +1 -1
  5. data/contrib/zstd/COPYING +339 -0
  6. data/contrib/zstd/Makefile +82 -51
  7. data/contrib/zstd/NEWS +92 -5
  8. data/contrib/zstd/README.md +50 -41
  9. data/contrib/zstd/appveyor.yml +164 -102
  10. data/contrib/zstd/circle.yml +10 -22
  11. data/contrib/zstd/lib/BUCK +31 -10
  12. data/contrib/zstd/lib/Makefile +57 -31
  13. data/contrib/zstd/lib/README.md +68 -37
  14. data/contrib/zstd/lib/common/bitstream.h +130 -76
  15. data/contrib/zstd/lib/common/compiler.h +86 -0
  16. data/contrib/zstd/lib/common/error_private.c +15 -11
  17. data/contrib/zstd/lib/common/error_private.h +8 -8
  18. data/contrib/zstd/lib/common/fse.h +19 -9
  19. data/contrib/zstd/lib/common/fse_decompress.c +3 -22
  20. data/contrib/zstd/lib/common/huf.h +68 -26
  21. data/contrib/zstd/lib/common/mem.h +23 -35
  22. data/contrib/zstd/lib/common/pool.c +123 -63
  23. data/contrib/zstd/lib/common/pool.h +19 -10
  24. data/contrib/zstd/lib/common/threading.c +11 -16
  25. data/contrib/zstd/lib/common/threading.h +52 -33
  26. data/contrib/zstd/lib/common/xxhash.c +28 -22
  27. data/contrib/zstd/lib/common/zstd_common.c +40 -27
  28. data/contrib/zstd/lib/common/zstd_errors.h +43 -34
  29. data/contrib/zstd/lib/common/zstd_internal.h +131 -123
  30. data/contrib/zstd/lib/compress/fse_compress.c +17 -33
  31. data/contrib/zstd/lib/compress/huf_compress.c +15 -9
  32. data/contrib/zstd/lib/compress/zstd_compress.c +2096 -2363
  33. data/contrib/zstd/lib/compress/zstd_compress_internal.h +462 -0
  34. data/contrib/zstd/lib/compress/zstd_double_fast.c +309 -0
  35. data/contrib/zstd/lib/compress/zstd_double_fast.h +29 -0
  36. data/contrib/zstd/lib/compress/zstd_fast.c +243 -0
  37. data/contrib/zstd/lib/compress/zstd_fast.h +31 -0
  38. data/contrib/zstd/lib/compress/zstd_lazy.c +765 -0
  39. data/contrib/zstd/lib/compress/zstd_lazy.h +39 -0
  40. data/contrib/zstd/lib/compress/zstd_ldm.c +707 -0
  41. data/contrib/zstd/lib/compress/zstd_ldm.h +68 -0
  42. data/contrib/zstd/lib/compress/zstd_opt.c +785 -0
  43. data/contrib/zstd/lib/compress/zstd_opt.h +19 -908
  44. data/contrib/zstd/lib/compress/zstdmt_compress.c +737 -327
  45. data/contrib/zstd/lib/compress/zstdmt_compress.h +88 -26
  46. data/contrib/zstd/lib/decompress/huf_decompress.c +158 -50
  47. data/contrib/zstd/lib/decompress/zstd_decompress.c +884 -699
  48. data/contrib/zstd/lib/deprecated/zbuff.h +5 -4
  49. data/contrib/zstd/lib/deprecated/zbuff_common.c +5 -5
  50. data/contrib/zstd/lib/deprecated/zbuff_compress.c +6 -4
  51. data/contrib/zstd/lib/deprecated/zbuff_decompress.c +5 -4
  52. data/contrib/zstd/lib/dictBuilder/cover.c +93 -77
  53. data/contrib/zstd/lib/dictBuilder/zdict.c +107 -92
  54. data/contrib/zstd/lib/dictBuilder/zdict.h +112 -102
  55. data/contrib/zstd/lib/legacy/zstd_legacy.h +9 -4
  56. data/contrib/zstd/lib/legacy/zstd_v01.c +7 -6
  57. data/contrib/zstd/lib/legacy/zstd_v01.h +5 -4
  58. data/contrib/zstd/lib/legacy/zstd_v02.c +27 -99
  59. data/contrib/zstd/lib/legacy/zstd_v02.h +5 -4
  60. data/contrib/zstd/lib/legacy/zstd_v03.c +26 -98
  61. data/contrib/zstd/lib/legacy/zstd_v03.h +5 -4
  62. data/contrib/zstd/lib/legacy/zstd_v04.c +22 -91
  63. data/contrib/zstd/lib/legacy/zstd_v04.h +5 -4
  64. data/contrib/zstd/lib/legacy/zstd_v05.c +23 -99
  65. data/contrib/zstd/lib/legacy/zstd_v05.h +5 -4
  66. data/contrib/zstd/lib/legacy/zstd_v06.c +22 -96
  67. data/contrib/zstd/lib/legacy/zstd_v06.h +5 -4
  68. data/contrib/zstd/lib/legacy/zstd_v07.c +19 -95
  69. data/contrib/zstd/lib/legacy/zstd_v07.h +5 -4
  70. data/contrib/zstd/lib/zstd.h +895 -271
  71. data/ext/extconf.rb +11 -2
  72. data/ext/extzstd.c +45 -128
  73. data/ext/extzstd.h +74 -31
  74. data/ext/extzstd_stream.c +401 -142
  75. data/ext/zstd_common.c +5 -0
  76. data/ext/zstd_compress.c +8 -0
  77. data/ext/zstd_decompress.c +1 -0
  78. data/ext/zstd_dictbuilder.c +2 -0
  79. data/lib/extzstd/version.rb +1 -1
  80. data/lib/extzstd.rb +48 -1
  81. data/test/test_basic.rb +9 -1
  82. metadata +17 -7
  83. data/HISTORY.ja +0 -10
  84. data/contrib/zstd/LICENSE-examples +0 -11
  85. data/contrib/zstd/PATENTS +0 -33
data/ext/extconf.rb CHANGED
@@ -17,8 +17,17 @@ $INCFLAGS = %w(
17
17
  #$srcs = files
18
18
  #$VPATH.push "$(srcdir)/../contrib/zstd", "$(srcdir)/../contrib/zstd/legacy"
19
19
 
20
- if RbConfig::CONFIG["arch"] =~ /mingw/
21
- $LDFLAGS << " -static-libgcc"
20
+ if RbConfig::CONFIG["arch"] =~ /mingw/i
21
+ $LDFLAGS << " -static-libgcc" if try_ldflags("-static-libgcc")
22
+ else
23
+ if try_compile(<<-"VISIBILITY")
24
+ __attribute__ ((visibility("hidden"))) int conftest(void) { return 0; }
25
+ VISIBILITY
26
+ if try_cflags("-fvisibility=hidden")
27
+ $CFLAGS << " -fvisibility=hidden"
28
+ $defs << %('-DRBEXT_API=__attribute__ ((visibility("default")))')
29
+ end
30
+ end
22
31
  end
23
32
 
24
33
  create_makefile File.join(RUBY_VERSION.slice(/\d+\.\d+/), "extzstd")
data/ext/extzstd.c CHANGED
@@ -3,36 +3,11 @@
3
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
-
34
6
  VALUE extzstd_mZstd;
35
7
 
8
+ static ID id_initialize;
9
+ static ID id_error_code;
10
+
36
11
  /*
37
12
  * constant Zstd::LIBRARY_VERSION
38
13
  */
@@ -83,25 +58,6 @@ init_libver(void)
83
58
  VALUE extzstd_mExceptions;
84
59
 
85
60
  VALUE extzstd_eError;
86
- VALUE extzstd_eError;
87
- VALUE extzstd_eGenericError;
88
- VALUE extzstd_ePrefixUnknownError;
89
- VALUE extzstd_eFrameParameterUnsupportedError;
90
- VALUE extzstd_eFrameParameterUnsupportedBy32bitsError;
91
- VALUE extzstd_eCompressionParameterUnsupportedError;
92
- VALUE extzstd_eInitMissingError;
93
- VALUE extzstd_eMemoryAllocationError;
94
- VALUE extzstd_eStageWrongError;
95
- VALUE extzstd_eDstSizeTooSmallError;
96
- VALUE extzstd_eSrcSizeWrongError;
97
- VALUE extzstd_eCorruptionDetectedError;
98
- VALUE extzstd_eChecksumWrongError;
99
- VALUE extzstd_eTableLogTooLargeError;
100
- VALUE extzstd_eMaxSymbolValueTooLargeError;
101
- VALUE extzstd_eMaxSymbolValueTooSmallError;
102
- VALUE extzstd_eDictionaryCorruptedError;
103
- VALUE extzstd_eDictionaryWrongError;
104
-
105
61
 
106
62
  void
107
63
  extzstd_check_error(ssize_t errcode)
@@ -118,16 +74,18 @@ extzstd_error(ssize_t errcode)
118
74
  }
119
75
 
120
76
  VALUE
121
- extzstd_make_errorf(VALUE exc, const char *fmt, ...)
77
+ extzstd_make_errorf(ssize_t errcode, const char *fmt, ...)
122
78
  {
79
+ VALUE e;
80
+
123
81
  if (fmt && strlen(fmt) > 0) {
124
82
  va_list va;
125
83
  va_start(va, fmt);
126
84
  VALUE mesg = rb_vsprintf(fmt, va);
127
85
  va_end(va);
128
- return rb_exc_new3(exc, mesg);
86
+ return AUX_FUNCALL(extzstd_eError, id_initialize, SSIZET2NUM(errcode), mesg);
129
87
  } else {
130
- return rb_exc_new2(exc, "");
88
+ return AUX_FUNCALL(extzstd_eError, id_initialize, SSIZET2NUM(errcode));
131
89
  }
132
90
  }
133
91
 
@@ -136,33 +94,34 @@ extzstd_make_error(ssize_t errcode)
136
94
  {
137
95
  if (!ZSTD_isError(errcode)) { return Qnil; }
138
96
 
139
- #define CASE_ERROR(zstderr, extzstderr, ...) \
140
- case zstderr: return extzstd_make_errorf(extzstderr, __VA_ARGS__); \
141
-
142
- switch (-errcode) {
143
- CASE_ERROR(ZSTD_error_GENERIC, extzstd_eGenericError, NULL);
144
- CASE_ERROR(ZSTD_error_prefix_unknown, extzstd_ePrefixUnknownError, NULL);
145
- CASE_ERROR(ZSTD_error_frameParameter_unsupported, extzstd_eFrameParameterUnsupportedError, NULL);
146
- CASE_ERROR(ZSTD_error_frameParameter_unsupportedBy32bits, extzstd_eFrameParameterUnsupportedBy32bitsError, NULL);
147
- CASE_ERROR(ZSTD_error_compressionParameter_unsupported, extzstd_eCompressionParameterUnsupportedError, NULL);
148
- CASE_ERROR(ZSTD_error_init_missing, extzstd_eInitMissingError, NULL);
149
- CASE_ERROR(ZSTD_error_memory_allocation, extzstd_eMemoryAllocationError, NULL);
150
- CASE_ERROR(ZSTD_error_stage_wrong, extzstd_eStageWrongError, NULL);
151
- CASE_ERROR(ZSTD_error_dstSize_tooSmall, extzstd_eDstSizeTooSmallError, NULL);
152
- CASE_ERROR(ZSTD_error_srcSize_wrong, extzstd_eSrcSizeWrongError, NULL);
153
- CASE_ERROR(ZSTD_error_corruption_detected, extzstd_eCorruptionDetectedError, NULL);
154
- CASE_ERROR(ZSTD_error_checksum_wrong, extzstd_eChecksumWrongError, NULL);
155
- CASE_ERROR(ZSTD_error_tableLog_tooLarge, extzstd_eTableLogTooLargeError, NULL);
156
- CASE_ERROR(ZSTD_error_maxSymbolValue_tooLarge, extzstd_eMaxSymbolValueTooLargeError, NULL);
157
- CASE_ERROR(ZSTD_error_maxSymbolValue_tooSmall, extzstd_eMaxSymbolValueTooSmallError, NULL);
158
- CASE_ERROR(ZSTD_error_dictionary_corrupted, extzstd_eDictionaryCorruptedError, NULL);
159
- CASE_ERROR(ZSTD_error_dictionary_wrong, extzstd_eDictionaryWrongError, NULL);
160
- default:
161
- return extzstd_make_errorf(extzstd_eError,
162
- "unknown zstd error code (%d)", errcode);
163
- }
97
+ return extzstd_make_errorf(ZSTD_getErrorCode(errcode), NULL);
98
+ }
99
+
100
+ static VALUE
101
+ err_initialize(int argc, VALUE argv[], VALUE err)
102
+ {
103
+ VALUE errcode;
104
+
105
+ rb_scan_args(argc, argv, "1*", &errcode, NULL);
106
+ rb_call_super(argc - 1, argv + 1);
107
+ rb_ivar_set(err, id_error_code, errcode);
108
+
109
+ return err;
110
+ }
164
111
 
165
- #undef CASE_ERROR
112
+ static VALUE
113
+ err_errcode(VALUE err)
114
+ {
115
+ return rb_ivar_get(err, id_error_code);
116
+ }
117
+
118
+ static VALUE
119
+ err_to_s(VALUE err)
120
+ {
121
+ ZSTD_ErrorCode code = (ZSTD_ErrorCode)NUM2SSIZET(rb_ivar_get(err, id_error_code));
122
+ VALUE mesg = rb_call_super(0, NULL);
123
+ VALUE mesg2 = rb_sprintf(" - %s (errcode: %d)", ZSTD_getErrorString(code), (int)code);
124
+ return rb_str_plus(mesg, mesg2);
166
125
  }
167
126
 
168
127
  static void
@@ -172,57 +131,10 @@ init_error(void)
172
131
 
173
132
  extzstd_eError = rb_define_class_under(extzstd_mZstd, "Error", rb_eRuntimeError);
174
133
  rb_include_module(extzstd_eError, extzstd_mExceptions);
175
-
176
- extzstd_eGenericError = rb_define_class_under(extzstd_mZstd, "GenericError", rb_eRuntimeError);
177
- rb_include_module(extzstd_eGenericError, extzstd_mExceptions);
178
-
179
- extzstd_ePrefixUnknownError = rb_define_class_under(extzstd_mZstd, "PrefixUnknownError", rb_eArgError);
180
- rb_include_module(extzstd_ePrefixUnknownError, extzstd_mExceptions);
181
-
182
- extzstd_eFrameParameterUnsupportedError = rb_define_class_under(extzstd_mZstd, "FrameParameterUnsupportedError", rb_eRuntimeError);
183
- rb_include_module(extzstd_eFrameParameterUnsupportedError, extzstd_mExceptions);
184
-
185
- extzstd_eFrameParameterUnsupportedBy32bitsError = rb_define_class_under(extzstd_mZstd, "FrameParameterUnsupportedBy32bitsImplementationError", rb_eRuntimeError);
186
- rb_include_module(extzstd_eFrameParameterUnsupportedBy32bitsError, extzstd_mExceptions);
187
-
188
- extzstd_eCompressionParameterUnsupportedError = rb_define_class_under(extzstd_mZstd, "CompressionParameterUnsupportedError", rb_eRuntimeError);
189
- rb_include_module(extzstd_eCompressionParameterUnsupportedError, extzstd_mExceptions);
190
-
191
- extzstd_eInitMissingError = rb_define_class_under(extzstd_mZstd, "InitMissingError", rb_eRuntimeError);
192
- rb_include_module(extzstd_eInitMissingError, extzstd_mExceptions);
193
-
194
- extzstd_eMemoryAllocationError = rb_define_class_under(extzstd_mZstd, "MemoryAllocationError", aux_const_dig_str(rb_cObject, "Errno", "ENOMEM"));
195
- rb_include_module(extzstd_eMemoryAllocationError, extzstd_mExceptions);
196
-
197
- extzstd_eStageWrongError = rb_define_class_under(extzstd_mZstd, "StageWrongError", rb_eRuntimeError);
198
- rb_include_module(extzstd_eStageWrongError, extzstd_mExceptions);
199
-
200
- extzstd_eDstSizeTooSmallError = rb_define_class_under(extzstd_mZstd, "DstSizeTooSmallError", rb_eArgError);
201
- rb_include_module(extzstd_eDstSizeTooSmallError, extzstd_mExceptions);
202
-
203
- extzstd_eSrcSizeWrongError = rb_define_class_under(extzstd_mZstd, "SrcSizeWrongError", rb_eArgError);
204
- rb_include_module(extzstd_eSrcSizeWrongError, extzstd_mExceptions);
205
-
206
- extzstd_eCorruptionDetectedError = rb_define_class_under(extzstd_mZstd, "CorruptionDetectedError", rb_eRuntimeError);
207
- rb_include_module(extzstd_eCorruptionDetectedError, extzstd_mExceptions);
208
-
209
- extzstd_eChecksumWrongError = rb_define_class_under(extzstd_mZstd, "ChecksumWrongError", rb_eRuntimeError);
210
- rb_include_module(extzstd_eChecksumWrongError, extzstd_mExceptions);
211
-
212
- extzstd_eTableLogTooLargeError = rb_define_class_under(extzstd_mZstd, "TableLogTooLargeError", rb_eArgError);
213
- rb_include_module(extzstd_eTableLogTooLargeError, extzstd_mExceptions);
214
-
215
- extzstd_eMaxSymbolValueTooLargeError = rb_define_class_under(extzstd_mZstd, "MaxSymbolValueTooLargeError", rb_eArgError);
216
- rb_include_module(extzstd_eMaxSymbolValueTooLargeError, extzstd_mExceptions);
217
-
218
- extzstd_eMaxSymbolValueTooSmallError = rb_define_class_under(extzstd_mZstd, "MaxSymbolValueTooSmallError", rb_eArgError);
219
- rb_include_module(extzstd_eMaxSymbolValueTooSmallError, extzstd_mExceptions);
220
-
221
- extzstd_eDictionaryCorruptedError = rb_define_class_under(extzstd_mZstd, "DictionaryCorruptedError", rb_eRuntimeError);
222
- rb_include_module(extzstd_eDictionaryCorruptedError, extzstd_mExceptions);
223
-
224
- extzstd_eDictionaryWrongError = rb_define_class_under(extzstd_mZstd, "DictionaryWrongError", rb_eRuntimeError);
225
- rb_include_module(extzstd_eDictionaryWrongError, extzstd_mExceptions);
134
+ rb_define_method(extzstd_eError, "initialize", err_initialize, -1);
135
+ rb_define_method(extzstd_eError, "error_code", err_errcode, 0);
136
+ rb_define_method(extzstd_eError, "to_s", err_to_s, 0);
137
+ rb_define_alias(extzstd_eError, "errcode", "error_code");
226
138
  }
227
139
 
228
140
  /*
@@ -245,6 +157,7 @@ init_constants(void)
245
157
  rb_define_const(mConstants, "ZSTD_LAZY2", INT2NUM(ZSTD_lazy2));
246
158
  rb_define_const(mConstants, "ZSTD_BTLAZY2", INT2NUM(ZSTD_btlazy2));
247
159
  rb_define_const(mConstants, "ZSTD_BTOPT", INT2NUM(ZSTD_btopt));
160
+ rb_define_const(mConstants, "ZSTD_BTULTRA", INT2NUM(ZSTD_btultra));
248
161
  rb_define_const(mConstants, "ZSTD_WINDOWLOG_MAX", INT2NUM(ZSTD_WINDOWLOG_MAX));
249
162
  rb_define_const(mConstants, "ZSTD_WINDOWLOG_MIN", INT2NUM(ZSTD_WINDOWLOG_MIN));
250
163
  rb_define_const(mConstants, "ZSTD_HASHLOG_MAX", INT2NUM(ZSTD_HASHLOG_MAX));
@@ -266,6 +179,7 @@ init_constants(void)
266
179
  rb_define_const(mConstants, "LAZY2", INT2NUM(ZSTD_lazy2));
267
180
  rb_define_const(mConstants, "BTLAZY2", INT2NUM(ZSTD_btlazy2));
268
181
  rb_define_const(mConstants, "BTOPT", INT2NUM(ZSTD_btopt));
182
+ rb_define_const(mConstants, "BTULTRA", INT2NUM(ZSTD_btultra));
269
183
  rb_define_const(mConstants, "WINDOWLOG_MAX", INT2NUM(ZSTD_WINDOWLOG_MAX));
270
184
  rb_define_const(mConstants, "WINDOWLOG_MIN", INT2NUM(ZSTD_WINDOWLOG_MIN));
271
185
  rb_define_const(mConstants, "HASHLOG_MAX", INT2NUM(ZSTD_HASHLOG_MAX));
@@ -688,9 +602,12 @@ init_contextless(void)
688
602
  * library initializer
689
603
  */
690
604
 
691
- void
605
+ RBEXT_API void
692
606
  Init_extzstd(void)
693
607
  {
608
+ id_initialize = rb_intern("initialize");
609
+ id_error_code = rb_intern("error_code");
610
+
694
611
  extzstd_mZstd = rb_define_module("Zstd");
695
612
 
696
613
  init_libver();
data/ext/extzstd.h CHANGED
@@ -3,7 +3,8 @@
3
3
 
4
4
  #define ZSTD_LEGACY_SUPPORT 1
5
5
  #define ZDICT_STATIC_LINKING_ONLY 1
6
- #define ZSTD_STATIC_LINKING_ONLY 1
6
+ //#define ZSTD_STATIC_LINKING_ONLY 1
7
+ #include <common/zstd_internal.h> /* for MIN() */
7
8
  #include <zstd.h>
8
9
  #include <stdarg.h>
9
10
  #include <ruby.h>
@@ -28,24 +29,6 @@ RDOCFAKE(extzstd_cParams = rb_define_class_under(extzstd_mZstd, "Parameters", rb
28
29
 
29
30
  extern VALUE extzstd_mExceptions;
30
31
  extern VALUE extzstd_eError;
31
- extern VALUE extzstd_eGenericError;
32
- extern VALUE extzstd_ePrefixUnknownError;
33
- extern VALUE extzstd_eFrameParameterUnsupportedError;
34
- extern VALUE extzstd_eFrameParameterUnsupportedBy32bitsError;
35
- extern VALUE extzstd_eCompressionParameterUnsupportedError;
36
- extern VALUE extzstd_eInitMissingError;
37
- extern VALUE extzstd_eMemoryAllocationError;
38
- extern VALUE extzstd_eStageWrongError;
39
- extern VALUE extzstd_eDstSizeTooSmallError;
40
- extern VALUE extzstd_eSrcSizeWrongError;
41
- extern VALUE extzstd_eCorruptionDetectedError;
42
- extern VALUE extzstd_eChecksumWrongError;
43
- extern VALUE extzstd_eTableLogTooLargeError;
44
- extern VALUE extzstd_eMaxSymbolValueTooLargeError;
45
- extern VALUE extzstd_eMaxSymbolValueTooSmallError;
46
- extern VALUE extzstd_eDictionaryCorruptedError;
47
- extern VALUE extzstd_eDictionaryWrongError;
48
-
49
32
 
50
33
  extern void init_extzstd_stream(void);
51
34
  extern void extzstd_init_buffered(void);
@@ -53,7 +36,7 @@ extern void extzstd_init_stream(void);
53
36
  extern void extzstd_error(ssize_t errcode);
54
37
  extern void extzstd_check_error(ssize_t errcode);
55
38
  extern VALUE extzstd_make_error(ssize_t errcode);
56
- extern VALUE extzstd_make_errorf(VALUE exc, const char *fmt, ...);
39
+ extern VALUE extzstd_make_errorf(ssize_t errcode, const char *fmt, ...);
57
40
 
58
41
  extern ZSTD_parameters *extzstd_getparams(VALUE v);
59
42
  extern int extzstd_params_p(VALUE v);
@@ -171,16 +154,76 @@ aux_const_dig_str_0(VALUE obj, const char *p[], const char **pp)
171
154
  return obj;
172
155
  }
173
156
 
174
- #define aux_const_dig_str(OBJ, ...) \
175
- ({ \
176
- const char *names__[] = { __VA_ARGS__ }; \
177
- aux_const_dig_str_0((OBJ), names__, ENDOF(names__)); \
178
- }) \
179
-
180
- #define AUX_TUPLE(...) \
181
- ({ \
182
- VALUE v__[] = { __VA_ARGS__ }; \
183
- rb_ary_new4(ELEMENTOF(v__), v__); \
184
- }) \
157
+ #define aux_const_dig_str(OBJ, ...) \
158
+ aux_const_dig_str_0((OBJ), \
159
+ ((const char *[]){ __VA_ARGS__ }), \
160
+ ENDOF(((const char *[]){ __VA_ARGS__ }))) \
161
+
162
+ #define AUX_TUPLE(...) \
163
+ rb_ary_new4(ELEMENTOF(((VALUE[]) { __VA_ARGS__ })), \
164
+ ((VALUE[]) { __VA_ARGS__ })) \
165
+
166
+ #define AUX_FUNCALL(RECV, MID, ...) \
167
+ rb_funcall2((RECV), (MID), \
168
+ ELEMENTOF(((const VALUE[]){ __VA_ARGS__ })), \
169
+ ((const VALUE[]){ __VA_ARGS__ })) \
170
+
171
+ #define AUX_TRY_WITH_GC(cond, mesg) \
172
+ do { \
173
+ if (!(cond)) { \
174
+ rb_gc(); \
175
+ if (!(cond)) { \
176
+ errno = ENOMEM; \
177
+ rb_sys_fail(mesg); \
178
+ } \
179
+ } \
180
+ } while (0) \
181
+
182
+ #if defined _WIN32 || defined __CYGWIN__
183
+ # define RBEXT_IMPORT __declspec(dllimport)
184
+ # define RBEXT_EXPORT __declspec(dllexport)
185
+ # define RBEXT_LOCAL
186
+ #elif __GNUC__ >= 4 || __clang__
187
+ # define RBEXT_IMPORT __attribute__((visibility("default")))
188
+ # define RBEXT_EXPORT __attribute__((visibility("default")))
189
+ # define RBEXT_LOCAL __attribute__((visibility("hidden")))
190
+ #else
191
+ # define RBEXT_IMPORT
192
+ # define RBEXT_EXPORT
193
+ # define RBEXT_LOCAL
194
+ #endif
195
+
196
+ #ifndef RBEXT_API
197
+ # define RBEXT_API RBEXT_EXPORT
198
+ #endif
199
+
200
+
201
+ static void
202
+ aux_string_pointer(VALUE str, const char **ptr, size_t *size)
203
+ {
204
+ rb_check_type(str, RUBY_T_STRING);
205
+ RSTRING_GETMEM(str, *ptr, *size);
206
+ }
207
+
208
+ static void
209
+ aux_string_pointer_with_nil(VALUE str, const char **ptr, size_t *size)
210
+ {
211
+ if (NIL_P(str)) {
212
+ *ptr = NULL;
213
+ *size = 0;
214
+ } else {
215
+ aux_string_pointer(str, ptr, size);
216
+ }
217
+ }
218
+
219
+ static void
220
+ aux_string_expand_pointer(VALUE str, char **ptr, size_t size)
221
+ {
222
+ rb_check_type(str, RUBY_T_STRING);
223
+ rb_str_modify(str);
224
+ rb_str_set_len(str, 0);
225
+ rb_str_modify_expand(str, size);
226
+ *ptr = RSTRING_PTR(str);
227
+ }
185
228
 
186
229
  #endif /* EXTZSTD_H */