Add buffered lzo decompress
This commit is contained in:
parent
02b28096af
commit
d7a2b98b4d
|
@ -86,3 +86,46 @@ const char * oscar_expand_rle(char * dp, const char * sp)
|
||||||
|
|
||||||
return sp + 1;
|
return sp + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__native const char * oscar_expand_lzo_buf(char * dp, const char * sp)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
char b = 0;
|
||||||
|
|
||||||
|
char cmd = sp[0];
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (cmd & 0x80)
|
||||||
|
{
|
||||||
|
char i = b - sp[1];
|
||||||
|
cmd &= 0x7f;
|
||||||
|
sp += 2;
|
||||||
|
|
||||||
|
char n = 0;
|
||||||
|
do {
|
||||||
|
buf[b] = dp[n] = buf[i];
|
||||||
|
b++;
|
||||||
|
i++;
|
||||||
|
n++;
|
||||||
|
} while (n != cmd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sp += 1;
|
||||||
|
|
||||||
|
char n = 0;
|
||||||
|
do {
|
||||||
|
buf[b] = dp[n] = sp[n];
|
||||||
|
b++;
|
||||||
|
n++;
|
||||||
|
} while (n != cmd);
|
||||||
|
|
||||||
|
sp += cmd;
|
||||||
|
}
|
||||||
|
dp += cmd;
|
||||||
|
|
||||||
|
cmd = sp[0];
|
||||||
|
} while (cmd);
|
||||||
|
|
||||||
|
return sp + 1;
|
||||||
|
}
|
||||||
|
|
|
@ -6,6 +6,10 @@ __native const char * oscar_expand_lzo(char * dp, const char * sp);
|
||||||
|
|
||||||
__native const char * oscar_expand_rle(char * dp, const char * sp);
|
__native const char * oscar_expand_rle(char * dp, const char * sp);
|
||||||
|
|
||||||
|
// Same as oscar_expand_lzo, but does not need read access to the
|
||||||
|
// target memory area. On the downside, it uses 256 bytes of stack
|
||||||
|
// memory as buffer
|
||||||
|
__native const char * oscar_expand_lzo_buf(char * dp, const char * sp);
|
||||||
|
|
||||||
#pragma compile("oscar.c")
|
#pragma compile("oscar.c")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue