11#ifndef ZSTD_RUBY_H
22#define ZSTD_RUBY_H 1
33
4- #include " ruby.h"
4+ #include < ruby.h>
55#include "./libzstd/zstd.h"
66
77static int convert_compression_level (VALUE compression_level_value )
@@ -12,4 +12,55 @@ static int convert_compression_level(VALUE compression_level_value)
1212 return NUM2INT (compression_level_value );
1313}
1414
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+
1566#endif /* ZSTD_RUBY_H */
0 commit comments