📄 minilzo.c
字号:
#endif
#endif
#if 0 && !defined(MEMCPY8_DS)
#define MEMCPY8_DS(dest,src,len) \
{ do { \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
len -= 8; \
} while (len > 0); }
#endif
#if !defined(MEMCPY8_DS)
#define MEMCPY8_DS(dest,src,len) \
{ register lzo_uint __l = (len) / 8; \
do { \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
*dest++ = *src++; \
} while (--__l > 0); }
#endif
#define MEMCPY_DS(dest,src,len) \
do *dest++ = *src++; \
while (--len > 0)
#define MEMMOVE_DS(dest,src,len) \
do *dest++ = *src++; \
while (--len > 0)
#if 0 && defined(LZO_OPTIMIZE_GNUC_i386)
#define BZERO8_PTR(s,l,n) \
__asm__ __volatile__( \
"movl %0,%%eax \n" \
"movl %1,%%edi \n" \
"movl %2,%%ecx \n" \
"cld \n" \
"rep \n" \
"stosl %%eax,(%%edi) \n" \
: \
:"g" (0),"g" (s),"g" (n) \
:"eax","edi","ecx", "memory", "cc" \
)
#elif (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMSET)
#if 1
#define BZERO8_PTR(s,l,n) memset((s),0,(lzo_uint)(l)*(n))
#else
#define BZERO8_PTR(s,l,n) memset((lzo_voidp)(s),0,(lzo_uint)(l)*(n))
#endif
#else
#define BZERO8_PTR(s,l,n) \
lzo_memset((lzo_voidp)(s),0,(lzo_uint)(l)*(n))
#endif
#if 0
#if defined(__GNUC__) && defined(__i386__)
unsigned char lzo_rotr8(unsigned char value, int shift);
extern __inline__ unsigned char lzo_rotr8(unsigned char value, int shift)
{
unsigned char result;
__asm__ __volatile__ ("movb %b1, %b0; rorb %b2, %b0"
: "=a"(result) : "g"(value), "c"(shift));
return result;
}
unsigned short lzo_rotr16(unsigned short value, int shift);
extern __inline__ unsigned short lzo_rotr16(unsigned short value, int shift)
{
unsigned short result;
__asm__ __volatile__ ("movw %b1, %b0; rorw %b2, %b0"
: "=a"(result) : "g"(value), "c"(shift));
return result;
}
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif
LZO_PUBLIC(lzo_bool)
lzo_assert(int expr)
{
return (expr) ? 1 : 0;
}
/* If you use the LZO library in a product, you *must* keep this
* copyright string in the executable of your product.
*/
const lzo_byte __lzo_copyright[] =
#if !defined(__LZO_IN_MINLZO)
LZO_VERSION_STRING;
#else
"\n\n\n"
"LZO real-time data compression library.\n"
"Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Markus Franz Xaver Johannes Oberhumer\n"
"<markus.oberhumer@jk.uni-linz.ac.at>\n"
"http://www.oberhumer.com/opensource/lzo/\n"
"\n"
"LZO version: v" LZO_VERSION_STRING ", " LZO_VERSION_DATE "\n"
"LZO build date: " __DATE__ " " __TIME__ "\n\n"
"LZO special compilation options:\n"
#ifdef __cplusplus
" __cplusplus\n"
#endif
#if defined(__PIC__)
" __PIC__\n"
#elif defined(__pic__)
" __pic__\n"
#endif
#if (UINT_MAX < LZO_0xffffffffL)
" 16BIT\n"
#endif
#if defined(__LZO_STRICT_16BIT)
" __LZO_STRICT_16BIT\n"
#endif
#if (UINT_MAX > LZO_0xffffffffL)
" UINT_MAX=" _LZO_MEXPAND(UINT_MAX) "\n"
#endif
#if (ULONG_MAX > LZO_0xffffffffL)
" ULONG_MAX=" _LZO_MEXPAND(ULONG_MAX) "\n"
#endif
#if defined(LZO_BYTE_ORDER)
" LZO_BYTE_ORDER=" _LZO_MEXPAND(LZO_BYTE_ORDER) "\n"
#endif
#if defined(LZO_UNALIGNED_OK_2)
" LZO_UNALIGNED_OK_2\n"
#endif
#if defined(LZO_UNALIGNED_OK_4)
" LZO_UNALIGNED_OK_4\n"
#endif
#if defined(LZO_ALIGNED_OK_4)
" LZO_ALIGNED_OK_4\n"
#endif
#if defined(LZO_DICT_USE_PTR)
" LZO_DICT_USE_PTR\n"
#endif
#if defined(__LZO_QUERY_COMPRESS)
" __LZO_QUERY_COMPRESS\n"
#endif
#if defined(__LZO_QUERY_DECOMPRESS)
" __LZO_QUERY_DECOMPRESS\n"
#endif
#if defined(__LZO_IN_MINILZO)
" __LZO_IN_MINILZO\n"
#endif
"\n\n"
"$Id: LZO " LZO_VERSION_STRING " built " __DATE__ " " __TIME__
#if defined(__GNUC__) && defined(__VERSION__)
" by gcc " __VERSION__
#elif defined(__BORLANDC__)
" by Borland C " _LZO_MEXPAND(__BORLANDC__)
#elif defined(_MSC_VER)
" by Microsoft C " _LZO_MEXPAND(_MSC_VER)
#elif defined(__PUREC__)
" by Pure C " _LZO_MEXPAND(__PUREC__)
#elif defined(__SC__)
" by Symantec C " _LZO_MEXPAND(__SC__)
#elif defined(__TURBOC__)
" by Turbo C " _LZO_MEXPAND(__TURBOC__)
#elif defined(__WATCOMC__)
" by Watcom C " _LZO_MEXPAND(__WATCOMC__)
#endif
" $\n"
"$Copyright: LZO (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Markus Franz Xaver Johannes Oberhumer $\n";
#endif
LZO_PUBLIC(const lzo_byte *)
lzo_copyright(void)
{
return __lzo_copyright;
}
LZO_PUBLIC(unsigned)
lzo_version(void)
{
return LZO_VERSION;
}
LZO_PUBLIC(const char *)
lzo_version_string(void)
{
return LZO_VERSION_STRING;
}
LZO_PUBLIC(const char *)
lzo_version_date(void)
{
return LZO_VERSION_DATE;
}
LZO_PUBLIC(const lzo_charp)
_lzo_version_string(void)
{
return LZO_VERSION_STRING;
}
LZO_PUBLIC(const lzo_charp)
_lzo_version_date(void)
{
return LZO_VERSION_DATE;
}
#define LZO_BASE 65521u
#define LZO_NMAX 5552
#define LZO_DO1(buf,i) {s1 += buf[i]; s2 += s1;}
#define LZO_DO2(buf,i) LZO_DO1(buf,i); LZO_DO1(buf,i+1);
#define LZO_DO4(buf,i) LZO_DO2(buf,i); LZO_DO2(buf,i+2);
#define LZO_DO8(buf,i) LZO_DO4(buf,i); LZO_DO4(buf,i+4);
#define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8);
LZO_PUBLIC(lzo_uint32)
lzo_adler32(lzo_uint32 adler, const lzo_byte *buf, lzo_uint len)
{
lzo_uint32 s1 = adler & 0xffff;
lzo_uint32 s2 = (adler >> 16) & 0xffff;
int k;
if (buf == NULL)
return 1;
while (len > 0)
{
k = len < LZO_NMAX ? (int) len : LZO_NMAX;
len -= k;
if (k >= 16) do
{
LZO_DO16(buf,0);
buf += 16;
k -= 16;
} while (k >= 16);
if (k != 0) do
{
s1 += *buf++;
s2 += s1;
} while (--k > 0);
s1 %= LZO_BASE;
s2 %= LZO_BASE;
}
return (s2 << 16) | s1;
}
LZO_PUBLIC(int)
lzo_memcmp(const lzo_voidp s1, const lzo_voidp s2, lzo_uint len)
{
#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMCMP)
return memcmp(s1,s2,len);
#else
const lzo_byte *p1 = (const lzo_byte *) s1;
const lzo_byte *p2 = (const lzo_byte *) s2;
int d;
if (len > 0) do
{
d = *p1 - *p2;
if (d != 0)
return d;
p1++;
p2++;
}
while (--len > 0);
return 0;
#endif
}
LZO_PUBLIC(lzo_voidp)
lzo_memcpy(lzo_voidp dest, const lzo_voidp src, lzo_uint len)
{
#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMCPY)
return memcpy(dest,src,len);
#else
lzo_byte *p1 = (lzo_byte *) dest;
const lzo_byte *p2 = (const lzo_byte *) src;
if (len <= 0 || p1 == p2)
return dest;
do
*p1++ = *p2++;
while (--len > 0);
return dest;
#endif
}
LZO_PUBLIC(lzo_voidp)
lzo_memmove(lzo_voidp dest, const lzo_voidp src, lzo_uint len)
{
#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMMOVE)
return memmove(dest,src,len);
#else
lzo_byte *p1 = (lzo_byte *) dest;
const lzo_byte *p2 = (const lzo_byte *) src;
if (len <= 0 || p1 == p2)
return dest;
if (p1 < p2)
{
do
*p1++ = *p2++;
while (--len > 0);
}
else
{
p1 += len;
p2 += len;
do
*--p1 = *--p2;
while (--len > 0);
}
return dest;
#endif
}
LZO_PUBLIC(lzo_voidp)
lzo_memset(lzo_voidp s, int c, lzo_uint len)
{
#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMSET)
return memset(s,c,len);
#else
lzo_byte *p = (lzo_byte *) s;
if (len > 0) do
*p++ = LZO_BYTE(c);
while (--len > 0);
return s;
#endif
}
#if 0
# define IS_SIGNED(type) (((type) (1ul << (8 * sizeof(type) - 1))) < 0)
# define IS_UNSIGNED(type) (((type) (1ul << (8 * sizeof(type) - 1))) > 0)
#else
# define IS_SIGNED(type) (((type) (-1)) < ((type) 0))
# define IS_UNSIGNED(type) (((type) (-1)) > ((type) 0))
#endif
#define IS_POWER_OF_2(x) (((x) & ((x) - 1)) == 0)
static lzo_bool schedule_insns_bug(void);
static lzo_bool strength_reduce_bug(int *);
#if 0 || defined(LZO_DEBUG)
#include <stdio.h>
static lzo_bool __lzo_assert_fail(const char *s, unsigned line)
{
#if defined(__palmos__)
printf("LZO assertion failed in line %u: '%s'\n",line,s);
#else
fprintf(stderr,"LZO assertion failed in line %u: '%s'\n",line,s);
#endif
return 0;
}
# define __lzo_assert(x) ((x) ? 1 : __lzo_assert_fail(#x,__LINE__))
#else
# define __lzo_assert(x) ((x) ? 1 : 0)
#endif
#undef COMPILE_TIME_ASSERT
#if 0
# define COMPILE_TIME_ASSERT(expr) r &= __lzo_assert(expr)
#else
# define COMPILE_TIME_ASSERT(expr) LZO_COMPILE_TIME_ASSERT(expr)
#endif
static lzo_bool basic_integral_check(void)
{
lzo_bool r = 1;
COMPILE_TIME_ASSERT(CHAR_BIT == 8);
COMPILE_TIME_ASSERT(sizeof(char) == 1);
COMPILE_TIME_ASSERT(sizeof(short) >= 2);
COMPILE_TIME_ASSERT(sizeof(long) >= 4);
COMPILE_TIME_ASSERT(sizeof(int) >= sizeof(short));
COMPILE_TIME_ASSERT(sizeof(long) >= sizeof(int));
COMPILE_TIME_ASSERT(sizeof(lzo_uint) == sizeof(lzo_int));
COMPILE_TIME_ASSERT(sizeof(lzo_uint32) == sizeof(lzo_int32));
COMPILE_TIME_ASSERT(sizeof(lzo_uint32) >= 4);
COMPILE_TIME_ASSERT(sizeof(lzo_uint32) >= sizeof(unsigned));
#if defined(__LZO_STRICT_16BIT)
COMPILE_TIME_ASSERT(sizeof(lzo_uint) == 2);
#else
COMPILE_TIME_ASSERT(sizeof(lzo_uint) >= 4);
COMPILE_TIME_ASSERT(sizeof(lzo_uint) >= sizeof(unsigned));
#endif
#if (USHRT_MAX == 65535u)
COMPILE_TIME_ASSERT(sizeof(short) == 2);
#elif (USHRT_MAX == LZO_0xffffffffL)
COMPILE_TIME_ASSERT(sizeof(short) == 4);
#elif (USHRT_MAX >= LZO_0xffffffffL)
COMPILE_TIME_ASSERT(sizeof(short) > 4);
#endif
#if (UINT_MAX == 65535u)
COMPILE_TIME_ASSERT(sizeof(int) == 2);
#elif (UINT_MAX == LZO_0xffffffffL)
COMPILE_TIME_ASSERT(sizeof(int) == 4);
#elif (UINT_MAX >= LZO_0xffffffffL)
COMPILE_TIME_ASSERT(sizeof(int) > 4);
#endif
#if (ULONG_MAX == 65535ul)
COMPILE_TIME_ASSERT(sizeof(long) == 2);
#elif (ULONG_MAX == LZO_0xffffffffL)
COMPILE_TIME_ASSERT(sizeof(long) == 4);
#elif (ULONG_MAX >= LZO_0xffffffffL)
COMPILE_TIME_ASSERT(sizeof(long) > 4);
#endif
#if defined(SIZEOF_UNSIGNED)
COMPILE_TIME_ASSERT(SIZEOF_UNSIGNED == sizeof(unsigned));
#endif
#if defined(SIZEOF_UNSIGNED_LONG)
COMPILE_TIME_ASSERT(SIZEOF_UNSIGNED_LONG == sizeof(unsigned long));
#endif
#if defined(SIZEOF_UNSIGNED_SHORT)
COMPILE_TIME_ASSERT(SIZEOF_UNSIGNED_SHORT == sizeof(unsigned short));
#endif
#if !defined(__LZO_IN_MINILZO)
#if defined(SIZEOF_SIZE_T)
COMPILE_TIME_ASSERT(SIZEOF_SIZE_T == sizeof(size_t));
#endif
#endif
COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned char));
COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned short));
COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned));
COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned long));
COMPILE_TIME_ASSERT(IS_SIGNED(short));
COMPILE_TIME_ASSERT(IS_SIGNED(int));
COMPILE_TIME_ASSERT(IS_SIGNED(long));
COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_uint32));
COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_uint));
COMPILE_TIME_ASSERT(IS_SIGNED(lzo_int32));
COMPILE_TIME_ASSERT(IS_SIGNED(lzo_int));
COMPILE_TIME_ASSERT(INT_MAX == LZO_STYPE_MAX(sizeof(int)));
COMPILE_TIME_ASSERT(UINT_MAX == LZO_UTYPE_MAX(sizeof(unsigned)));
COMPILE_TIME_ASSERT(LONG_MAX == LZO_STYPE_MAX(sizeof(long)));
COMPILE_TIME_ASSERT(ULONG_MAX == LZO_UTYPE_MAX(sizeof(unsigned long)));
COMPILE_TIME_ASSERT(SHRT_MAX == LZO_STYPE_MAX(sizeof(short)));
COMPILE_TIME_ASSERT(USHRT_MAX == LZO_UTYPE_MAX(sizeof(unsigned short)));
COMPILE_TIME_ASSERT(LZO_UINT32_MAX == LZO_UTYPE_MAX(sizeof(lzo_uint32)));
COMPILE_TIME_ASSERT(LZO_UINT_MAX == LZO_UTYPE_MAX(sizeof(lzo_uint)));
#if !defined(__LZO_IN_MINILZO)
COMPILE_TIME_ASSERT(SIZE_T_MAX == LZO_UTYPE_MAX(sizeof(size_t)));
#endif
r &= __lzo_assert(LZO_BYTE(257) == 1);
return r;
}
static lzo_bool basic_ptr_check(void)
{
lzo_bool r = 1;
COMPILE_TIME_ASSERT(sizeof(char *) >= sizeof(int));
COMPILE_TIME_ASSERT(sizeof(lzo_byte *) >= sizeof(char *));
COMPILE_TIME_ASSERT(sizeof(lzo_voidp) == sizeof(lzo_byte *));
COMPILE_TIME_ASSERT(sizeof(lzo_voidp) == sizeof(lzo_voidpp));
COMPILE_TIME_ASSERT(sizeof(lzo_voidp) == sizeof(lzo_bytepp));
COMPILE_TIME_ASSERT(sizeof(lzo_voidp) >= sizeof(lzo_uint));
COMPILE_TIME_ASSERT(sizeof(lzo_ptr_t) == sizeof(lzo_voidp));
COMPILE_TIME_ASSERT(sizeof(lzo_ptr_t) == sizeof(lzo_sptr_t));
COMPILE_TIME_ASSERT(sizeof(lzo_ptr_t) >= sizeof(lzo_uint));
COMPILE_TIME_ASSERT(sizeof(lzo_ptrdiff_t) >= 4);
COMPILE_TIME_ASSERT(sizeof(lzo_ptrdiff_t) >= sizeof(ptrdiff_t));
COMPILE_TIME_ASSERT(sizeof(ptrdiff_t) >= sizeof(size_t));
COMPILE_TIME_ASSERT(sizeof(lzo_ptrdiff_t) >= sizeof(lzo_uint));
#if defined(SIZEOF_CHAR_P)
COMPILE_TIME_ASSERT(SIZEOF_CHAR_P == sizeof(char *));
#endif
#if defined(SIZEOF_PTRDIFF_T)
COMPILE_TIME_ASSERT(SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t));
#endif
COMPILE_TIME_ASSERT(IS_SIGNED(ptrdiff_t));
COMPILE_TIME_ASSERT(IS_UNSIGNED(size_t));
COMPILE_TIME_ASSERT(IS_SIGNED(lzo_ptrdiff_t));
COMPILE_TIME_ASSERT(IS_SIGNED(lzo_sptr_t));
COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_ptr_t));
COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_moff_t));
return r;
}
static lzo_bool ptr_check(void)
{
lzo_bool r = 1;
int i;
char _wrkmem[10 * sizeof(lzo_byte *) + sizeof(lzo_full_align_t)];
lzo_bytep wrkmem;
lzo_bytepp dict;
unsigned char x[4 * sizeof(lzo_full_align_t)];
long d;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -