From 8a190c9f10f7b4b4739c503c457aeeb7e48d3b62 Mon Sep 17 00:00:00 2001 From: optixx Date: Sun, 22 May 2016 17:49:07 +0200 Subject: [PATCH] Make ringbuffer work --- poc/fastlz/fastlz.c | 23 ++++++++++++++++++----- poc/fastlz/poc.c | 4 +++- poc/fastlz/ringbuffer.h | 8 ++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/poc/fastlz/fastlz.c b/poc/fastlz/fastlz.c index 26f92bb..ec6790d 100644 --- a/poc/fastlz/fastlz.c +++ b/poc/fastlz/fastlz.c @@ -328,10 +328,12 @@ int fastlz_decompress(const void* input, int length, void* output) return op - (flzuint8*)output; } + #include +#include #include "ringbuffer.h" -#define log2(NUM) printf("%i op=%i(%x) ip=%i(%x) ref=%i(%x) dist=%i len=%i ctrl=%i ofs=%i(%i) limit=%i\n",NUM, output_addr,output[output_addr], input_addr,input[input_addr],ref_addr,input[ref_addr],output_addr - ref_addr, len, ctrl, ofs, ofs>>6,input_addr < ip_limit); +#define log2(NUM) printf("%i op=%i(%x) ip=%i(%x) ref=%i(%x) dist=%i buf->end=%i len=%i ctrl=%i ofs=%i(%i) limit=%i\n",NUM, output_addr,output[output_addr], input_addr,input[input_addr],ref_addr,input[ref_addr],output_addr - ref_addr,buffer_ptr->end, len, ctrl, ofs, ofs>>6,input_addr < ip_limit); #define OUTPUT_INC(B) do { \ flzuint8 __b = B;\ @@ -340,6 +342,17 @@ int fastlz_decompress(const void* input, int length, void* output) output_addr++;\ } while (0) +#define OUTPUT_INC_FROM_REFINC() do { \ + flzuint8 __b = output[ref_addr]; \ + flzuint16 __dist = (output_addr-ref_addr); \ + flzuint8 __c = bufferGet(buffer_ptr, __dist); \ + printf("output_addr=%i ref_addr=%i(%x) dist=%i(%x) buf->end=%i buf->size=%i position=%i\n", output_addr, ref_addr, __b, __dist, __c, buffer_ptr->end, buffer_ptr->size, __mod(buffer_ptr->end - __dist, buffer_ptr->size)); \ + assert(__c == __b); \ + output[output_addr] = __c;\ + bufferWrite(buffer_ptr, __c);\ + output_addr++;\ + ref_addr++;\ +} while (0) ringBuffer_typedef(unsigned char, charBuffer); @@ -396,11 +409,11 @@ int fastlz_decompress2(unsigned char* input, int length, unsigned char* output) { log2(3) ref_addr--; - OUTPUT_INC(output[ref_addr++]); - OUTPUT_INC(output[ref_addr++]); - OUTPUT_INC(output[ref_addr++]); + OUTPUT_INC_FROM_REFINC(); + OUTPUT_INC_FROM_REFINC(); + OUTPUT_INC_FROM_REFINC(); for(; len; --len) - OUTPUT_INC(output[ref_addr++]); + OUTPUT_INC_FROM_REFINC(); } } else diff --git a/poc/fastlz/poc.c b/poc/fastlz/poc.c index 9b633cf..51d4bf2 100644 --- a/poc/fastlz/poc.c +++ b/poc/fastlz/poc.c @@ -71,10 +71,11 @@ int main(int argc, char** argv){ for(i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", c[i]); printf("\n"); rlen = fastlz_compress(unpacked, len, packed); - hexdump(packed, rlen); + //hexdump(packed, rlen); printf("packed len=%i\n", rlen); memset(unpacked, 0, len); printf("-----\n"); +#if 0 fastlz_decompress(packed, rlen, unpacked); MD5_Init (&md5_context); MD5_Update (&md5_context, unpacked, len); @@ -87,6 +88,7 @@ int main(int argc, char** argv){ printf("Wrote out01.smc %l bytes\n", len); fclose(fp); memset(unpacked, 0, len); +#endif printf("-----\n"); fastlz_decompress2(packed, rlen, unpacked); MD5_Init (&md5_context); diff --git a/poc/fastlz/ringbuffer.h b/poc/fastlz/ringbuffer.h index 5e5e975..2cb9452 100644 --- a/poc/fastlz/ringbuffer.h +++ b/poc/fastlz/ringbuffer.h @@ -41,9 +41,16 @@ * */ + #ifndef _ringbuffer_h #define _ringbuffer_h +int __mod(int a, int b) +{ + int r = a % b; + return r < 0 ? r + b : r; +} + #define ringBuffer_typedef(T, NAME) \ typedef struct { \ int size; \ @@ -64,6 +71,7 @@ #define nextEndIndex(BUF) ((BUF->end + 1) % BUF->size) #define isBufferEmpty(BUF) (BUF->end == BUF->start) #define isBufferFull(BUF) (nextEndIndex(BUF) == BUF->start) +#define bufferGet(BUF, INDEX) (BUF->elems[__mod(BUF->end - INDEX, BUF->size)]) #define bufferWrite(BUF, ELEM) \ BUF->elems[BUF->end] = ELEM; \