ruby-zstds 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +1 -0
  3. data/LICENSE +21 -0
  4. data/README.md +498 -0
  5. data/ext/extconf.rb +82 -0
  6. data/ext/zstds_ext/buffer.c +30 -0
  7. data/ext/zstds_ext/buffer.h +23 -0
  8. data/ext/zstds_ext/common.h +16 -0
  9. data/ext/zstds_ext/dictionary.c +106 -0
  10. data/ext/zstds_ext/dictionary.h +16 -0
  11. data/ext/zstds_ext/error.c +81 -0
  12. data/ext/zstds_ext/error.h +35 -0
  13. data/ext/zstds_ext/io.c +512 -0
  14. data/ext/zstds_ext/io.h +14 -0
  15. data/ext/zstds_ext/macro.h +13 -0
  16. data/ext/zstds_ext/main.c +25 -0
  17. data/ext/zstds_ext/option.c +287 -0
  18. data/ext/zstds_ext/option.h +122 -0
  19. data/ext/zstds_ext/stream/compressor.c +241 -0
  20. data/ext/zstds_ext/stream/compressor.h +31 -0
  21. data/ext/zstds_ext/stream/decompressor.c +183 -0
  22. data/ext/zstds_ext/stream/decompressor.h +29 -0
  23. data/ext/zstds_ext/string.c +254 -0
  24. data/ext/zstds_ext/string.h +14 -0
  25. data/lib/zstds.rb +9 -0
  26. data/lib/zstds/dictionary.rb +47 -0
  27. data/lib/zstds/error.rb +22 -0
  28. data/lib/zstds/file.rb +46 -0
  29. data/lib/zstds/option.rb +194 -0
  30. data/lib/zstds/stream/abstract.rb +153 -0
  31. data/lib/zstds/stream/delegates.rb +36 -0
  32. data/lib/zstds/stream/raw/abstract.rb +55 -0
  33. data/lib/zstds/stream/raw/compressor.rb +101 -0
  34. data/lib/zstds/stream/raw/decompressor.rb +70 -0
  35. data/lib/zstds/stream/reader.rb +166 -0
  36. data/lib/zstds/stream/reader_helpers.rb +192 -0
  37. data/lib/zstds/stream/stat.rb +78 -0
  38. data/lib/zstds/stream/writer.rb +145 -0
  39. data/lib/zstds/stream/writer_helpers.rb +93 -0
  40. data/lib/zstds/string.rb +31 -0
  41. data/lib/zstds/validation.rb +48 -0
  42. data/lib/zstds/version.rb +6 -0
  43. metadata +182 -0
