diff --git a/include/oscar.c b/include/oscar.c index 5704091..d2384b6 100644 --- a/include/oscar.c +++ b/include/oscar.c @@ -86,3 +86,46 @@ const char * oscar_expand_rle(char * dp, const char * sp) 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; +} diff --git a/include/oscar.h b/include/oscar.h index 590867d..6101a06 100644 --- a/include/oscar.h +++ b/include/oscar.h @@ -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); +// 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")