hirlite 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +28 -0
  3. data/Rakefile +51 -0
  4. data/ext/hirlite_ext/extconf.rb +33 -0
  5. data/ext/hirlite_ext/hirlite_ext.c +14 -0
  6. data/ext/hirlite_ext/hirlite_ext.h +38 -0
  7. data/ext/hirlite_ext/rlite.c +351 -0
  8. data/lib/hirlite/rlite.rb +1 -0
  9. data/lib/hirlite/version.rb +3 -0
  10. data/lib/hirlite.rb +2 -0
  11. data/vendor/rlite/Makefile +6 -0
  12. data/vendor/rlite/deps/crc64.c +191 -0
  13. data/vendor/rlite/deps/crc64.h +3 -0
  14. data/vendor/rlite/deps/endianconv.h +73 -0
  15. data/vendor/rlite/deps/hyperloglog.c +1547 -0
  16. data/vendor/rlite/deps/hyperloglog.h +14 -0
  17. data/vendor/rlite/deps/lzf.h +100 -0
  18. data/vendor/rlite/deps/lzfP.h +159 -0
  19. data/vendor/rlite/deps/lzf_c.c +295 -0
  20. data/vendor/rlite/deps/lzf_d.c +150 -0
  21. data/vendor/rlite/deps/sha1.c +227 -0
  22. data/vendor/rlite/deps/sha1.h +19 -0
  23. data/vendor/rlite/deps/utilfromredis.c +397 -0
  24. data/vendor/rlite/deps/utilfromredis.h +11 -0
  25. data/vendor/rlite/src/Makefile +79 -0
  26. data/vendor/rlite/src/constants.h +15 -0
  27. data/vendor/rlite/src/dump.c +191 -0
  28. data/vendor/rlite/src/dump.h +3 -0
  29. data/vendor/rlite/src/hirlite.c +3985 -0
  30. data/vendor/rlite/src/hirlite.h +186 -0
  31. data/vendor/rlite/src/page_btree.c +1556 -0
  32. data/vendor/rlite/src/page_btree.h +133 -0
  33. data/vendor/rlite/src/page_key.c +283 -0
  34. data/vendor/rlite/src/page_key.h +25 -0
  35. data/vendor/rlite/src/page_list.c +718 -0
  36. data/vendor/rlite/src/page_list.h +70 -0
  37. data/vendor/rlite/src/page_long.c +61 -0
  38. data/vendor/rlite/src/page_long.h +14 -0
  39. data/vendor/rlite/src/page_multi_string.c +538 -0
  40. data/vendor/rlite/src/page_multi_string.h +18 -0
  41. data/vendor/rlite/src/page_skiplist.c +689 -0
  42. data/vendor/rlite/src/page_skiplist.h +70 -0
  43. data/vendor/rlite/src/page_string.c +55 -0
  44. data/vendor/rlite/src/page_string.h +12 -0
  45. data/vendor/rlite/src/pqsort.c +185 -0
  46. data/vendor/rlite/src/pqsort.h +40 -0
  47. data/vendor/rlite/src/restore.c +401 -0
  48. data/vendor/rlite/src/restore.h +3 -0
  49. data/vendor/rlite/src/rlite.c +1309 -0
  50. data/vendor/rlite/src/rlite.h +159 -0
  51. data/vendor/rlite/src/sort.c +530 -0
  52. data/vendor/rlite/src/sort.h +18 -0
  53. data/vendor/rlite/src/status.h +19 -0
  54. data/vendor/rlite/src/type_hash.c +607 -0
  55. data/vendor/rlite/src/type_hash.h +29 -0
  56. data/vendor/rlite/src/type_list.c +477 -0
  57. data/vendor/rlite/src/type_list.h +23 -0
  58. data/vendor/rlite/src/type_set.c +796 -0
  59. data/vendor/rlite/src/type_set.h +34 -0
  60. data/vendor/rlite/src/type_string.c +613 -0
  61. data/vendor/rlite/src/type_string.h +34 -0
  62. data/vendor/rlite/src/type_zset.c +1147 -0
  63. data/vendor/rlite/src/type_zset.h +50 -0
  64. data/vendor/rlite/src/util.c +334 -0
  65. data/vendor/rlite/src/util.h +71 -0
  66. metadata +151 -0
