extzstd 0.0.1.CONCEPT → 0.0.2.CONCEPT
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.
- checksums.yaml +4 -4
- data/README.md +27 -15
- data/Rakefile +19 -8
- data/contrib/zstd/Makefile +5 -4
- data/contrib/zstd/fse.c +1528 -583
- data/contrib/zstd/fse.h +167 -227
- data/contrib/zstd/fse_static.h +197 -23
- data/contrib/zstd/zstd.c +594 -627
- data/contrib/zstd/zstd.h +7 -16
- data/contrib/zstd/zstd_static.h +24 -15
- data/ext/extconf.rb +6 -1
- data/ext/extzstd-stream.c +238 -59
- data/ext/extzstd.c +77 -18
- data/ext/extzstd.h +29 -2
- data/gemstub.rb +3 -3
- data/lib/extzstd.rb +127 -1
- data/lib/extzstd/version.rb +1 -3
- metadata +13 -7
data/ext/extzstd.c
CHANGED
@@ -3,8 +3,26 @@
|
|
3
3
|
VALUE mZstd;
|
4
4
|
VALUE eError;
|
5
5
|
|
6
|
+
static size_t
|
7
|
+
aux_ZSTD_compress_nogvl(va_list *vp)
|
8
|
+
{
|
9
|
+
char *dest = va_arg(*vp, char *);
|
10
|
+
size_t destsize = va_arg(*vp, size_t);
|
11
|
+
const char *src = va_arg(*vp, const char *);
|
12
|
+
size_t srcsize = va_arg(*vp, size_t);
|
13
|
+
return ZSTD_compress(dest, destsize, src, srcsize);
|
14
|
+
}
|
15
|
+
|
16
|
+
static inline size_t
|
17
|
+
aux_ZSTD_compress(char *dest, size_t destsize, const char *src, size_t srcsize)
|
18
|
+
{
|
19
|
+
return (size_t)aux_thread_call_without_gvl(
|
20
|
+
(void *(*)(void *))aux_ZSTD_compress_nogvl, NULL,
|
21
|
+
dest, destsize, src, srcsize);
|
22
|
+
}
|
23
|
+
|
6
24
|
static inline void
|
7
|
-
|
25
|
+
zstd_s_encode_args(int argc, VALUE argv[], VALUE *src, VALUE *dest, size_t *maxsize)
|
8
26
|
{
|
9
27
|
switch (argc) {
|
10
28
|
case 1:
|
@@ -46,31 +64,50 @@ zstd_encode_args(int argc, VALUE argv[], VALUE *src, VALUE *dest, size_t *maxsiz
|
|
46
64
|
* encode(src, size, dest) -> dest with encoded string
|
47
65
|
*/
|
48
66
|
static VALUE
|
49
|
-
|
67
|
+
zstd_s_encode(int argc, VALUE argv[], VALUE mod)
|
50
68
|
{
|
51
69
|
VALUE src, dest;
|
52
70
|
size_t maxsize;
|
53
|
-
|
71
|
+
zstd_s_encode_args(argc, argv, &src, &dest, &maxsize);
|
54
72
|
const char *srcp;
|
55
73
|
size_t srcsize;
|
56
74
|
RSTRING_GETMEM(src, srcp, srcsize);
|
57
|
-
|
75
|
+
rb_obj_infect(dest, src);
|
76
|
+
size_t s = aux_ZSTD_compress(RSTRING_PTR(dest), maxsize, srcp, srcsize);
|
58
77
|
if (ZSTD_isError(s)) {
|
59
78
|
rb_raise(eError,
|
60
|
-
|
61
|
-
|
62
|
-
|
79
|
+
"failed ZSTD_compress - %s(%d) in %s:%d:%s",
|
80
|
+
ZSTD_getErrorName(s), (int)s,
|
81
|
+
__FILE__, __LINE__, __func__);
|
63
82
|
}
|
64
83
|
if (s > maxsize) {
|
65
84
|
rb_bug("%s:%d:%s: detect buffer overflow in ZSTD_compress - maxsize is %zd, but returned size is %zd",
|
66
|
-
|
85
|
+
__FILE__, __LINE__, __func__, maxsize, s);
|
67
86
|
}
|
68
87
|
rb_str_set_len(dest, s);
|
69
88
|
return dest;
|
70
89
|
}
|
71
90
|
|
91
|
+
static size_t
|
92
|
+
aux_ZSTD_decompress_nogvl(va_list *vp)
|
93
|
+
{
|
94
|
+
char *dest = va_arg(*vp, char *);
|
95
|
+
size_t destsize = va_arg(*vp, size_t);
|
96
|
+
const char *src = va_arg(*vp, const char *);
|
97
|
+
size_t srcsize = va_arg(*vp, size_t);
|
98
|
+
return ZSTD_decompress(dest, destsize, src, srcsize);
|
99
|
+
}
|
100
|
+
|
101
|
+
static inline size_t
|
102
|
+
aux_ZSTD_decompress(char *dest, size_t destsize, const char *src, size_t srcsize)
|
103
|
+
{
|
104
|
+
return (size_t)aux_thread_call_without_gvl(
|
105
|
+
(void *(*)(void *))aux_ZSTD_decompress_nogvl, NULL,
|
106
|
+
dest, destsize, src, srcsize);
|
107
|
+
}
|
108
|
+
|
72
109
|
static inline void
|
73
|
-
|
110
|
+
zstd_s_decode_args(int argc, VALUE argv[], VALUE *src, VALUE *dest, size_t *maxsize)
|
74
111
|
{
|
75
112
|
switch (argc) {
|
76
113
|
case 2:
|
@@ -98,35 +135,57 @@ zstd_decode_args(int argc, VALUE argv[], VALUE *src, VALUE *dest, size_t *maxsiz
|
|
98
135
|
* decode(src, size, dest) -> dest with decoded string
|
99
136
|
*/
|
100
137
|
static VALUE
|
101
|
-
|
138
|
+
zstd_s_decode(int argc, VALUE argv[], VALUE mod)
|
102
139
|
{
|
103
140
|
VALUE src, dest;
|
104
141
|
size_t maxsize;
|
105
|
-
|
142
|
+
zstd_s_decode_args(argc, argv, &src, &dest, &maxsize);
|
106
143
|
const char *srcp;
|
107
144
|
size_t srcsize;
|
108
145
|
RSTRING_GETMEM(src, srcp, srcsize);
|
109
|
-
|
146
|
+
rb_obj_infect(dest, src);
|
147
|
+
size_t s = aux_ZSTD_decompress(RSTRING_PTR(dest), maxsize, srcp, srcsize);
|
110
148
|
if (ZSTD_isError(s)) {
|
111
149
|
rb_raise(eError,
|
112
|
-
|
113
|
-
|
114
|
-
|
150
|
+
"failed ZSTD_decompress - %s(%d) in %s:%d:%s",
|
151
|
+
ZSTD_getErrorName(s), (int)s,
|
152
|
+
__FILE__, __LINE__, __func__);
|
115
153
|
}
|
116
154
|
if (s > maxsize) {
|
117
155
|
rb_bug("%s:%d:%s: detect buffer overflow in ZSTD_compress - maxsize is %zd, but returned size is %zd",
|
118
|
-
|
156
|
+
__FILE__, __LINE__, __func__, maxsize, s);
|
119
157
|
}
|
120
158
|
rb_str_set_len(dest, s);
|
121
159
|
return dest;
|
122
160
|
}
|
123
161
|
|
162
|
+
static VALUE
|
163
|
+
libver_s_to_s(VALUE ver)
|
164
|
+
{
|
165
|
+
static VALUE str;
|
166
|
+
if (!str) {
|
167
|
+
str = rb_sprintf("%d.%d.%d",
|
168
|
+
ZSTD_VERSION_MAJOR,
|
169
|
+
ZSTD_VERSION_MINOR,
|
170
|
+
ZSTD_VERSION_RELEASE);
|
171
|
+
}
|
172
|
+
return str;
|
173
|
+
}
|
174
|
+
|
124
175
|
void
|
125
176
|
Init_extzstd(void)
|
126
177
|
{
|
127
178
|
mZstd = rb_define_module("Zstd");
|
128
|
-
rb_define_singleton_method(mZstd, "encode", RUBY_METHOD_FUNC(
|
129
|
-
rb_define_singleton_method(mZstd, "decode", RUBY_METHOD_FUNC(
|
179
|
+
rb_define_singleton_method(mZstd, "encode", RUBY_METHOD_FUNC(zstd_s_encode), -1);
|
180
|
+
rb_define_singleton_method(mZstd, "decode", RUBY_METHOD_FUNC(zstd_s_decode), -1);
|
181
|
+
|
182
|
+
VALUE libver = rb_ary_new3(3,
|
183
|
+
INT2FIX(ZSTD_VERSION_MAJOR),
|
184
|
+
INT2FIX(ZSTD_VERSION_MINOR),
|
185
|
+
INT2FIX(ZSTD_VERSION_RELEASE));
|
186
|
+
rb_define_singleton_method(libver, "to_s", RUBY_METHOD_FUNC(libver_s_to_s), 0);
|
187
|
+
rb_obj_freeze(libver);
|
188
|
+
rb_define_const(mZstd, "LIBRARY_VERSION", libver);
|
130
189
|
|
131
190
|
eError = rb_define_class_under(mZstd, "Error", rb_eRuntimeError);
|
132
191
|
|
data/ext/extzstd.h
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
#ifndef EXTZSTD_H
|
2
2
|
#define EXTZSTD_H 1
|
3
3
|
|
4
|
+
#include <stdarg.h>
|
4
5
|
#include <ruby.h>
|
6
|
+
#include <ruby/thread.h>
|
5
7
|
#include <zstd.h>
|
6
8
|
#include <zstd_static.h>
|
7
9
|
|
10
|
+
#define RDOCFAKE(DUMMY_CODE)
|
11
|
+
|
8
12
|
extern VALUE mZstd;
|
9
|
-
extern VALUE cStreamEncoder;
|
10
|
-
extern VALUE cStreamDecoder;
|
11
13
|
extern VALUE eError;
|
12
14
|
|
13
15
|
void init_extzstd_stream(void);
|
@@ -49,4 +51,29 @@ getref(VALUE v, const rb_data_type_t *type)
|
|
49
51
|
return checkref(v, getrefp(v, type));
|
50
52
|
}
|
51
53
|
|
54
|
+
static inline VALUE
|
55
|
+
aux_str_modify_expand(VALUE s, size_t z)
|
56
|
+
{
|
57
|
+
rb_check_type(s, RUBY_T_STRING);
|
58
|
+
size_t size = RSTRING_LEN(s);
|
59
|
+
if (z > size) {
|
60
|
+
rb_str_modify_expand(s, z - size);
|
61
|
+
} else {
|
62
|
+
rb_str_modify(s);
|
63
|
+
}
|
64
|
+
return s;
|
65
|
+
}
|
66
|
+
|
67
|
+
static inline void *
|
68
|
+
aux_thread_call_without_gvl(void *(*func)(void *), void (*cancel)(void *), ...)
|
69
|
+
{
|
70
|
+
va_list va1, va2;
|
71
|
+
va_start(va1, cancel);
|
72
|
+
va_start(va2, cancel);
|
73
|
+
void *p = rb_thread_call_without_gvl(func, &va1, cancel, &va2);
|
74
|
+
va_end(va1);
|
75
|
+
va_end(va2);
|
76
|
+
return p;
|
77
|
+
}
|
78
|
+
|
52
79
|
#endif /* !EXTZSTD_H */
|
data/gemstub.rb
CHANGED
@@ -5,12 +5,12 @@ GEMSTUB = Gem::Specification.new do |s|
|
|
5
5
|
s.version = Zstd::VERSION
|
6
6
|
s.summary = "ruby bindings for Zstandard (zstd)"
|
7
7
|
s.description = <<EOS
|
8
|
-
ruby bindings for Zstandard (zstd) <https://github.com/Cyan4973/zstd>.
|
8
|
+
unoficial ruby bindings for Zstandard (zstd) <https://github.com/Cyan4973/zstd>.
|
9
9
|
EOS
|
10
|
-
s.homepage = "
|
10
|
+
s.homepage = "https://osdn.jp/projects/rutsubo/"
|
11
11
|
s.license = "2-clause BSD License"
|
12
12
|
s.author = "dearblue"
|
13
|
-
s.email = "dearblue@users.
|
13
|
+
s.email = "dearblue@users.osdn.me"
|
14
14
|
|
15
15
|
s.required_ruby_version = ">= 2.0"
|
16
16
|
s.add_development_dependency "rake", "~> 10.0"
|
data/lib/extzstd.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#vim: set fileencoding:utf-8
|
2
2
|
|
3
|
-
ver = RbConfig::CONFIG["ruby_version"]
|
3
|
+
ver = RbConfig::CONFIG["ruby_version"].slice(/\d+\.\d+/)
|
4
4
|
soname = File.basename(__FILE__, ".rb") << ".so"
|
5
5
|
lib = File.join(File.dirname(__FILE__), ver, soname)
|
6
6
|
if File.file?(lib)
|
@@ -10,3 +10,129 @@ else
|
|
10
10
|
end
|
11
11
|
|
12
12
|
require_relative "extzstd/version"
|
13
|
+
|
14
|
+
require "stringio"
|
15
|
+
|
16
|
+
if false
|
17
|
+
def p(*args)
|
18
|
+
sf = File.basename(caller(1, 1)[0])
|
19
|
+
args.each do |mesg|
|
20
|
+
$stderr.puts "#{sf}: #{mesg.inspect}\n"
|
21
|
+
end
|
22
|
+
return *args
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module Zstd
|
27
|
+
module Aux
|
28
|
+
module_function
|
29
|
+
def io_read(io, size, buf)
|
30
|
+
raise Error, "encounted EOF (read error)" unless io.read(size, buf)
|
31
|
+
raise Error, "read size too small (read error)" unless buf.bytesize == size
|
32
|
+
buf
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Decoder < Struct.new(:decoder, :import, :readbuf, :destbuf, :status)
|
37
|
+
BLOCKSIZE = 1 << 18
|
38
|
+
STATUS_TERMINATE = nil
|
39
|
+
STATUS_BLOCK_APPROACH = 1
|
40
|
+
STATUS_INBLOCK = 2
|
41
|
+
|
42
|
+
#
|
43
|
+
# call-seq:
|
44
|
+
# open(import) -> decoder
|
45
|
+
# open(import) { |decoder| ... } -> yield returned value
|
46
|
+
#
|
47
|
+
# [import]
|
48
|
+
# String instance or +read+ method haved Object.
|
49
|
+
#
|
50
|
+
def self.open(import)
|
51
|
+
import = StringIO.new(import) if import.kind_of?(String)
|
52
|
+
dec = new(import)
|
53
|
+
|
54
|
+
return dec unless block_given?
|
55
|
+
|
56
|
+
begin
|
57
|
+
yield(dec)
|
58
|
+
ensure
|
59
|
+
dec.close rescue nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize(import)
|
64
|
+
raise Error, "require .read method - <%s:0x%08x>" % [import.class, import.object_id << 1] unless import.respond_to?(:read)
|
65
|
+
super(LowLevelDecoder.new, import, "".b, "".b, STATUS_BLOCK_APPROACH)
|
66
|
+
|
67
|
+
# read header
|
68
|
+
Aux.io_read(import, decoder.next_srcsize, readbuf)
|
69
|
+
decoder.decode(readbuf, "", 0)
|
70
|
+
end
|
71
|
+
|
72
|
+
def close
|
73
|
+
decoder.reset
|
74
|
+
import.close rescue nil if import.respond_to?(:close)
|
75
|
+
readbuf.clear
|
76
|
+
destbuf.clear
|
77
|
+
self.status = STATUS_TERMINATE
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
|
81
|
+
def eof
|
82
|
+
!status
|
83
|
+
end
|
84
|
+
|
85
|
+
alias eof? eof
|
86
|
+
|
87
|
+
def read(size = nil, dest = "".b)
|
88
|
+
dest.clear
|
89
|
+
destenc = dest.encoding
|
90
|
+
dest.force_encoding Encoding::BINARY
|
91
|
+
|
92
|
+
until size && size <= 0
|
93
|
+
if destbuf.empty?
|
94
|
+
unless fetch
|
95
|
+
return nil if dest.empty?
|
96
|
+
break
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
d = destbuf.slice!(0, size || destbuf.bytesize)
|
101
|
+
dest << d
|
102
|
+
|
103
|
+
size -= d.bytesize if size
|
104
|
+
end
|
105
|
+
|
106
|
+
dest
|
107
|
+
ensure
|
108
|
+
dest.force_encoding destenc rescue nil if destenc
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
def fetch
|
113
|
+
return nil if eof?
|
114
|
+
|
115
|
+
while true
|
116
|
+
if status == STATUS_INBLOCK
|
117
|
+
s = decoder.next_srcsize
|
118
|
+
if s > 0
|
119
|
+
Aux.io_read(import, s, readbuf)
|
120
|
+
return destbuf if decoder.decode(readbuf, destbuf, BLOCKSIZE)
|
121
|
+
next
|
122
|
+
end
|
123
|
+
self.status = STATUS_BLOCK_APPROACH
|
124
|
+
end
|
125
|
+
|
126
|
+
# status == STATUS_BLOCK_APPROACH
|
127
|
+
s = decoder.next_srcsize
|
128
|
+
if s == 0
|
129
|
+
self.status = STATUS_TERMINATE
|
130
|
+
return nil
|
131
|
+
end
|
132
|
+
Aux.io_read(import, s, readbuf)
|
133
|
+
decoder.decode(readbuf, "", 0)
|
134
|
+
self.status = STATUS_INBLOCK
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/lib/extzstd/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extzstd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2.CONCEPT
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dearblue
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -25,14 +25,15 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '10.0'
|
27
27
|
description: |
|
28
|
-
ruby bindings for Zstandard (zstd) <https://github.com/Cyan4973/zstd>.
|
29
|
-
email: dearblue@users.
|
28
|
+
unoficial ruby bindings for Zstandard (zstd) <https://github.com/Cyan4973/zstd>.
|
29
|
+
email: dearblue@users.osdn.me
|
30
30
|
executables: []
|
31
31
|
extensions:
|
32
32
|
- ext/extconf.rb
|
33
33
|
extra_rdoc_files:
|
34
34
|
- LICENSE
|
35
35
|
- README.md
|
36
|
+
- contrib/zstd/LICENSE
|
36
37
|
- ext/extzstd-stream.c
|
37
38
|
- ext/extzstd.c
|
38
39
|
- ext/extzstd.h
|
@@ -58,12 +59,16 @@ files:
|
|
58
59
|
- gemstub.rb
|
59
60
|
- lib/extzstd.rb
|
60
61
|
- lib/extzstd/version.rb
|
61
|
-
homepage:
|
62
|
+
homepage: https://osdn.jp/projects/rutsubo/
|
62
63
|
licenses:
|
63
64
|
- 2-clause BSD License
|
64
65
|
metadata: {}
|
65
66
|
post_install_message:
|
66
|
-
rdoc_options:
|
67
|
+
rdoc_options:
|
68
|
+
- "--charset"
|
69
|
+
- UTF-8
|
70
|
+
- "-m"
|
71
|
+
- README.md
|
67
72
|
require_paths:
|
68
73
|
- lib
|
69
74
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -78,8 +83,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
83
|
version: 1.3.1
|
79
84
|
requirements: []
|
80
85
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.4.
|
86
|
+
rubygems_version: 2.4.8
|
82
87
|
signing_key:
|
83
88
|
specification_version: 4
|
84
89
|
summary: ruby bindings for Zstandard (zstd)
|
85
90
|
test_files: []
|
91
|
+
has_rdoc:
|