Class: MultiCompress::Dictionary
- Inherits:
-
Object
- Object
- MultiCompress::Dictionary
- Defined in:
- ext/multi_compress/multi_compress.c
Class Method Summary collapse
Instance Method Summary collapse
- #algo ⇒ Object
- #bytes ⇒ Object
- #initialize(*args) ⇒ Object constructor
- #save(path) ⇒ Object
- #size ⇒ Object
- #zstd_id ⇒ Object
Constructor Details
#initialize(*args) ⇒ Object
3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 |
# File 'ext/multi_compress/multi_compress.c', line 3298
static VALUE dict_initialize(int argc, VALUE *argv, VALUE self) {
VALUE raw, opts;
scan_one_required_keywords(argc, argv, &raw, &opts);
StringValue(raw);
mc_opts_t parsed_opts;
mc_parse_opts(opts, &parsed_opts);
reject_algorithm_keyword(&parsed_opts);
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
VALUE algo_sym = parsed_opts.algo;
d->algo = NIL_P(algo_sym) ? ALGO_ZSTD : sym_to_algo(algo_sym);
if (d->algo == ALGO_LZ4)
rb_raise(eUnsupportedError, "LZ4 does not support dictionaries");
d->size = RSTRING_LEN(raw);
d->data = ALLOC_N(uint8_t, d->size);
memcpy(d->data, RSTRING_PTR(raw), d->size);
return self;
}
|
Class Method Details
.load(*args) ⇒ Object
3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 |
# File 'ext/multi_compress/multi_compress.c', line 3412
static VALUE dict_load(int argc, VALUE *argv, VALUE self) {
VALUE path, opts;
scan_one_required_keywords(argc, argv, &path, &opts);
StringValue(path);
raise_if_path_has_null_byte(path);
mc_opts_t parsed_opts;
mc_parse_opts(opts, &parsed_opts);
reject_algorithm_keyword(&parsed_opts);
VALUE algo_sym = parsed_opts.algo;
compress_algo_t algo = NIL_P(algo_sym) ? ALGO_ZSTD : sym_to_algo(algo_sym);
if (algo == ALGO_LZ4)
rb_raise(eUnsupportedError, "LZ4 does not support dictionaries");
const char *cpath = RSTRING_PTR(path);
FILE *f = fopen(cpath, "rb");
if (!f)
rb_sys_fail(cpath);
fseek(f, 0, SEEK_END);
long file_size = ftell(f);
fseek(f, 0, SEEK_SET);
if (file_size <= 0) {
fclose(f);
rb_raise(eDataError, "dictionary file is empty: %s", cpath);
}
if ((unsigned long long)file_size > DICT_FILE_MAX_SIZE) {
fclose(f);
rb_raise(eDataError, "dictionary file too large (%ld bytes, max=%d)", file_size,
(int)DICT_FILE_MAX_SIZE);
}
uint8_t *buf = ALLOC_N(uint8_t, file_size);
size_t read_bytes = fread(buf, 1, file_size, f);
fclose(f);
if ((long)read_bytes != file_size) {
xfree(buf);
rb_raise(eDataError, "failed to read dictionary: %s", cpath);
}
VALUE dict_obj = dict_alloc(cDictionary);
dictionary_t *d;
TypedData_Get_Struct(dict_obj, dictionary_t, &dictionary_type, d);
d->algo = algo;
d->data = buf;
d->size = (size_t)file_size;
return dict_obj;
}
|
Instance Method Details
#algo ⇒ Object
3482 3483 3484 3485 3486 |
# File 'ext/multi_compress/multi_compress.c', line 3482
static VALUE dict_algo(VALUE self) {
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
return algo_to_sym(d->algo);
}
|
#bytes ⇒ Object
3488 3489 3490 3491 3492 |
# File 'ext/multi_compress/multi_compress.c', line 3488
static VALUE dict_bytes(VALUE self) {
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
return rb_binary_str_new((const char *)d->data, (long)d->size);
}
|
#save(path) ⇒ Object
3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 |
# File 'ext/multi_compress/multi_compress.c', line 3465
static VALUE dict_save(VALUE self, VALUE path) {
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
const char *cpath = StringValueCStr(path);
FILE *f = fopen(cpath, "wb");
if (!f)
rb_sys_fail(cpath);
size_t written = fwrite(d->data, 1, d->size, f);
fclose(f);
if (written != d->size)
rb_raise(eError, "failed to write dictionary to %s", cpath);
return path;
}
|
#size ⇒ Object
3502 3503 3504 3505 3506 |
# File 'ext/multi_compress/multi_compress.c', line 3502
static VALUE dict_size(VALUE self) {
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
return SIZET2NUM(d->size);
}
|
#zstd_id ⇒ Object
3494 3495 3496 3497 3498 3499 3500 |
# File 'ext/multi_compress/multi_compress.c', line 3494
static VALUE dict_zstd_id(VALUE self) {
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
if (d->algo != ALGO_ZSTD)
rb_raise(eUnsupportedError, "zstd_id is available only for zstd dictionaries");
return UINT2NUM(ZSTD_getDictID_fromDict(d->data, d->size));
}
|