@@ -0,0 +1,14 @@
1
+ #include <stdlib.h>
2
+ #include <stdio.h>
3
+ #include <string.h>
4
+ #include <stdint.h>
5
+
6
+ extern size_t rl_hll_sparse_max_bytes;
7
+ int rl_str_pfadd(unsigned char *str, long strlen, int argc, unsigned char **argv, long *argvlen, unsigned char **_str, long *_strlen);
8
+ int rl_str_pfcount(int argc, unsigned char **argv, long *argvlen, long *_card, unsigned char **updatevalue, long *updatevaluelen);
9
+ int rl_str_pfmerge(int argc, unsigned char **argv, long *argvlen, unsigned char **_str, long *_strlen);
10
+ int rl_str_pfselftest();
11
+ int rl_str_pfdebug_getreg(unsigned char *str, long strlen, int *size, long **elements, unsigned char **_str, long *_strlen);
12
+ int rl_str_pfdebug_decode(unsigned char *str, long strlen, unsigned char **response, long *responselen);
13
+ int rl_str_pfdebug_encoding(unsigned char *str, long strlen, unsigned char **response, long *responselen);
14
+ int rl_str_pfdebug_todense(unsigned char *str, long strlen, unsigned char **_str, long *_strlen);
@@ -0,0 +1,100 @@
1
+ /*
2
+ * Copyright (c) 2000-2008 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, API version */
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 return 0,
57
+ * otherwise return the number of bytes used, which might be considerably
58
+ * more than in_len (but less than 104% of the original size), so it
59
+ * makes sense to always use out_len == in_len - 1), to ensure _some_
60
+ * compression, and store the data uncompressed otherwise (with a flag, of
61
+ * course.
62
+ *
63
+ * lzf_compress might use different algorithms on different systems and
64
+ * even different runs, thus might result in different compressed strings
65
+ * depending on the phase of the moon or similar factors. However, all
66
+ * these strings are architecture-independent and will result in the
67
+ * original data when decompressed using lzf_decompress.
68
+ *
69
+ * The buffers must not be overlapping.
70
+ *
71
+ * If the option LZF_STATE_ARG is enabled, an extra argument must be
72
+ * supplied which is not reflected in this header file. Refer to lzfP.h
73
+ * and lzf_c.c.
74
+ *
75
+ */
76
+ unsigned int
77
+ rl_lzf_compress (const void *const in_data, unsigned int in_len,
78
+ void *out_data, unsigned int out_len);
79
+
80
+ /*
81
+ * Decompress data compressed with some version of the lzf_compress
82
+ * function and stored at location in_data and length in_len. The result
83
+ * will be stored at out_data up to a maximum of out_len characters.
84
+ *
85
+ * If the output buffer is not large enough to hold the decompressed
86
+ * data, a 0 is returned and errno is set to E2BIG. Otherwise the number
87
+ * of decompressed bytes (i.e. the original length of the data) is
88
+ * returned.
89
+ *
90
+ * If an error in the compressed data is detected, a zero is returned and
91
+ * errno is set to EINVAL.
92
+ *
93
+ * This function is very fast, about as fast as a copying loop.
94
+ */
95
+ unsigned int
96
+ rl_lzf_decompress (const void *const in_data, unsigned int in_len,
97
+ void *out_data, unsigned int out_len);
98
+
99
+ #endif
100
+
@@ -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 necessary. NOTE: this breaks
97
+ * the documentation in lzf.h.
98
+ */
99
+ #ifndef AVOID_ERRNO
100
+ # define AVOID_ERRNO 0
101
+ #endif
102
+
103
+ /*
104
+ * Whether 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
+ * Whether 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 noticeable 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
+
@@ -0,0 +1,295 @@
1
+ /*
2
+ * Copyright (c) 2000-2008 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
+ rl_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; /* len is now #octets - 1 */
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
+ lit = 0; op++; /* start run */
226
+
227
+ ip += len + 1;
228
+
229
+ if (expect_false (ip >= in_end - 2))
230
+ break;
231
+
232
+ #if ULTRA_FAST || VERY_FAST
233
+ --ip;
234
+ # if VERY_FAST && !ULTRA_FAST
235
+ --ip;
236
+ # endif
237
+ hval = FRST (ip);
238
+
239
+ hval = NEXT (hval, ip);
240
+ htab[IDX (hval)] = ip;
241
+ ip++;
242
+
243
+ # if VERY_FAST && !ULTRA_FAST
244
+ hval = NEXT (hval, ip);
245
+ htab[IDX (hval)] = ip;
246
+ ip++;
247
+ # endif
248
+ #else
249
+ ip -= len + 1;
250
+
251
+ do
252
+ {
253
+ hval = NEXT (hval, ip);
254
+ htab[IDX (hval)] = ip;
255
+ ip++;
256
+ }
257
+ while (len--);
258
+ #endif
259
+ }
260
+ else
261
+ {
262
+ /* one more literal byte we must copy */
263
+ if (expect_false (op >= out_end))
264
+ return 0;
265
+
266
+ lit++; *op++ = *ip++;
267
+
268
+ if (expect_false (lit == MAX_LIT))
269
+ {
270
+ op [- lit - 1] = lit - 1; /* stop run */
271
+ lit = 0; op++; /* start run */
272
+ }
273
+ }
274
+ }
275
+
276
+ if (op + 3 > out_end) /* at most 3 bytes can be missing here */
277
+ return 0;
278
+
279
+ while (ip < in_end)
280
+ {
281
+ lit++; *op++ = *ip++;
282
+
283
+ if (expect_false (lit == MAX_LIT))
284
+ {
285
+ op [- lit - 1] = lit - 1; /* stop run */
286
+ lit = 0; op++; /* start run */
287
+ }
288
+ }
289
+
290
+ op [- lit - 1] = lit - 1; /* end run */
291
+ op -= !lit; /* undo run if length is zero */
292
+
293
+ return op - (u8 *)out_data;
294
+ }
295
+