@@ -75,6 +75,11 @@ rb_streaming_compress_initialize(int argc, VALUE *argv, VALUE obj)
7575 rb_scan_args (argc , argv , "01" , & compression_level_value );
7676 int compression_level = convert_compression_level (compression_level_value );
7777
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+
7883 struct streaming_compress_t * sc ;
7984 TypedData_Get_Struct (obj , struct streaming_compress_t , & streaming_compress_type , sc );
8085 size_t const buffOutSize = ZSTD_CStreamOutSize ();
@@ -83,6 +88,14 @@ rb_streaming_compress_initialize(int argc, VALUE *argv, VALUE obj)
8388 if (ctx == NULL ) {
8489 rb_raise (rb_eRuntimeError , "%s" , "ZSTD_createCCtx error" );
8590 }
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+ }
8699 ZSTD_CCtx_setParameter (ctx , ZSTD_c_compressionLevel , compression_level );
87100 sc -> ctx = ctx ;
88101 sc -> buf = rb_str_new (NULL , buffOutSize );
0 commit comments