yaz0 0.1.1 → 0.4.0
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/Gemfile +1 -1
- data/ext/yaz0/ext_yaz0.c +165 -0
- data/ext/yaz0/ext_yaz0.h +8 -0
- data/ext/yaz0/extconf.rb +11 -1
- data/lib/yaz0/version.rb +1 -1
- data/lib/yaz0/yaz0.bundle +0 -0
- data/lib/yaz0.rb +42 -0
- data/libyaz0/include/yaz0.h +34 -0
- data/libyaz0/src/libyaz0/CMakeLists.txt +3 -0
- data/libyaz0/src/libyaz0/compress.c +434 -0
- data/libyaz0/src/libyaz0/decompress.c +197 -0
- data/libyaz0/src/libyaz0/libyaz0.c +64 -0
- data/libyaz0/src/libyaz0/libyaz0.h +49 -0
- data/libyaz0/src/libyaz0/util.c +6 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/yaz0_spec.rb +39 -0
- data/yaz0.gemspec +13 -3
- metadata +19 -16
- data/.gitignore +0 -19
- data/.travis.yml +0 -6
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/ext/yaz0/buffer.c +0 -29
- data/ext/yaz0/compress.c +0 -319
- data/ext/yaz0/decompress.c +0 -64
- data/ext/yaz0/yaz0.c +0 -48
- data/ext/yaz0/yaz0.h +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dea3dd6f151a4a0aeebb87258fd9ca033d92a91462ebe2ad9e121777c23aea5
|
4
|
+
data.tar.gz: c9885eb2142c21af2026b226c3c2a4175e8b7f3f1ac745d013135b282c963703
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 483a8e9de03d2c6f0e5fea0a0be1b048a2b46641528e3b00e165effc7a2794d3b04aa84d8aa5d07c9509baee680ee7783cba3fd0fa44b2e9435c44fd03011904
|
7
|
+
data.tar.gz: 243f77ffbd66fe1c0df94e474dcf92297e792bfb02fb3481e5518a5627c733c505cf5f282ff338a9d6a692ccd5d39e9c6f5b3984f364ac390d99976be454b572
|
data/Gemfile
CHANGED
data/ext/yaz0/ext_yaz0.c
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
#include "ext_yaz0.h"
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <stdint.h>
|
4
|
+
|
5
|
+
#define BUFSIZE 0x4000
|
6
|
+
|
7
|
+
static void ext_yaz0_stream_free(void*);
|
8
|
+
|
9
|
+
static VALUE class_yaz0_stream;
|
10
|
+
static VALUE class_yaz0_error;
|
11
|
+
static VALUE class_yaz0_error_bad_magic;
|
12
|
+
static VALUE class_yaz0_error_end_of_file;
|
13
|
+
|
14
|
+
static struct rb_data_type_struct type_yaz0_stream = {
|
15
|
+
"yaz0_stream",
|
16
|
+
{ NULL, ext_yaz0_stream_free, NULL },
|
17
|
+
NULL,
|
18
|
+
NULL,
|
19
|
+
RUBY_TYPED_FREE_IMMEDIATELY
|
20
|
+
};
|
21
|
+
|
22
|
+
static void
|
23
|
+
ext_yaz0_stream_free(void* s)
|
24
|
+
{
|
25
|
+
yaz0Destroy((Yaz0Stream*)s);
|
26
|
+
}
|
27
|
+
|
28
|
+
static VALUE
|
29
|
+
ext_yaz0_stream_alloc(VALUE klass)
|
30
|
+
{
|
31
|
+
Yaz0Stream* s;
|
32
|
+
int ret;
|
33
|
+
|
34
|
+
ret = yaz0Init(&s);
|
35
|
+
if (ret == YAZ0_OUT_OF_MEMORY)
|
36
|
+
rb_raise(rb_eNoMemError, "Out of memory");
|
37
|
+
return TypedData_Wrap_Struct(klass, &type_yaz0_stream, s);
|
38
|
+
}
|
39
|
+
|
40
|
+
static void*
|
41
|
+
run_NoGVL(void* arg)
|
42
|
+
{
|
43
|
+
return (void*)(intptr_t)yaz0Run((Yaz0Stream*)arg);
|
44
|
+
}
|
45
|
+
|
46
|
+
static VALUE
|
47
|
+
run(VALUE self, VALUE io_in, VALUE io_out, int compress, int size, int level)
|
48
|
+
{
|
49
|
+
Yaz0Stream* s;
|
50
|
+
VALUE buffer_in;
|
51
|
+
VALUE buffer_out;
|
52
|
+
VALUE tmp;
|
53
|
+
int in_is_str;
|
54
|
+
int ret;
|
55
|
+
|
56
|
+
in_is_str = TYPE(io_in) == T_STRING;
|
57
|
+
|
58
|
+
TypedData_Get_Struct(self, Yaz0Stream, &type_yaz0_stream, s);
|
59
|
+
if (compress)
|
60
|
+
yaz0ModeCompress(s, size, level);
|
61
|
+
else
|
62
|
+
yaz0ModeDecompress(s);
|
63
|
+
|
64
|
+
/* Init the buffers */
|
65
|
+
if (!in_is_str)
|
66
|
+
{
|
67
|
+
buffer_in = rb_str_new(NULL, 0);
|
68
|
+
rb_str_resize(buffer_in, BUFSIZE);
|
69
|
+
rb_gc_register_address(&buffer_in);
|
70
|
+
rb_funcall(io_in, rb_intern("read"), 2, INT2FIX(BUFSIZE), buffer_in);
|
71
|
+
}
|
72
|
+
else
|
73
|
+
{
|
74
|
+
buffer_in = rb_obj_dup(io_in);
|
75
|
+
rb_gc_register_address(&buffer_in);
|
76
|
+
}
|
77
|
+
yaz0Input(s, RSTRING_PTR(buffer_in), (uint32_t)RSTRING_LEN(buffer_in));
|
78
|
+
|
79
|
+
buffer_out = rb_str_new(NULL, 0);
|
80
|
+
rb_str_resize(buffer_out, BUFSIZE);
|
81
|
+
rb_gc_register_address(&buffer_out);
|
82
|
+
yaz0Output(s, RSTRING_PTR(buffer_out), BUFSIZE);
|
83
|
+
|
84
|
+
for (;;)
|
85
|
+
{
|
86
|
+
ret = (int)(intptr_t)rb_thread_call_without_gvl(run_NoGVL, s, RUBY_UBF_IO, NULL);
|
87
|
+
switch (ret)
|
88
|
+
{
|
89
|
+
case YAZ0_NEED_AVAIL_IN:
|
90
|
+
/* Need more input */
|
91
|
+
if (in_is_str)
|
92
|
+
{
|
93
|
+
rb_gc_unregister_address(&buffer_in);
|
94
|
+
rb_gc_unregister_address(&buffer_out);
|
95
|
+
rb_raise(class_yaz0_error_end_of_file, "Unexpected end of file");
|
96
|
+
}
|
97
|
+
|
98
|
+
tmp = rb_funcall(io_in, rb_intern("read"), 2, INT2FIX(BUFSIZE), buffer_in);
|
99
|
+
if (tmp == Qnil)
|
100
|
+
{
|
101
|
+
rb_gc_unregister_address(&buffer_in);
|
102
|
+
rb_gc_unregister_address(&buffer_out);
|
103
|
+
rb_raise(class_yaz0_error_end_of_file, "Unexpected end of file");
|
104
|
+
}
|
105
|
+
yaz0Input(s, RSTRING_PTR(buffer_in), (uint32_t)RSTRING_LEN(buffer_in));
|
106
|
+
break;
|
107
|
+
case YAZ0_NEED_AVAIL_OUT:
|
108
|
+
/* Need more output */
|
109
|
+
rb_str_set_len(buffer_out, yaz0OutputChunkSize(s));
|
110
|
+
rb_funcall(io_out, rb_intern("write"), 1, buffer_out);
|
111
|
+
rb_str_set_len(buffer_out, BUFSIZE);
|
112
|
+
yaz0Output(s, RSTRING_PTR(buffer_out), BUFSIZE);
|
113
|
+
break;
|
114
|
+
case YAZ0_BAD_MAGIC:
|
115
|
+
rb_gc_unregister_address(&buffer_in);
|
116
|
+
rb_gc_unregister_address(&buffer_out);
|
117
|
+
rb_raise(class_yaz0_error_bad_magic, "Bad magic");
|
118
|
+
break;
|
119
|
+
case YAZ0_OK:
|
120
|
+
goto end;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
end:
|
125
|
+
/* There might still be unflushed output */
|
126
|
+
rb_str_set_len(buffer_out, yaz0OutputChunkSize(s));
|
127
|
+
rb_funcall(io_out, rb_intern("write"), 1, buffer_out);
|
128
|
+
|
129
|
+
rb_gc_unregister_address(&buffer_in);
|
130
|
+
rb_gc_unregister_address(&buffer_out);
|
131
|
+
|
132
|
+
return Qnil;
|
133
|
+
}
|
134
|
+
|
135
|
+
static VALUE
|
136
|
+
ext_yaz0_stream_raw_decompress(VALUE self, VALUE io_in, VALUE io_out)
|
137
|
+
{
|
138
|
+
return run(self, io_in, io_out, 0, 0, 0);
|
139
|
+
}
|
140
|
+
|
141
|
+
static VALUE
|
142
|
+
ext_yaz0_stream_raw_compress(VALUE self, VALUE io_in, VALUE io_out, VALUE size, VALUE level)
|
143
|
+
{
|
144
|
+
Check_Type(size, T_FIXNUM);
|
145
|
+
Check_Type(level, T_FIXNUM);
|
146
|
+
return run(self, io_in, io_out, 1, FIX2INT(size), FIX2INT(level));
|
147
|
+
}
|
148
|
+
|
149
|
+
void
|
150
|
+
Init_yaz0(void)
|
151
|
+
{
|
152
|
+
VALUE mod;
|
153
|
+
mod = rb_define_module("Yaz0");
|
154
|
+
|
155
|
+
/* Error classes */
|
156
|
+
class_yaz0_error = rb_define_class_under(mod, "Error", rb_eStandardError);
|
157
|
+
class_yaz0_error_bad_magic = rb_define_class_under(mod, "BadMagicError", class_yaz0_error);
|
158
|
+
class_yaz0_error_end_of_file = rb_define_class_under(mod, "EndOfFileError", class_yaz0_error);
|
159
|
+
|
160
|
+
/* Stream */
|
161
|
+
class_yaz0_stream = rb_define_class_under(mod, "Stream", rb_cObject);
|
162
|
+
rb_define_alloc_func(class_yaz0_stream, ext_yaz0_stream_alloc);
|
163
|
+
rb_define_method(class_yaz0_stream, "raw_decompress", ext_yaz0_stream_raw_decompress, 2);
|
164
|
+
rb_define_method(class_yaz0_stream, "raw_compress", ext_yaz0_stream_raw_compress, 4);
|
165
|
+
}
|
data/ext/yaz0/ext_yaz0.h
ADDED
data/ext/yaz0/extconf.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
1
|
require "mkmf"
|
2
2
|
|
3
|
-
|
3
|
+
extension_name = 'yaz0/yaz0'
|
4
|
+
dir_config(extension_name)
|
5
|
+
|
6
|
+
libyaz0_src = Dir[File.join(__dir__, "../../libyaz0/src/libyaz0/**/*.c")].map{|x| File.expand_path(x)}
|
7
|
+
|
8
|
+
$srcs = libyaz0_src + ["ext_yaz0.c"]
|
9
|
+
|
10
|
+
$VPATH << File.expand_path(File.join(__dir__, "../../libyaz0/src/libyaz0"))
|
11
|
+
$INCFLAGS << " -I#{File.expand_path(File.join(__dir__, "../../libyaz0/include"))}"
|
12
|
+
|
13
|
+
create_makefile(extension_name)
|
data/lib/yaz0/version.rb
CHANGED
Binary file
|
data/lib/yaz0.rb
CHANGED
@@ -1,5 +1,47 @@
|
|
1
|
+
require "stringio"
|
1
2
|
require "yaz0/version"
|
2
3
|
require "yaz0/yaz0"
|
3
4
|
|
4
5
|
module Yaz0
|
6
|
+
class Stream
|
7
|
+
def decompress(src, dst = nil)
|
8
|
+
if dst
|
9
|
+
raw_decompress(src, dst)
|
10
|
+
nil
|
11
|
+
else
|
12
|
+
dst = StringIO.new
|
13
|
+
raw_decompress(src, dst)
|
14
|
+
dst.string
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def compress(src, dst_or_opts = nil, opts = {})
|
19
|
+
if dst_or_opts.is_a?(Hash)
|
20
|
+
opts = dst_or_opts
|
21
|
+
dst = nil
|
22
|
+
else
|
23
|
+
dst = dst_or_opts
|
24
|
+
end
|
25
|
+
|
26
|
+
level = opts[:level] || 6
|
27
|
+
size = opts[:size] || src.size
|
28
|
+
|
29
|
+
if dst
|
30
|
+
raw_compress(src, dst, size, level)
|
31
|
+
nil
|
32
|
+
else
|
33
|
+
dst = StringIO.new
|
34
|
+
raw_compress(src, dst, size, level)
|
35
|
+
dst.string
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.decompress(*args)
|
41
|
+
Yaz0::Stream.new.decompress(*args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.compress(*args)
|
45
|
+
Yaz0::Stream.new.compress(*args)
|
46
|
+
end
|
5
47
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#ifndef YAZ0_H
|
2
|
+
#define YAZ0_H
|
3
|
+
|
4
|
+
#include <stddef.h>
|
5
|
+
#include <stdint.h>
|
6
|
+
|
7
|
+
#if defined(__cplusplus)
|
8
|
+
# define YAZ0_API extern "C"
|
9
|
+
#else
|
10
|
+
# define YAZ0_API
|
11
|
+
#endif
|
12
|
+
|
13
|
+
#define YAZ0_OK 0
|
14
|
+
#define YAZ0_NEED_AVAIL_IN 1
|
15
|
+
#define YAZ0_NEED_AVAIL_OUT 2
|
16
|
+
#define YAZ0_BAD_MAGIC (-1)
|
17
|
+
#define YAZ0_OUT_OF_MEMORY (-2)
|
18
|
+
|
19
|
+
#define YAZ0_DEFAULT_LEVEL 6
|
20
|
+
|
21
|
+
typedef struct Yaz0Stream Yaz0Stream;
|
22
|
+
|
23
|
+
YAZ0_API int yaz0Init(Yaz0Stream** stream);
|
24
|
+
YAZ0_API int yaz0Destroy(Yaz0Stream* stream);
|
25
|
+
YAZ0_API int yaz0ModeDecompress(Yaz0Stream* stream);
|
26
|
+
YAZ0_API int yaz0ModeCompress(Yaz0Stream* stream, uint32_t size, int level);
|
27
|
+
YAZ0_API int yaz0Run(Yaz0Stream* stream);
|
28
|
+
YAZ0_API int yaz0Input(Yaz0Stream* stream, const void* data, uint32_t size);
|
29
|
+
YAZ0_API int yaz0Output(Yaz0Stream* stream, void* data, uint32_t size);
|
30
|
+
|
31
|
+
YAZ0_API uint32_t yaz0OutputChunkSize(const Yaz0Stream* stream);
|
32
|
+
YAZ0_API uint32_t yaz0DecompressedSize(const Yaz0Stream* stream);
|
33
|
+
|
34
|
+
#endif /* YAZ0_H */
|