liblzma 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|