Skip to content

Commit 317c12c

Browse files
committed
feat: add magicVariant for write
1 parent 8187f8e commit 317c12c

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

ext/zstdruby/skippable_frame.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@ static VALUE rb_write_skippable_frame(int argc, VALUE *argv, VALUE self)
66
{
77
VALUE input_value;
88
VALUE skip_value;
9-
rb_scan_args(argc, argv, "2", &input_value, &skip_value);
9+
VALUE kwargs;
10+
rb_scan_args(argc, argv, "2:", &input_value, &skip_value, &kwargs);
11+
12+
ID kwargs_keys[1];
13+
kwargs_keys[0] = rb_intern("magic_variant");
14+
VALUE kwargs_values[1];
15+
rb_get_kwargs(kwargs, kwargs_keys, 0, 1, kwargs_values);
16+
unsigned magic_variant = (kwargs_values[0] != Qundef) ? (NUM2INT(kwargs_values[0])) : 0;
1017

1118
StringValue(input_value);
1219
StringValue(skip_value);
@@ -18,7 +25,7 @@ static VALUE rb_write_skippable_frame(int argc, VALUE *argv, VALUE self)
1825
size_t dst_size = input_size + ZSTD_SKIPPABLEHEADERSIZE + skip_size;
1926
VALUE output = rb_str_new(input_data, dst_size);
2027
char* output_data = RSTRING_PTR(output);
21-
size_t output_size = ZSTD_writeSkippableFrame((void*)output_data, dst_size, (const void*)skip_data, skip_size, (unsigned)0);
28+
size_t output_size = ZSTD_writeSkippableFrame((void*)output_data, dst_size, (const void*)skip_data, skip_size, magic_variant);
2229
if (ZSTD_isError(output_size)) {
2330
rb_raise(rb_eRuntimeError, "%s: %s", "write skippable frame failed", ZSTD_getErrorName(output_size));
2431
}
@@ -39,7 +46,8 @@ static VALUE rb_read_skippable_frame(VALUE self, VALUE input_value)
3946
size_t const skipLen = 129 * 1024;
4047
VALUE output = rb_str_new(NULL, skipLen);
4148
char* output_data = RSTRING_PTR(output);
42-
size_t output_size = ZSTD_readSkippableFrame((void*)output_data, skipLen, (unsigned int*)0, (const void*)input_data, input_size);
49+
unsigned readMagic;
50+
size_t output_size = ZSTD_readSkippableFrame((void*)output_data, skipLen, &readMagic, (const void*)input_data, input_size);
4351
if (ZSTD_isError(output_size)) {
4452
rb_raise(rb_eRuntimeError, "%s: %s", "read skippable frame failed", ZSTD_getErrorName(output_size));
4553
}

spec/zstd-skippable_frame_spec.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,14 @@
2121
expect(Zstd.read_skippable_frame(compressed_data_with_skippable_frame)).to eq "sample data"
2222
end
2323
end
24+
25+
context 'compressed string + skippable frame + magic_variant' do
26+
it '' do
27+
compressed_data = Zstd.compress(SecureRandom.hex(150))
28+
compressed_data_with_skippable_frame = Zstd.write_skippable_frame(compressed_data, "sample data", magic_variant: 1)
29+
expect(Zstd.read_skippable_frame(compressed_data_with_skippable_frame)).to eq "sample data"
30+
end
31+
end
32+
2433
end
2534
end

0 commit comments

Comments
 (0)