From d7a2b98b4d9ab773e16697f63d7be1d243f52b73 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:07:58 +0200 Subject: [PATCH] Add buffered lzo decompress --- include/oscar.c | 43 +++++++++++++++++++++++++++++++++++++++++++ include/oscar.h | 4 ++++ 2 files changed, 47 insertions(+) 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")