liblzma 0.3-x86-mingw32
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 +42 -0
- data/ext/extconf.rb +27 -0
- data/ext/liblzma.c +1237 -0
- data/lib/1.9.1/liblzma.so +0 -0
- data/lib/2.0.0/liblzma.so +0 -0
- data/lib/liblzma.rb +222 -0
- data/samples/01-easy_using.rb +58 -0
- data/samples/02-streaming.rb +82 -0
- metadata +59 -0
Binary file
|
Binary file
|
data/lib/liblzma.rb
ADDED
@@ -0,0 +1,222 @@
|
|
1
|
+
#vim: set fileencoding:utf-8
|
2
|
+
|
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
|
10
|
+
|
11
|
+
|
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)
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.decoder(*args)
|
119
|
+
Decoder.new(*args)
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.auto_decoder(*args)
|
123
|
+
AutoDecoder.new(*args)
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.raw_encoder(*args)
|
127
|
+
RawEncoder.new(*args)
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.raw_decoder(*args)
|
131
|
+
RawDecoder.new(*args)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
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
|
142
|
+
|
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
|
149
|
+
|
150
|
+
alias << update
|
151
|
+
|
152
|
+
def finish
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
def reset
|
157
|
+
self.state = init
|
158
|
+
self
|
159
|
+
end
|
160
|
+
|
161
|
+
def digest
|
162
|
+
[state].pack("N")
|
163
|
+
end
|
164
|
+
|
165
|
+
def hexdigest
|
166
|
+
"%08x" % state
|
167
|
+
end
|
168
|
+
|
169
|
+
alias to_s hexdigest
|
170
|
+
|
171
|
+
def to_str
|
172
|
+
"CRC32 <#{hexdigest}>"
|
173
|
+
end
|
174
|
+
|
175
|
+
alias inspect to_str
|
176
|
+
end
|
177
|
+
|
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
|
184
|
+
|
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
|
191
|
+
|
192
|
+
alias << update
|
193
|
+
|
194
|
+
def finish
|
195
|
+
self
|
196
|
+
end
|
197
|
+
|
198
|
+
def reset
|
199
|
+
self.state = init
|
200
|
+
self
|
201
|
+
end
|
202
|
+
|
203
|
+
def digest
|
204
|
+
[state].pack("Q>")
|
205
|
+
end
|
206
|
+
|
207
|
+
def hexdigest
|
208
|
+
"%016x" % state
|
209
|
+
end
|
210
|
+
|
211
|
+
alias to_s hexdigest
|
212
|
+
|
213
|
+
def to_str
|
214
|
+
"CRC64 <#{hexdigest}>"
|
215
|
+
end
|
216
|
+
|
217
|
+
alias inspect to_str
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
LZMA = LibLZMA unless Object.const_defined?(:LZMA)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#vim: set fileencoding:utf-8
|
3
|
+
|
4
|
+
# このrubyスクリプトはliblzma for Rubyの利用手引きを兼ねたサンプルスクリプトです。
|
5
|
+
|
6
|
+
|
7
|
+
# rubyでliblzmaの機能を利用するのに必要なのは、次の一文のみです
|
8
|
+
require "liblzma"
|
9
|
+
|
10
|
+
|
11
|
+
# 圧縮するデータを用意します
|
12
|
+
original_data = "0123456789abcdefghijklmnopqrstuvwxyz\n" * 10
|
13
|
+
|
14
|
+
|
15
|
+
# liblzmaを使って、データを圧縮します (xzデータストリームそのものが出力されます)
|
16
|
+
encoded_data = LZMA.encode(original_data)
|
17
|
+
|
18
|
+
|
19
|
+
# 圧縮レベルを変える場合は、第二引数に0から9の整数値を与えます
|
20
|
+
# この例は xz -1 と等価です
|
21
|
+
# (『9』を与える場合、作業メモリ空間が700MBほど必要になります)
|
22
|
+
encoded_data = LZMA.encode(original_data, 1)
|
23
|
+
|
24
|
+
|
25
|
+
# さらに細かい調整は、圧縮レベル(プリセット値)の後にハッシュ値を指定します
|
26
|
+
# この例ではプリセット値を省略しています
|
27
|
+
# (プリセット値の規定値はliblzma由来であり、『6』です)
|
28
|
+
encoded_data = LZMA.encode(original_data, mode: LZMA::MODE_FAST)
|
29
|
+
|
30
|
+
# この他にどんな値が与えられるかは、LZMA::Filter::LZMA2.newを参考にしてください
|
31
|
+
|
32
|
+
|
33
|
+
# 必要であればファイルに書き出しましょう
|
34
|
+
# xzデータストリームそのものです
|
35
|
+
File.write("sample.txt.xz", encoded_data, mode: "wb")
|
36
|
+
|
37
|
+
# 出力されたファイルがxzユーティリティ(もしくは7-Zip)で開けることを確認してください
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
# 圧縮されたデータを伸張してみましょう
|
42
|
+
# たったこれだけです
|
43
|
+
puts LZMA.decode(encoded_data)
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
# 今回は処理したいデータをあらかじめ用意してから、一気に処理を行う方法を提示しました
|
48
|
+
# 現実には少しずつデータを処理していく必要がある事例も少なくありません
|
49
|
+
# (巨大な――数ギガバイトにも及ぶ――ファイルなどはオンメモリでは現実的に処理できませんね)
|
50
|
+
# データを少しずつ圧縮/伸張していく、ストリーム志向での処理は 02-* にて提示します
|
51
|
+
|
52
|
+
|
53
|
+
# 今回利用したクラス/モジュール/メソッド
|
54
|
+
# LZMA.encode
|
55
|
+
# LZMA.decode
|
56
|
+
|
57
|
+
|
58
|
+
# [EOF]
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#vim: set fileencoding:utf-8
|
3
|
+
|
4
|
+
# この ruby スクリプトは liblzma for Ruby の利用手引きを兼ねたサンプルスクリプトです。
|
5
|
+
|
6
|
+
|
7
|
+
# 01-* ではデータの全てを用意してから処理を行う方法を提示しますた。
|
8
|
+
# このサンプルではオンメモリでは難しい大きなデータを処理する方法を提示します。
|
9
|
+
|
10
|
+
|
11
|
+
# 始めはお決まりで
|
12
|
+
require "liblzma"
|
13
|
+
|
14
|
+
# 今回のサンプルでファイルI/Oを再現するためにStringIOを利用します
|
15
|
+
require "stringio"
|
16
|
+
|
17
|
+
# 圧縮元となるデータを用意します
|
18
|
+
original_data = "abcdefghijklmnopqrstuvwxyz" * 50
|
19
|
+
|
20
|
+
|
21
|
+
# まずは圧縮してみましょう
|
22
|
+
source = StringIO.new(original_data)
|
23
|
+
dest = ""
|
24
|
+
encoder = LZMA::Stream.encoder(LZMA::Filter.lzma2) # (1)
|
25
|
+
while fragment = source.read(16) # (2)
|
26
|
+
dest << encoder.update(fragment) # -
|
27
|
+
end # -
|
28
|
+
dest << encoder.finish # (3)
|
29
|
+
|
30
|
+
# (1) はじめに圧縮器を構築します
|
31
|
+
# LZMA::Stream.encoderの引数は、1つ以上をとることが出来ます (上限はliblzma由来となる4つです)
|
32
|
+
# LZMA::Filter.lzma2の引数は、LZMA.encodeの二つ目以降の引数と同じです
|
33
|
+
# (LZMA::Filter.lzma2(1) とか LZMA::Filter.lzma2(mode: LZMA::MODE_FAST) とか)
|
34
|
+
# (2) 取り込んだ部分データを処理します
|
35
|
+
# (3) データの終わりを通知し、圧縮器内に残ったデータを取り出します
|
36
|
+
# これを忘れるとxzデータストリームとして間違ったものが生成されます
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
encoded_data = dest
|
41
|
+
|
42
|
+
|
43
|
+
# 伸張も圧縮とほとんど同じです
|
44
|
+
source = StringIO.new(encoded_data)
|
45
|
+
dest = ""
|
46
|
+
decoder = LZMA::Stream.decoder # (1)
|
47
|
+
while fragment = source.read(16) # (2)
|
48
|
+
dest << decoder.update(fragment) # -
|
49
|
+
end # -
|
50
|
+
dest << decoder.finish # (3)
|
51
|
+
|
52
|
+
puts(dest == original_data ? "data ok" : "bad data")
|
53
|
+
|
54
|
+
# 圧縮時と伸張時の違いがわかりますか?
|
55
|
+
# はじめ(1)の伸張器の構築部分 (encoderかdecoderか) を変更するだけで、後は同じような文で処理を行えます
|
56
|
+
|
57
|
+
|
58
|
+
# 上の例ではxzデータストリームのみの対応です
|
59
|
+
# lzmaデータストリームは対象となりません
|
60
|
+
# xzもlzmaも区別なく伸張したい場合は、decoder ではなく auto_decoder を使います
|
61
|
+
source = StringIO.new(encoded_data)
|
62
|
+
dest = ""
|
63
|
+
decoder = LZMA::Stream.auto_decoder # (1)
|
64
|
+
while fragment = source.read(16) # (2)
|
65
|
+
dest << decoder.update(fragment) # -
|
66
|
+
end # -
|
67
|
+
dest << decoder.finish # (3)
|
68
|
+
|
69
|
+
puts(dest == original_data ? "data ok" : "bad data")
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
# 今回利用したクラス/モジュール/メソッド
|
74
|
+
# LZMA::Stream.encoder LZMA::Stream::Encoder.new と等価
|
75
|
+
# LZMA::Stream.decoder LZMA::Stream::Decoder.new と等価
|
76
|
+
# LZMA::Stream.auto_decoder LZMA::Stream::AutoDecoder.new と等価
|
77
|
+
# LZMA::Filter.lzma2 LZMA::Filter::LZMA2.new と等価
|
78
|
+
# LZMA::Stream#update
|
79
|
+
# LZMA::Stream#finish
|
80
|
+
|
81
|
+
|
82
|
+
# [EOF]
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: liblzma
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.3'
|
5
|
+
prerelease:
|
6
|
+
platform: x86-mingw32
|
7
|
+
authors:
|
8
|
+
- dearblue
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-21 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email: dearblue@users.sourceforge.jp
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- README.txt
|
21
|
+
- ext/extconf.rb
|
22
|
+
- ext/liblzma.c
|
23
|
+
- lib/liblzma.rb
|
24
|
+
- lib/1.9.1/liblzma.so
|
25
|
+
- lib/2.0.0/liblzma.so
|
26
|
+
- samples/01-easy_using.rb
|
27
|
+
- samples/02-streaming.rb
|
28
|
+
homepage:
|
29
|
+
licenses:
|
30
|
+
- 2-clause BSD License
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options:
|
33
|
+
- -eUTF-8
|
34
|
+
- -mREADME.txt
|
35
|
+
- README.txt
|
36
|
+
- ext/liblzma.c
|
37
|
+
- lib/liblzma.rb
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.9.3
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
requirements: []
|
53
|
+
rubyforge_project:
|
54
|
+
rubygems_version: 1.8.25
|
55
|
+
signing_key:
|
56
|
+
specification_version: 3
|
57
|
+
summary: ruby bindings for liblzma that is included in the xz utilities
|
58
|
+
test_files: []
|
59
|
+
has_rdoc: false
|