extlzma 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bf82c1e2d9fb2f56d0e2851f795fdfa76e556997
4
+ data.tar.gz: 4de5e918bced2b329be0c59325dc73607628f67d
5
+ SHA512:
6
+ metadata.gz: dda370856be76ff47634847c113b12289147d33e0a219a53416f7622c46a117c0e37a69e19434047f9d72902b400f3e3c04f7b74060d9060de116e64b58376a4
7
+ data.tar.gz: 22dbbcff9d81e58c81c4eb2d11ae33a9d7c126108bea980f692f35b90b91da0562e31e700dccfa495d9691b73261d6e606421d4483c6d536237febe66dc79aad
@@ -0,0 +1,29 @@
1
+ # extlzma 更新履歴
2
+
3
+ ## extlzma-0.4 (2016-5-8)
4
+
5
+ * 名称を liblzma から extlzma に変更
6
+ * ext/liblzma.c を機能ごとに分割
7
+ * LZMA::Stream が提供する機能を最低限のみとするように変更
8
+ * ``liblzma:lzma_code()`` を実行するのに最低限必要となる処理・機能のみの提供となるように変更しました。
9
+ * バッファリングなどの高級機能については、新設された LZMA::Encoder / LZMA::Decoder が提供します。
10
+ * LZMA::Stream は互換性を失っています。以前の stream.update、
11
+ stream.flush、stream.finish メソッドは元々 ``liblzma:lzma_code()`` を用いていたため、
12
+ stream.code に統合された形となっています。
13
+ * LZMA::Utils.crc32 および LZMA::Utils.crc64 で与える文字列オブジェクトのロックを排除
14
+ * これまで ``ruby:rb_str_locktmp()`` と ``ruby:rb_str_unlocktmp()``
15
+ を用いて文字列オブジェクトにロックをかけてきましたが、これを廃止しました。
16
+ * LZMA::Utils.crc32 / LZMA::Utils.crc64 を実行中に変更する可能性がある場合は、
17
+ 利用者側で排他的ロックを行うか、str.dup によってオブジェクトを複製する必要があります。
18
+ * LZMA::Utils.crcXX に関する追加機能
19
+ * LZMA::Utils.crc32\_digest / LZMA::Utils.crc32\_hexdigest
20
+ * LZMA::Utils.crc64\_digest / LZMA::Utils.crc64\_hexdigest
21
+ これらは LZMA::Utils::CRCXX.digest や LZMA::Utils::CRCXX.hexdigest を呼び出します。
22
+
23
+ ## liblzma-0.3 (2013-2-21)
24
+
25
+ (NO INFORMATION)
26
+
27
+ ## liblzma-0.2 (2012-3-31)
28
+
29
+ (NO INFORMATION)
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ extlzma license (2-clause BSD License)
2
+
3
+ Copyright (c) 2011, dearblue. All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or
6
+ without modification, are permitted provided that the following
7
+ conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright
10
+ notice, this list of conditions and the following disclaimer.
11
+ 2. Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in
13
+ the documentation and/or other materials provided with the
14
+ distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,44 @@
1
+
2
+ # extlzma - lzma for Ruby
3
+
4
+ * **package name**: extlzma
5
+ * **author**: dearblue (mailto:dearblue@users.osdn.me)
6
+ * **report issue to**: <https://osdn.jp/projects/rutsubo/ticket/>
7
+ * **how to install**: ``gem install extlzma``
8
+ * **version**: 0.4
9
+ * **release quality**: thechnical preview
10
+ * **license**: BSD-2-Clause (二条項BSDライセンス)
11
+ * **dependency gems**: none
12
+ * **dependency external c libraries**: liblzma <http://tukaani.org/xz/>
13
+ * **bundled external c libraries**: none
14
+
15
+ This document is written in Japanese.
16
+
17
+
18
+ ## はじめに
19
+
20
+ xz ユーティリティに含まれる liblzma の ruby バインディングです。
21
+
22
+ MinGW32 および FreeBSD 10.3R amd64 で動作確認を行っています。
23
+
24
+ MinGW32 向けにはバイナリパッケージも用意してあります (もしかしたら ruby-mswin32 でも動作するかもしれません)。
25
+
26
+
27
+ ## 利用できる主な機能
28
+
29
+ ※カッコ内は、本来の liblzma が提供する関数を示す
30
+
31
+ * LZMA::Stream::Encoder / LZMA::Stream::Decoder (lzma\_stream\_encoder / lzma\_stream\_decoder)
32
+ * LZMA::Stream::RawEncoder / LZMA::Stream::RawDecoder (lzma\_raw\_encoder / lzma\_raw\_decoder)
33
+ * LZMA::Filter::LZMA1 / LZMA::Filter::LZMA2 / LZMA::Filter::Delta
34
+ * LZMA.crc32 / LZMA.crc64 (lzma\_crc32 / lzma\_crc64)
35
+
36
+
37
+ ## 実際に利用するには
38
+
39
+ まともな文書化が出来ていないため、gem パッケージ内の『examples』ディレクトリに含まれる各サンプルを頼りにして下さい。
40
+
41
+
42
+ ## ライセンスについて
43
+
44
+ extlzma は、二条項 BSD ライセンスの下で利用できます。
@@ -0,0 +1,212 @@
1
+
2
+ require "pathname"
3
+ require "rake/clean"
4
+
5
+ docnames = "{README,LICENSE,CHANGELOG,Changelog,HISTORY}"
6
+ doctypes = "{,.txt,.rd,.rdoc,.md,.markdown}"
7
+ cexttypes = "{c,C,cc,cxx,cpp,h,H,hh}"
8
+
9
+ DOC = FileList["#{docnames}{,.ja}#{doctypes}"] +
10
+ FileList["{contrib,ext}/**/#{docnames}{,.ja}#{doctypes}"] +
11
+ FileList["ext/**/*.#{cexttypes}"]
12
+ EXT = FileList["ext/**/*"]
13
+ BIN = FileList["bin/*"]
14
+ LIB = FileList["lib/**/*.rb"]
15
+ SPEC = FileList["spec/**/*"]
16
+ TEST = FileList["test/**/*"]
17
+ EXAMPLE = FileList["examples/**/*"]
18
+ GEMSTUB_SRC = "gemstub.rb"
19
+ RAKEFILE = [File.basename(__FILE__), GEMSTUB_SRC]
20
+ EXTRA = []
21
+ EXTCONF = FileList["ext/**/extconf.rb"]
22
+ EXTCONF.reject! { |n| !File.file?(n) }
23
+ EXTMAP = {}
24
+
25
+ load GEMSTUB_SRC
26
+
27
+ EXTMAP.dup.each_pair do |dir, name|
28
+ EXTMAP[Pathname.new(dir).cleanpath.to_s] = Pathname.new(name).cleanpath.to_s
29
+ end
30
+
31
+ GEMSTUB.extensions += EXTCONF
32
+ GEMSTUB.executables += FileList["bin/*"].map { |n| File.basename n }
33
+ GEMSTUB.executables.sort!
34
+
35
+ PACKAGENAME = "#{GEMSTUB.name}-#{GEMSTUB.version}"
36
+ GEMFILE = "#{PACKAGENAME}.gem"
37
+ GEMSPEC = "#{PACKAGENAME}.gemspec"
38
+
39
+ GEMSTUB.files += DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + EXTRA
40
+ GEMSTUB.files.sort!
41
+ if GEMSTUB.rdoc_options.nil? || GEMSTUB.rdoc_options.empty?
42
+ readme = %W(.md .markdown .rd .rdoc .txt #{""}).map { |ext| "README#{ext}" }.find { |m| DOC.find { |n| n == m } }
43
+ GEMSTUB.rdoc_options = %w(--charset UTF-8) + (readme ? %W(-m #{readme}) : [])
44
+ end
45
+ GEMSTUB.extra_rdoc_files += DOC + LIB + EXT.reject { |n| n.include?("/externals/") || !%w(.h .hh .c .cc .cpp .cxx).include?(File.extname(n)) }
46
+ GEMSTUB.extra_rdoc_files.sort!
47
+
48
+ GEMSTUB_TRYOUT = GEMSTUB.dup
49
+ GEMSTUB_TRYOUT.version = "#{GEMSTUB.version}#{Time.now.strftime(".TRYOUT.%Y%m%d.%H%M%S")}"
50
+ PACKAGENAME_TRYOUT = "#{GEMSTUB.name}-#{GEMSTUB_TRYOUT.version}"
51
+ GEMFILE_TRYOUT = "#{PACKAGENAME_TRYOUT}.gem"
52
+ GEMSPEC_TRYOUT = "#{PACKAGENAME_TRYOUT}.gemspec"
53
+
54
+ CLEAN << GEMSPEC << GEMSPEC_TRYOUT
55
+ CLOBBER << GEMFILE
56
+
57
+ task :default => :tryout do
58
+ $stderr.puts <<-EOS
59
+ #{__FILE__}:#{__LINE__}:
60
+ \ttype ``rake release'' to build release package.
61
+ EOS
62
+ end
63
+
64
+ desc "build tryout package"
65
+ task :tryout
66
+
67
+ desc "build release package"
68
+ task :release => :all
69
+
70
+ unless EXTCONF.empty?
71
+ RUBYSET ||= (ENV["RUBYSET"] || "").split(",")
72
+
73
+ if RUBYSET.nil? || RUBYSET.empty?
74
+ $stderr.puts <<-EOS
75
+ #{__FILE__}:
76
+ |
77
+ | If you want binary gem package, launch rake with ``RUBYSET`` enviroment
78
+ | variable for set ruby interpreters by comma separated.
79
+ |
80
+ | e.g.) $ rake RUBYSET=ruby
81
+ | or) $ rake RUBYSET=ruby21,ruby22,ruby23
82
+ |
83
+ EOS
84
+ else
85
+ platforms = RUBYSET.map { |ruby| `#{ruby} --disable-gems -e "puts RUBY_PLATFORM"`.chomp }
86
+ platforms1 = platforms.uniq
87
+ unless platforms1.size == 1 && !platforms1[0].empty?
88
+ abort <<-EOS
89
+ #{__FILE__}:#{__LINE__}: different platforms:
90
+ #{RUBYSET.zip(platforms).map { |ruby, platform| "%24s => %s" % [ruby, platform] }.join("\n")}
91
+ ABORTED.
92
+ EOS
93
+ end
94
+ PLATFORM = platforms1[0]
95
+
96
+ RUBY_VERSIONS = RUBYSET.map do |ruby|
97
+ ver = `#{ruby} --disable-gems -e "puts RUBY_VERSION"`.slice(/\d+\.\d+/)
98
+ raise "failed ruby checking - ``#{ruby}''" unless $?.success?
99
+ [ver, ruby]
100
+ end
101
+
102
+ SOFILES_SET = RUBY_VERSIONS.map { |(ver, ruby)|
103
+ EXTCONF.map { |extconf|
104
+ extdir = Pathname.new(extconf).cleanpath.dirname.to_s
105
+ case
106
+ when soname = EXTMAP[extdir.sub(/^ext\//i, "")]
107
+ soname = soname.sub(/\.so$/i, "")
108
+ when extdir == "ext" || extdir == "."
109
+ soname = GEMSTUB.name
110
+ else
111
+ soname = File.basename(extdir)
112
+ end
113
+
114
+ [ruby, File.join("lib", "#{soname.sub(/(?<=\/)|^(?!.*\/)/, "#{ver}/")}.so"), extconf]
115
+ }
116
+ }.flatten(1)
117
+ SOFILES = SOFILES_SET.map { |(ruby, sopath, extconf)| sopath }
118
+
119
+ GEMSTUB_NATIVE = GEMSTUB.dup
120
+ GEMSTUB_NATIVE.files += SOFILES
121
+ GEMSTUB_NATIVE.platform = Gem::Platform.new(PLATFORM).to_s
122
+ GEMSTUB_NATIVE.extensions.clear
123
+ GEMFILE_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.version}-#{GEMSTUB_NATIVE.platform}.gem"
124
+ GEMSPEC_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.platform}.gemspec"
125
+
126
+ task :all => ["native-gem", GEMFILE]
127
+
128
+ desc "build binary gem package"
129
+ task "native-gem" => GEMFILE_NATIVE
130
+
131
+ desc "generate binary gemspec"
132
+ task "native-gemspec" => GEMSPEC_NATIVE
133
+
134
+ file GEMFILE_NATIVE => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + SOFILES + RAKEFILE + [GEMSPEC_NATIVE] do
135
+ sh "gem build #{GEMSPEC_NATIVE}"
136
+ end
137
+
138
+ file GEMSPEC_NATIVE => RAKEFILE do
139
+ File.write(GEMSPEC_NATIVE, GEMSTUB_NATIVE.to_ruby, mode: "wb")
140
+ end
141
+
142
+ desc "build c-extension libraries"
143
+ task "sofiles" => SOFILES
144
+
145
+ SOFILES_SET.each do |(ruby, soname, extconf)|
146
+ sodir = File.dirname(soname)
147
+ makefile = File.join(sodir, "Makefile")
148
+
149
+ CLEAN << GEMSPEC_NATIVE << sodir
150
+ CLOBBER << GEMFILE_NATIVE
151
+
152
+ directory sodir
153
+
154
+ desc "generate Makefile for binary extension library"
155
+ file makefile => [sodir, extconf] do
156
+ rel_extconf = Pathname.new(extconf).relative_path_from(Pathname.new(sodir)).to_s
157
+ cd sodir do
158
+ sh *%W"#{ruby} #{rel_extconf} --ruby=#{ruby} #{ENV["EXTCONF"]}"
159
+ end
160
+ end
161
+
162
+ desc "build binary extension library"
163
+ file soname => [makefile] + EXT do
164
+ cd sodir do
165
+ sh "make"
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+
173
+ task :all => GEMFILE
174
+ task :tryout => GEMFILE_TRYOUT
175
+
176
+ desc "generate local rdoc"
177
+ task :rdoc => DOC + LIB do
178
+ sh *(%w(rdoc) + GEMSTUB.rdoc_options + DOC + LIB)
179
+ end
180
+
181
+ desc "launch rspec"
182
+ task rspec: :all do
183
+ sh "rspec"
184
+ end
185
+
186
+ desc "build gem package"
187
+ task gem: GEMFILE
188
+
189
+ desc "generate gemspec"
190
+ task gemspec: GEMSPEC
191
+
192
+ desc "print package name"
193
+ task "package-name" do
194
+ puts PACKAGENAME
195
+ end
196
+
197
+ file GEMFILE => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + [GEMSPEC] do
198
+ sh "gem build #{GEMSPEC}"
199
+ end
200
+
201
+ file GEMFILE_TRYOUT => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + [GEMSPEC_TRYOUT] do
202
+ #file GEMFILE_TRYOUT do
203
+ sh "gem build #{GEMSPEC_TRYOUT}"
204
+ end
205
+
206
+ file GEMSPEC => RAKEFILE do
207
+ File.write(GEMSPEC, GEMSTUB.to_ruby, mode: "wb")
208
+ end
209
+
210
+ file GEMSPEC_TRYOUT => RAKEFILE do
211
+ File.write(GEMSPEC_TRYOUT, GEMSTUB_TRYOUT.to_ruby, mode: "wb")
212
+ end
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ #vim: set fileencoding:utf-8
3
+
4
+ # この ruby スクリプトは extlzma の利用手引きを兼ねたサンプルスクリプトです。
5
+
6
+
7
+ # このファイルにはメソッドを 1 回呼ぶだけで、圧縮・伸長を行う方法を記述しています。
8
+ #
9
+ # 今回利用するクラス/モジュール/メソッド
10
+ # * LZMA.encode
11
+ # * LZMA.decode
12
+
13
+
14
+ # ruby で extlzma の機能を利用するのに必要なのは、次の一文のみです
15
+ require "extlzma"
16
+
17
+
18
+ # 圧縮するデータを用意します
19
+ original_data = "0123456789abcdefghijklmnopqrstuvwxyz\n" * 10
20
+
21
+
22
+ # extlzma を使って、データを圧縮します (xz データストリームそのものが出力されます)
23
+ encoded_data = LZMA.encode(original_data)
24
+
25
+
26
+ # 圧縮レベルを変える場合は、第二引数に 0 から 9 の整数値を与えます
27
+ # この例は xz -1 と等価です
28
+ # (『9』を与える場合、作業メモリ空間が 700 MB ほど必要になります)
29
+ encoded_data = LZMA.encode(original_data, 1)
30
+
31
+
32
+ # さらに細かい調整は、圧縮レベル (プリセット値) の後にハッシュ値を指定します
33
+ # この例ではプリセット値を省略しています
34
+ # (プリセット値の規定値は liblzma 由来であり、『6』です)
35
+ encoded_data = LZMA.encode(original_data, mode: LZMA::MODE_FAST)
36
+
37
+ # この他にどんな値が与えられるかは、LZMA::Filter::LZMA2.new を参考にしてください
38
+
39
+
40
+ # 必要であればファイルに書き出しましょう
41
+ # xz データストリームそのものです
42
+ File.write("sample.txt.xz", encoded_data, mode: "wb")
43
+
44
+ # 出力されたファイルが xz ユーティリティ (もしくは 7-Zip) で開けることを確認してください
45
+
46
+
47
+
48
+ # 圧縮されたデータを伸張してみましょう
49
+ # たったこれだけです
50
+ puts LZMA.decode(encoded_data)
51
+
52
+
53
+ # 今回は処理したいデータをあらかじめ用意してから、一気に処理を行う方法を提示しました。
54
+ # しかしながら現実には、少しずつデータを処理していく必要のある事例も少なくありません。
55
+ # データを少しずつ圧縮・伸張していく、ストリーム志向での処理は 02-* にて提示します。
56
+
57
+
58
+ # [EOF]
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+ #vim: set fileencoding:utf-8
3
+
4
+ # この ruby スクリプトは extlzma の利用手引きを兼ねたサンプルスクリプトです。
5
+
6
+
7
+ # このファイルではオンメモリでは難しい大きなデータを処理する方法を提示します。
8
+ #
9
+ # 今回利用するクラス/モジュール/メソッド
10
+ # * LZMA.encode
11
+ # * LZMA.decode
12
+ # * LZMA::Encoder#<< (LZMA::Encoder#write)
13
+ # * LZMA::Encoder#finish
14
+ # * LZMA::Decoder#read
15
+
16
+
17
+ # 始めはお決まりで
18
+ require "extlzma"
19
+
20
+ # 今回のサンプルでファイルI/Oを再現するためにStringIOを利用します
21
+ require "stringio"
22
+
23
+ # 圧縮元となるデータを用意します
24
+ original_data = "abcdefghijklmnopqrstuvwxyz" * 50
25
+
26
+
27
+ # まずは圧縮してみましょう
28
+ src = StringIO.new(original_data)
29
+ dest = StringIO.new("")
30
+ encoder = LZMA.encode(dest) ## 圧縮器の生成
31
+ while buf = src.read(50)
32
+ encoder << buf ## データの圧縮
33
+ end
34
+ encoder.finish ## 最終処理を忘れずに実行して下さい
35
+ p dest.string # => 圧縮された xz データ
36
+
37
+
38
+ # 上の処理はブロックを用いて次のように置き換えることが出来ます
39
+ src = StringIO.new(original_data)
40
+ dest = StringIO.new("")
41
+ LZMA.encode(dest) do |encoder| ## 圧縮器の生成
42
+ while buf = src.read(50)
43
+ encoder << buf ## データの圧縮
44
+ end
45
+ end ## finish は不要
46
+ p dest.string # => 圧縮された xz データ
47
+
48
+
49
+ # 次は伸長処理です
50
+ encoded_data = dest.string
51
+
52
+ src = StringIO.new(encoded_data)
53
+ dest = StringIO.new("")
54
+ decoder = LZMA.decode(src)
55
+ while buf = dest.read(50)
56
+ dest << buf
57
+ end
58
+ puts(dest.string == original_data ? "data ok" : "bad data")
59
+
60
+ # これもブロックを用いて置き換えることが出来ます
61
+ src = StringIO.new(encoded_data)
62
+ dest = StringIO.new("")
63
+ LZMA.decode(src) do |decoder|
64
+ while buf = dest.read(50)
65
+ dest << buf
66
+ end
67
+ end
68
+ puts(dest.string == original_data ? "data ok" : "bad data")
69
+
70
+
71
+ # [EOF]