1
1
#ifndef ZSTD_RUBY_H
2
2
#define ZSTD_RUBY_H 1
3
3
4
- #include " ruby.h"
4
+ #include < ruby.h>
5
5
#include "./libzstd/zstd.h"
6
6
7
7
static int convert_compression_level (VALUE compression_level_value )
@@ -12,4 +12,55 @@ static int convert_compression_level(VALUE compression_level_value)
12
12
return NUM2INT (compression_level_value );
13
13
}
14
14
15
+ static size_t zstd_compress (ZSTD_CCtx * const ctx , ZSTD_outBuffer * output , ZSTD_inBuffer * input , ZSTD_EndDirective endOp )
16
+ {
17
+ return ZSTD_compressStream2 (ctx , output , input , endOp );
18
+ }
19
+
20
+ static void set_compress_params (ZSTD_CCtx * const ctx , VALUE level_from_args , VALUE kwargs )
21
+ {
22
+ ID kwargs_keys [2 ];
23
+ kwargs_keys [0 ] = rb_intern ("level" );
24
+ kwargs_keys [1 ] = rb_intern ("dict" );
25
+ VALUE kwargs_values [2 ];
26
+ rb_get_kwargs (kwargs , kwargs_keys , 0 , 2 , kwargs_values );
27
+
28
+ int compression_level = ZSTD_CLEVEL_DEFAULT ;
29
+ if (kwargs_values [0 ] != Qundef && kwargs_values [0 ] != Qnil ) {
30
+ compression_level = convert_compression_level (kwargs_values [0 ]);
31
+ } else if (!NIL_P (level_from_args )) {
32
+ rb_warn ("`level` in args is deprecated; use keyword args `level:` instead." );
33
+ compression_level = convert_compression_level (level_from_args );
34
+ }
35
+ ZSTD_CCtx_setParameter (ctx , ZSTD_c_compressionLevel , compression_level );
36
+
37
+ if (kwargs_values [1 ] != Qundef && kwargs_values [1 ] != Qnil ) {
38
+ char * dict_buffer = RSTRING_PTR (kwargs_values [1 ]);
39
+ size_t dict_size = RSTRING_LEN (kwargs_values [1 ]);
40
+ size_t load_dict_ret = ZSTD_CCtx_loadDictionary (ctx , dict_buffer , dict_size );
41
+ if (ZSTD_isError (load_dict_ret )) {
42
+ ZSTD_freeCCtx (ctx );
43
+ rb_raise (rb_eRuntimeError , "%s" , "ZSTD_CCtx_loadDictionary failed" );
44
+ }
45
+ }
46
+ }
47
+
48
+ static void set_decompress_params (ZSTD_DCtx * const dctx , VALUE kwargs )
49
+ {
50
+ ID kwargs_keys [1 ];
51
+ kwargs_keys [0 ] = rb_intern ("dict" );
52
+ VALUE kwargs_values [1 ];
53
+ rb_get_kwargs (kwargs , kwargs_keys , 0 , 1 , kwargs_values );
54
+
55
+ if (kwargs_values [0 ] != Qundef && kwargs_values [0 ] != Qnil ) {
56
+ char * dict_buffer = RSTRING_PTR (kwargs_values [0 ]);
57
+ size_t dict_size = RSTRING_LEN (kwargs_values [0 ]);
58
+ size_t load_dict_ret = ZSTD_DCtx_loadDictionary (dctx , dict_buffer , dict_size );
59
+ if (ZSTD_isError (load_dict_ret )) {
60
+ ZSTD_freeDCtx (dctx );
61
+ rb_raise (rb_eRuntimeError , "%s" , "ZSTD_CCtx_loadDictionary failed" );
62
+ }
63
+ }
64
+ }
65
+
15
66
#endif /* ZSTD_RUBY_H */
0 commit comments