liblzma 0.2 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +13 -14
- data/ext/extconf.rb +16 -0
- data/ext/liblzma.c +382 -172
- data/lib/liblzma.rb +188 -97
- data/samples/01-easy_using.rb +1 -1
- data/samples/02-streaming.rb +1 -1
- metadata +9 -4
data/README.txt
CHANGED
@@ -1,43 +1,42 @@
|
|
1
|
-
# encoding:utf-8
|
2
1
|
|
3
2
|
= liblzma for Ruby
|
4
3
|
|
5
4
|
- AUTHOR : dearblue
|
6
5
|
- MAIL : dearblue@users.sourceforge.jp
|
7
6
|
- LICENSE : 2-clause BSD License (二条項BSDライセンス)
|
8
|
-
-
|
7
|
+
- PROJECT PAGE : http://sourceforge.jp/projects/rutsubo/
|
9
8
|
|
10
9
|
This document is written in Japanese.
|
11
10
|
|
12
11
|
|
13
12
|
== はじめに
|
14
13
|
|
15
|
-
xzユーティリティに含まれるliblzmaのRubyバインディングです。
|
14
|
+
xz ユーティリティに含まれる liblzma の Ruby バインディングです。
|
16
15
|
|
17
|
-
gemパッケージになっており、『gem install liblzma-0.
|
16
|
+
gemパッケージになっており、『gem install liblzma-0.3.gem』でビルド、インストールが完了します。
|
18
17
|
|
19
|
-
MinGW32およびFreeBSD 9.0R i386で動作確認を行っています。
|
18
|
+
MinGW32 および FreeBSD 9.0R i386 で動作確認を行っています。
|
20
19
|
|
21
|
-
MinGW32向けにはバイナリパッケージも用意してあります (もしかしたらruby-mswin32でも動作するかもしれません)。
|
20
|
+
MinGW32 向けにはバイナリパッケージも用意してあります (もしかしたら ruby-mswin32 でも動作するかもしれません)。
|
22
21
|
|
23
|
-
FreeBSD 9.0R i386 上では標準コンパイラであるGCCのほかにllvm clangでもビルド可能なことを確認してあります。
|
22
|
+
FreeBSD 9.0R i386 上では標準コンパイラである GCC のほかに llvm clang でもビルド可能なことを確認してあります。
|
24
23
|
|
25
24
|
|
26
25
|
== 利用できる主な機能
|
27
26
|
|
28
|
-
※カッコ内は、本来のliblzmaが提供する関数を示す
|
27
|
+
※カッコ内は、本来の liblzma が提供する関数を示す
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
- LZMA::Stream::Encoder / Decoder (lzma_stream_encoder / lzma_stream_decoder)
|
30
|
+
- LZMA::Stream::RawEncoder / RawDecoder (lzma_raw_encoder / lzma_raw_decoder)
|
31
|
+
- LZMA::Filter::LZMA1 / LZMA2 / Delta
|
32
|
+
- LZMA::Utils.crc32 / crc64 (lzma_crc32 / lzma_crc64)
|
34
33
|
|
35
34
|
|
36
35
|
== 実際に利用するには
|
37
36
|
|
38
|
-
まともな文書化が出来ていないため、gemパッケージ内の『samples』ディレクトリに含まれる各サンプルを頼りにして下さい。
|
37
|
+
まともな文書化が出来ていないため、gem パッケージ内の『samples』ディレクトリに含まれる各サンプルを頼りにして下さい。
|
39
38
|
|
40
39
|
|
41
40
|
== ライセンスについて
|
42
41
|
|
43
|
-
liblzma for Ruby は、二条項BSDライセンスの下で利用できます。
|
42
|
+
liblzma for Ruby は、二条項 BSD ライセンスの下で利用できます。
|
data/ext/extconf.rb
CHANGED
@@ -1,7 +1,23 @@
|
|
1
|
+
#!ruby
|
2
|
+
|
3
|
+
require "optparse"
|
4
|
+
|
5
|
+
opt = OptionParser.new
|
6
|
+
|
7
|
+
staticlink = nil
|
8
|
+
opt.on("-s", "link liblzma.a as static library") { staticlink = true }
|
9
|
+
|
10
|
+
opt.parse!
|
11
|
+
|
12
|
+
|
1
13
|
require "mkmf"
|
2
14
|
|
3
15
|
have_header "lzma.h" or raise "need lzma.h"
|
4
16
|
have_library "lzma" or raise "need liblzma.a"
|
17
|
+
if staticlink
|
18
|
+
# 静的ライブラリリンクを優先する
|
19
|
+
$libs = ["-Wl,-dn,-llzma", "-Wl,-llzma", $libs].join(" ")
|
20
|
+
end
|
5
21
|
create_makefile "liblzma"
|
6
22
|
|
7
23
|
# Makefile から、『-L.』を取り除く
|
data/ext/liblzma.c
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
/* encoding:utf-8 */
|
2
|
+
|
1
3
|
/*
|
2
4
|
* liblzma.c -
|
3
|
-
* Author
|
4
|
-
* Copyright
|
5
|
-
* License
|
5
|
+
* - Author: dearblue <dearblue@sourceforge.jp>
|
6
|
+
* - Copyright: Copyright (c) 2010 dearblue
|
7
|
+
* - License: Distributed under the 2-clause BSD License
|
6
8
|
*/
|
7
9
|
|
8
10
|
#include <ruby.h>
|
@@ -14,7 +16,7 @@ static VALUE mLZMA;
|
|
14
16
|
|
15
17
|
|
16
18
|
static VALUE symDICTSIZE;
|
17
|
-
static VALUE
|
19
|
+
static VALUE symDICT;
|
18
20
|
static VALUE symLC;
|
19
21
|
static VALUE symLP;
|
20
22
|
static VALUE symPB;
|
@@ -25,12 +27,25 @@ static VALUE symDEPTH;
|
|
25
27
|
static VALUE symCHECK;
|
26
28
|
|
27
29
|
|
30
|
+
// rdoc に対して定義されているものと錯覚させるマクロ
|
31
|
+
#define RDOC(...)
|
32
|
+
|
33
|
+
|
28
34
|
static inline int
|
29
35
|
lzma_isfailed(lzma_ret status)
|
30
36
|
{
|
31
37
|
return status != 0;
|
32
38
|
}
|
33
39
|
|
40
|
+
#define LZMA_TEST(STATUS) \
|
41
|
+
{ \
|
42
|
+
lzma_ret _status = (STATUS); \
|
43
|
+
if (lzma_isfailed(_status)) { \
|
44
|
+
VALUE exc = lookup_exception(_status); \
|
45
|
+
rb_exc_raise(rb_exc_new3(exc, rb_class_name(exc))); \
|
46
|
+
} \
|
47
|
+
} \
|
48
|
+
|
34
49
|
|
35
50
|
// SECTION: LZMA::Constants
|
36
51
|
|
@@ -178,44 +193,189 @@ setup_lzma_preset(size_t preset)
|
|
178
193
|
lzma_options_lzma *lzma = xcalloc(sizeof(lzma_options_lzma), 1);
|
179
194
|
if (lzma_lzma_preset(lzma, preset)) {
|
180
195
|
rb_raise(rb_eArgError,
|
181
|
-
"wrong preset level (%d for 0..9) or wrong flag bit(s) (%08x)",
|
196
|
+
"wrong preset level (%d for 0..9) or wrong flag bit(s) (0x%08x)",
|
182
197
|
preset & LZMA_PRESET_LEVEL_MASK,
|
183
198
|
preset & ~LZMA_PRESET_LEVEL_MASK & ~LZMA_PRESET_EXTREME);
|
184
199
|
}
|
185
200
|
return (void *)(lzma);
|
186
201
|
}
|
187
202
|
|
188
|
-
static const char PRIVATE_DICTPRESET[] = "dict_preset";
|
189
203
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
rb_iv_set(self, PRIVATE_DICTPRESET, dict);
|
205
|
-
}
|
204
|
+
/*
|
205
|
+
* Document-method: LZMA::Filter::BasicLZMA#dict
|
206
|
+
*
|
207
|
+
* call-seq:
|
208
|
+
* LZMA::Filter::BasicLZMA#dict -> string or nil
|
209
|
+
*
|
210
|
+
* 定義済み辞書を取得します。
|
211
|
+
*
|
212
|
+
* [RETURN] 定義済み辞書が定義されている場合は文字列が返ります。定義されていなければ +nil+ が返ります。
|
213
|
+
*
|
214
|
+
* エンコード情報は無視されます (常に Encoding::BINARY として扱われます)。呼び出し側で統一しておくべきです。
|
215
|
+
*
|
216
|
+
* 返される文字列は定義辞書の複成体です。変更しても定義情報には反映されません。+#dict=+ と併せて利用して下さい。
|
217
|
+
*/
|
206
218
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
219
|
+
/*
|
220
|
+
* Document-method: LZMA::Filter::BasicLZMA#dict=
|
221
|
+
*
|
222
|
+
* call-seq:
|
223
|
+
* LZMA::Filter::BasicLZMA#dict=(dict)
|
224
|
+
*
|
225
|
+
* 定義済み辞書を定義します。
|
226
|
+
*
|
227
|
+
* [dict] 定義済み辞書として文字列を与えます。定義を無効にする (定義済み辞書を利用しない) には、+nil+ を与えます。
|
228
|
+
*
|
229
|
+
* エンコード情報は無視されます (常に Encoding::BINARY として扱われます)。呼び出し側で統一しておくべきです。
|
230
|
+
*
|
231
|
+
* 与えた文字列は内部で複写され、元の文字列とは独立します。文字列の変更を反映したい場合はその都度 +#dict=+ を呼ぶ必要があります。
|
232
|
+
*
|
233
|
+
* [RETURN] 自身 (self) を返します。
|
234
|
+
*/
|
213
235
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
236
|
+
/*
|
237
|
+
* Document-method: LZMA::Filter::BasicLZMA#dictsize
|
238
|
+
*
|
239
|
+
* call-seq:
|
240
|
+
* LZMA::Filter::BasicLZMA#dictsize -> integer
|
241
|
+
*
|
242
|
+
* 辞書の大きさをバイト値として取得します。
|
243
|
+
*/
|
244
|
+
|
245
|
+
/*
|
246
|
+
* Document-method: LZMA::Filter::BasicLZMA#dictsize=
|
247
|
+
*
|
248
|
+
* call-seq:
|
249
|
+
* LZMA::Filter::BasicLZMA#dictsize=(size) -> self
|
250
|
+
*
|
251
|
+
* 辞書の大きさをバイト値として設定します。
|
252
|
+
*/
|
253
|
+
|
254
|
+
/*
|
255
|
+
* Document-method: LZMA::Filter::BasicLZMA#lc
|
256
|
+
*
|
257
|
+
* call-seq:
|
258
|
+
* LZMA::Filter::BasicLZMA#lc -> integer
|
259
|
+
*
|
260
|
+
* lc 値を取得します。
|
261
|
+
*/
|
262
|
+
|
263
|
+
/*
|
264
|
+
* Document-method: LZMA::Filter::BasicLZMA#lc=
|
265
|
+
*
|
266
|
+
* call-seq:
|
267
|
+
* LZMA::Filter::BasicLZMA#lc=(value) -> self
|
268
|
+
*
|
269
|
+
* lc 値を設定します。
|
270
|
+
*/
|
271
|
+
|
272
|
+
/*
|
273
|
+
* Document-method: LZMA::Filter::BasicLZMA#lp
|
274
|
+
*
|
275
|
+
* call-seq:
|
276
|
+
* LZMA::Filter::BasicLZMA#lp -> integer
|
277
|
+
*
|
278
|
+
* lp 値を取得します。
|
279
|
+
*/
|
280
|
+
|
281
|
+
/*
|
282
|
+
* Document-method: LZMA::Filter::BasicLZMA#lp=
|
283
|
+
*
|
284
|
+
* call-seq:
|
285
|
+
* LZMA::Filter::BasicLZMA#lp=(value) -> self
|
286
|
+
*
|
287
|
+
* lp 値を設定します。
|
288
|
+
*/
|
289
|
+
|
290
|
+
/*
|
291
|
+
* Document-method: LZMA::Filter::BasicLZMA#pb
|
292
|
+
*
|
293
|
+
* call-seq:
|
294
|
+
* LZMA::Filter::BasicLZMA#pb -> integer
|
295
|
+
*
|
296
|
+
* pb 値を取得します。
|
297
|
+
*/
|
298
|
+
|
299
|
+
/*
|
300
|
+
* Document-method: LZMA::Filter::BasicLZMA#pb=
|
301
|
+
*
|
302
|
+
* call-seq:
|
303
|
+
* LZMA::Filter::BasicLZMA#pb=(value) -> self
|
304
|
+
*
|
305
|
+
* pb 値を設定します。
|
306
|
+
*/
|
307
|
+
|
308
|
+
/*
|
309
|
+
* Document-method: LZMA::Filter::BasicLZMA#mode
|
310
|
+
*
|
311
|
+
* call-seq:
|
312
|
+
* LZMA::Filter::BasicLZMA#mode -> integer
|
313
|
+
*
|
314
|
+
* mode 値を取得します。
|
315
|
+
*/
|
316
|
+
|
317
|
+
/*
|
318
|
+
* Document-method: LZMA::Filter::BasicLZMA#mode=
|
319
|
+
*
|
320
|
+
* call-seq:
|
321
|
+
* LZMA::Filter::BasicLZMA#mode=(value) -> self
|
322
|
+
*
|
323
|
+
* mode 値を設定します。
|
324
|
+
*/
|
325
|
+
|
326
|
+
/*
|
327
|
+
* Document-method: LZMA::Filter::BasicLZMA#nice
|
328
|
+
*
|
329
|
+
* call-seq:
|
330
|
+
* LZMA::Filter::BasicLZMA#nice -> integer
|
331
|
+
*
|
332
|
+
* nice 値を取得します。
|
333
|
+
*/
|
334
|
+
|
335
|
+
/*
|
336
|
+
* Document-method: LZMA::Filter::BasicLZMA#nice=
|
337
|
+
*
|
338
|
+
* call-seq:
|
339
|
+
* LZMA::Filter::BasicLZMA#nice=(value) -> self
|
340
|
+
*
|
341
|
+
* nice 値を設定します。
|
342
|
+
*/
|
343
|
+
|
344
|
+
/*
|
345
|
+
* Document-method: LZMA::Filter::BasicLZMA#mf
|
346
|
+
*
|
347
|
+
* call-seq:
|
348
|
+
* LZMA::Filter::BasicLZMA#mf -> integer
|
349
|
+
*
|
350
|
+
* mf 値を取得します。
|
351
|
+
*/
|
352
|
+
|
353
|
+
/*
|
354
|
+
* Document-method: LZMA::Filter::BasicLZMA#mf=
|
355
|
+
*
|
356
|
+
* call-seq:
|
357
|
+
* LZMA::Filter::BasicLZMA#mf=(value) -> self
|
358
|
+
*
|
359
|
+
* mf 値を設定します。
|
360
|
+
*/
|
361
|
+
|
362
|
+
/*
|
363
|
+
* Document-method: LZMA::Filter::BasicLZMA#depth
|
364
|
+
*
|
365
|
+
* call-seq:
|
366
|
+
* LZMA::Filter::BasicLZMA#depth -> integer
|
367
|
+
*
|
368
|
+
* depth 値を取得します。
|
369
|
+
*/
|
370
|
+
|
371
|
+
/*
|
372
|
+
* Document-method: LZMA::Filter::BasicLZMA#depth=
|
373
|
+
*
|
374
|
+
* call-seq:
|
375
|
+
* LZMA::Filter::BasicLZMA#depth=(value) -> self
|
376
|
+
*
|
377
|
+
* depth 値を設定します。
|
378
|
+
*/
|
219
379
|
|
220
380
|
|
221
381
|
#define DEFINE_ACCESSOR_ENTITY(NAME, MEMBER, DEFAULT) \
|
@@ -242,17 +402,68 @@ lzma_get_dict(VALUE self)
|
|
242
402
|
return UINT2NUM(((lzma_options_lzma *)getfilter(self)->options)->MEMBER); \
|
243
403
|
} \
|
244
404
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
405
|
+
static ID IDdictpreset;
|
406
|
+
|
407
|
+
static inline void
|
408
|
+
lzma_set_dict_nil(lzma_options_lzma *filter)
|
409
|
+
{
|
410
|
+
filter->preset_dict = NULL;
|
411
|
+
filter->preset_dict_size = 0;
|
412
|
+
}
|
413
|
+
|
414
|
+
static inline void
|
415
|
+
lzma_set_dict_string(lzma_options_lzma *filter, VALUE dict)
|
416
|
+
{
|
417
|
+
dict = rb_str_new_frozen(dict);
|
418
|
+
filter->preset_dict = (uint8_t *)(RSTRING_PTR(dict));
|
419
|
+
filter->preset_dict_size = RSTRING_LEN(dict);
|
420
|
+
}
|
421
|
+
|
422
|
+
static inline void
|
423
|
+
lzma_set_dict_0(lzma_options_lzma *filter, VALUE dict, VALUE self)
|
424
|
+
{
|
425
|
+
if (NIL_P(dict)) {
|
426
|
+
lzma_set_dict_nil(filter);
|
427
|
+
} else if (TYPE(dict) == T_STRING) {
|
428
|
+
if (RSTRING_LEN(dict) > 0) {
|
429
|
+
lzma_set_dict_string(filter, dict);
|
430
|
+
} else {
|
431
|
+
lzma_set_dict_nil(filter);
|
432
|
+
}
|
433
|
+
} else {
|
434
|
+
rb_raise(rb_eTypeError, "%s", "dict is not a String or nil");
|
435
|
+
}
|
436
|
+
|
437
|
+
rb_ivar_set(self, IDdictpreset, dict);
|
438
|
+
}
|
439
|
+
|
440
|
+
static VALUE
|
441
|
+
lzma_set_dict(VALUE self, VALUE dict)
|
442
|
+
{
|
443
|
+
lzma_set_dict_0((lzma_options_lzma *)getfilter(self)->options, dict, self);
|
444
|
+
return self;
|
445
|
+
}
|
446
|
+
|
447
|
+
static VALUE
|
448
|
+
lzma_get_dict(VALUE self)
|
449
|
+
{
|
450
|
+
VALUE dict = rb_attr_get(self, IDdictpreset);
|
451
|
+
if (!NIL_P(dict)) { dict = rb_str_new_shared(dict); }
|
452
|
+
return dict;
|
453
|
+
}
|
454
|
+
|
455
|
+
DEFINE_ACCESSOR_ENTITY(dictsize, dict_size, LZMA_DICT_SIZE_DEFAULT); // lzma_set_dictsize_0, lzma_set_dictsize, lzma_set_lc
|
456
|
+
DEFINE_ACCESSOR_ENTITY(lc, lc, LZMA_LC_DEFAULT);
|
457
|
+
DEFINE_ACCESSOR_ENTITY(lp, lp, LZMA_LP_DEFAULT);
|
458
|
+
DEFINE_ACCESSOR_ENTITY(pb, pb, LZMA_PB_DEFAULT);
|
459
|
+
DEFINE_ACCESSOR_ENTITY(mode, mode, LZMA_MODE_NORMAL);
|
460
|
+
DEFINE_ACCESSOR_ENTITY(nice, nice_len, 64);
|
461
|
+
DEFINE_ACCESSOR_ENTITY(mf, mf, LZMA_MF_BT4);
|
462
|
+
DEFINE_ACCESSOR_ENTITY(depth, depth, 0);
|
253
463
|
|
254
464
|
#undef DEFINE_ACCESSOR_ENTITY
|
255
465
|
|
466
|
+
|
256
467
|
static void *
|
257
468
|
setup_lzma(VALUE obj, uint32_t preset,
|
258
469
|
VALUE dictsize, VALUE dictpreset, VALUE lc, VALUE lp, VALUE pb,
|
@@ -260,7 +471,7 @@ setup_lzma(VALUE obj, uint32_t preset,
|
|
260
471
|
{
|
261
472
|
lzma_options_lzma lzma = { 0 };
|
262
473
|
if (lzma_lzma_preset(&lzma, preset) != 0) {
|
263
|
-
rb_raise(eBadPreset, "bad preset (%08x)", preset);
|
474
|
+
rb_raise(eBadPreset, "bad preset (0x%08x)", preset);
|
264
475
|
}
|
265
476
|
|
266
477
|
if (RTEST(dictpreset)) { lzma_set_dict_0(&lzma, dictpreset, obj); }
|
@@ -306,12 +517,12 @@ getpreset(VALUE preset)
|
|
306
517
|
|
307
518
|
/*
|
308
519
|
* call-seq:
|
309
|
-
* LZMA::Filter.lzma1(
|
520
|
+
* LZMA::Filter.lzma1(...)
|
310
521
|
*
|
311
|
-
* LZMA::Filter::LZMA1.new
|
522
|
+
* LZMA::Filter::LZMA1.newを呼ぶための補助機構です。
|
312
523
|
*
|
313
|
-
* LZMA::Filter::LZMA1クラスの .new や #initialize
|
314
|
-
* (あくまで .new
|
524
|
+
* LZMA::Filter::LZMA1クラスの .new や #initialize を書き換えた場合はそれに従います
|
525
|
+
* (あくまで .new を呼ぶだけです)。
|
315
526
|
*/
|
316
527
|
static VALUE
|
317
528
|
lzma1_new(int argc, VALUE argv[], VALUE self)
|
@@ -323,10 +534,10 @@ lzma1_new(int argc, VALUE argv[], VALUE self)
|
|
323
534
|
* call-seq:
|
324
535
|
* LZMA::Filter.lzma2(...)
|
325
536
|
*
|
326
|
-
* LZMA::Filter::LZMA2.new
|
537
|
+
* LZMA::Filter::LZMA2.new を呼ぶための補助機構です。
|
327
538
|
*
|
328
|
-
* LZMA::Filter::LZMA2クラスの .new や #initialize
|
329
|
-
* (あくまで .new
|
539
|
+
* LZMA::Filter::LZMA2クラスの .new や #initialize を書き換えた場合はそれに従います
|
540
|
+
* (あくまで .new を呼ぶだけです)。
|
330
541
|
*/
|
331
542
|
static VALUE
|
332
543
|
lzma2_new(int argc, VALUE argv[], VALUE self)
|
@@ -336,12 +547,12 @@ lzma2_new(int argc, VALUE argv[], VALUE self)
|
|
336
547
|
|
337
548
|
/*
|
338
549
|
* call-seq:
|
339
|
-
* LZMA::Filter.delta(
|
550
|
+
* LZMA::Filter.delta(...)
|
340
551
|
*
|
341
|
-
* LZMA::Filter::Delta.new
|
552
|
+
* LZMA::Filter::Delta.new を呼ぶための補助機構です。
|
342
553
|
*
|
343
|
-
* LZMA::Filter::Deltaクラスの .new や #initialize
|
344
|
-
* (あくまで .new
|
554
|
+
* LZMA::Filter::Deltaクラスの .new や #initialize を書き換えた場合はそれに従います
|
555
|
+
* (あくまで .new を呼ぶだけです)。
|
345
556
|
*/
|
346
557
|
static VALUE
|
347
558
|
delta_new(int argc, VALUE argv[], VALUE self)
|
@@ -350,7 +561,6 @@ delta_new(int argc, VALUE argv[], VALUE self)
|
|
350
561
|
}
|
351
562
|
|
352
563
|
|
353
|
-
|
354
564
|
static inline VALUE
|
355
565
|
filter_alloc(VALUE klass, lzma_vli id)
|
356
566
|
{
|
@@ -383,13 +593,14 @@ delta_alloc(VALUE klass)
|
|
383
593
|
* call-seq:
|
384
594
|
* LZMA::Filter::Delta.new(dist = LZMA::DELTA_DIST_MIN)
|
385
595
|
*
|
386
|
-
*
|
596
|
+
* 差分フィルタ設定オブジェクトを返します。
|
387
597
|
*
|
388
|
-
* distは1要素あたりのバイト長で、1
|
598
|
+
* distは1要素あたりのバイト長で、1以上255以下を指定できます。
|
389
599
|
*
|
390
|
-
*
|
600
|
+
* NOTE::
|
601
|
+
* 使用する場合多くの場合1で十分と思われますが、音楽CDの音声データであれば1サンプル2バイトであるため2が有効でしょう。
|
391
602
|
*
|
392
|
-
*
|
603
|
+
* しかし元のデータによっては圧縮効率を低下させることがあるため、実際に適用するべきかはデータの特性によって検証するのが好ましいです。
|
393
604
|
*/
|
394
605
|
static VALUE
|
395
606
|
delta_init(int argc, VALUE argv[], VALUE self)
|
@@ -408,27 +619,24 @@ delta_init(int argc, VALUE argv[], VALUE self)
|
|
408
619
|
|
409
620
|
/*
|
410
621
|
* call-seq:
|
411
|
-
* LZMA::Filter::BasicLZMA.new(preset = LZMA::PRESET_DEFAULT,
|
622
|
+
* LZMA::Filter::BasicLZMA.new(preset = LZMA::PRESET_DEFAULT, ... ) -> filter
|
412
623
|
*
|
413
|
-
*
|
624
|
+
* LZMA フィルタ設定オブジェクトを初期化します。
|
414
625
|
*
|
415
|
-
* この段階で各値の確認を行うことはせず、*encoder
|
626
|
+
* この段階で各値の確認を行うことはせず、*encoderに渡すときに初めて確認されます。
|
416
627
|
*
|
417
|
-
*
|
418
|
-
*
|
419
|
-
*
|
420
|
-
*
|
421
|
-
*
|
422
|
-
*
|
423
|
-
*
|
424
|
-
*
|
425
|
-
*
|
426
|
-
*
|
427
|
-
*
|
428
|
-
*
|
429
|
-
* nice:: 既定値はLZMA::NICE_DEFAULT
|
430
|
-
* mf:: 既定値はLZMA::MF_BT4
|
431
|
-
* depth:: 既定値はLZMA::DEPTH_DEFAULT
|
628
|
+
* [preset] プリセット値 (≒圧縮レベル) を 0-9 の範囲で指定し、任意で LZMA::PRESET_EXTREME を論理和で組み合わせることが出来ます。既定値はLZMA::PRESET_DEFAULTとなります。
|
629
|
+
* [dictsize] 辞書の大きさをバイト値で指定します。既定値は preset によって変化します。
|
630
|
+
* [dict] 定義済み辞書を指定します。既定値は nil です。
|
631
|
+
* [lc] 既定値は preset によって変化します。
|
632
|
+
* [lp] 既定値は preset によって変化します。
|
633
|
+
* [pb] 既定値は preset によって変化します。
|
634
|
+
* [mode] 既定値は preset によって変化します。
|
635
|
+
* [nice] 既定値は preset によって変化します。
|
636
|
+
* [mf] 既定値は preset によって変化します。
|
637
|
+
* [depth] 既定値は preset によって変化します。
|
638
|
+
* [RETURN] フィルタオブジェクト
|
639
|
+
* [EXCEPTIONS] (NO DOCUMENT)
|
432
640
|
*/
|
433
641
|
static VALUE
|
434
642
|
lzma_init(int argc, VALUE argv[], VALUE self)
|
@@ -442,7 +650,7 @@ lzma_init(int argc, VALUE argv[], VALUE self)
|
|
442
650
|
} else {
|
443
651
|
filter->options = setup_lzma(self, getpreset(preset),
|
444
652
|
rb_hash_lookup(opts, symDICTSIZE),
|
445
|
-
rb_hash_lookup(opts,
|
653
|
+
rb_hash_lookup(opts, symDICT),
|
446
654
|
rb_hash_lookup(opts, symLC),
|
447
655
|
rb_hash_lookup(opts, symLP),
|
448
656
|
rb_hash_lookup(opts, symPB),
|
@@ -455,13 +663,33 @@ lzma_init(int argc, VALUE argv[], VALUE self)
|
|
455
663
|
}
|
456
664
|
|
457
665
|
/*
|
458
|
-
* Document-
|
666
|
+
* Document-class: LZMA::Filter
|
667
|
+
*
|
668
|
+
* LZMA::Filter クラスは、各圧縮器や伸張器の生成時に用いるフィルタ情報を取り扱います。
|
669
|
+
*
|
670
|
+
* liblzma で定義されているフィルタはそれぞれ LZMA::Filter::LZMA1 /
|
671
|
+
* LZMA::Filter::LZMA2 / LZMA::Filter::Delta として定義されています。
|
672
|
+
*
|
673
|
+
* これらのクラスについてはそれぞれの文書を見てください。
|
674
|
+
*/
|
675
|
+
|
676
|
+
/*
|
677
|
+
* Document-class: LZMA::Filter::BasicLZMA
|
678
|
+
*
|
679
|
+
* LZMA::Filter::LZMA1 と LZMA::Filter::LZMA2 の基本となるクラスです。
|
680
|
+
*
|
681
|
+
* allocator を持たないため、このクラス自身はインスタンスを作成することが出来ません。
|
682
|
+
*/
|
683
|
+
|
684
|
+
/*
|
685
|
+
* Document-method: LZMA::Filter::BasicLZMA#dictsize -> integer
|
459
686
|
*
|
460
687
|
* call-seq:
|
461
688
|
* LZMA::Filter::BasicLZMA#dictsize -> 辞書サイズ (バイト長)
|
462
689
|
*
|
463
690
|
* 様々なフィルタ値の設定・取り出しを行う
|
464
691
|
*/
|
692
|
+
|
465
693
|
static void
|
466
694
|
setup_filter(void)
|
467
695
|
{
|
@@ -484,21 +712,25 @@ setup_filter(void)
|
|
484
712
|
rb_define_alloc_func(cDelta, delta_alloc);
|
485
713
|
rb_define_method(cDelta, "initialize", delta_init, -1);
|
486
714
|
|
487
|
-
|
488
|
-
rb_define_method(
|
489
|
-
rb_define_method(
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
715
|
+
|
716
|
+
rb_define_method(cBasicLZMA, "dictsize", lzma_get_dictsize, 0);
|
717
|
+
rb_define_method(cBasicLZMA, "dictsize=", lzma_set_dictsize, 1);
|
718
|
+
rb_define_method(cBasicLZMA, "dict", lzma_get_dict, 0);
|
719
|
+
rb_define_method(cBasicLZMA, "dict=", lzma_set_dict, 1);
|
720
|
+
rb_define_method(cBasicLZMA, "lc", lzma_get_lc, 0);
|
721
|
+
rb_define_method(cBasicLZMA, "lc=", lzma_set_lc, 1);
|
722
|
+
rb_define_method(cBasicLZMA, "lp", lzma_get_lp, 0);
|
723
|
+
rb_define_method(cBasicLZMA, "lp=", lzma_set_lp, 1);
|
724
|
+
rb_define_method(cBasicLZMA, "pb", lzma_get_pb, 0);
|
725
|
+
rb_define_method(cBasicLZMA, "pb=", lzma_set_pb, 1);
|
726
|
+
rb_define_method(cBasicLZMA, "mode", lzma_get_mode, 0);
|
727
|
+
rb_define_method(cBasicLZMA, "mode=", lzma_set_mode, 1);
|
728
|
+
rb_define_method(cBasicLZMA, "nice", lzma_get_nice, 0);
|
729
|
+
rb_define_method(cBasicLZMA, "nice=", lzma_set_nice, 1);
|
730
|
+
rb_define_method(cBasicLZMA, "mf", lzma_get_mf, 0);
|
731
|
+
rb_define_method(cBasicLZMA, "mf=", lzma_set_mf, 1);
|
732
|
+
rb_define_method(cBasicLZMA, "depth", lzma_get_depth, 0);
|
733
|
+
rb_define_method(cBasicLZMA, "depth=", lzma_set_depth, 1);
|
502
734
|
}
|
503
735
|
|
504
736
|
|
@@ -512,15 +744,6 @@ static VALUE cRawEncoder;
|
|
512
744
|
static VALUE cRawDecoder;
|
513
745
|
|
514
746
|
|
515
|
-
#define LZMA_TEST(STATUS) \
|
516
|
-
{ \
|
517
|
-
lzma_ret _status = (STATUS); \
|
518
|
-
if (lzma_isfailed(_status)) { \
|
519
|
-
VALUE exc = lookup_exception(_status); \
|
520
|
-
rb_exc_raise(rb_exc_new3(exc, rb_class_name(exc))); \
|
521
|
-
} \
|
522
|
-
} \
|
523
|
-
|
524
747
|
static inline void
|
525
748
|
filter_copy(lzma_filter *dest, VALUE filter)
|
526
749
|
{
|
@@ -596,13 +819,6 @@ stream_update_2(struct stream_update_args *args)
|
|
596
819
|
return rb_thread_blocking_region((VALUE (*)(void *))stream_update_1, args, RUBY_UBF_IO, NULL);
|
597
820
|
}
|
598
821
|
|
599
|
-
static inline VALUE
|
600
|
-
stream_update_3(VALUE src)
|
601
|
-
{
|
602
|
-
rb_str_unlocktmp(src);
|
603
|
-
return Qnil;
|
604
|
-
}
|
605
|
-
|
606
822
|
static inline VALUE
|
607
823
|
stream_update_0(lzma_stream *stream, lzma_action action, VALUE src)
|
608
824
|
{
|
@@ -613,7 +829,7 @@ stream_update_0(lzma_stream *stream, lzma_action action, VALUE src)
|
|
613
829
|
stream, action,
|
614
830
|
(const uint8_t *)RSTRING_PTR(src), RSTRING_LEN(src),
|
615
831
|
};
|
616
|
-
return rb_ensure(stream_update_2, (VALUE)&args,
|
832
|
+
return rb_ensure(stream_update_2, (VALUE)&args, rb_str_unlocktmp, src);
|
617
833
|
} else {
|
618
834
|
struct stream_update_args args = {
|
619
835
|
stream, action, NULL, 0,
|
@@ -706,7 +922,17 @@ filter_setup(lzma_filter filter[LZMA_FILTERS_MAX + 1], VALUE filters0[], VALUE *
|
|
706
922
|
}
|
707
923
|
|
708
924
|
|
709
|
-
|
925
|
+
/*
|
926
|
+
* call-seq:
|
927
|
+
* LZMA::Stream::Encoder.new(filter1 [ , filter2 [ , filter3 [ , filter4 ] ] ], check: CHECK_CRC64) -> encoder
|
928
|
+
*
|
929
|
+
* 圧縮器を生成します。圧縮されたデータストリームは xz ファイルフォーマットです。
|
930
|
+
*
|
931
|
+
* [filter1, filter2, filter3, filter4] LZMA::Filter インスタンス。最低一つを必要とします。
|
932
|
+
* [check] チェックメソッド。CHECK_NONE CHECK_CRC32 CHECK_CRC64 CHECK_SHA256 のいずれかの定数を与えます。
|
933
|
+
* [RETURN] 生成された圧縮器
|
934
|
+
* [EXCEPTIONS] (NO DOCUMENTS)
|
935
|
+
*/
|
710
936
|
static VALUE
|
711
937
|
encoder_init(int argc, VALUE argv[], VALUE self)
|
712
938
|
{
|
@@ -731,7 +957,7 @@ encoder_init(int argc, VALUE argv[], VALUE self)
|
|
731
957
|
|
732
958
|
/*
|
733
959
|
* call-seq:
|
734
|
-
* LZMA::Stream::AutoDecoder.
|
960
|
+
* LZMA::Stream::AutoDecoder.new(memlimit = nil, flags = nil)
|
735
961
|
*/
|
736
962
|
static VALUE
|
737
963
|
autodecoder_init(int argc, VALUE argv[], VALUE self)
|
@@ -752,7 +978,7 @@ autodecoder_init(int argc, VALUE argv[], VALUE self)
|
|
752
978
|
|
753
979
|
/*
|
754
980
|
* call-seq:
|
755
|
-
* LZMA::Stream::Decoder.
|
981
|
+
* LZMA::Stream::Decoder.new(memlimit = nil, flags = nil)
|
756
982
|
*/
|
757
983
|
static VALUE
|
758
984
|
decoder_init(int argc, VALUE argv[], VALUE self)
|
@@ -773,9 +999,9 @@ decoder_init(int argc, VALUE argv[], VALUE self)
|
|
773
999
|
|
774
1000
|
/*
|
775
1001
|
* call-seq:
|
776
|
-
* LZMA::Stream::RawEncoder.
|
1002
|
+
* LZMA::Stream::RawEncoder.new(filter1 [ , filter2 [ , .... ] ]) -> encoder
|
777
1003
|
*
|
778
|
-
* 生の (xzヘッダなどの付かない) LZMA1/2
|
1004
|
+
* 生の (xzヘッダなどの付かない) LZMA1/2ストリームを構成する圧縮器を生成する。
|
779
1005
|
*
|
780
1006
|
* filterは1つ以上4つまでを与える。
|
781
1007
|
*/
|
@@ -797,7 +1023,7 @@ rawencoder_init(int argc, VALUE argv[], VALUE self)
|
|
797
1023
|
|
798
1024
|
/*
|
799
1025
|
* call-seq:
|
800
|
-
* LZMA::Stream::RawDecoder.
|
1026
|
+
* LZMA::Stream::RawDecoder.new(filter1 [ , filter2 [ , .... ] ])
|
801
1027
|
*/
|
802
1028
|
static VALUE
|
803
1029
|
rawdecoder_init(int argc, VALUE argv[], VALUE self)
|
@@ -896,60 +1122,62 @@ setup_index(void)
|
|
896
1122
|
|
897
1123
|
// SECTION: LZMA::Utils
|
898
1124
|
|
899
|
-
struct
|
1125
|
+
struct crc_args
|
900
1126
|
{
|
901
1127
|
const uint8_t *ptr;
|
902
1128
|
size_t len;
|
903
|
-
|
1129
|
+
VALUE crc;
|
1130
|
+
VALUE (*crc_update)(struct crc_args *args);
|
904
1131
|
};
|
905
1132
|
|
906
1133
|
static VALUE
|
907
|
-
|
1134
|
+
crc_calc_try(struct crc_args *args)
|
908
1135
|
{
|
909
|
-
return
|
1136
|
+
return rb_thread_blocking_region((VALUE (*)(void *))(args->crc_update), args, RUBY_UBF_IO, NULL);
|
910
1137
|
}
|
911
1138
|
|
912
|
-
|
913
|
-
*
|
914
|
-
* LZMA::Utils.crc32(string, crc = 0)
|
915
|
-
*
|
916
|
-
* liblzmaに含まれるlzma_crc32を呼び出します。
|
917
|
-
*/
|
918
|
-
static VALUE
|
919
|
-
utils_crc32(int argc, VALUE argv[], VALUE self)
|
1139
|
+
static inline VALUE
|
1140
|
+
crc_calc(VALUE (*crc_update)(struct crc_args *args), int argc, VALUE argv[])
|
920
1141
|
{
|
921
1142
|
VALUE src, crc;
|
922
1143
|
rb_scan_args(argc, argv, "11", &src, &crc);
|
923
|
-
|
924
1144
|
StringValue(src);
|
925
1145
|
rb_str_locktmp(src);
|
926
1146
|
|
927
|
-
struct
|
1147
|
+
struct crc_args args = {
|
928
1148
|
(const uint8_t *)RSTRING_PTR(src),
|
929
1149
|
RSTRING_LEN(src),
|
930
|
-
NIL_P(crc) ? 0 :
|
1150
|
+
NIL_P(crc) ? INT2FIX(0) : crc,
|
1151
|
+
crc_update,
|
931
1152
|
};
|
932
1153
|
|
933
|
-
|
934
|
-
|
935
|
-
rb_str_unlocktmp(src);
|
936
|
-
|
937
|
-
return crc;
|
1154
|
+
return rb_ensure(crc_calc_try, (VALUE)&args, rb_str_unlocktmp, src);
|
938
1155
|
}
|
939
1156
|
|
940
1157
|
|
1158
|
+
static VALUE
|
1159
|
+
crc32_update(struct crc_args *args)
|
1160
|
+
{
|
1161
|
+
return UINT2NUM(lzma_crc32(args->ptr, args->len, NUM2UINT(args->crc)));
|
1162
|
+
}
|
941
1163
|
|
942
|
-
|
1164
|
+
/*
|
1165
|
+
* call-seq:
|
1166
|
+
* LZMA::Utils.crc32(string, crc = 0)
|
1167
|
+
*
|
1168
|
+
* liblzmaに含まれるlzma_crc32を呼び出します。
|
1169
|
+
*/
|
1170
|
+
static VALUE
|
1171
|
+
utils_crc32(int argc, VALUE argv[], VALUE self)
|
943
1172
|
{
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
};
|
1173
|
+
return crc_calc(crc32_update, argc, argv);
|
1174
|
+
}
|
1175
|
+
|
948
1176
|
|
949
1177
|
static VALUE
|
950
|
-
|
1178
|
+
crc64_update(struct crc_args *args)
|
951
1179
|
{
|
952
|
-
return ULL2NUM(lzma_crc64(args->ptr, args->len, args->crc));
|
1180
|
+
return ULL2NUM(lzma_crc64(args->ptr, args->len, NUM2ULL(args->crc)));
|
953
1181
|
}
|
954
1182
|
|
955
1183
|
/*
|
@@ -961,23 +1189,7 @@ utils_crc64_update(struct utils_crc64_args *args)
|
|
961
1189
|
static VALUE
|
962
1190
|
utils_crc64(int argc, VALUE argv[], VALUE self)
|
963
1191
|
{
|
964
|
-
|
965
|
-
rb_scan_args(argc, argv, "11", &src, &crc);
|
966
|
-
|
967
|
-
StringValue(src);
|
968
|
-
rb_str_locktmp(src);
|
969
|
-
|
970
|
-
struct utils_crc64_args args = {
|
971
|
-
(const uint8_t *)RSTRING_PTR(src),
|
972
|
-
RSTRING_LEN(src),
|
973
|
-
NIL_P(crc) ? 0 : NUM2ULL(crc),
|
974
|
-
};
|
975
|
-
|
976
|
-
crc = rb_thread_blocking_region((VALUE (*)(void *))utils_crc64_update, &args, RUBY_UBF_IO, NULL);
|
977
|
-
|
978
|
-
rb_str_unlocktmp(src);
|
979
|
-
|
980
|
-
return crc;
|
1192
|
+
return crc_calc(crc64_update, argc, argv);
|
981
1193
|
}
|
982
1194
|
|
983
1195
|
|
@@ -987,26 +1199,21 @@ static void
|
|
987
1199
|
setup_utils(void)
|
988
1200
|
{
|
989
1201
|
mUtils = rb_define_module_under(mLZMA, "Utils");
|
990
|
-
rb_include_module(mLZMA, mUtils);
|
991
|
-
rb_extend_object(mLZMA, mUtils);
|
992
1202
|
|
993
|
-
|
994
|
-
//
|
995
|
-
|
996
|
-
rb_extend_object(mUtils, mUtils);
|
1203
|
+
rb_extend_object(mLZMA, mUtils);
|
1204
|
+
rb_extend_object(mUtils, mUtils); // 自分に対してもモジュールメソッドを利用できるようにする
|
997
1205
|
|
998
1206
|
rb_define_method(mUtils, "crc32", RUBY_METHOD_FUNC(utils_crc32), -1);
|
999
1207
|
rb_define_method(mUtils, "crc64", RUBY_METHOD_FUNC(utils_crc64), -1);
|
1000
1208
|
}
|
1001
1209
|
|
1002
|
-
|
1003
|
-
// SECTION: LZMA
|
1210
|
+
// SECTION: LibLZMA
|
1004
1211
|
|
1005
1212
|
void
|
1006
1213
|
Init_liblzma(void)
|
1007
1214
|
{
|
1008
|
-
symDICTSIZE = ID2SYM(rb_intern("
|
1009
|
-
|
1215
|
+
symDICTSIZE = ID2SYM(rb_intern("dictsize"));
|
1216
|
+
symDICT = ID2SYM(rb_intern("dict"));
|
1010
1217
|
symLC = ID2SYM(rb_intern("lc"));
|
1011
1218
|
symLP = ID2SYM(rb_intern("lp"));
|
1012
1219
|
symPB = ID2SYM(rb_intern("pb"));
|
@@ -1016,12 +1223,15 @@ Init_liblzma(void)
|
|
1016
1223
|
symDEPTH = ID2SYM(rb_intern("depth"));
|
1017
1224
|
symCHECK = ID2SYM(rb_intern("check"));
|
1018
1225
|
|
1019
|
-
|
1226
|
+
IDdictpreset = rb_intern_const("liblzma.dict_preset");
|
1227
|
+
|
1228
|
+
|
1229
|
+
mLZMA = rb_define_module("LibLZMA");
|
1020
1230
|
|
1021
1231
|
setup_utils();
|
1022
1232
|
setup_constants();
|
1023
1233
|
setup_exceptions();
|
1024
1234
|
setup_filter();
|
1025
1235
|
setup_stream();
|
1026
|
-
setup_index();
|
1236
|
+
// setup_index();
|
1027
1237
|
}
|
data/lib/liblzma.rb
CHANGED
@@ -1,131 +1,222 @@
|
|
1
1
|
#vim: set fileencoding:utf-8
|
2
2
|
|
3
|
-
|
3
|
+
ver = RbConfig::CONFIG["ruby_version"]
|
4
|
+
lib = File.join(File.dirname(__FILE__), ver, "liblzma.so")
|
5
|
+
if File.file?(lib)
|
6
|
+
require_relative File.join(ver, "liblzma.so")
|
7
|
+
else
|
8
|
+
require_relative "liblzma.so"
|
9
|
+
end
|
4
10
|
|
5
|
-
module LZMA
|
6
|
-
module_function
|
7
|
-
def encode(data, *args)
|
8
|
-
s = Stream.encoder(Filter.lzma2(*args))
|
9
|
-
s.update(data, LZMA::FINISH)
|
10
|
-
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
#--
|
13
|
+
# This comment is avoid the problem that is recognized binary by rdoc
|
14
|
+
# #
|
15
|
+
# #
|
16
|
+
# #
|
17
|
+
# #
|
18
|
+
# #
|
19
|
+
# #
|
20
|
+
# #
|
21
|
+
# #
|
22
|
+
# #
|
23
|
+
# #
|
24
|
+
# #
|
25
|
+
# #
|
26
|
+
#++
|
27
|
+
|
28
|
+
module LibLZMA
|
29
|
+
LZMA = self
|
30
|
+
|
31
|
+
# call-seq:
|
32
|
+
# LibLZMA.encode(data, ...) -> encoded_xz_data
|
33
|
+
#
|
34
|
+
# データを圧縮します。圧縮されたデータ列は、xz ファイルフォーマットとなるため、コマンドラインの xz などで伸張させることが可能です。
|
35
|
+
#
|
36
|
+
# [data] 圧縮元となるデータを String インスタンスで渡します。liblzma はエンコーディング情報を無視し、そのままのバイト列をバイナリデータと見立て処理を行います。
|
37
|
+
#
|
38
|
+
# [options] LZMA::Filter::LZMA2.new に渡される可変引数です。詳細は LZMA::Filter::LZMA2.new を見てください。
|
39
|
+
#
|
40
|
+
# [RETURN] xz データストリームとしての String インスタンスです。
|
41
|
+
#
|
42
|
+
# [EXCEPTIONS] (NO DOCUMENT)
|
43
|
+
module_function
|
44
|
+
def encode(data, *args)
|
45
|
+
s = Stream.encoder(Filter.lzma2(*args))
|
46
|
+
s.update(data, LZMA::FINISH)
|
47
|
+
ensure
|
48
|
+
s.finish rescue nil if s
|
49
|
+
end
|
50
|
+
|
51
|
+
# call-seq:
|
52
|
+
# LZMA.decode(encoded_data, ...) -> string
|
53
|
+
#
|
54
|
+
# 圧縮されたデータを伸張します。
|
55
|
+
#
|
56
|
+
# [encoded_data] 圧縮されたデータを与えます。圧縮されたデータの形式は、xz と lzma です。これらはあらかじめ区別する必要なく与えることが出来ます。
|
57
|
+
#
|
58
|
+
# [options] LZMA::Filter::LZMA2.new に渡される可変引数です。詳細は LZMA::Filter::LZMA2.new を見てください。
|
59
|
+
#
|
60
|
+
# [RETURN] xz データストリームとしての String インスタンスです。
|
61
|
+
#
|
62
|
+
# [EXCEPTIONS] (NO DOCUMENT)
|
63
|
+
module_function
|
64
|
+
def decode(data, *args)
|
65
|
+
s = Stream.auto_decoder(*args)
|
66
|
+
s.update(data, LZMA::FINISH)
|
67
|
+
ensure
|
68
|
+
s.finish rescue nil if s
|
69
|
+
end
|
70
|
+
|
71
|
+
# call-seq:
|
72
|
+
# LZMA.raw_encode(data, ...) -> encoded_data
|
73
|
+
#
|
74
|
+
# データを圧縮します。圧縮されたデータ列は生の lzma1/lzma2 のデータ列であるため、伸張する際に適切なフィルタを与える必要があります。
|
75
|
+
#
|
76
|
+
# xz ファイルフォーマットヘッダや整合値を持たないため、これらが不要な場合は有用かもしれません。
|
77
|
+
#
|
78
|
+
# [data] 圧縮元となるデータを String インスタンスで渡します。liblzma はエンコーディング情報を無視し、そのままのバイト列をバイナリデータと見立てて処理を行います。
|
79
|
+
#
|
80
|
+
# [options] LZMA::Filter のインスタンスを与えます。
|
81
|
+
#
|
82
|
+
# [RETURN] 生の lzma1/lzma2 のデータ列となる String インスタンスです。
|
83
|
+
#
|
84
|
+
# [EXCEPTIONS] (NO DOCUMENT)
|
85
|
+
module_function
|
86
|
+
def raw_encode(data, *args)
|
87
|
+
s = Stream.raw_encoder(*args)
|
88
|
+
s.update(data, LZMA::FINISH)
|
89
|
+
ensure
|
90
|
+
s.finish rescue nil if s
|
91
|
+
end
|
92
|
+
|
93
|
+
# call-seq:
|
94
|
+
# LZMA.raw_decode(encoded_data, ...) -> decoded_data
|
95
|
+
#
|
96
|
+
# 圧縮されたデータを伸張します。圧縮した際に用いたフィルタをそのままの順番・数で与える必要があります。
|
97
|
+
#
|
98
|
+
# [data] 圧縮された生の lzma1/lzma2 の String インスタンスを渡します。liblzma はエンコーディング情報を無視し、そのままのバイト列をバイナリデータと見立てて処理を行います。
|
99
|
+
#
|
100
|
+
# [options] LZMA::Filter のインスタンスを与えます。
|
101
|
+
#
|
102
|
+
# [RETURN] 伸張されたデータ列となる String インスタンスです。
|
103
|
+
#
|
104
|
+
# [EXCEPTIONS] (NO DOCUMENT)
|
105
|
+
module_function
|
106
|
+
def raw_decode(data, *args)
|
107
|
+
s = Stream.raw_decoder(*args)
|
108
|
+
s.update(data, LZMA::FINISH)
|
109
|
+
ensure
|
110
|
+
s.finish rescue nil if s
|
111
|
+
end
|
112
|
+
|
113
|
+
class Stream
|
114
|
+
def self.encoder(*args)
|
115
|
+
Encoder.new(*args)
|
16
116
|
end
|
17
117
|
|
18
|
-
|
19
|
-
|
20
|
-
s = Stream.raw_encoder(*args)
|
21
|
-
s.update(data, LZMA::FINISH)
|
118
|
+
def self.decoder(*args)
|
119
|
+
Decoder.new(*args)
|
22
120
|
end
|
23
121
|
|
24
|
-
|
25
|
-
|
26
|
-
s = Stream.raw_decoder(*args)
|
27
|
-
s.update(data, LZMA::FINISH)
|
122
|
+
def self.auto_decoder(*args)
|
123
|
+
AutoDecoder.new(*args)
|
28
124
|
end
|
29
125
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.decoder(*args)
|
36
|
-
Decoder.new(*args)
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.auto_decoder(*args)
|
40
|
-
AutoDecoder.new(*args)
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.raw_encoder(*args)
|
44
|
-
RawEncoder.new(*args)
|
45
|
-
end
|
126
|
+
def self.raw_encoder(*args)
|
127
|
+
RawEncoder.new(*args)
|
128
|
+
end
|
46
129
|
|
47
|
-
|
48
|
-
|
49
|
-
end
|
130
|
+
def self.raw_decoder(*args)
|
131
|
+
RawDecoder.new(*args)
|
50
132
|
end
|
133
|
+
end
|
51
134
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
135
|
+
module Utils
|
136
|
+
# CRC32 を Digest のように生成できるようになります。
|
137
|
+
class CRC32 < Struct.new(:state, :init)
|
138
|
+
def initialize(state = 0)
|
139
|
+
state = state.to_i
|
140
|
+
super(state, state)
|
141
|
+
end
|
58
142
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
143
|
+
# call-seq:
|
144
|
+
# LZMA::Utils::CRC32#update(data) -> self
|
145
|
+
def update(data)
|
146
|
+
self.state = Utils.crc32(data, state)
|
147
|
+
self
|
148
|
+
end
|
63
149
|
|
64
|
-
|
150
|
+
alias << update
|
65
151
|
|
66
|
-
|
67
|
-
|
68
|
-
|
152
|
+
def finish
|
153
|
+
self
|
154
|
+
end
|
69
155
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
156
|
+
def reset
|
157
|
+
self.state = init
|
158
|
+
self
|
159
|
+
end
|
74
160
|
|
75
|
-
|
76
|
-
|
77
|
-
|
161
|
+
def digest
|
162
|
+
[state].pack("N")
|
163
|
+
end
|
78
164
|
|
79
|
-
|
80
|
-
|
81
|
-
|
165
|
+
def hexdigest
|
166
|
+
"%08x" % state
|
167
|
+
end
|
82
168
|
|
83
|
-
|
169
|
+
alias to_s hexdigest
|
84
170
|
|
85
|
-
|
86
|
-
|
87
|
-
|
171
|
+
def to_str
|
172
|
+
"CRC32 <#{hexdigest}>"
|
173
|
+
end
|
88
174
|
|
89
|
-
|
90
|
-
|
175
|
+
alias inspect to_str
|
176
|
+
end
|
91
177
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
178
|
+
# CRC64 を Digest のように生成できるようになります。
|
179
|
+
class CRC64 < Struct.new(:state, :init)
|
180
|
+
def initialize(state = 0)
|
181
|
+
state = state.to_i
|
182
|
+
super(state, state)
|
183
|
+
end
|
97
184
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
185
|
+
# call-seq:
|
186
|
+
# LZMA::Utils::CRC64#update(data) -> self
|
187
|
+
def update(data)
|
188
|
+
self.state = Utils.crc64(data, state)
|
189
|
+
self
|
190
|
+
end
|
102
191
|
|
103
|
-
|
192
|
+
alias << update
|
104
193
|
|
105
|
-
|
106
|
-
|
107
|
-
|
194
|
+
def finish
|
195
|
+
self
|
196
|
+
end
|
108
197
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
198
|
+
def reset
|
199
|
+
self.state = init
|
200
|
+
self
|
201
|
+
end
|
113
202
|
|
114
|
-
|
115
|
-
|
116
|
-
|
203
|
+
def digest
|
204
|
+
[state].pack("Q>")
|
205
|
+
end
|
117
206
|
|
118
|
-
|
119
|
-
|
120
|
-
|
207
|
+
def hexdigest
|
208
|
+
"%016x" % state
|
209
|
+
end
|
121
210
|
|
122
|
-
|
211
|
+
alias to_s hexdigest
|
123
212
|
|
124
|
-
|
125
|
-
|
126
|
-
|
213
|
+
def to_str
|
214
|
+
"CRC64 <#{hexdigest}>"
|
215
|
+
end
|
127
216
|
|
128
|
-
|
129
|
-
end
|
217
|
+
alias inspect to_str
|
130
218
|
end
|
219
|
+
end
|
131
220
|
end
|
221
|
+
|
222
|
+
LZMA = LibLZMA unless Object.const_defined?(:LZMA)
|
data/samples/01-easy_using.rb
CHANGED
data/samples/02-streaming.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: liblzma
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.3'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-21 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email: dearblue@users.sourceforge.jp
|
@@ -28,7 +28,12 @@ homepage:
|
|
28
28
|
licenses:
|
29
29
|
- 2-clause BSD License
|
30
30
|
post_install_message:
|
31
|
-
rdoc_options:
|
31
|
+
rdoc_options:
|
32
|
+
- -eUTF-8
|
33
|
+
- -mREADME.txt
|
34
|
+
- README.txt
|
35
|
+
- ext/liblzma.c
|
36
|
+
- lib/liblzma.rb
|
32
37
|
require_paths:
|
33
38
|
- lib
|
34
39
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -45,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
45
50
|
version: '0'
|
46
51
|
requirements: []
|
47
52
|
rubyforge_project:
|
48
|
-
rubygems_version: 1.8.
|
53
|
+
rubygems_version: 1.8.25
|
49
54
|
signing_key:
|
50
55
|
specification_version: 3
|
51
56
|
summary: ruby bindings for liblzma that is included in the xz utilities
|