lz4-ruby 0.1.2 → 0.1.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.rdoc +1 -2
- data/VERSION +1 -1
- data/ext/extconf.rb +9 -6
- data/ext/lz4ruby.c +57 -13
- data/lz4-ruby.gemspec +2 -2
- data/test/test_lz4-ruby.rb +52 -1
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -22,7 +22,7 @@ Ruby bindings for {LZ4}[http://code.google.com/p/lz4/].
|
|
22
22
|
|
23
23
|
== Benchmark
|
24
24
|
|
25
|
-
Tested on VirtualBox VM : 2-core
|
25
|
+
Tested on VirtualBox VM : 2-core / 4GB RAM (Host : Core i5-2520M / 8GB RAM).
|
26
26
|
|
27
27
|
=== {enwik8}[http://mattmahoney.net/dc/enwik8.zip]
|
28
28
|
method ratio(bpc) comp.time(ms) uncomp.time(ms)
|
@@ -34,7 +34,6 @@ Tested on VirtualBox VM : 2-core, 4GB RAM (Host : Core i5-2520M / 8GB RAM).
|
|
34
34
|
== TODO
|
35
35
|
|
36
36
|
* Write API documents.
|
37
|
-
* Write test codes.
|
38
37
|
* Support mswin32 platform.
|
39
38
|
|
40
39
|
== Copyright
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/ext/extconf.rb
CHANGED
@@ -4,8 +4,9 @@ LZ4_REV_NO = 66
|
|
4
4
|
|
5
5
|
URL = "http://lz4.googlecode.com/svn-history/r#{LZ4_REV_NO}/trunk/"
|
6
6
|
|
7
|
-
def download_from_web(
|
8
|
-
|
7
|
+
def download_from_web(file)
|
8
|
+
File.delete(file) if File.file?(file)
|
9
|
+
`wget #{URL}/#{file}`
|
9
10
|
|
10
11
|
if $?.exitstatus != 0
|
11
12
|
return false
|
@@ -14,10 +15,12 @@ def download_from_web(url)
|
|
14
15
|
return true
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
[ "lz4.c",
|
19
|
+
"lz4.h",
|
20
|
+
"lz4hc.c",
|
21
|
+
"lz4hc.h" ].each do |filename|
|
22
|
+
exit if !download_from_web(filename)
|
23
|
+
end
|
21
24
|
|
22
25
|
$CFLAGS += " -Wall "
|
23
26
|
|
data/ext/lz4ruby.c
CHANGED
@@ -7,11 +7,58 @@ typedef int (*CompressFunc)(const char *source, char *dest, int isize);
|
|
7
7
|
static VALUE lz4;
|
8
8
|
static VALUE lz4_error;
|
9
9
|
|
10
|
+
static int encode_varbyte(int value, char *buf) {
|
11
|
+
buf[0] = value & 0x7f; value >>= 7;
|
12
|
+
if (value == 0) { return 1; }
|
13
|
+
buf[0] |= 0x80;
|
14
|
+
|
15
|
+
buf[1] = value & 0x7f; value >>= 7;
|
16
|
+
if (value == 0) { return 2; }
|
17
|
+
buf[1] |= 0x80;
|
18
|
+
|
19
|
+
buf[2] = value & 0x7f; value >>= 7;
|
20
|
+
if (value == 0) { return 3; }
|
21
|
+
buf[2] |= 0x80;
|
22
|
+
|
23
|
+
buf[3] = value & 0x7f; value >>= 7;
|
24
|
+
if (value == 0) { return 4; }
|
25
|
+
buf[3] |= 0x80;
|
26
|
+
|
27
|
+
buf[4] = value & 0x7f;
|
28
|
+
return 5;
|
29
|
+
}
|
30
|
+
|
31
|
+
static int decode_varbyte(const char *src, int len, int *value) {
|
32
|
+
if (len < 1) { return -1; }
|
33
|
+
|
34
|
+
*value = src[0] & 0x7f;
|
35
|
+
if ((src[0] & 0x80) == 0) { return 1; }
|
36
|
+
if (len < 2) { return -1; }
|
37
|
+
|
38
|
+
*value |= (src[1] & 0x7f) << 7;
|
39
|
+
if ((src[1] & 0x80) == 0) { return 2; }
|
40
|
+
if (len < 3) { return -1; }
|
41
|
+
|
42
|
+
*value |= (src[2] & 0x7f) << 14;
|
43
|
+
if ((src[2] & 0x80) == 0) { return 3; }
|
44
|
+
if (len < 4) { return -1; }
|
45
|
+
|
46
|
+
*value |= (src[3] & 0x7f) << 21;
|
47
|
+
if ((src[3] & 0x80) == 0) { return 4; }
|
48
|
+
if (len < 5) { return -1; }
|
49
|
+
|
50
|
+
*value |= (src[4] & 0x7f) << 28;
|
51
|
+
|
52
|
+
return 5;
|
53
|
+
}
|
54
|
+
|
10
55
|
static VALUE compress(CompressFunc compressor, VALUE self, VALUE source) {
|
11
56
|
const char *src_p = NULL;
|
57
|
+
char varbyte[5];
|
12
58
|
char *buf = NULL;
|
13
59
|
VALUE result;
|
14
60
|
int src_size;
|
61
|
+
int varbyte_len;
|
15
62
|
int buf_size;
|
16
63
|
int comp_size;
|
17
64
|
|
@@ -20,16 +67,15 @@ static VALUE compress(CompressFunc compressor, VALUE self, VALUE source) {
|
|
20
67
|
src_size = RSTRING_LEN(source);
|
21
68
|
buf_size = LZ4_compressBound(src_size);
|
22
69
|
|
23
|
-
|
70
|
+
varbyte_len = encode_varbyte(src_size, varbyte);
|
71
|
+
|
72
|
+
result = rb_str_new(NULL, buf_size + varbyte_len);
|
24
73
|
buf = RSTRING_PTR(result);
|
25
74
|
|
26
|
-
buf
|
27
|
-
buf[1] = (char)((src_size >> 16) & 0xff);
|
28
|
-
buf[2] = (char)((src_size >> 8) & 0xff);
|
29
|
-
buf[3] = (char)(src_size & 0xff);
|
75
|
+
memcpy(buf, varbyte, varbyte_len);
|
30
76
|
|
31
|
-
comp_size = compressor(src_p, buf +
|
32
|
-
rb_str_resize(result, comp_size +
|
77
|
+
comp_size = compressor(src_p, buf + varbyte_len, src_size);
|
78
|
+
rb_str_resize(result, comp_size + varbyte_len);
|
33
79
|
|
34
80
|
return result;
|
35
81
|
}
|
@@ -47,22 +93,20 @@ static VALUE lz4_ruby_uncompress(VALUE self, VALUE source) {
|
|
47
93
|
char *buf = NULL;
|
48
94
|
VALUE result;
|
49
95
|
int src_size;
|
50
|
-
int
|
96
|
+
int varbyte_len;
|
97
|
+
int buf_size = 0;
|
51
98
|
int read_bytes;
|
52
99
|
|
53
100
|
Check_Type(source, T_STRING);
|
54
101
|
src_p = RSTRING_PTR(source);
|
55
102
|
src_size = RSTRING_LEN(source);
|
56
103
|
|
57
|
-
|
58
|
-
| ((src_p[1] & 0xffU) << 16)
|
59
|
-
| ((src_p[2] & 0xffU) << 8)
|
60
|
-
| (src_p[3] & 0xffU);
|
104
|
+
varbyte_len = decode_varbyte(src_p, src_size, &buf_size);
|
61
105
|
|
62
106
|
result = rb_str_new(NULL, buf_size);
|
63
107
|
buf = RSTRING_PTR(result);
|
64
108
|
|
65
|
-
read_bytes = LZ4_uncompress(src_p +
|
109
|
+
read_bytes = LZ4_uncompress(src_p + varbyte_len, buf, buf_size);
|
66
110
|
if (read_bytes < 0) {
|
67
111
|
rb_raise(lz4_error, "Compressed data is maybe corrupted.");
|
68
112
|
}
|
data/lz4-ruby.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "lz4-ruby"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["KOMIYA Atsushi"]
|
12
|
-
s.date = "2012-06-
|
12
|
+
s.date = "2012-06-05"
|
13
13
|
s.description = "Ruby bindings for LZ4."
|
14
14
|
s.email = "komiya.atsushi@gmail.com"
|
15
15
|
s.extensions = ["ext/extconf.rb"]
|
data/test/test_lz4-ruby.rb
CHANGED
@@ -1,8 +1,18 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestLz4Ruby < Test::Unit::TestCase
|
4
|
+
LOOP_COUNT = 257
|
5
|
+
|
6
|
+
@@random = Random.new(123)
|
7
|
+
|
4
8
|
context "LZ4::compress" do
|
5
|
-
|
9
|
+
should "empty text" do
|
10
|
+
compressed = LZ4::compress("")
|
11
|
+
uncompressed = LZ4::uncompress(compressed)
|
12
|
+
assert_empty("", uncompressed)
|
13
|
+
end
|
14
|
+
|
15
|
+
LOOP_COUNT.times do |t|
|
6
16
|
len = t + 1
|
7
17
|
text = "a" * len
|
8
18
|
|
@@ -12,5 +22,46 @@ class TestLz4Ruby < Test::Unit::TestCase
|
|
12
22
|
assert_equal(text, uncompressed)
|
13
23
|
end
|
14
24
|
end
|
25
|
+
|
26
|
+
LOOP_COUNT.times do |t|
|
27
|
+
len = t + 1
|
28
|
+
text = @@random.bytes(len)
|
29
|
+
|
30
|
+
should "random text of #{len} bytes" do
|
31
|
+
compressed = LZ4::compress(text)
|
32
|
+
uncompressed = LZ4::uncompress(compressed)
|
33
|
+
assert_equal(text, uncompressed)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "LZ4::compressHC" do
|
39
|
+
should "empty text" do
|
40
|
+
compressed = LZ4::compressHC("")
|
41
|
+
uncompressed = LZ4::uncompress(compressed)
|
42
|
+
assert_empty("", uncompressed)
|
43
|
+
end
|
44
|
+
|
45
|
+
LOOP_COUNT.times do |t|
|
46
|
+
len = t + 1
|
47
|
+
text = "a" * len
|
48
|
+
|
49
|
+
should "text of #{len} \"a\"'s" do
|
50
|
+
compressed = LZ4::compressHC(text)
|
51
|
+
uncompressed = LZ4::uncompress(compressed)
|
52
|
+
assert_equal(text, uncompressed)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
LOOP_COUNT.times do |t|
|
57
|
+
len = t + 1
|
58
|
+
text = @@random.bytes(len)
|
59
|
+
|
60
|
+
should "random text of #{len} bytes" do
|
61
|
+
compressed = LZ4::compressHC(text)
|
62
|
+
uncompressed = LZ4::uncompress(compressed)
|
63
|
+
assert_equal(text, uncompressed)
|
64
|
+
end
|
65
|
+
end
|
15
66
|
end
|
16
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lz4-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.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: 2012-06-
|
12
|
+
date: 2012-06-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: shoulda
|
@@ -116,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
116
|
version: '0'
|
117
117
|
segments:
|
118
118
|
- 0
|
119
|
-
hash:
|
119
|
+
hash: -379957487
|
120
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
121
|
none: false
|
122
122
|
requirements:
|