@@ -0,0 +1,14 @@
1
+ // Ruby bindings for zstd library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(ZSTDS_EXT_IO_H)
5
+ #define ZSTDS_EXT_IO_H
6
+
7
+ #include "ruby.h"
8
+
9
+ VALUE zstds_ext_compress_io(VALUE self, VALUE source, VALUE destination, VALUE options);
10
+ VALUE zstds_ext_decompress_io(VALUE self, VALUE source, VALUE destination, VALUE options);
11
+
12
+ void zstds_ext_io_exports(VALUE root_module);
13
+
14
+ #endif // ZSTDS_EXT_IO_H
@@ -0,0 +1,13 @@
1
+ // Ruby bindings for zstd library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(ZSTDS_EXT_MACRO_H)
5
+ #define ZSTDS_EXT_MACRO_H
6
+
7
+ #if defined(__GNUC__)
8
+ #define ZSTDS_EXT_UNUSED(x) x __attribute__((__unused__))
9
+ #else
10
+ #define ZSTDS_EXT_UNUSED(x) x
11
+ #endif
12
+
13
+ #endif // ZSTDS_EXT_MACRO_H
@@ -0,0 +1,25 @@
1
+ // Ruby bindings for zstd library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #include "ruby.h"
5
+ #include "zstds_ext/buffer.h"
6
+ #include "zstds_ext/common.h"
7
+ #include "zstds_ext/dictionary.h"
8
+ #include "zstds_ext/io.h"
9
+ #include "zstds_ext/option.h"
10
+ #include "zstds_ext/stream/compressor.h"
11
+ #include "zstds_ext/stream/decompressor.h"
12
+ #include "zstds_ext/string.h"
13
+
14
+ void Init_zstds_ext()
15
+ {
16
+ VALUE root_module = rb_define_module(ZSTDS_EXT_MODULE_NAME);
17
+
18
+ zstds_ext_buffer_exports(root_module);
19
+ zstds_ext_dictionary_exports(root_module);
20
+ zstds_ext_io_exports(root_module);
21
+ zstds_ext_option_exports(root_module);
22
+ zstds_ext_compressor_exports(root_module);
23
+ zstds_ext_decompressor_exports(root_module);
24
+ zstds_ext_string_exports(root_module);
25
+ }
@@ -0,0 +1,287 @@
1
+ // Ruby bindings for zstd library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #include "zstds_ext/option.h"
5
+
6
+ #include <stdbool.h>
7
+ #include <stdint.h>
8
+ #include <stdlib.h>
9
+ #include <zstd.h>
10
+
11
+ #include "ruby.h"
12
+ #include "zstds_ext/common.h"
13
+ #include "zstds_ext/dictionary.h"
14
+ #include "zstds_ext/error.h"
15
+
16
+ // -- values --
17
+
18
+ static inline VALUE get_raw_option_value(VALUE options, const char* name)
19
+ {
20
+ return rb_funcall(options, rb_intern("[]"), 1, ID2SYM(rb_intern(name)));
21
+ }
22
+
23
+ static inline bool get_bool_option_value(VALUE raw_value)
24
+ {
25
+ int raw_type = TYPE(raw_value);
26
+ if (raw_type != T_TRUE && raw_type != T_FALSE) {
27
+ zstds_ext_raise_error(ZSTDS_EXT_ERROR_VALIDATE_FAILED);
28
+ }
29
+
30
+ return raw_type == T_TRUE;
31
+ }
32
+
33
+ static inline unsigned int get_uint_option_value(VALUE raw_value)
34
+ {
35
+ Check_Type(raw_value, T_FIXNUM);
36
+
37
+ return NUM2UINT(raw_value);
38
+ }
39
+
40
+ static inline int get_int_option_value(VALUE raw_value)
41
+ {
42
+ Check_Type(raw_value, T_FIXNUM);
43
+
44
+ return NUM2INT(raw_value);
45
+ }
46
+
47
+ static inline unsigned long long get_ull_option_value(VALUE raw_value)
48
+ {
49
+ Check_Type(raw_value, T_FIXNUM);
50
+
51
+ return NUM2ULL(raw_value);
52
+ }
53
+
54
+ static inline ZSTD_strategy get_strategy_option_value(VALUE raw_value)
55
+ {
56
+ Check_Type(raw_value, T_SYMBOL);
57
+
58
+ ID raw_id = SYM2ID(raw_value);
59
+ if (raw_id == rb_intern("fast")) {
60
+ return ZSTD_fast;
61
+ }
62
+ else if (raw_id == rb_intern("dfast")) {
63
+ return ZSTD_dfast;
64
+ }
65
+ else if (raw_id == rb_intern("greedy")) {
66
+ return ZSTD_greedy;
67
+ }
68
+ else if (raw_id == rb_intern("lazy")) {
69
+ return ZSTD_lazy;
70
+ }
71
+ else if (raw_id == rb_intern("lazy2")) {
72
+ return ZSTD_lazy2;
73
+ }
74
+ else if (raw_id == rb_intern("btlazy2")) {
75
+ return ZSTD_btlazy2;
76
+ }
77
+ else if (raw_id == rb_intern("btopt")) {
78
+ return ZSTD_btopt;
79
+ }
80
+ else if (raw_id == rb_intern("btultra")) {
81
+ return ZSTD_btultra;
82
+ }
83
+ else if (raw_id == rb_intern("btultra2")) {
84
+ return ZSTD_btultra2;
85
+ }
86
+ else {
87
+ zstds_ext_raise_error(ZSTDS_EXT_ERROR_VALIDATE_FAILED);
88
+ }
89
+ }
90
+
91
+ void zstds_ext_get_option(VALUE options, zstds_ext_option_t* option, zstds_ext_option_type_t type, const char* name)
92
+ {
93
+ VALUE raw_value = get_raw_option_value(options, name);
94
+
95
+ option->has_value = raw_value != Qnil;
96
+ if (!option->has_value) {
97
+ return;
98
+ }
99
+
100
+ zstds_ext_option_value_t value;
101
+
102
+ switch (type) {
103
+ case ZSTDS_EXT_OPTION_TYPE_BOOL:
104
+ value = get_bool_option_value(raw_value) ? 1 : 0;
105
+ break;
106
+ case ZSTDS_EXT_OPTION_TYPE_UINT:
107
+ value = (zstds_ext_option_value_t)get_uint_option_value(raw_value);
108
+ break;
109
+ case ZSTDS_EXT_OPTION_TYPE_INT:
110
+ value = (zstds_ext_option_value_t)get_int_option_value(raw_value);
111
+ break;
112
+ case ZSTDS_EXT_OPTION_TYPE_STRATEGY:
113
+ value = (zstds_ext_option_value_t)get_strategy_option_value(raw_value);
114
+ break;
115
+ default:
116
+ zstds_ext_raise_error(ZSTDS_EXT_ERROR_UNEXPECTED);
117
+ }
118
+
119
+ option->value = value;
120
+ }
121
+
122
+ void zstds_ext_get_ull_option(VALUE options, zstds_ext_ull_option_t* option, const char* name)
123
+ {
124
+ VALUE raw_value = get_raw_option_value(options, name);
125
+
126
+ option->has_value = raw_value != Qnil;
127
+ if (option->has_value) {
128
+ option->value = (zstds_ext_ull_option_value_t)get_ull_option_value(raw_value);
129
+ }
130
+ }
131
+
132
+ void zstds_ext_get_dictionary_option(VALUE options, VALUE* option, const char* name)
133
+ {
134
+ VALUE raw_value = get_raw_option_value(options, name);
135
+
136
+ if (raw_value != Qnil) {
137
+ VALUE root_module = rb_define_module(ZSTDS_EXT_MODULE_NAME);
138
+ VALUE dictionary = rb_const_get_at(root_module, rb_intern("Dictionary"));
139
+ if (rb_obj_is_kind_of(raw_value, dictionary) != Qtrue) {
140
+ zstds_ext_raise_error(ZSTDS_EXT_ERROR_VALIDATE_FAILED);
141
+ }
142
+ }
143
+
144
+ *option = raw_value;
145
+ }
146
+
147
+ size_t zstds_ext_get_size_option_value(VALUE options, const char* name)
148
+ {
149
+ VALUE raw_value = get_raw_option_value(options, name);
150
+
151
+ Check_Type(raw_value, T_FIXNUM);
152
+
153
+ return NUM2SIZET(raw_value);
154
+ }
155
+
156
+ // -- set params --
157
+
158
+ #define SET_OPTION_VALUE(function, ctx, param, option) \
159
+ if (option.has_value) { \
160
+ result = function(ctx, param, option.value); \
161
+ if (ZSTD_isError(result)) { \
162
+ return zstds_ext_get_error(ZSTD_getErrorCode(result)); \
163
+ } \
164
+ }
165
+
166
+ #define SET_COMPRESSOR_PARAM(ctx, param, option) \
167
+ SET_OPTION_VALUE(ZSTD_CCtx_setParameter, ctx, param, option);
168
+
169
+ zstds_ext_result_t zstds_ext_set_compressor_options(ZSTD_CCtx* ctx, zstds_ext_compressor_options_t* options)
170
+ {
171
+ zstds_result_t result;
172
+
173
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_compressionLevel, options->compression_level);
174
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_windowLog, options->window_log);
175
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_hashLog, options->hash_log);
176
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_chainLog, options->chain_log);
177
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_searchLog, options->search_log);
178
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_minMatch, options->min_match);
179
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_targetLength, options->target_length);
180
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_strategy, options->strategy);
181
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_enableLongDistanceMatching, options->enable_long_distance_matching);
182
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_ldmHashLog, options->ldm_hash_log);
183
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_ldmMinMatch, options->ldm_min_match);
184
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_ldmBucketSizeLog, options->ldm_bucket_size_log);
185
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_ldmHashRateLog, options->ldm_hash_rate_log);
186
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_contentSizeFlag, options->content_size_flag);
187
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_checksumFlag, options->checksum_flag);
188
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_dictIDFlag, options->dict_id_flag);
189
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_nbWorkers, options->nb_workers);
190
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_jobSize, options->job_size);
191
+ SET_COMPRESSOR_PARAM(ctx, ZSTD_c_overlapLog, options->overlap_log);
192
+
193
+ if (options->pledged_size.has_value) {
194
+ result = ZSTD_CCtx_setPledgedSrcSize(ctx, options->pledged_size.value);
195
+ if (ZSTD_isError(result)) {
196
+ return zstds_ext_get_error(ZSTD_getErrorCode(result));
197
+ }
198
+ }
199
+
200
+ if (options->dictionary != Qnil) {
201
+ VALUE dictionary_buffer = rb_attr_get(options->dictionary, rb_intern("@buffer"));
202
+
203
+ result = ZSTD_CCtx_loadDictionary(ctx, RSTRING_PTR(dictionary_buffer), RSTRING_LEN(dictionary_buffer));
204
+ if (ZSTD_isError(result)) {
205
+ return zstds_ext_get_error(ZSTD_getErrorCode(result));
206
+ }
207
+ }
208
+
209
+ return 0;
210
+ }
211
+
212
+ #define SET_DECOMPRESSOR_PARAM(ctx, param, option) \
213
+ SET_OPTION_VALUE(ZSTD_DCtx_setParameter, ctx, param, option);
214
+
215
+ zstds_ext_result_t zstds_ext_set_decompressor_options(ZSTD_DCtx* ctx, zstds_ext_decompressor_options_t* options)
216
+ {
217
+ zstds_result_t result;
218
+
219
+ SET_DECOMPRESSOR_PARAM(ctx, ZSTD_d_windowLogMax, options->window_log_max);
220
+
221
+ if (options->dictionary != Qnil) {
222
+ VALUE dictionary_buffer = rb_attr_get(options->dictionary, rb_intern("@buffer"));
223
+
224
+ result = ZSTD_DCtx_loadDictionary(ctx, RSTRING_PTR(dictionary_buffer), RSTRING_LEN(dictionary_buffer));
225
+ if (ZSTD_isError(result)) {
226
+ return zstds_ext_get_error(ZSTD_getErrorCode(result));
227
+ }
228
+ }
229
+
230
+ return 0;
231
+ }
232
+
233
+ // -- exports --
234
+
235
+ #define EXPORT_PARAM_BOUNDS(function, module, param, type, name) \
236
+ bounds = function(param); \
237
+ if (ZSTD_isError(bounds.error)) { \
238
+ zstds_ext_raise_error(zstds_ext_get_error(ZSTD_getErrorCode(bounds.error))); \
239
+ } \
240
+ \
241
+ rb_define_const(module, "MIN_" name, type##2NUM(bounds.lowerBound)); \
242
+ rb_define_const(module, "MAX_" name, type##2NUM(bounds.upperBound));
243
+
244
+ #define EXPORT_COMPRESSOR_PARAM_BOUNDS(module, param, type, name) \
245
+ EXPORT_PARAM_BOUNDS(ZSTD_cParam_getBounds, module, param, type, name);
246
+
247
+ #define EXPORT_DECOMPRESSOR_PARAM_BOUNDS(module, param, type, name) \
248
+ EXPORT_PARAM_BOUNDS(ZSTD_dParam_getBounds, module, param, type, name);
249
+
250
+ void zstds_ext_option_exports(VALUE root_module)
251
+ {
252
+ VALUE module = rb_define_module_under(root_module, "Option");
253
+
254
+ ZSTD_bounds bounds;
255
+
256
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_compressionLevel, INT, "COMPRESSION_LEVEL");
257
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_windowLog, UINT, "WINDOW_LOG");
258
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_hashLog, UINT, "HASH_LOG");
259
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_chainLog, UINT, "CHAIN_LOG");
260
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_searchLog, UINT, "SEARCH_LOG");
261
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_minMatch, UINT, "MIN_MATCH");
262
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_targetLength, UINT, "TARGET_LENGTH");
263
+
264
+ VALUE strategies = rb_ary_new_from_args(
265
+ 9,
266
+ ID2SYM(rb_intern("fast")),
267
+ ID2SYM(rb_intern("dfast")),
268
+ ID2SYM(rb_intern("greedy")),
269
+ ID2SYM(rb_intern("lazy")),
270
+ ID2SYM(rb_intern("lazy2")),
271
+ ID2SYM(rb_intern("btlazy2")),
272
+ ID2SYM(rb_intern("btopt")),
273
+ ID2SYM(rb_intern("btultra")),
274
+ ID2SYM(rb_intern("btultra2")));
275
+ rb_define_const(module, "STRATEGIES", strategies);
276
+ RB_GC_GUARD(strategies);
277
+
278
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_ldmHashLog, UINT, "LDM_HASH_LOG");
279
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_ldmMinMatch, UINT, "LDM_MIN_MATCH");
280
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_ldmBucketSizeLog, UINT, "LDM_BUCKET_SIZE_LOG");
281
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_ldmHashRateLog, UINT, "LDM_HASH_RATE_LOG");
282
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_nbWorkers, UINT, "NB_WORKERS");
283
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_jobSize, UINT, "JOB_SIZE");
284
+ EXPORT_COMPRESSOR_PARAM_BOUNDS(module, ZSTD_c_overlapLog, UINT, "OVERLAP_LOG");
285
+
286
+ EXPORT_DECOMPRESSOR_PARAM_BOUNDS(module, ZSTD_d_windowLogMax, UINT, "WINDOW_LOG_MAX");
287
+ }
@@ -0,0 +1,122 @@
1
+ // Ruby bindings for zstd library.
2
+ // Copyright (c) 2019 AUTHORS, MIT License.
3
+
4
+ #if !defined(ZSTDS_EXT_OPTIONS_H)
5
+ #define ZSTDS_EXT_OPTIONS_H
6
+
7
+ #include <stdbool.h>
8
+ #include <stdint.h>
9
+ #include <stdlib.h>
10
+ #include <zstd.h>
11
+
12
+ #include "ruby.h"
13
+ #include "zstds_ext/common.h"
14
+
15
+ // Default option values depends on zstd library.
16
+ // We will set only user defined values.
17
+
18
+ enum {
19
+ ZSTDS_EXT_OPTION_TYPE_BOOL = 1,
20
+ ZSTDS_EXT_OPTION_TYPE_UINT,
21
+ ZSTDS_EXT_OPTION_TYPE_INT,
22
+ ZSTDS_EXT_OPTION_TYPE_STRATEGY
23
+ };
24
+
25
+ typedef uint_fast8_t zstds_ext_option_type_t;
26
+ typedef int zstds_ext_option_value_t;
27
+ typedef unsigned long long zstds_ext_ull_option_value_t;
28
+
29
+ typedef struct {
30
+ bool has_value;
31
+ zstds_ext_option_value_t value;
32
+ } zstds_ext_option_t;
33
+
34
+ typedef struct {
35
+ bool has_value;
36
+ zstds_ext_ull_option_value_t value;
37
+ } zstds_ext_ull_option_t;
38
+
39
+ typedef struct {
40
+ zstds_ext_option_t compression_level;
41
+ zstds_ext_option_t window_log;
42
+ zstds_ext_option_t hash_log;
43
+ zstds_ext_option_t chain_log;
44
+ zstds_ext_option_t search_log;
45
+ zstds_ext_option_t min_match;
46
+ zstds_ext_option_t target_length;
47
+ zstds_ext_option_t strategy;
48
+ zstds_ext_option_t enable_long_distance_matching;
49
+ zstds_ext_option_t ldm_hash_log;
50
+ zstds_ext_option_t ldm_min_match;
51
+ zstds_ext_option_t ldm_bucket_size_log;
52
+ zstds_ext_option_t ldm_hash_rate_log;
53
+ zstds_ext_option_t content_size_flag;
54
+ zstds_ext_option_t checksum_flag;
55
+ zstds_ext_option_t dict_id_flag;
56
+ zstds_ext_option_t nb_workers;
57
+ zstds_ext_option_t job_size;
58
+ zstds_ext_option_t overlap_log;
59
+ zstds_ext_ull_option_t pledged_size;
60
+ VALUE dictionary;
61
+ } zstds_ext_compressor_options_t;
62
+
63
+ typedef struct {
64
+ zstds_ext_option_t window_log_max;
65
+ VALUE dictionary;
66
+ } zstds_ext_decompressor_options_t;
67
+
68
+ void zstds_ext_get_option(VALUE options, zstds_ext_option_t* option, zstds_ext_option_type_t type, const char* name);
69
+ void zstds_ext_get_ull_option(VALUE options, zstds_ext_ull_option_t* option, const char* name);
70
+ void zstds_ext_get_dictionary_option(VALUE options, VALUE* option, const char* name);
71
+
72
+ #define ZSTDS_EXT_GET_OPTION(options, target_options, type, name) \
73
+ zstds_ext_get_option(options, &target_options.name, type, #name);
74
+
75
+ #define ZSTDS_EXT_GET_ULL_OPTION(options, target_options, name) \
76
+ zstds_ext_get_ull_option(options, &target_options.name, #name);
77
+
78
+ #define ZSTDS_EXT_GET_DICTIONARY_OPTION(options, target_options, name) \
79
+ zstds_ext_get_dictionary_option(options, &target_options.name, #name);
80
+
81
+ #define ZSTDS_EXT_GET_COMPRESSOR_OPTIONS(options) \
82
+ zstds_ext_compressor_options_t compressor_options; \
83
+ \
84
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_INT, compression_level); \
85
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, window_log); \
86
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, hash_log); \
87
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, chain_log); \
88
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, search_log); \
89
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, min_match); \
90
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, target_length); \
91
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_STRATEGY, strategy); \
92
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_BOOL, enable_long_distance_matching); \
93
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, ldm_hash_log); \
94
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, ldm_min_match); \
95
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, ldm_bucket_size_log); \
96
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, ldm_hash_rate_log); \
97
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_BOOL, content_size_flag); \
98
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_BOOL, checksum_flag); \
99
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_BOOL, dict_id_flag); \
100
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, nb_workers); \
101
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, job_size); \
102
+ ZSTDS_EXT_GET_OPTION(options, compressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, overlap_log); \
103
+ ZSTDS_EXT_GET_ULL_OPTION(options, compressor_options, pledged_size); \
104
+ ZSTDS_EXT_GET_DICTIONARY_OPTION(options, compressor_options, dictionary);
105
+
106
+ #define ZSTDS_EXT_GET_DECOMPRESSOR_OPTIONS(options) \
107
+ zstds_ext_decompressor_options_t decompressor_options; \
108
+ \
109
+ ZSTDS_EXT_GET_OPTION(options, decompressor_options, ZSTDS_EXT_OPTION_TYPE_UINT, window_log_max); \
110
+ ZSTDS_EXT_GET_DICTIONARY_OPTION(options, decompressor_options, dictionary);
111
+
112
+ size_t zstds_ext_get_size_option_value(VALUE options, const char* name);
113
+
114
+ #define ZSTDS_EXT_GET_BUFFER_LENGTH_OPTION(options, name) \
115
+ size_t name = zstds_ext_get_size_option_value(options, #name);
116
+
117
+ zstds_ext_result_t zstds_ext_set_compressor_options(ZSTD_CCtx* ctx, zstds_ext_compressor_options_t* options);
118
+ zstds_ext_result_t zstds_ext_set_decompressor_options(ZSTD_DCtx* ctx, zstds_ext_decompressor_options_t* options);
119
+
120
+ void zstds_ext_option_exports(VALUE root_module);
121
+
122
+ #endif // ZSTDS_EXT_OPTIONS_H