00001
00021 #ifndef DKUTILC_LZW_H
00022 #define DKUTILC_LZW_H
00023
00024
00025 #include "dkcOSIndependent.h"
00026 #include "dkcRedBlackTree.h"
00027 #include "dkcBit.h"
00028
00029
00030
00032 #define dkcdLZW_SIGNATURE edk_LZW_SIGNATURE
00033
00034
00035
00036
00037
00038
00039
00041 #define dkcdLZW_CODE_SIZE 15
00042
00043 #define dkcdLZW_NUM (1 << dkcdLZW_CODE_SIZE)
00044
00045 #define dkcdLZW_NIL(objp) objp->sentinel//(&(objp->sentinel))
00046
00047 #define dkcdLZW_NIL_OFFSET dkcdLZW_NUM
00048
00049
00050
00051
00052
00054 #define dkcdLZW_HASH_TABLE_SIZE 32749
00055
00056 #define dkcmLZW_HASH_FUNC(node,c) ((((node) << 8) + (c)) % dkcdLZW_HASH_TABLE_SIZE)
00057
00059 #define dkcdLZW_DATA int
00060
00061 #define dkcdLZW_COLOR uint8
00062
00064 typedef struct dkc_LZW_Node{
00066 dkcdLZW_DATA code;
00068 struct dkc_LZW_Node *parent;
00070 struct dkc_LZW_Node *left;
00072 struct dkc_LZW_Node *middle;
00074 struct dkc_LZW_Node *right;
00076 dkcdLZW_COLOR color;
00077 }DKC_LZW_NODE;
00078
00079 typedef struct dkc_LZW_Trie{
00080 dkcdLZW_DATA code;
00081 dkcdLZW_DATA p;
00082 }DKC_LZW_TRIE;
00083
00084 typedef struct dkc_LZW
00085 {
00086
00087 union{
00089 DKC_LZW_NODE tst[dkcdLZW_NUM];
00090 DKC_LZW_TRIE trie[dkcdLZW_NUM];
00092 }pool;
00094 dkcdLZW_DATA *hash_table;
00096 dkcdLZW_DATA *hash_stack;
00098 size_t node_count;
00099
00100 DKC_LZW_NODE *sentinel;
00101
00102 DKC_BIT_MEMORYSTREAM *mbs;
00103 }DKC_LZW;
00104
00105 typedef struct dkc_LZW_Header{
00106 unsigned long mSignature;
00108 size_t mOriginSize;
00110 size_t mCompressedSize;
00112 ULONG option;
00113 }DKC_LZW_HEADER;
00114
00115 enum edk_LZW_Option{
00117 edkcLZW_Default = 0,
00119 edkcLZW_Variableness = 1,
00121 edkcLZW_TST = 2,
00123 edkcLZW_HASH = 4,
00125 edkcLZW_REDBLACK = 8,
00127 edkcLZW_TRIE = 16,
00128
00129 };
00133 DKC_EXTERN DKC_LZW *WINAPI dkcAllocLZW(size_t output_block_size);
00134
00135 DKC_EXTERN int WINAPI dkcFreeLZW(DKC_LZW **);
00148 DKC_EXTERN int WINAPI dkcLZWDecode(DKC_LZW *ptr,DKC_LZW_HEADER *ph,
00149 BYTE *dest,size_t dsize,const BYTE *src,size_t ssize,ULONG sig);
00161 DKC_EXTERN int WINAPI dkcLZWEncode(DKC_LZW *ptr,DKC_LZW_HEADER *ph,
00162 BYTE *dest,size_t dsize,const BYTE *src,size_t ssize,
00163 size_t CloseProcessSize,ULONG sig,ULONG option);
00164
00165
00166
00167
00168
00169
00170
00172 #define dkcLZWDump(lzwobj,filename) dkcBitMemoryStreamDump(lzwobj->mbs,filename,edkcDumpNowOffset)
00173
00174
00175 #endif //end of include once