11 Star 24 Fork 4

goldbeef / wzip

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
wavelet.cpp 8.78 KB
一键复制 编辑 原始数据 按行查看 历史
goldbeef 提交于 2014-05-19 18:52 . Create wavelet.cpp
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
#include "wavelet.h"
#include "wzip.h"
#include "errProcess.h"
#include "rleElisCode.h"
#include <memory.h>
#include <string.h>
int initWavletNodeWithBuff(waveletNode_t *node,
uchar *buff,u32 len,
int level,char (*codeTable)[CODE_MAX_LEN]
)
{
int ret;
//allocate memory
node->level=level;
node->bitLen=len;
if (strlen(codeTable[buff[0]])==level)
{
//leaf node
node->label=buff[0];
node->bitBuff=node->zipBuff=NULL;
node->leftChild=node->righChild=NULL;
return 0;
}
//internal node
int byteLen=len/8+((len%8)?1:0);
node->bitBuff=(uchar*)malloc(byteLen);
if (!node->bitBuff)
{
return ERR_MEMORY;
}
memset(node->bitBuff,0,byteLen);
node->bitLen=len;//measure in bit
node->zipBuff=(uchar *)malloc(byteLen*3);
if (!node->zipBuff)
{
return ERR_MEMORY;
}
node->zipLen=0;//measure in bit
node->leftChild=node->righChild=NULL;
//
uchar *lptr,*rptr;
u32 leftLen,righLen;
lptr=(uchar *)malloc(sizeof(uchar)*len);
rptr=(uchar *)malloc(sizeof(uchar)*len);
if (!lptr ||!rptr)
{
return ERR_MEMORY;
}
//compute bitVect
u32 i;
leftLen=righLen=0;
int bytePos,bitOffset;
bytePos=0;
bitOffset=0;
//for test
uchar *tempPtr=buff;
uchar *tempLptr,*tempRptr;
tempLptr=lptr;
tempRptr=rptr;
uchar ch;
for (i=0;i<len;i++)
{
ch=*tempPtr;
if (codeTable[ch][level]=='1')
{
//
node->bitBuff[bytePos]|=0x01<<(7-bitOffset);
//construct right data buff
//rptr[righLen++]=ch;
*tempRptr=ch;
tempRptr++;
}else{
//construct left data buff
//lptr[leftLen++]=ch;
*tempLptr=ch;
tempLptr++;
}
bitOffset++;
if (bitOffset==8)
{
bytePos++;
bitOffset=0;
}
tempPtr++;
}
righLen=tempRptr-rptr;
leftLen=tempLptr-lptr;
if (leftLen!=0)
{
waveletNode_t *leftNode=(waveletNode_t*)
malloc(sizeof(waveletNode_t));
if (!leftNode)
{
return ERR_MEMORY;
}
node->leftChild=leftNode;
ret=initWavletNodeWithBuff(leftNode,lptr,leftLen,
level+1,codeTable
);
if (ret<0)
{
return ret;
}
free(lptr);
lptr=NULL;
}
if(righLen!=0)
{
waveletNode_t *righNode=(waveletNode_t*)
malloc(sizeof(waveletNode_t));
if (!righNode)
{
return ERR_MEMORY;
}
node->righChild=righNode;
ret=initWavletNodeWithBuff(righNode,rptr,righLen,
level+1,codeTable
);
if (ret<0)
{
return ret;
}
free(rptr);
rptr=NULL;
}
return 0;
}
int destroyWaveletTree(waveletTree root){
int ret;
if (!root)
{
return 0;
}
//internal node
if (root->leftChild)
{
destroyWaveletTree(root->leftChild);
root->leftChild=NULL;
}
if (root->righChild)
{
destroyWaveletTree(root->righChild);
root->righChild=NULL;
}
if (root->bitBuff)
{
free(root->bitBuff);
root->bitBuff=NULL;
}
if (root->zipBuff)
{
free(root->zipBuff);
root->zipBuff=NULL;
}
free(root);
return 0;
}
waveletTree createWaveletTree(uchar *buff,u32 len,
char (*codeTable)[CODE_MAX_LEN]
)
{
int ret;
if (!buff || !len || !codeTable)
{
errProcess("createWaveletTree",ERR_PARAMETER);
return NULL;
}
waveletTree root=(waveletTree)malloc(sizeof(waveletNode_t));
if (!root)
{
errProcess("malloc",ERR_MEMORY);
return NULL;
}
ret=initWavletNodeWithBuff(root,buff,len,0,codeTable);
if (ret<0)
{
errProcess("initWaveletNodeWithBuff",ret);
return NULL;
}
return root;
}
int compressWaveletTreeWithGamma(waveletTree wavTree)
{
if (!wavTree )
{
return ERR_PARAMETER;
}
if (wavTree->leftChild==NULL && wavTree->righChild==NULL)
{
//leaf node
return 0;
}
int ret=runLengthGammaCode(wavTree->bitBuff,
wavTree->bitLen,
wavTree->zipBuff
);
if (ret<0)
{
errProcess("runLengthGammaCode",ret);
return ret;
}
wavTree->zipLen=ret;
if (wavTree->leftChild)
{
ret=compressWaveletTreeWithGamma(wavTree->leftChild);
if (ret<0)
{
errProcess("runLengthGammaCode",ret);
return ret;
}
}
if (wavTree->righChild)
{
ret=compressWaveletTreeWithGamma(wavTree->righChild);
if (ret<0)
{
errProcess("runLengthGammaCode",ret);
return ret;
}
}
return 0;
}
int compressWaveletTreeWithDelta(waveletTree wavTree)
{
if (!wavTree )
{
return ERR_PARAMETER;
}
if (wavTree->leftChild==NULL && wavTree->righChild==NULL)
{
//leaf node
return 0;
}
int ret=runLengthDeltaCode(wavTree->bitBuff,
wavTree->bitLen,
wavTree->zipBuff
);
if (ret<0)
{
errProcess("runLengthDeltaCode",ret);
return ret;
}
wavTree->zipLen=ret;
if (wavTree->leftChild)
{
ret=compressWaveletTreeWithDelta(wavTree->leftChild);
if (ret<0)
{
errProcess("runLengthDeltaCode",ret);
return ret;
}
}
if (wavTree->righChild)
{
ret=compressWaveletTreeWithDelta(wavTree->righChild);
if (ret<0)
{
errProcess("runLengthDeltaCode",ret);
return ret;
}
}
return 0;
}
int compressWaveletTree(waveletTree root,NodeCodeType type)
{
int ret;
if (!root)
{
return ERR_PARAMETER;
}
switch (type)
{
case RLE_GAMA:
ret=compressWaveletTreeWithGamma(root);
break;
case RLE_DELTA:
ret=compressWaveletTreeWithDelta(root);
break;
default:
return ERR_PARAMETER;
break;
}
return ret;
}
int decompressTreeWithRleGamma(waveletTree wavTree)
{
if (!wavTree)
{
return ERR_PARAMETER;
}
int ret;
if (wavTree->leftChild==NULL && wavTree->righChild==NULL)
{
//leaf node
return 0;
}
ret=runLengthGammaDecode(wavTree->zipBuff,
wavTree->zipLen,
wavTree->bitBuff
);
if (ret<0)
{
errProcess("runLengthGammaDecode",ret);
return ret;
}
wavTree->bitLen=ret;
if (wavTree->leftChild)
{
ret=decompressTreeWithRleGamma(wavTree->leftChild);
if (ret<0)
{
errProcess("decompressTreeWithRleGamma",ret);
return ret;
}
}
if (wavTree->righChild)
{
ret=decompressTreeWithRleGamma(wavTree->righChild);
if (ret<0)
{
errProcess("decompressTreeWithRleGamma",ret);
return ret;
}
}
return 0;
}
int decompressTreeWithRleDelta(waveletTree wavTree)
{
if (!wavTree)
{
return ERR_PARAMETER;
}
int ret;
if (wavTree->leftChild==NULL && wavTree->righChild==NULL)
{
//leaf node
return 0;
}
ret=runLengthDeltaDecode(wavTree->zipBuff,
wavTree->zipLen,
wavTree->bitBuff
);
if (ret<0)
{
errProcess("runLengthDeltaDecode",ret);
return ret;
}
wavTree->bitLen=ret;
if (wavTree->leftChild)
{
ret=decompressTreeWithRleDelta(wavTree->leftChild);
if (ret<0)
{
errProcess("decompressTreeWithRleDelta",ret);
return ret;
}
}
if (wavTree->righChild)
{
ret=decompressTreeWithRleDelta(wavTree->righChild);
if (ret<0)
{
errProcess("decompressTreeWithRleDelta",ret);
return ret;
}
}
return 0;
}
int decompressWaveletTree(waveletTree wavTree,NodeCodeType type)
{
int ret;
if (!wavTree)
{
return ERR_PARAMETER;
}
switch (type)
{
case RLE_GAMA:
ret=decompressTreeWithRleGamma(wavTree);
break;
case RLE_DELTA:
ret=decompressTreeWithRleGamma(wavTree);
break;
default:
return ERR_PARAMETER;
}
return ret;
}
int resetBitBuffWaveletTree(waveletTree root)
{
int ret;
if (!root)
{
return ERR_PARAMETER;
}
if (root->leftChild==NULL && root->righChild==NULL)
{
//leaf node
return 0;
}
int nbytes=root->bitLen/8+(root->bitLen%8?1:0);
memset(root->bitBuff,0,nbytes);
if (root->leftChild)
{
ret=resetBitBuffWaveletTree(root->leftChild);
if (ret<0)
{
errProcess("resetBitBuffWavelet",ret);
exit(0);
}
}
if (root->righChild)
{
ret=resetBitBuffWaveletTree(root->righChild);
if (ret<0)
{
errProcess("resetBitBuffWavelet",ret);
exit(0);
}
}
return 0;
}
int resetZipBuffWaveletTree(waveletTree root)
{
int ret;
if (!root)
{
return ERR_PARAMETER;
}
if (root->leftChild==NULL && root->righChild==NULL)
{
//leaf node
return 0;
}
int nbytes=root->zipLen/8+(root->zipLen%8?1:0);
memset(root->zipBuff,0,nbytes);
if (root->leftChild)
{
ret=resetZipBuffWaveletTree(root->leftChild);
if (ret<0)
{
errProcess("resetZipBuffWavelet",ret);
exit(0);
}
}
if (root->righChild)
{
ret=resetZipBuffWaveletTree(root->righChild);
if (ret<0)
{
errProcess("resetZipBuffWavelet",ret);
exit(0);
}
}
return 0;
}
int computeZipSizWaveletTree(waveletTree root)
{
if (!root)
{
return ERR_PARAMETER;
}
if (root->leftChild==NULL && root->righChild==NULL)
{
return 0;
}
int curLen=root->zipLen/8+(root->zipLen%8?1:0);
int leftLen,righLen;
if (root->leftChild)
{
leftLen=computeZipSizWaveletTree(root->leftChild);
if (leftLen<0)
{
return leftLen;
}
curLen+=leftLen;
}
if (root->righChild)
{
righLen=computeZipSizWaveletTree(root->righChild);
if (righLen<0)
{
return righLen;
}
curLen+=righLen;
}
return curLen;
}
C
1
https://gitee.com/goldbeef/wzip.git
git@gitee.com:goldbeef/wzip.git
goldbeef
wzip
wzip
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891