Skip to content

Commit 6c1211c

Browse files
committed
更新代码
1 parent ca6661e commit 6c1211c

File tree

5 files changed

+745
-0
lines changed

5 files changed

+745
-0
lines changed

lua_lzf.c

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#define LUA_LIB
2+
3+
#include <core.h>
4+
#include <lzf.h>
5+
6+
7+
static int llzf_compress(lua_State *L) {
8+
size_t tsize;
9+
const char *text = luaL_checklstring(L, 1, &tsize);
10+
if (!text || tsize < 1)
11+
return luaL_error(L, "[lzf_compress error]: Invalid buffer.");
12+
13+
size_t bsize = LZF_MAX_COMPRESSED_SIZE(tsize);
14+
char *buffer = lua_newuserdata(L, bsize);
15+
16+
int rsize;
17+
if ((rsize = lzf_compress(text, tsize, buffer, bsize)) < 1)
18+
return luaL_error(L, "[lzf_compress error]: Can't compressed text.");
19+
20+
lua_pushlstring(L, buffer, rsize);
21+
return 1;
22+
}
23+
24+
static int llzf_uncompress(lua_State *L) {
25+
26+
size_t tsize;
27+
const char *text = luaL_checklstring(L, 1, &tsize);
28+
if (!text || tsize < 1)
29+
return luaL_error(L, "[lzf_compress error]: Invalid buffer.");
30+
31+
size_t bsize = tsize * 2;
32+
for (;;) {
33+
char* buffer = lua_newuserdata(L, bsize);
34+
int ret = lzf_decompress(text, tsize, buffer, bsize);
35+
printf("ret = %d\n", ret);
36+
if (ret == 0) {
37+
if (errno == EINVAL) {
38+
errno = 0;
39+
bsize *= 2;
40+
lua_pop(L, 1);
41+
continue;
42+
}
43+
if (errno == EINVAL) {
44+
lua_pushboolean(L, 0);
45+
lua_pushliteral(L, "[lzf_decompress error]: Invalid text buffer.");
46+
return 2;
47+
}
48+
return luaL_error(L, "[lzf_decompress error]: Unknown error.");
49+
}
50+
if (ret > 0) {
51+
lua_pushlstring(L, buffer, ret);
52+
break;
53+
}
54+
}
55+
return 1;
56+
}
57+
58+
59+
LUAMOD_API int
60+
luaopen_llzf(lua_State *L) {
61+
luaL_checkversion(L);
62+
luaL_Reg lzf_libs[] = {
63+
{"compress", llzf_compress},
64+
{"uncompress", llzf_uncompress},
65+
{NULL, NULL},
66+
};
67+
luaL_newlib(L, lzf_libs);
68+
return 1;
69+
}

lzfP.h

+185
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
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 22).
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. Avoiding errno has no speed impact.
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+
* Whether to store pointers or offsets inside the hash table. On
126+
* 64 bit architetcures, pointers take up twice as much space,
127+
* and might also be slower. Default is to autodetect.
128+
*/
129+
/*#define LZF_USER_OFFSETS autodetect */
130+
131+
/*****************************************************************************/
132+
/* nothing should be changed below */
133+
134+
#ifdef __cplusplus
135+
# include <cstring>
136+
# include <climits>
137+
using namespace std;
138+
#else
139+
# include <string.h>
140+
# include <limits.h>
141+
#endif
142+
143+
#ifndef LZF_USE_OFFSETS
144+
# if defined (WIN32)
145+
# define LZF_USE_OFFSETS defined(_M_X64)
146+
# else
147+
# if __cplusplus > 199711L
148+
# include <cstdint>
149+
# else
150+
# include <stdint.h>
151+
# endif
152+
# define LZF_USE_OFFSETS (UINTPTR_MAX > 0xffffffffU)
153+
# endif
154+
#endif
155+
156+
typedef unsigned char u8;
157+
158+
#if LZF_USE_OFFSETS
159+
# define LZF_HSLOT_BIAS ((const u8 *)in_data)
160+
typedef unsigned int LZF_HSLOT;
161+
#else
162+
# define LZF_HSLOT_BIAS 0
163+
typedef const u8 *LZF_HSLOT;
164+
#endif
165+
166+
typedef LZF_HSLOT LZF_STATE[1 << (HLOG)];
167+
168+
#if !STRICT_ALIGN
169+
/* for unaligned accesses we need a 16 bit datatype. */
170+
# if USHRT_MAX == 65535
171+
typedef unsigned short u16;
172+
# elif UINT_MAX == 65535
173+
typedef unsigned int u16;
174+
# else
175+
# undef STRICT_ALIGN
176+
# define STRICT_ALIGN 1
177+
# endif
178+
#endif
179+
180+
#if ULTRA_FAST
181+
# undef VERY_FAST
182+
#endif
183+
184+
#endif
185+

0 commit comments

Comments
 (0)