lzfruby 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (8) hide show
  1. data/README.txt +80 -0
  2. data/ext/extconf.rb +2 -0
  3. data/ext/lzf.h +99 -0
  4. data/ext/lzfP.h +159 -0
  5. data/ext/lzf_c.c +289 -0
  6. data/ext/lzf_d.c +148 -0
  7. data/ext/lzfruby.c +201 -0
  8. metadata +61 -0
data/README.txt ADDED
@@ -0,0 +1,80 @@
1
+ = LZF/Ruby
2
+
3
+ Copyright (c) 2008 SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
4
+
5
+ == Description
6
+
7
+ Ruby bindings for LibLZF.
8
+
9
+ LibLZF is a very fast compression library.
10
+
11
+ == Project Page
12
+
13
+ http://rubyforge.org/projects/lzfruby
14
+
15
+ == Install
16
+
17
+ gem install lzfruby
18
+
19
+ == Download
20
+
21
+ http://rubyforge.org/frs/?group_id=6750
22
+
23
+ == Example
24
+
25
+ require 'lzfruby'
26
+ require 'open-uri'
27
+ require 'stringio'
28
+
29
+ source = open('http://lzfruby.rubyforge.org/') {|f| f.read }
30
+ source = StringIO.new(source)
31
+
32
+ puts "uncompress size: #{source.length}"
33
+
34
+ # compress
35
+ comp_data = StringIO.new
36
+ LZF.compress(source, comp_data)
37
+ puts "compress size: #{comp_data.length}"
38
+
39
+ # decompress
40
+ comp_data.seek(0)
41
+ decomp_data = StringIO.new
42
+ LZF.decompress(comp_data, decomp_data)
43
+ puts "decompress size: #{decomp_data.length}"
44
+ puts "decompress success?: #{source.string == decomp_data.string}"
45
+
46
+ == License
47
+
48
+ Copyright (c) 2008 SUGAWARA Genki <sgwr_dts@yahoo.co.jp>
49
+ All rights reserved.
50
+
51
+ Redistribution and use in source and binary forms, with or without modification,
52
+ are permitted provided that the following conditions are met:
53
+
54
+ * Redistributions of source code must retain the above copyright notice,
55
+ this list of conditions and the following disclaimer.
56
+ * Redistributions in binary form must reproduce the above copyright notice,
57
+ this list of conditions and the following disclaimer in the documentation
58
+ and/or other materials provided with the distribution.
59
+ * The names of its contributors may be used to endorse or promote products
60
+ derived from this software without specific prior written permission.
61
+
62
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
63
+ ANY EXPRESS OR IMPLIED WARRANTIES,
64
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
65
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
66
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
67
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
68
+ OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
69
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
70
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
71
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
72
+ DAMAGE.
73
+
74
+ === LibLZF
75
+ LZF/Ruby contains LibLZF.
76
+
77
+ LibLZF is a very fast compression library.
78
+
79
+ * http://www.goof.com/pcg/marc/liblzf.html
80
+ * Copyright (c) 2000-2007 Marc Alexander Lehmann <schmorp@schmorp.de>
data/ext/extconf.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'mkmf'
2
+ create_makefile('lzfruby')
data/ext/lzf.h ADDED
@@ -0,0 +1,99 @@
1
+ /*
2
+ * Copyright (c) 2000-2007 Marc Alexander Lehmann <schmorp@schmorp.de>
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without modifica-
5
+ * tion, are permitted provided that the following conditions are met:
6
+ *
7
+ * 1. Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ *
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
15
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
16
+ * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
18
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
21
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
22
+ * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
23
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ *
25
+ * Alternatively, the contents of this file may be used under the terms of
26
+ * the GNU General Public License ("GPL") version 2 or any later version,
27
+ * in which case the provisions of the GPL are applicable instead of
28
+ * the above. If you wish to allow the use of your version of this file
29
+ * only under the terms of the GPL and not to allow others to use your
30
+ * version of this file under the BSD license, indicate your decision
31
+ * by deleting the provisions above and replace them with the notice
32
+ * and other provisions required by the GPL. If you do not delete the
33
+ * provisions above, a recipient may use your version of this file under
34
+ * either the BSD or the GPL.
35
+ */
36
+
37
+ #ifndef LZF_H
38
+ #define LZF_H
39
+
40
+ /***********************************************************************
41
+ **
42
+ ** lzf -- an extremely fast/free compression/decompression-method
43
+ ** http://liblzf.plan9.de/
44
+ **
45
+ ** This algorithm is believed to be patent-free.
46
+ **
47
+ ***********************************************************************/
48
+
49
+ #define LZF_VERSION 0x0105 /* 1.5 */
50
+
51
+ /*
52
+ * Compress in_len bytes stored at the memory block starting at
53
+ * in_data and write the result to out_data, up to a maximum length
54
+ * of out_len bytes.
55
+ *
56
+ * If the output buffer is not large enough or any error occurs
57
+ * return 0, otherwise return the number of bytes used (which might
58
+ * be considerably larger than in_len, so it makes sense to always
59
+ * use out_len == in_len - 1), to ensure _some_ compression, and store
60
+ * the data uncompressed otherwise.
61
+ *
62
+ * lzf_compress might use different algorithms on different systems and
63
+ * even different runs, thus might result in different compressed strings
64
+ * depending on the phase of the moon or similar factors. However, all
65
+ * these strings are architecture-independent and will result in the
66
+ * original data when decompressed using lzf_decompress.
67
+ *
68
+ * The buffers must not be overlapping.
69
+ *
70
+ * If the option LZF_STATE_ARG is enabled, an extra argument must be
71
+ * supplied which is not reflected in this header file. Refer to lzfP.h
72
+ * and lzf_c.c.
73
+ *
74
+ */
75
+ unsigned int
76
+ lzf_compress (const void *const in_data, unsigned int in_len,
77
+ void *out_data, unsigned int out_len);
78
+
79
+ /*
80
+ * Decompress data compressed with some version of the lzf_compress
81
+ * function and stored at location in_data and length in_len. The result
82
+ * will be stored at out_data up to a maximum of out_len characters.
83
+ *
84
+ * If the output buffer is not large enough to hold the decompressed
85
+ * data, a 0 is returned and errno is set to E2BIG. Otherwise the number
86
+ * of decompressed bytes (i.e. the original length of the data) is
87
+ * returned.
88
+ *
89
+ * If an error in the compressed data is detected, a zero is returned and
90
+ * errno is set to EINVAL.
91
+ *
92
+ * This function is very fast, about as fast as a copying loop.
93
+ */
94
+ unsigned int
95
+ lzf_decompress (const void *const in_data, unsigned int in_len,
96
+ void *out_data, unsigned int out_len);
97
+
98
+ #endif
99
+
data/ext/lzfP.h ADDED
@@ -0,0 +1,159 @@
1
+ /*
2
+ * Copyright (c) 2000-2007 Marc Alexander Lehmann <schmorp@schmorp.de>
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without modifica-
5
+ * tion, are permitted provided that the following conditions are met:
6
+ *
7
+ * 1. Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ *
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
15
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
16
+ * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
18
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
21
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
22
+ * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
23
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ *
25
+ * Alternatively, the contents of this file may be used under the terms of
26
+ * the GNU General Public License ("GPL") version 2 or any later version,
27
+ * in which case the provisions of the GPL are applicable instead of
28
+ * the above. If you wish to allow the use of your version of this file
29
+ * only under the terms of the GPL and not to allow others to use your
30
+ * version of this file under the BSD license, indicate your decision
31
+ * by deleting the provisions above and replace them with the notice
32
+ * and other provisions required by the GPL. If you do not delete the
33
+ * provisions above, a recipient may use your version of this file under
34
+ * either the BSD or the GPL.
35
+ */
36
+
37
+ #ifndef LZFP_h
38
+ #define LZFP_h
39
+
40
+ #define STANDALONE 1 /* at the moment, this is ok. */
41
+
42
+ #ifndef STANDALONE
43
+ # include "lzf.h"
44
+ #endif
45
+
46
+ /*
47
+ * Size of hashtable is (1 << HLOG) * sizeof (char *)
48
+ * decompression is independent of the hash table size
49
+ * the difference between 15 and 14 is very small
50
+ * for small blocks (and 14 is usually a bit faster).
51
+ * For a low-memory/faster configuration, use HLOG == 13;
52
+ * For best compression, use 15 or 16 (or more, up to 23).
53
+ */
54
+ #ifndef HLOG
55
+ # define HLOG 16
56
+ #endif
57
+
58
+ /*
59
+ * Sacrifice very little compression quality in favour of compression speed.
60
+ * This gives almost the same compression as the default code, and is
61
+ * (very roughly) 15% faster. This is the preferred mode of operation.
62
+ */
63
+ #ifndef VERY_FAST
64
+ # define VERY_FAST 1
65
+ #endif
66
+
67
+ /*
68
+ * Sacrifice some more compression quality in favour of compression speed.
69
+ * (roughly 1-2% worse compression for large blocks and
70
+ * 9-10% for small, redundant, blocks and >>20% better speed in both cases)
71
+ * In short: when in need for speed, enable this for binary data,
72
+ * possibly disable this for text data.
73
+ */
74
+ #ifndef ULTRA_FAST
75
+ # define ULTRA_FAST 0
76
+ #endif
77
+
78
+ /*
79
+ * Unconditionally aligning does not cost very much, so do it if unsure
80
+ */
81
+ #ifndef STRICT_ALIGN
82
+ # define STRICT_ALIGN !(defined(__i386) || defined (__amd64))
83
+ #endif
84
+
85
+ /*
86
+ * You may choose to pre-set the hash table (might be faster on some
87
+ * modern cpus and large (>>64k) blocks, and also makes compression
88
+ * deterministic/repeatable when the configuration otherwise is the same).
89
+ */
90
+ #ifndef INIT_HTAB
91
+ # define INIT_HTAB 0
92
+ #endif
93
+
94
+ /*
95
+ * Avoid assigning values to errno variable? for some embedding purposes
96
+ * (linux kernel for example), this is neccessary. NOTE: this breaks
97
+ * the documentation in lzf.h.
98
+ */
99
+ #ifndef AVOID_ERRNO
100
+ # define AVOID_ERRNO 0
101
+ #endif
102
+
103
+ /*
104
+ * Wether to pass the LZF_STATE variable as argument, or allocate it
105
+ * on the stack. For small-stack environments, define this to 1.
106
+ * NOTE: this breaks the prototype in lzf.h.
107
+ */
108
+ #ifndef LZF_STATE_ARG
109
+ # define LZF_STATE_ARG 0
110
+ #endif
111
+
112
+ /*
113
+ * Wether to add extra checks for input validity in lzf_decompress
114
+ * and return EINVAL if the input stream has been corrupted. This
115
+ * only shields against overflowing the input buffer and will not
116
+ * detect most corrupted streams.
117
+ * This check is not normally noticable on modern hardware
118
+ * (<1% slowdown), but might slow down older cpus considerably.
119
+ */
120
+ #ifndef CHECK_INPUT
121
+ # define CHECK_INPUT 1
122
+ #endif
123
+
124
+ /*****************************************************************************/
125
+ /* nothing should be changed below */
126
+
127
+ typedef unsigned char u8;
128
+
129
+ typedef const u8 *LZF_STATE[1 << (HLOG)];
130
+
131
+ #if !STRICT_ALIGN
132
+ /* for unaligned accesses we need a 16 bit datatype. */
133
+ # include <limits.h>
134
+ # if USHRT_MAX == 65535
135
+ typedef unsigned short u16;
136
+ # elif UINT_MAX == 65535
137
+ typedef unsigned int u16;
138
+ # else
139
+ # undef STRICT_ALIGN
140
+ # define STRICT_ALIGN 1
141
+ # endif
142
+ #endif
143
+
144
+ #if ULTRA_FAST
145
+ # if defined(VERY_FAST)
146
+ # undef VERY_FAST
147
+ # endif
148
+ #endif
149
+
150
+ #if INIT_HTAB
151
+ # ifdef __cplusplus
152
+ # include <cstring>
153
+ # else
154
+ # include <string.h>
155
+ # endif
156
+ #endif
157
+
158
+ #endif
159
+
data/ext/lzf_c.c ADDED
@@ -0,0 +1,289 @@
1
+ /*
2
+ * Copyright (c) 2000-2007 Marc Alexander Lehmann <schmorp@schmorp.de>
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without modifica-
5
+ * tion, are permitted provided that the following conditions are met:
6
+ *
7
+ * 1. Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ *
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
15
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
16
+ * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
18
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
21
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
22
+ * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
23
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ *
25
+ * Alternatively, the contents of this file may be used under the terms of
26
+ * the GNU General Public License ("GPL") version 2 or any later version,
27
+ * in which case the provisions of the GPL are applicable instead of
28
+ * the above. If you wish to allow the use of your version of this file
29
+ * only under the terms of the GPL and not to allow others to use your
30
+ * version of this file under the BSD license, indicate your decision
31
+ * by deleting the provisions above and replace them with the notice
32
+ * and other provisions required by the GPL. If you do not delete the
33
+ * provisions above, a recipient may use your version of this file under
34
+ * either the BSD or the GPL.
35
+ */
36
+
37
+ #include "lzfP.h"
38
+
39
+ #define HSIZE (1 << (HLOG))
40
+
41
+ /*
42
+ * don't play with this unless you benchmark!
43
+ * decompression is not dependent on the hash function
44
+ * the hashing function might seem strange, just believe me
45
+ * it works ;)
46
+ */
47
+ #ifndef FRST
48
+ # define FRST(p) (((p[0]) << 8) | p[1])
49
+ # define NEXT(v,p) (((v) << 8) | p[2])
50
+ # if ULTRA_FAST
51
+ # define IDX(h) ((( h >> (3*8 - HLOG)) - h ) & (HSIZE - 1))
52
+ # elif VERY_FAST
53
+ # define IDX(h) ((( h >> (3*8 - HLOG)) - h*5) & (HSIZE - 1))
54
+ # else
55
+ # define IDX(h) ((((h ^ (h << 5)) >> (3*8 - HLOG)) - h*5) & (HSIZE - 1))
56
+ # endif
57
+ #endif
58
+ /*
59
+ * IDX works because it is very similar to a multiplicative hash, e.g.
60
+ * ((h * 57321 >> (3*8 - HLOG)) & (HSIZE - 1))
61
+ * the latter is also quite fast on newer CPUs, and compresses similarly.
62
+ *
63
+ * the next one is also quite good, albeit slow ;)
64
+ * (int)(cos(h & 0xffffff) * 1e6)
65
+ */
66
+
67
+ #if 0
68
+ /* original lzv-like hash function, much worse and thus slower */
69
+ # define FRST(p) (p[0] << 5) ^ p[1]
70
+ # define NEXT(v,p) ((v) << 5) ^ p[2]
71
+ # define IDX(h) ((h) & (HSIZE - 1))
72
+ #endif
73
+
74
+ #define MAX_LIT (1 << 5)
75
+ #define MAX_OFF (1 << 13)
76
+ #define MAX_REF ((1 << 8) + (1 << 3))
77
+
78
+ #if __GNUC__ >= 3
79
+ # define expect(expr,value) __builtin_expect ((expr),(value))
80
+ # define inline inline
81
+ #else
82
+ # define expect(expr,value) (expr)
83
+ # define inline static
84
+ #endif
85
+
86
+ #define expect_false(expr) expect ((expr) != 0, 0)
87
+ #define expect_true(expr) expect ((expr) != 0, 1)
88
+
89
+ /*
90
+ * compressed format
91
+ *
92
+ * 000LLLLL <L+1> ; literal
93
+ * LLLooooo oooooooo ; backref L
94
+ * 111ooooo LLLLLLLL oooooooo ; backref L+7
95
+ *
96
+ */
97
+
98
+ unsigned int
99
+ lzf_compress (const void *const in_data, unsigned int in_len,
100
+ void *out_data, unsigned int out_len
101
+ #if LZF_STATE_ARG
102
+ , LZF_STATE htab
103
+ #endif
104
+ )
105
+ {
106
+ #if !LZF_STATE_ARG
107
+ LZF_STATE htab;
108
+ #endif
109
+ const u8 **hslot;
110
+ const u8 *ip = (const u8 *)in_data;
111
+ u8 *op = (u8 *)out_data;
112
+ const u8 *in_end = ip + in_len;
113
+ u8 *out_end = op + out_len;
114
+ const u8 *ref;
115
+
116
+ /* off requires a type wide enough to hold a general pointer difference.
117
+ * ISO C doesn't have that (size_t might not be enough and ptrdiff_t only
118
+ * works for differences within a single object). We also assume that no
119
+ * no bit pattern traps. Since the only platform that is both non-POSIX
120
+ * and fails to support both assumptions is windows 64 bit, we make a
121
+ * special workaround for it.
122
+ */
123
+ #if defined (WIN32) && defined (_M_X64)
124
+ unsigned _int64 off; /* workaround for missing POSIX compliance */
125
+ #else
126
+ unsigned long off;
127
+ #endif
128
+ unsigned int hval;
129
+ int lit;
130
+
131
+ if (!in_len || !out_len)
132
+ return 0;
133
+
134
+ #if INIT_HTAB
135
+ memset (htab, 0, sizeof (htab));
136
+ # if 0
137
+ for (hslot = htab; hslot < htab + HSIZE; hslot++)
138
+ *hslot++ = ip;
139
+ # endif
140
+ #endif
141
+
142
+ lit = 0; op++; /* start run */
143
+
144
+ hval = FRST (ip);
145
+ while (ip < in_end - 2)
146
+ {
147
+ hval = NEXT (hval, ip);
148
+ hslot = htab + IDX (hval);
149
+ ref = *hslot; *hslot = ip;
150
+
151
+ if (1
152
+ #if INIT_HTAB
153
+ && ref < ip /* the next test will actually take care of this, but this is faster */
154
+ #endif
155
+ && (off = ip - ref - 1) < MAX_OFF
156
+ && ip + 4 < in_end
157
+ && ref > (u8 *)in_data
158
+ #if STRICT_ALIGN
159
+ && ref[0] == ip[0]
160
+ && ref[1] == ip[1]
161
+ && ref[2] == ip[2]
162
+ #else
163
+ && *(u16 *)ref == *(u16 *)ip
164
+ && ref[2] == ip[2]
165
+ #endif
166
+ )
167
+ {
168
+ /* match found at *ref++ */
169
+ unsigned int len = 2;
170
+ unsigned int maxlen = in_end - ip - len;
171
+ maxlen = maxlen > MAX_REF ? MAX_REF : maxlen;
172
+
173
+ op [- lit - 1] = lit - 1; /* stop run */
174
+ op -= !lit; /* undo run if length is zero */
175
+
176
+ if (expect_false (op + 3 + 1 >= out_end))
177
+ return 0;
178
+
179
+ for (;;)
180
+ {
181
+ if (expect_true (maxlen > 16))
182
+ {
183
+ len++; if (ref [len] != ip [len]) break;
184
+ len++; if (ref [len] != ip [len]) break;
185
+ len++; if (ref [len] != ip [len]) break;
186
+ len++; if (ref [len] != ip [len]) break;
187
+
188
+ len++; if (ref [len] != ip [len]) break;
189
+ len++; if (ref [len] != ip [len]) break;
190
+ len++; if (ref [len] != ip [len]) break;
191
+ len++; if (ref [len] != ip [len]) break;
192
+
193
+ len++; if (ref [len] != ip [len]) break;
194
+ len++; if (ref [len] != ip [len]) break;
195
+ len++; if (ref [len] != ip [len]) break;
196
+ len++; if (ref [len] != ip [len]) break;
197
+
198
+ len++; if (ref [len] != ip [len]) break;
199
+ len++; if (ref [len] != ip [len]) break;
200
+ len++; if (ref [len] != ip [len]) break;
201
+ len++; if (ref [len] != ip [len]) break;
202
+ }
203
+
204
+ do
205
+ len++;
206
+ while (len < maxlen && ref[len] == ip[len]);
207
+
208
+ break;
209
+ }
210
+
211
+ len -= 2;
212
+ ip++;
213
+
214
+ if (len < 7)
215
+ {
216
+ *op++ = (off >> 8) + (len << 5);
217
+ }
218
+ else
219
+ {
220
+ *op++ = (off >> 8) + ( 7 << 5);
221
+ *op++ = len - 7;
222
+ }
223
+
224
+ *op++ = off;
225
+
226
+ #if ULTRA_FAST || VERY_FAST
227
+ ip += len;
228
+ #if VERY_FAST && !ULTRA_FAST
229
+ --ip;
230
+ #endif
231
+ hval = FRST (ip);
232
+
233
+ hval = NEXT (hval, ip);
234
+ htab[IDX (hval)] = ip;
235
+ ip++;
236
+
237
+ #if VERY_FAST && !ULTRA_FAST
238
+ hval = NEXT (hval, ip);
239
+ htab[IDX (hval)] = ip;
240
+ ip++;
241
+ #endif
242
+ #else
243
+ do
244
+ {
245
+ hval = NEXT (hval, ip);
246
+ htab[IDX (hval)] = ip;
247
+ ip++;
248
+ }
249
+ while (len--);
250
+ #endif
251
+
252
+ lit = 0; op++; /* start run */
253
+ }
254
+ else
255
+ {
256
+ /* one more literal byte we must copy */
257
+ if (expect_false (op >= out_end))
258
+ return 0;
259
+
260
+ lit++; *op++ = *ip++;
261
+
262
+ if (expect_false (lit == MAX_LIT))
263
+ {
264
+ op [- lit - 1] = lit - 1; /* stop run */
265
+ lit = 0; op++; /* start run */
266
+ }
267
+ }
268
+ }
269
+
270
+ if (op + 3 > out_end) /* at most 3 bytes can be missing here */
271
+ return 0;
272
+
273
+ while (ip < in_end)
274
+ {
275
+ lit++; *op++ = *ip++;
276
+
277
+ if (expect_false (lit == MAX_LIT))
278
+ {
279
+ op [- lit - 1] = lit - 1; /* stop run */
280
+ lit = 0; op++; /* start run */
281
+ }
282
+ }
283
+
284
+ op [- lit - 1] = lit - 1; /* end run */
285
+ op -= !lit; /* undo run if length is zero */
286
+
287
+ return op - (u8 *)out_data;
288
+ }
289
+
data/ext/lzf_d.c ADDED
@@ -0,0 +1,148 @@
1
+ /*
2
+ * Copyright (c) 2000-2007 Marc Alexander Lehmann <schmorp@schmorp.de>
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without modifica-
5
+ * tion, are permitted provided that the following conditions are met:
6
+ *
7
+ * 1. Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ *
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
15
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
16
+ * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
18
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
21
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
22
+ * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
23
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ *
25
+ * Alternatively, the contents of this file may be used under the terms of
26
+ * the GNU General Public License ("GPL") version 2 or any later version,
27
+ * in which case the provisions of the GPL are applicable instead of
28
+ * the above. If you wish to allow the use of your version of this file
29
+ * only under the terms of the GPL and not to allow others to use your
30
+ * version of this file under the BSD license, indicate your decision
31
+ * by deleting the provisions above and replace them with the notice
32
+ * and other provisions required by the GPL. If you do not delete the
33
+ * provisions above, a recipient may use your version of this file under
34
+ * either the BSD or the GPL.
35
+ */
36
+
37
+ #include "lzfP.h"
38
+
39
+ #if AVOID_ERRNO
40
+ # define SET_ERRNO(n)
41
+ #else
42
+ # include <errno.h>
43
+ # define SET_ERRNO(n) errno = (n)
44
+ #endif
45
+
46
+ #if (__i386 || __amd64) && __GNUC__ >= 3
47
+ # define lzf_movsb(dst, src, len) \
48
+ asm ("rep movsb" \
49
+ : "=D" (dst), "=S" (src), "=c" (len) \
50
+ : "0" (dst), "1" (src), "2" (len));
51
+ #endif
52
+
53
+ unsigned int
54
+ lzf_decompress (const void *const in_data, unsigned int in_len,
55
+ void *out_data, unsigned int out_len)
56
+ {
57
+ u8 const *ip = (const u8 *)in_data;
58
+ u8 *op = (u8 *)out_data;
59
+ u8 const *const in_end = ip + in_len;
60
+ u8 *const out_end = op + out_len;
61
+
62
+ do
63
+ {
64
+ unsigned int ctrl = *ip++;
65
+
66
+ if (ctrl < (1 << 5)) /* literal run */
67
+ {
68
+ ctrl++;
69
+
70
+ if (op + ctrl > out_end)
71
+ {
72
+ SET_ERRNO (E2BIG);
73
+ return 0;
74
+ }
75
+
76
+ #if CHECK_INPUT
77
+ if (ip + ctrl > in_end)
78
+ {
79
+ SET_ERRNO (EINVAL);
80
+ return 0;
81
+ }
82
+ #endif
83
+
84
+ #ifdef lzf_movsb
85
+ lzf_movsb (op, ip, ctrl);
86
+ #else
87
+ do
88
+ *op++ = *ip++;
89
+ while (--ctrl);
90
+ #endif
91
+ }
92
+ else /* back reference */
93
+ {
94
+ unsigned int len = ctrl >> 5;
95
+
96
+ u8 *ref = op - ((ctrl & 0x1f) << 8) - 1;
97
+
98
+ #if CHECK_INPUT
99
+ if (ip >= in_end)
100
+ {
101
+ SET_ERRNO (EINVAL);
102
+ return 0;
103
+ }
104
+ #endif
105
+ if (len == 7)
106
+ {
107
+ len += *ip++;
108
+ #if CHECK_INPUT
109
+ if (ip >= in_end)
110
+ {
111
+ SET_ERRNO (EINVAL);
112
+ return 0;
113
+ }
114
+ #endif
115
+ }
116
+
117
+ ref -= *ip++;
118
+
119
+ if (op + len + 2 > out_end)
120
+ {
121
+ SET_ERRNO (E2BIG);
122
+ return 0;
123
+ }
124
+
125
+ if (ref < (u8 *)out_data)
126
+ {
127
+ SET_ERRNO (EINVAL);
128
+ return 0;
129
+ }
130
+
131
+ #ifdef lzf_movsb
132
+ len += 2;
133
+ lzf_movsb (op, ref, len);
134
+ #else
135
+ *op++ = *ref++;
136
+ *op++ = *ref++;
137
+
138
+ do
139
+ *op++ = *ref++;
140
+ while (--len);
141
+ #endif
142
+ }
143
+ }
144
+ while (ip < in_end);
145
+
146
+ return op - (u8 *)out_data;
147
+ }
148
+
data/ext/lzfruby.c ADDED
@@ -0,0 +1,201 @@
1
+ #ifdef _WIN32
2
+ __declspec(dllexport) void Init_lzfruby(void);
3
+ typedef int ssize_t;
4
+ #define _CRT_SECURE_DEPRECATE_MEMORY
5
+ #include <memory.h>
6
+ #endif
7
+
8
+ #include <string.h>
9
+ #include "lzf.h"
10
+ #include "ruby.h"
11
+
12
+ #ifndef RSTRING_PTR
13
+ #define RSTRING_PTR(s) (RSTRING(s)->ptr)
14
+ #endif
15
+
16
+ #ifndef RSTRING_LEN
17
+ #define RSTRING_LEN(s) (RSTRING(s)->len)
18
+ #endif
19
+
20
+ #define Check_IO(x) do { \
21
+ const char *classname = rb_class2name(CLASS_OF(x)); \
22
+ if (rb_obj_is_instance_of((x), rb_cIO)) { \
23
+ rb_io_binmode(x); \
24
+ } else if (strcmp(classname, "StringIO") != 0) { \
25
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected IO or StringIO)", classname); \
26
+ } \
27
+ } while(0)
28
+
29
+ #define VERSION "0.1.2"
30
+ #define BLOCKSIZE (1024 * 64 - 1)
31
+ #define MAX_BLOCKSIZE BLOCKSIZE
32
+ #define TYPE0_HDR_SIZE 5
33
+ #define TYPE1_HDR_SIZE 7
34
+ #define MAX_HDR_SIZE 7
35
+ #define MIN_HDR_SIZE 5
36
+
37
+ static VALUE LZF;
38
+ static VALUE LZF_Error;
39
+
40
+ /* */
41
+ static VALUE lzfruby_compress(int argc, VALUE *argv, VALUE self) {
42
+ VALUE from, to, blocksize;
43
+ unsigned char buf1[MAX_BLOCKSIZE + MAX_HDR_SIZE + 16];
44
+ unsigned char buf2[MAX_BLOCKSIZE + MAX_HDR_SIZE + 16];
45
+ unsigned char *header;
46
+ int i_blocksize;
47
+
48
+ rb_scan_args(argc, argv, "21", &from, &to, &blocksize);
49
+ Check_IO(from);
50
+ Check_IO(to);
51
+
52
+ if (NIL_P(blocksize)) {
53
+ i_blocksize = BLOCKSIZE;
54
+ } else {
55
+ i_blocksize = NUM2INT(blocksize);
56
+
57
+ if (blocksize < 1 || MAX_BLOCKSIZE < blocksize) {
58
+ i_blocksize = BLOCKSIZE;
59
+ }
60
+ }
61
+
62
+ blocksize = INT2FIX(i_blocksize);
63
+
64
+ while (1) {
65
+ VALUE in = rb_funcall(from, rb_intern("read"), 1, blocksize);
66
+ ssize_t us, cs, len;
67
+
68
+ if (NIL_P(in) || (us = RSTRING_LEN(in)) < 1) {
69
+ break;
70
+ }
71
+
72
+ memcpy(&buf1[MAX_HDR_SIZE], RSTRING_PTR(in), us);
73
+ cs = lzf_compress(&buf1[MAX_HDR_SIZE], us, &buf2[MAX_HDR_SIZE], (us > 4) ? us - 4 : us);
74
+
75
+ if (cs) {
76
+ header = &buf2[MAX_HDR_SIZE - TYPE1_HDR_SIZE];
77
+ header[0] = 'Z';
78
+ header[1] = 'V';
79
+ header[2] = 1;
80
+ header[3] = cs >> 8;
81
+ header[4] = cs & 0xff;
82
+ header[5] = us >> 8;
83
+ header[6] = us & 0xff;
84
+ len = cs + TYPE1_HDR_SIZE;
85
+ } else {
86
+ header = &buf1[MAX_HDR_SIZE - TYPE0_HDR_SIZE];
87
+ header[0] = 'Z';
88
+ header[1] = 'V';
89
+ header[2] = 0;
90
+ header[3] = us >> 8;
91
+ header[4] = us & 0xff;
92
+ len = us + TYPE0_HDR_SIZE;
93
+ }
94
+
95
+ rb_funcall(to, rb_intern("write"), 1, rb_str_new(header, len));
96
+ }
97
+
98
+ return Qnil;
99
+ }
100
+
101
+ /* */
102
+ static VALUE lzfruby_decompress(VALUE self, VALUE from, VALUE to) {
103
+ unsigned char header[MAX_HDR_SIZE];
104
+ unsigned char buf1[MAX_BLOCKSIZE + MAX_HDR_SIZE + 16];
105
+ unsigned char buf2[MAX_BLOCKSIZE + MAX_HDR_SIZE + 16];
106
+ ssize_t rc, cs, us, bytes, over = 0;
107
+ int l, rd;
108
+
109
+ Check_IO(from);
110
+ Check_IO(to);
111
+
112
+ while (1) {
113
+ VALUE in, in_header;
114
+ unsigned char *p;
115
+
116
+ in_header = rb_funcall(from, rb_intern("read"), 1, INT2FIX(MAX_HDR_SIZE - over));
117
+
118
+ if (NIL_P(in_header) || (rc = RSTRING_LEN(in_header)) < 1) {
119
+ break;
120
+ }
121
+
122
+ memcpy(header + over, RSTRING_PTR(in_header), MAX_HDR_SIZE - over);
123
+ rc += over;
124
+ over = 0;
125
+
126
+ if (header[0] == 0) {
127
+ break;
128
+ }
129
+
130
+ if (rc < MIN_HDR_SIZE || header[0] != 'Z' || header[1] != 'V') {
131
+ rb_raise(LZF_Error, "invalid data stream - magic not found or short header");
132
+ }
133
+
134
+ switch (header[2]) {
135
+ case 0:
136
+ cs = -1;
137
+ us = (header[3] << 8) | header[4];
138
+ p = &header[TYPE0_HDR_SIZE];
139
+ break;
140
+
141
+ case 1:
142
+ if (rc < TYPE1_HDR_SIZE) {
143
+ rb_raise(LZF_Error, "short data");
144
+ }
145
+
146
+ cs = (header[3] << 8) | header[4];
147
+ us = (header[5] << 8) | header[6];
148
+ p = &header[TYPE1_HDR_SIZE];
149
+ break;
150
+
151
+ default:
152
+ rb_raise(LZF_Error, "unknown blocktype");
153
+ }
154
+
155
+ bytes = (cs == -1) ? us : cs;
156
+ l = &header[rc] - p;
157
+
158
+ if (l > 0) {
159
+ memcpy(buf1, p, l);
160
+ }
161
+
162
+ if (l > bytes) {
163
+ over = l - bytes;
164
+ memmove(header, &p[bytes], over);
165
+ }
166
+
167
+ p = &buf1[l];
168
+ rd = bytes - l;
169
+
170
+ if (rd > 0) {
171
+ in = rb_funcall(from, rb_intern("read"), 1, INT2FIX(rd));
172
+
173
+ if (NIL_P(in) || (rc = RSTRING_LEN(in)) < 1 || rc != rd) {
174
+ rb_raise(LZF_Error, "short data");
175
+ }
176
+
177
+ memcpy(p, RSTRING_PTR(in), rc);
178
+ }
179
+
180
+ if (cs == -1) {
181
+ rb_funcall(to, rb_intern("write"), 1, rb_str_new(buf1, us));
182
+ } else {
183
+ if (lzf_decompress(buf1, cs, buf2, us) != us) {
184
+ rb_raise(LZF_Error, "decompress: invalid stream - data corrupted");
185
+ }
186
+
187
+ rb_funcall(to, rb_intern("write"), 1, rb_str_new(buf2, us));
188
+ }
189
+ }
190
+
191
+ return Qnil;
192
+ }
193
+
194
+ void Init_lzfruby() {
195
+ LZF = rb_define_module("LZF");
196
+ LZF_Error = rb_define_class_under(LZF, "Error", rb_eStandardError);
197
+
198
+ rb_define_const(LZF, "VERSION", rb_str_new2(VERSION));
199
+ rb_define_module_function(LZF, "compress", lzfruby_compress, -1);
200
+ rb_define_module_function(LZF, "decompress", lzfruby_decompress, 2);
201
+ }
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lzfruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - winebarrel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-08-08 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: sgwr_dts@yahoo.co.jp
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/extconf.rb
22
+ extra_rdoc_files:
23
+ - README.txt
24
+ - ext/lzfruby.c
25
+ files:
26
+ - ext/extconf.rb
27
+ - ext/lzf.h
28
+ - ext/lzfP.h
29
+ - ext/lzfruby.c
30
+ - ext/lzf_c.c
31
+ - ext/lzf_d.c
32
+ - README.txt
33
+ has_rdoc: true
34
+ homepage: http://lzfruby.rubyforge.org
35
+ post_install_message:
36
+ rdoc_options:
37
+ - --title
38
+ - LZF/Ruby - Ruby bindings for LibLZF.
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ requirements: []
54
+
55
+ rubyforge_project: lzfruby
56
+ rubygems_version: 1.1.1
57
+ signing_key:
58
+ specification_version: 2
59
+ summary: Ruby bindings for LibLZF.
60
+ test_files: []
61
+