RLE機構のプログラムが出来ました。

これでRLEのプログラム書きなおしたの5回目だよ・・・。
セルオートマトン*1こんな感じのプログラムを組むのを苦手とするのは致命的です・・・。ヽ(`Д´)ノウワァン
完全版は次回dkutil_cのリリースで・・・。
ちなみに下記のソースコードのライセンスはNYSLで・・・。


#define packbit(a) (BYTE)((a + 0x80) & 0xff)

#define int2byte(a) (BYTE)(a & 0xff)

int WINAPI dkcRLEPackBitsEncode(DKC_RLE_PACKBITS_HEADER *p,
BYTE *dest,size_t dsize,
const BYTE *src,size_t ssize,
BYTE a_count)
{
BYTE *t = (BYTE *)src;
BYTE *st = t + ssize;
BYTE *out = dest;
int i;

if(dkcCheckOverflowULONG( (ULONG) dest,dsize)){
return edk_FAILED;
}
if(dsize < ssize * 2){
return edk_ArgumentException;
}
if(CHAR_MAX < a_count || a_count <= 2){
return edk_ArgumentException;
}
for(;;){
unsigned int tt = *t;
BYTE *inp = t;
int n = 1;
t++;//1個め

for(;t < st && n < CHAR_MAX;t++){
if( *t != tt){
break;
}
n ++;
}
if(n >= a_count){
*out++ = packbit(n) ;

*out++ = (BYTE)(tt & 0xff);


}else{

int c = 1;//次のRUN長を調べるためのカウンタ
BYTE *se = inp;
t = inp;

for(i = 0;se < st && i<CHAR_MAX;i++){
if(c >= a_count){
break;
}
if(t[i] == t[i + 1]){
c++;
}else{
c = 1;
}

se++;
}

if(c >= a_count){
se -= (c - 1);
i -= (c - 1);
}
*out++ = int2byte(i);
for(;t < se;){
*out++ = *t++;
}

}
if(t >= st){
break;
}
}
p->mCompressedSize = out - dest;
p->mOriginSize = ssize;
p->mCount = a_count;
return edk_SUCCEEDED;
}


int WINAPI dkcRLEPackBitsDecode(DKC_RLE_PACKBITS_HEADER *p,
BYTE *dest,size_t dsize,
const BYTE *src,size_t ssize)
{
BYTE *in = (BYTE *)src;
const BYTE *sin = src + ssize;
BYTE *out = dest;
int i;
for(;;){
BYTE t = *in++;
int st;
if(t & 0x80){//pack bits
st = t - 0x80;
for(i=0;i<st;i++){
*out++ = *in;
}
in++;
}else{//No compression
st = t;
for(i=0;i<st;i++){
*out++ = *in++;
}
}
if(in >= sin){
break;
}
}
return edk_SUCCEEDED;
}

*1:で、いいんだっけ?