📄 minilzo.c
字号:
/* minilzo.c -- mini subset of the LZO real-time data compression library This file is part of the LZO real-time data compression library. Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer All Rights Reserved. The LZO library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the LZO library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Markus F.X.J. Oberhumer <markus@oberhumer.com> http://www.oberhumer.com/opensource/lzo/ *//* * NOTE: * the full LZO package can be found at * http://www.oberhumer.com/opensource/lzo/ */#define __LZO_IN_MINILZO#define LZO_BUILD#ifdef MINILZO_HAVE_CONFIG_H# include <config.h>#endif#undef LZO_HAVE_CONFIG_H#include "minilzo.h"#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x1080)# error "version mismatch in miniLZO source files"#endif#ifdef MINILZO_HAVE_CONFIG_H# define LZO_HAVE_CONFIG_H#endif#if !defined(LZO_NO_SYS_TYPES_H)# include <sys/types.h>#endif#include <stdio.h>#ifndef __LZO_CONF_H#define __LZO_CONF_H#if !defined(__LZO_IN_MINILZO)# ifndef __LZOCONF_H# include <lzoconf.h># endif#endif#if defined(__BOUNDS_CHECKING_ON)# include <unchecked.h>#else# define BOUNDS_CHECKING_OFF_DURING(stmt) stmt# define BOUNDS_CHECKING_OFF_IN_EXPR(expr) (expr)#endif#if !defined(LZO_HAVE_CONFIG_H)# include <stddef.h># include <string.h># if !defined(NO_STDLIB_H)# include <stdlib.h># endif# define HAVE_MEMCMP# define HAVE_MEMCPY# define HAVE_MEMMOVE# define HAVE_MEMSET#else# include <sys/types.h># if defined(HAVE_STDDEF_H)# include <stddef.h># endif# if defined(STDC_HEADERS)# include <string.h># include <stdlib.h># endif#endif#if defined(__LZO_DOS16) || defined(__LZO_WIN16)# define HAVE_MALLOC_H# define HAVE_HALLOC#endif#undef NDEBUG#if !defined(LZO_DEBUG)# define NDEBUG#endif#if defined(LZO_DEBUG) || !defined(NDEBUG)# if !defined(NO_STDIO_H)# include <stdio.h># endif#endif#include <assert.h>#if !defined(LZO_COMPILE_TIME_ASSERT)# define LZO_COMPILE_TIME_ASSERT(expr) \ { typedef int __lzo_compile_time_assert_fail[1 - 2 * !(expr)]; }#endif#if !defined(LZO_UNUSED)# if 1# define LZO_UNUSED(var) ((void)&var)# elif 0# define LZO_UNUSED(var) { typedef int __lzo_unused[sizeof(var) ? 2 : 1]; }# else# define LZO_UNUSED(parm) (parm = parm)# endif#endif#if !defined(__inline__) && !defined(__GNUC__)# if defined(__cplusplus)# define __inline__ inline# else# define __inline__# endif#endif#if defined(NO_MEMCMP)# undef HAVE_MEMCMP#endif#if !defined(HAVE_MEMCMP)# undef memcmp# define memcmp lzo_memcmp#endif#if !defined(HAVE_MEMCPY)# undef memcpy# define memcpy lzo_memcpy#endif#if !defined(HAVE_MEMMOVE)# undef memmove# define memmove lzo_memmove#endif#if !defined(HAVE_MEMSET)# undef memset# define memset lzo_memset#endif#if 0# define LZO_BYTE(x) ((unsigned char) (x))#else# define LZO_BYTE(x) ((unsigned char) ((x) & 0xff))#endif#define LZO_MAX(a,b) ((a) >= (b) ? (a) : (b))#define LZO_MIN(a,b) ((a) <= (b) ? (a) : (b))#define LZO_MAX3(a,b,c) ((a) >= (b) ? LZO_MAX(a,c) : LZO_MAX(b,c))#define LZO_MIN3(a,b,c) ((a) <= (b) ? LZO_MIN(a,c) : LZO_MIN(b,c))#define lzo_sizeof(type) ((lzo_uint) (sizeof(type)))#define LZO_HIGH(array) ((lzo_uint) (sizeof(array)/sizeof(*(array))))#define LZO_SIZE(bits) (1u << (bits))#define LZO_MASK(bits) (LZO_SIZE(bits) - 1)#define LZO_LSIZE(bits) (1ul << (bits))#define LZO_LMASK(bits) (LZO_LSIZE(bits) - 1)#define LZO_USIZE(bits) ((lzo_uint) 1 << (bits))#define LZO_UMASK(bits) (LZO_USIZE(bits) - 1)#define LZO_STYPE_MAX(b) (((1l << (8*(b)-2)) - 1l) + (1l << (8*(b)-2)))#define LZO_UTYPE_MAX(b) (((1ul << (8*(b)-1)) - 1ul) + (1ul << (8*(b)-1)))#if !defined(SIZEOF_UNSIGNED)# if (UINT_MAX == 0xffff)# define SIZEOF_UNSIGNED 2# elif (UINT_MAX == LZO_0xffffffffL)# define SIZEOF_UNSIGNED 4# elif (UINT_MAX >= LZO_0xffffffffL)# define SIZEOF_UNSIGNED 8# else# error "SIZEOF_UNSIGNED"# endif#endif#if !defined(SIZEOF_UNSIGNED_LONG)# if (ULONG_MAX == LZO_0xffffffffL)# define SIZEOF_UNSIGNED_LONG 4# elif (ULONG_MAX >= LZO_0xffffffffL)# define SIZEOF_UNSIGNED_LONG 8# else# error "SIZEOF_UNSIGNED_LONG"# endif#endif#if !defined(SIZEOF_SIZE_T)# define SIZEOF_SIZE_T SIZEOF_UNSIGNED#endif#if !defined(SIZE_T_MAX)# define SIZE_T_MAX LZO_UTYPE_MAX(SIZEOF_SIZE_T)#endif#if 1 && defined(__LZO_i386) && (UINT_MAX == LZO_0xffffffffL)# if !defined(LZO_UNALIGNED_OK_2) && (USHRT_MAX == 0xffff)# define LZO_UNALIGNED_OK_2# endif# if !defined(LZO_UNALIGNED_OK_4) && (LZO_UINT32_MAX == LZO_0xffffffffL)# define LZO_UNALIGNED_OK_4# endif#endif#if defined(LZO_UNALIGNED_OK_2) || defined(LZO_UNALIGNED_OK_4)# if !defined(LZO_UNALIGNED_OK)# define LZO_UNALIGNED_OK# endif#endif#if defined(__LZO_NO_UNALIGNED)# undef LZO_UNALIGNED_OK# undef LZO_UNALIGNED_OK_2# undef LZO_UNALIGNED_OK_4#endif#if defined(LZO_UNALIGNED_OK_2) && (USHRT_MAX != 0xffff)# error "LZO_UNALIGNED_OK_2 must not be defined on this system"#endif#if defined(LZO_UNALIGNED_OK_4) && (LZO_UINT32_MAX != LZO_0xffffffffL)# error "LZO_UNALIGNED_OK_4 must not be defined on this system"#endif#if defined(__LZO_NO_ALIGNED)# undef LZO_ALIGNED_OK_4#endif#if defined(LZO_ALIGNED_OK_4) && (LZO_UINT32_MAX != LZO_0xffffffffL)# error "LZO_ALIGNED_OK_4 must not be defined on this system"#endif#define LZO_LITTLE_ENDIAN 1234#define LZO_BIG_ENDIAN 4321#define LZO_PDP_ENDIAN 3412#if !defined(LZO_BYTE_ORDER)# if defined(MFX_BYTE_ORDER)# define LZO_BYTE_ORDER MFX_BYTE_ORDER# elif defined(__LZO_i386)# define LZO_BYTE_ORDER LZO_LITTLE_ENDIAN# elif defined(BYTE_ORDER)# define LZO_BYTE_ORDER BYTE_ORDER# elif defined(__BYTE_ORDER)# define LZO_BYTE_ORDER __BYTE_ORDER# endif#endif#if defined(LZO_BYTE_ORDER)# if (LZO_BYTE_ORDER != LZO_LITTLE_ENDIAN) && \ (LZO_BYTE_ORDER != LZO_BIG_ENDIAN)# error "invalid LZO_BYTE_ORDER"# endif#endif#if defined(LZO_UNALIGNED_OK) && !defined(LZO_BYTE_ORDER)# error "LZO_BYTE_ORDER is not defined"#endif#define LZO_OPTIMIZE_GNUC_i386_IS_BUGGY#if defined(NDEBUG) && !defined(LZO_DEBUG) && !defined(__LZO_CHECKER)# if defined(__GNUC__) && defined(__i386__)# if !defined(LZO_OPTIMIZE_GNUC_i386_IS_BUGGY)# define LZO_OPTIMIZE_GNUC_i386# endif# endif#endif__LZO_EXTERN_C int __lzo_init_done;__LZO_EXTERN_C const lzo_byte __lzo_copyright[];LZO_EXTERN(const lzo_byte *) lzo_copyright(void);__LZO_EXTERN_C const lzo_uint32 _lzo_crc32_table[256];#define _LZO_STRINGIZE(x) #x#define _LZO_MEXPAND(x) _LZO_STRINGIZE(x)#define _LZO_CONCAT2(a,b) a ## b#define _LZO_CONCAT3(a,b,c) a ## b ## c#define _LZO_CONCAT4(a,b,c,d) a ## b ## c ## d#define _LZO_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e#define _LZO_ECONCAT2(a,b) _LZO_CONCAT2(a,b)#define _LZO_ECONCAT3(a,b,c) _LZO_CONCAT3(a,b,c)#define _LZO_ECONCAT4(a,b,c,d) _LZO_CONCAT4(a,b,c,d)#define _LZO_ECONCAT5(a,b,c,d,e) _LZO_CONCAT5(a,b,c,d,e)#if 0#define __LZO_IS_COMPRESS_QUERY(i,il,o,ol,w) ((lzo_voidp)(o) == (w))#define __LZO_QUERY_COMPRESS(i,il,o,ol,w,n,s) \ (*ol = (n)*(s), LZO_E_OK)#define __LZO_IS_DECOMPRESS_QUERY(i,il,o,ol,w) ((lzo_voidp)(o) == (w))#define __LZO_QUERY_DECOMPRESS(i,il,o,ol,w,n,s) \ (*ol = (n)*(s), LZO_E_OK)#define __LZO_IS_OPTIMIZE_QUERY(i,il,o,ol,w) ((lzo_voidp)(o) == (w))#define __LZO_QUERY_OPTIMIZE(i,il,o,ol,w,n,s) \ (*ol = (n)*(s), LZO_E_OK)#endif#ifndef __LZO_PTR_H#define __LZO_PTR_H#ifdef __cplusplusextern "C" {#endif#if defined(__LZO_DOS16) || defined(__LZO_WIN16)# include <dos.h># if 1 && defined(__WATCOMC__)# include <i86.h> __LZO_EXTERN_C unsigned char _HShift;# define __LZO_HShift _HShift# elif 1 && defined(_MSC_VER) __LZO_EXTERN_C unsigned short __near _AHSHIFT;# define __LZO_HShift ((unsigned) &_AHSHIFT)# elif defined(__LZO_WIN16)# define __LZO_HShift 3# else# define __LZO_HShift 12# endif# if !defined(_FP_SEG) && defined(FP_SEG)# define _FP_SEG FP_SEG# endif# if !defined(_FP_OFF) && defined(FP_OFF)# define _FP_OFF FP_OFF# endif#endif#if !defined(lzo_ptrdiff_t)# if (UINT_MAX >= LZO_0xffffffffL) typedef ptrdiff_t lzo_ptrdiff_t;# else typedef long lzo_ptrdiff_t;# endif#endif#if !defined(__LZO_HAVE_PTR_T)# if defined(lzo_ptr_t)# define __LZO_HAVE_PTR_T# endif#endif#if !defined(__LZO_HAVE_PTR_T)# if defined(SIZEOF_CHAR_P) && defined(SIZEOF_UNSIGNED_LONG)# if (SIZEOF_CHAR_P == SIZEOF_UNSIGNED_LONG) typedef unsigned long lzo_ptr_t; typedef long lzo_sptr_t;# define __LZO_HAVE_PTR_T# endif# endif#endif#if !defined(__LZO_HAVE_PTR_T)# if defined(SIZEOF_CHAR_P) && defined(SIZEOF_UNSIGNED)# if (SIZEOF_CHAR_P == SIZEOF_UNSIGNED) typedef unsigned int lzo_ptr_t; typedef int lzo_sptr_t;# define __LZO_HAVE_PTR_T# endif# endif#endif#if !defined(__LZO_HAVE_PTR_T)# if defined(SIZEOF_CHAR_P) && defined(SIZEOF_UNSIGNED_SHORT)# if (SIZEOF_CHAR_P == SIZEOF_UNSIGNED_SHORT) typedef unsigned short lzo_ptr_t; typedef short lzo_sptr_t;# define __LZO_HAVE_PTR_T# endif# endif#endif#if !defined(__LZO_HAVE_PTR_T)# if defined(LZO_HAVE_CONFIG_H) || defined(SIZEOF_CHAR_P)# error "no suitable type for lzo_ptr_t"# else typedef unsigned long lzo_ptr_t; typedef long lzo_sptr_t;# define __LZO_HAVE_PTR_T# endif#endif#if defined(__LZO_DOS16) || defined(__LZO_WIN16)#define PTR(a) ((lzo_bytep) (a))#define PTR_ALIGNED_4(a) ((_FP_OFF(a) & 3) == 0)#define PTR_ALIGNED2_4(a,b) (((_FP_OFF(a) | _FP_OFF(b)) & 3) == 0)#else#define PTR(a) ((lzo_ptr_t) (a))#define PTR_LINEAR(a) PTR(a)#define PTR_ALIGNED_4(a) ((PTR_LINEAR(a) & 3) == 0)#define PTR_ALIGNED_8(a) ((PTR_LINEAR(a) & 7) == 0)#define PTR_ALIGNED2_4(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 3) == 0)#define PTR_ALIGNED2_8(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 7) == 0)#endif#define PTR_LT(a,b) (PTR(a) < PTR(b))#define PTR_GE(a,b) (PTR(a) >= PTR(b))#define PTR_DIFF(a,b) ((lzo_ptrdiff_t) (PTR(a) - PTR(b)))#define pd(a,b) ((lzo_uint) ((a)-(b)))LZO_EXTERN(lzo_ptr_t)__lzo_ptr_linear(const lzo_voidp ptr);typedef union{ char a_char; unsigned char a_uchar; short a_short; unsigned short a_ushort; int a_int; unsigned int a_uint; long a_long; unsigned long a_ulong; lzo_int a_lzo_int; lzo_uint a_lzo_uint; lzo_int32 a_lzo_int32; lzo_uint32 a_lzo_uint32; ptrdiff_t a_ptrdiff_t; lzo_ptrdiff_t a_lzo_ptrdiff_t; lzo_ptr_t a_lzo_ptr_t; lzo_voidp a_lzo_voidp; void * a_void_p; lzo_bytep a_lzo_bytep; lzo_bytepp a_lzo_bytepp; lzo_uintp a_lzo_uintp; lzo_uint * a_lzo_uint_p; lzo_uint32p a_lzo_uint32p; lzo_uint32 * a_lzo_uint32_p; unsigned char * a_uchar_p; char * a_char_p;}lzo_full_align_t;#ifdef __cplusplus}#endif#endif#define LZO_DETERMINISTIC#define LZO_DICT_USE_PTR#if defined(__LZO_DOS16) || defined(__LZO_WIN16) || defined(__LZO_STRICT_16BIT)# undef LZO_DICT_USE_PTR#endif#if defined(LZO_DICT_USE_PTR)# define lzo_dict_t const lzo_bytep# define lzo_dict_p lzo_dict_t __LZO_MMODEL *#else# define lzo_dict_t lzo_uint# define lzo_dict_p lzo_dict_t __LZO_MMODEL *#endif#if !defined(lzo_moff_t)#define lzo_moff_t lzo_uint#endif#endifLZO_PUBLIC(lzo_ptr_t)__lzo_ptr_linear(const lzo_voidp ptr){ lzo_ptr_t p;#if defined(__LZO_DOS16) || defined(__LZO_WIN16) p = (((lzo_ptr_t)(_FP_SEG(ptr))) << (16 - __LZO_HShift)) + (_FP_OFF(ptr));#else p = PTR_LINEAR(ptr);#endif return p;}LZO_PUBLIC(unsigned)__lzo_align_gap(const lzo_voidp ptr, lzo_uint size){ lzo_ptr_t p, s, n; assert(size > 0); p = __lzo_ptr_linear(ptr); s = (lzo_ptr_t) (size - 1);#if 0 assert((size & (size - 1)) == 0); n = ((p + s) & ~s) - p;#else n = (((p + s) / size) * size) - p;#endif assert((long)n >= 0); assert(n <= s); return (unsigned)n;}#ifndef __LZO_UTIL_H#define __LZO_UTIL_H#ifndef __LZO_CONF_H#endif#ifdef __cplusplusextern "C" {#endif#if 1 && defined(HAVE_MEMCPY)#if !defined(__LZO_DOS16) && !defined(__LZO_WIN16)#define MEMCPY8_DS(dest,src,len) \ memcpy(dest,src,len); \ dest += len; \ src += len#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++; \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -