307 lines
11 KiB
C
307 lines
11 KiB
C
|
|
||
|
#ifndef __YRCP_H_INCLUDED
|
||
|
#define __YRCP_H_INCLUDED 1
|
||
|
|
||
|
typedef unsigned int yrcpUint;
|
||
|
typedef int yrcpInt;
|
||
|
|
||
|
#define YRCP_VERSION 0x10 /* 10 */
|
||
|
|
||
|
#define YRCP_E_OK 0
|
||
|
#define YRCP_E_ERROR (-1)
|
||
|
#define YRCP_E_OUT_OF_MEMORY (-2) /* */
|
||
|
#define YRCP_E_NOT_COMPRESSIBLE (-3) /* */
|
||
|
#define YRCP_E_INPUT_OVERRUN (-4)
|
||
|
#define YRCP_E_OUTPUT_OVERRUN (-5)
|
||
|
#define YRCP_E_LOOKBEHIND_OVERRUN (-6)
|
||
|
#define YRCP_E_EOF_NOT_FOUND (-7)
|
||
|
#define YRCP_E_INPUT_NOT_CONSUMED (-8)
|
||
|
#define YRCP_E_NOT_YET_IMPLEMENTED (-9) /* */
|
||
|
#define YRCP_E_INVALID_ARGUMENT (-10)
|
||
|
#define YRCP_E_INVALID_ALIGNMENT (-11) /* */
|
||
|
#define YRCP_E_OUTPUT_NOT_CONSUMED (-12)
|
||
|
#define YRCP_E_INTERNAL_ERROR (-99)
|
||
|
|
||
|
#define YRCP_UCHAR_MAX 0xFF
|
||
|
#define YRCP_CHAR_BIT 8
|
||
|
#define YRCP_MAG_NUMB 0x83828180 /* 0x83828180 */
|
||
|
#define YRCP_MAG_SHORT_NUMB 0x8180 /* 0x8180 */
|
||
|
#define YRCP_COMP_LEN_MAX 49152 /* 49152 */
|
||
|
#define YRCP_COMP_LEN_OFF 0x4000
|
||
|
|
||
|
#define yrcpXint yrcpUint
|
||
|
#define yrcpInt16T short
|
||
|
#define yrcpUint16T unsigned short
|
||
|
#define yrcpInt32T int
|
||
|
#define yrcpUint32T unsigned int
|
||
|
#define yrcpUintPtrT unsigned int
|
||
|
#define yrcpBytePtr unsigned char *
|
||
|
#define yrcpCharPtr char *
|
||
|
#define yrcpVoidPtr void *
|
||
|
#define yrcpShortPtr short *
|
||
|
#define yrcpUshortPtr unsigned short *
|
||
|
#define yrcpIntPtr yrcpInt *
|
||
|
#define yrcpUintPtr yrcpUint *
|
||
|
#define yrcpXintPtr yrcpXint *
|
||
|
#define yrcpVoidPPtr yrcpVoidPtr *
|
||
|
#define yrcpBytePPtr yrcpBytePtr *
|
||
|
|
||
|
#undef assert
|
||
|
#define assert(e) ((void)0)
|
||
|
|
||
|
#define YRCP_INT16_C(c) (c)
|
||
|
#define YRCP_UINT16_C(c) (c##U)
|
||
|
#define YRCP_INT32_C(c) (c)
|
||
|
#define YRCP_UINT32_C(c) (c##U)
|
||
|
|
||
|
#define YRCP_BYTE(x) ((unsigned char) (x))
|
||
|
|
||
|
#define YRCP_MAX(a,b) ((a) >= (b) ? (a) : (b))
|
||
|
#define YRCP_MIN(a,b) ((a) <= (b) ? (a) : (b))
|
||
|
|
||
|
#define YRCP_SIZE(bits) (1u << (bits))
|
||
|
#define YRCP_MASK(bits) (YRCP_SIZE(bits) - 1)
|
||
|
|
||
|
#define YRCP_USIZE(bits) ((yrcpUint) 1 << (bits))
|
||
|
#define YRCP_UMASK(bits) (YRCP_USIZE(bits) - 1)
|
||
|
|
||
|
#define YRMULDATA(a,b) ((yrcpXint) ((a) * (b)))
|
||
|
|
||
|
#define yrcp_memops_TU0p void *
|
||
|
|
||
|
#define yrcp_memops_TU1p unsigned char *
|
||
|
|
||
|
typedef yrcpUint16T yrcp_memops_TU2;
|
||
|
#define yrcp_memops_TU2p volatile yrcp_memops_TU2 *
|
||
|
|
||
|
typedef yrcpUint32T yrcp_memops_TU4;
|
||
|
#define yrcp_memops_TU4p volatile yrcp_memops_TU4 *
|
||
|
|
||
|
struct yrcp_memops_TU8_struct { unsigned char a[8]; };
|
||
|
typedef struct yrcp_memops_TU8_struct yrcp_memops_TU8;
|
||
|
|
||
|
#define yrcp_memops_TU8p yrcp_memops_TU8 *
|
||
|
|
||
|
#define yrcp_memops_set_TU1p volatile yrcp_memops_TU1p
|
||
|
|
||
|
#define yrcp_memops_move_TU1p yrcp_memops_TU1p
|
||
|
|
||
|
#define YRCP_MEMOPS_SET1(dd,cc) \
|
||
|
yrcp_memops_set_TU1p data1 = (yrcp_memops_set_TU1p) (yrcp_memops_TU0p) (dd); \
|
||
|
data1[0] = YRCP_BYTE(cc);
|
||
|
|
||
|
#define YRCP_MEMOPS_SET2(dd,cc) \
|
||
|
yrcp_memops_set_TU1p data2 = (yrcp_memops_set_TU1p) (yrcp_memops_TU0p) (dd); \
|
||
|
data2[0] = YRCP_BYTE(cc); data2[1] = YRCP_BYTE(cc);
|
||
|
|
||
|
#define YRCP_MEMOPS_SET3(dd,cc) \
|
||
|
yrcp_memops_set_TU1p data3 = (yrcp_memops_set_TU1p) (yrcp_memops_TU0p) (dd); \
|
||
|
data3[0] = YRCP_BYTE(cc); data3[1] = YRCP_BYTE(cc); data3[2] = YRCP_BYTE(cc);
|
||
|
|
||
|
#define YRCP_MEMOPS_SET4(dd,cc) \
|
||
|
yrcp_memops_set_TU1p data4 = (yrcp_memops_set_TU1p) (yrcp_memops_TU0p) (dd); \
|
||
|
data4[0] = YRCP_BYTE(cc); data4[1] = YRCP_BYTE(cc); data4[2] = YRCP_BYTE(cc); data4[3] = YRCP_BYTE(cc);
|
||
|
|
||
|
|
||
|
#define YRCP_UA_COPY4(dd,ss) memcpy((char *)dd, (char *)ss, 4)
|
||
|
#define YRCP_UA_COPY8(dd,ss) memcpy((char *)dd, (char *)ss, 8)
|
||
|
#define YRCP_UA_COPYN(dd,ss,nn) memcpy((char *)dd, (char *)ss, nn)
|
||
|
|
||
|
#define YRCP_UA_GET_LE16(ss) (* (const yrcp_memops_TU2p) (const yrcp_memops_TU0p) (ss))
|
||
|
#define YRCP_UA_GET_LE32(ss) (* (const yrcp_memops_TU4p) (const yrcp_memops_TU0p) (ss))
|
||
|
|
||
|
#define YRCP_UA_GET_NE16(ss) (* (const yrcp_memops_TU2p) (const yrcp_memops_TU0p) (ss))
|
||
|
#define YRCP_UA_GET_NE32(ss) (* (const yrcp_memops_TU4p) (const yrcp_memops_TU0p) (ss))
|
||
|
|
||
|
#define YRSUBDATA(a,b) ((yrcpUint) ((a)-(b)))
|
||
|
|
||
|
#define YRCP_DETERMINISTIC 1
|
||
|
|
||
|
#define yrcpDictT const yrcpBytePtr
|
||
|
#define yrcpDictPtr yrcpDictT *
|
||
|
|
||
|
#define YRCP_DICT_USE_PTR 0
|
||
|
|
||
|
#define YRCP_NEED_DICT_H 1
|
||
|
|
||
|
#define YRCP_D_BITS 11
|
||
|
|
||
|
#define YRCP_DINDEX(dv,p) YRCP_DM(((YRMULDATA(0x1824429d,dv)) >> (32-YRCP_D_BITS)))
|
||
|
|
||
|
#define YRCP_M1_MAX_OFFSET 0x0400
|
||
|
#define YRCP_M2_MAX_OFFSET 0x0800
|
||
|
#define YRCP_M3_MAX_OFFSET 0x4000
|
||
|
#define YRCP_M4_MAX_OFFSET 0xbfff
|
||
|
|
||
|
#define YRCP_M1_MIN_LEN 2
|
||
|
#define YRCP_M1_MAX_LEN 2
|
||
|
#define YRCP_M2_MIN_LEN 3
|
||
|
#define YRCP_M2_MAX_LEN 8
|
||
|
#define YRCP_M3_MIN_LEN 3
|
||
|
#define YRCP_M3_MAX_LEN 33
|
||
|
#define YRCP_M4_MIN_LEN 3
|
||
|
#define YRCP_M4_MAX_LEN 9
|
||
|
|
||
|
#define YRCP_M1_MARKER 0
|
||
|
#define YRCP_M2_MARKER 64
|
||
|
#define YRCP_M3_MARKER 32
|
||
|
#define YRCP_M4_MARKER 16
|
||
|
|
||
|
#define YRCP_HASH YRCP_HASH_YRCP_INCREMENTAL_B
|
||
|
#define YRCP_DL_MIN_LEN YRCP_M2_MIN_LEN
|
||
|
|
||
|
#if (YRCP_D_BITS < 16)
|
||
|
#define YRCP_D_SIZE YRCP_SIZE(YRCP_D_BITS)
|
||
|
#define YRCP_D_MASK YRCP_MASK(YRCP_D_BITS)
|
||
|
#else
|
||
|
#define YRCP_D_SIZE YRCP_USIZE(YRCP_D_BITS)
|
||
|
#define YRCP_D_MASK YRCP_UMASK(YRCP_D_BITS)
|
||
|
#endif
|
||
|
|
||
|
#define YRCP_D_HIGH ((YRCP_D_MASK >> 1) + 1)
|
||
|
|
||
|
#define YRCP_DD_BITS 0
|
||
|
#define YRCP_DD_SIZE YRCP_SIZE(YRCP_DD_BITS)
|
||
|
#define YRCP_DD_MASK YRCP_MASK(YRCP_DD_BITS)
|
||
|
|
||
|
#define YRCP_DL_BITS (YRCP_D_BITS - YRCP_DD_BITS)
|
||
|
|
||
|
#define YRCP_DL_SHIFT ((YRCP_DL_BITS + (YRCP_DL_MIN_LEN - 1)) / YRCP_DL_MIN_LEN)
|
||
|
|
||
|
#define YRCP_HASH_GZIP 1
|
||
|
#define YRCP_HASH_GZIP_INCREMENTAL 2
|
||
|
#define YRCP_HASH_YRCP_INCREMENTAL_A 3
|
||
|
#define YRCP_HASH_YRCP_INCREMENTAL_B 4
|
||
|
|
||
|
#define YRCP_DTAT_INPUT_LEN_MAX 20
|
||
|
|
||
|
#if (YRCP_DL_BITS < 16)
|
||
|
#define YRCP_DL_SIZE YRCP_SIZE(YRCP_DL_BITS)
|
||
|
#define YRCP_DL_MASK YRCP_MASK(YRCP_DL_BITS)
|
||
|
#else
|
||
|
#define YRCP_DL_SIZE YRCP_USIZE(YRCP_DL_BITS)
|
||
|
#define YRCP_DL_MASK YRCP_UMASK(YRCP_DL_BITS)
|
||
|
#endif
|
||
|
|
||
|
#if (YRCP_D_BITS < 6 || YRCP_D_BITS > 18)
|
||
|
#error "err YRCP_D_BITS"
|
||
|
#endif
|
||
|
|
||
|
#if (YRCP_DL_BITS < 6 || YRCP_DL_BITS > 20)
|
||
|
#error "err YRCP_DL_BITS"
|
||
|
#endif
|
||
|
|
||
|
#if (YRCP_DD_BITS < 0 || YRCP_DD_BITS > 6)
|
||
|
#error "err YRCP_DD_BITS"
|
||
|
#endif
|
||
|
|
||
|
#if (YRCP_DL_MIN_LEN == 3)
|
||
|
#define _DV2_A(p,shift1,shift2) (((( (yrcpXint)((p)[0]) << shift1) ^ (p)[1]) << shift2) ^ (p)[2])
|
||
|
#define _DV2_B(p,shift1,shift2) (((( (yrcpXint)((p)[2]) << shift1) ^ (p)[1]) << shift2) ^ (p)[0])
|
||
|
#define _DV3_B(p,shift1,shift2,shift3) ((_DV2_B((p)+1,shift1,shift2) << (shift3)) ^ (p)[0])
|
||
|
#elif (YRCP_DL_MIN_LEN == 2)
|
||
|
#define _DV2_A(p,shift1,shift2) (( (yrcpXint)(p[0]) << shift1) ^ p[1])
|
||
|
#define _DV2_B(p,shift1,shift2) (( (yrcpXint)(p[1]) << shift1) ^ p[2])
|
||
|
#else
|
||
|
#error "err YRCP_DL_MIN_LEN"
|
||
|
#endif
|
||
|
|
||
|
#define _DV_A(p,shift) _DV2_A(p,shift,shift)
|
||
|
#define _DV_B(p,shift) _DV2_B(p,shift,shift)
|
||
|
|
||
|
#define YRCP_DMS(v,s) ((yrcpUint) (((v) & (YRCP_D_MASK >> (s))) << (s)))
|
||
|
#define YRCP_DM(v) YRCP_DMS(v,0)
|
||
|
|
||
|
#if (YRCP_HASH == YRCP_HASH_GZIP)
|
||
|
#define _DINDEX(dv,p) (_DV_A((p),YRCP_DL_SHIFT))
|
||
|
#elif (YRCP_HASH == YRCP_HASH_GZIP_INCREMENTAL)
|
||
|
#define __YRCP_HASH_INCREMENTAL 1
|
||
|
#define DVAL_FIRST(dv,p) dv = _DV_A((p),YRCP_DL_SHIFT)
|
||
|
#define DVAL_NEXT(dv,p) dv = (((dv) << YRCP_DL_SHIFT) ^ p[2])
|
||
|
#define _DINDEX(dv,p) (dv)
|
||
|
#define DVAL_LOOKAHEAD YRCP_DL_MIN_LEN
|
||
|
#elif (YRCP_HASH == YRCP_HASH_YRCP_INCREMENTAL_A)
|
||
|
#define __YRCP_HASH_INCREMENTAL 1
|
||
|
#define DVAL_FIRST(dv,p) dv = _DV_A((p),5)
|
||
|
#define DVAL_NEXT(dv,p) dv ^= (yrcpXint)(p[-1]) << (2*5); dv = (((dv) << 5) ^ p[2])
|
||
|
#define _DINDEX(dv,p) ((YRMULDATA(0x9f5f,dv)) >> 5)
|
||
|
#define DVAL_LOOKAHEAD YRCP_DL_MIN_LEN
|
||
|
#elif (YRCP_HASH == YRCP_HASH_YRCP_INCREMENTAL_B)
|
||
|
#define __YRCP_HASH_INCREMENTAL 1
|
||
|
#define DVAL_FIRST(dv,p) dv = _DV_B((p),5)
|
||
|
#define DVAL_NEXT(dv,p) dv ^= p[-1]; dv = (((dv) >> 5) ^ ((yrcpXint)(p[2]) << (2*5)))
|
||
|
#define _DINDEX(dv,p) ((YRMULDATA(0x9f5f,dv)) >> 5)
|
||
|
#define DVAL_LOOKAHEAD YRCP_DL_MIN_LEN
|
||
|
#else
|
||
|
#error "err choose a hashing strategy"
|
||
|
#endif
|
||
|
|
||
|
#ifndef YRCP_DINDEX
|
||
|
#define YRCP_DINDEX(dv,p) ((yrcpUint)((_DINDEX(dv,p)) & YRCP_DL_MASK) << YRCP_DD_BITS)
|
||
|
#endif
|
||
|
|
||
|
#if (YRCP_DICT_USE_PTR)
|
||
|
#define DENTRY(p,in) (p)
|
||
|
#define GINDEX(m_pos,m_off,dict,dindex,in) (m_pos) = dict[dindex]
|
||
|
#else
|
||
|
#define DENTRY(p,in) (YRSUBDATA(p, in))
|
||
|
#define GINDEX(m_pos,m_off,dict,dindex,in) (m_off) = dict[dindex]
|
||
|
#endif
|
||
|
|
||
|
#if (YRCP_DD_BITS == 0)
|
||
|
#define UPDATE_D(dict,drun,dv,p,in) dict[ YRCP_DINDEX(dv,p) ] = DENTRY(p,in)
|
||
|
#define UPDATE_I(dict,drun,index,p,in) dict[index] = DENTRY(p,in)
|
||
|
#define UPDATE_P(ptr,drun,p,in) (ptr)[0] = DENTRY(p,in)
|
||
|
#else
|
||
|
#define UPDATE_D(dict,drun,dv,p,in) dict[ YRCP_DINDEX(dv,p) + drun++ ] = DENTRY(p,in); drun &= YRCP_DD_MASK
|
||
|
#define UPDATE_I(dict,drun,index,p,in) dict[ (index) + drun++ ] = DENTRY(p,in); drun &= YRCP_DD_MASK
|
||
|
#define UPDATE_P(ptr,drun,p,in) (ptr) [ drun++ ] = DENTRY(p,in); drun &= YRCP_DD_MASK
|
||
|
#endif
|
||
|
|
||
|
union yrcpConfigCheckUnion
|
||
|
{
|
||
|
yrcpUint array[2];
|
||
|
unsigned char buf[2*YRCP_MAX(8,sizeof(yrcpUint))];
|
||
|
};
|
||
|
|
||
|
#define yrcp_sizeof_dict_t ((unsigned)sizeof(yrcpBytePtr))
|
||
|
|
||
|
struct yrcpCallbackT;
|
||
|
typedef struct yrcpCallbackT yrcpCallbackT;
|
||
|
|
||
|
#define yrcp_callback_p yrcpCallbackT *
|
||
|
|
||
|
typedef yrcpVoidPtr (*yrcpAllocFuncT) (yrcp_callback_p self, yrcpUint items, yrcpUint size);
|
||
|
|
||
|
typedef void (*yrcpFreeFuncT) (yrcp_callback_p self, yrcpVoidPtr ptr);
|
||
|
|
||
|
typedef void (*yrcpProgressFuncT) (yrcp_callback_p, yrcpUint, yrcpUint, int);
|
||
|
|
||
|
struct yrcpCallbackT
|
||
|
{
|
||
|
yrcpAllocFuncT nalloc; /* */
|
||
|
yrcpFreeFuncT nfree; /* */
|
||
|
yrcpProgressFuncT nprogress;
|
||
|
yrcpVoidPtr user1;
|
||
|
yrcpXint user2;
|
||
|
yrcpXint user3;
|
||
|
};
|
||
|
|
||
|
int yellowRabbitInitExecute(unsigned version, int dataSize1, int dataSize2, int dataSize3, int dataSize4,
|
||
|
int dataSize5, int dataSize6, int dataSize7, int dataSize8, int dataSize9);
|
||
|
|
||
|
#define yellowRabbitCompressInit() yellowRabbitInitExecute(YRCP_VERSION,(int)sizeof(short),(int)sizeof(int),\
|
||
|
(int)sizeof(long),(int)sizeof(yrcpUint32T),(int)sizeof(yrcpUint),\
|
||
|
(int)yrcp_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(yrcpVoidPtr),\
|
||
|
(int)sizeof(yrcpCallbackT))
|
||
|
|
||
|
|
||
|
int yellowRabbitCompress(yrcpBytePtr dataIn, yrcpUint dataInLen, yrcpBytePtr dataOut, yrcpUintPtr dataOutLen, yrcpVoidPtr compressCacheMemAddr);
|
||
|
|
||
|
int yellowRabbitDecompress(const yrcpBytePtr in,yrcpUint in_len, yrcpBytePtr out, yrcpUintPtr out_len, yrcpVoidPtr compressCacheMemAddr);
|
||
|
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|