Class: MultiCompress::Dictionary
- Inherits:
-
Object
- Object
- MultiCompress::Dictionary
- Defined in:
- ext/multi_compress/multi_compress.c
Class Method Summary collapse
Instance Method Summary collapse
Constructor Details
#initialize(*args) ⇒ Object
3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 |
# File 'ext/multi_compress/multi_compress.c', line 3055
static VALUE dict_initialize(int argc, VALUE *argv, VALUE self) {
VALUE raw, opts;
rb_scan_args(argc, argv, "1:", &raw, &opts);
StringValue(raw);
reject_algorithm_keyword(opts);
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
VALUE algo_sym = Qnil;
if (!NIL_P(opts)) {
algo_sym = opt_get(opts, sym_cache.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
3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 |
# File 'ext/multi_compress/multi_compress.c', line 3173
static VALUE dict_load(int argc, VALUE *argv, VALUE self) {
VALUE path, opts;
rb_scan_args(argc, argv, "1:", &path, &opts);
StringValue(path);
reject_algorithm_keyword(opts);
raise_if_path_has_null_byte(path);
VALUE algo_sym = Qnil;
if (!NIL_P(opts)) {
algo_sym = opt_get(opts, sym_cache.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
3243 3244 3245 3246 3247 |
# File 'ext/multi_compress/multi_compress.c', line 3243
static VALUE dict_algo(VALUE self) {
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
return algo_to_sym(d->algo);
}
|
#save(path) ⇒ Object
3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 |
# File 'ext/multi_compress/multi_compress.c', line 3226
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
3249 3250 3251 3252 3253 |
# File 'ext/multi_compress/multi_compress.c', line 3249
static VALUE dict_size(VALUE self) {
dictionary_t *d;
TypedData_Get_Struct(self, dictionary_t, &dictionary_type, d);
return SIZET2NUM(d->size);
}
|