@@ -75,6 +75,11 @@ rb_streaming_compress_initialize(int argc, VALUE *argv, VALUE obj)
75
75
rb_scan_args (argc , argv , "01" , & compression_level_value );
76
76
int compression_level = convert_compression_level (compression_level_value );
77
77
78
+ ID kwargs_keys [1 ];
79
+ kwargs_keys [0 ] = rb_intern ("dict" );
80
+ VALUE kwargs_values [1 ];
81
+ rb_get_kwargs (kwargs , kwargs_keys , 0 , 1 , kwargs_values );
82
+
78
83
struct streaming_compress_t * sc ;
79
84
TypedData_Get_Struct (obj , struct streaming_compress_t , & streaming_compress_type , sc );
80
85
size_t const buffOutSize = ZSTD_CStreamOutSize ();
@@ -83,6 +88,14 @@ rb_streaming_compress_initialize(int argc, VALUE *argv, VALUE obj)
83
88
if (ctx == NULL ) {
84
89
rb_raise (rb_eRuntimeError , "%s" , "ZSTD_createCCtx error" );
85
90
}
91
+ if (kwargs_values [0 ] != Qundef && kwargs_values [0 ] != Qnil ) {
92
+ char * dict_buffer = RSTRING_PTR (kwargs_values [0 ]);
93
+ size_t dict_size = RSTRING_LEN (kwargs_values [0 ]);
94
+ size_t load_dict_ret = ZSTD_CCtx_loadDictionary (ctx , dict_buffer , dict_size );
95
+ if (ZSTD_isError (load_dict_ret )) {
96
+ rb_raise (rb_eRuntimeError , "%s" , "ZSTD_CCtx_loadDictionary failed" );
97
+ }
98
+ }
86
99
ZSTD_CCtx_setParameter (ctx , ZSTD_c_compressionLevel , compression_level );
87
100
sc -> ctx = ctx ;
88
101
sc -> buf = rb_str_new (NULL , buffOutSize );
0 commit comments