89 lines
1.1 KiB
C
89 lines
1.1 KiB
C
#include "oscar.h"
|
|
|
|
const char * oscar_expand_lzo(char * dp, const char * sp)
|
|
{
|
|
char cmd = sp[0];
|
|
do
|
|
{
|
|
const char * cp;
|
|
|
|
if (cmd & 0x80)
|
|
{
|
|
cp = dp - sp[1];
|
|
cmd &= 0x7f;
|
|
sp += 2;
|
|
}
|
|
else
|
|
{
|
|
sp += 1;
|
|
cp = sp;
|
|
sp += cmd;
|
|
}
|
|
|
|
char n = 0x00;
|
|
do {
|
|
dp[n] = cp[n];
|
|
n++;
|
|
} while (n != cmd);
|
|
dp += cmd;
|
|
|
|
cmd = sp[0];
|
|
} while (cmd);
|
|
|
|
return sp + 1;
|
|
}
|
|
|
|
const char * oscar_expand_rle(char * dp, const char * sp)
|
|
{
|
|
char cmd = sp[0];
|
|
|
|
do
|
|
{
|
|
if (cmd & 0x80)
|
|
{
|
|
char rep = (cmd & 0x70) >> 4;
|
|
char c = sp[1];
|
|
for(signed char i=rep; i>=0; i--)
|
|
dp[i] = c;
|
|
|
|
rep++;
|
|
sp += 2;
|
|
dp += rep;
|
|
|
|
cmd &= 0x0f;
|
|
for(signed char i=cmd; i>=0; i--)
|
|
dp[i] = sp[i];
|
|
|
|
cmd++;
|
|
sp += cmd;
|
|
dp += cmd;
|
|
}
|
|
else if (cmd & 0x40)
|
|
{
|
|
cmd &= 0x3f;
|
|
sp ++;
|
|
for(signed char i=cmd; i>=0; i--)
|
|
dp[i] = sp[i];
|
|
|
|
cmd++;
|
|
sp += cmd;
|
|
dp += cmd;
|
|
}
|
|
else
|
|
{
|
|
char c = sp[1];
|
|
for(signed char i=cmd; i>=0; i--)
|
|
dp[i] = c;
|
|
|
|
cmd++;
|
|
sp += 2;
|
|
dp += cmd;
|
|
}
|
|
|
|
cmd = sp[0];
|
|
|
|
} while (cmd)
|
|
|
|
return sp + 1;
|
|
}
|