Make ringbuffer work

This commit is contained in:
optixx 2016-05-22 17:49:07 +02:00
parent f6a15f0f4a
commit 8a190c9f10
3 changed files with 29 additions and 6 deletions

View File

@ -328,10 +328,12 @@ int fastlz_decompress(const void* input, int length, void* output)
return op - (flzuint8*)output; return op - (flzuint8*)output;
} }
#include <stdlib.h> #include <stdlib.h>
#include <assert.h>
#include "ringbuffer.h" #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 { \ #define OUTPUT_INC(B) do { \
flzuint8 __b = B;\ flzuint8 __b = B;\
@ -340,6 +342,17 @@ int fastlz_decompress(const void* input, int length, void* output)
output_addr++;\ output_addr++;\
} while (0) } 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); ringBuffer_typedef(unsigned char, charBuffer);
@ -396,11 +409,11 @@ int fastlz_decompress2(unsigned char* input, int length, unsigned char* output)
{ {
log2(3) log2(3)
ref_addr--; ref_addr--;
OUTPUT_INC(output[ref_addr++]); OUTPUT_INC_FROM_REFINC();
OUTPUT_INC(output[ref_addr++]); OUTPUT_INC_FROM_REFINC();
OUTPUT_INC(output[ref_addr++]); OUTPUT_INC_FROM_REFINC();
for(; len; --len) for(; len; --len)
OUTPUT_INC(output[ref_addr++]); OUTPUT_INC_FROM_REFINC();
} }
} }
else else

View File

@ -71,10 +71,11 @@ int main(int argc, char** argv){
for(i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", c[i]); for(i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", c[i]);
printf("\n"); printf("\n");
rlen = fastlz_compress(unpacked, len, packed); rlen = fastlz_compress(unpacked, len, packed);
hexdump(packed, rlen); //hexdump(packed, rlen);
printf("packed len=%i\n", rlen); printf("packed len=%i\n", rlen);
memset(unpacked, 0, len); memset(unpacked, 0, len);
printf("-----\n"); printf("-----\n");
#if 0
fastlz_decompress(packed, rlen, unpacked); fastlz_decompress(packed, rlen, unpacked);
MD5_Init (&md5_context); MD5_Init (&md5_context);
MD5_Update (&md5_context, unpacked, len); MD5_Update (&md5_context, unpacked, len);
@ -87,6 +88,7 @@ int main(int argc, char** argv){
printf("Wrote out01.smc %l bytes\n", len); printf("Wrote out01.smc %l bytes\n", len);
fclose(fp); fclose(fp);
memset(unpacked, 0, len); memset(unpacked, 0, len);
#endif
printf("-----\n"); printf("-----\n");
fastlz_decompress2(packed, rlen, unpacked); fastlz_decompress2(packed, rlen, unpacked);
MD5_Init (&md5_context); MD5_Init (&md5_context);

View File

@ -41,9 +41,16 @@
* *
*/ */
#ifndef _ringbuffer_h #ifndef _ringbuffer_h
#define _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) \ #define ringBuffer_typedef(T, NAME) \
typedef struct { \ typedef struct { \
int size; \ int size; \
@ -64,6 +71,7 @@
#define nextEndIndex(BUF) ((BUF->end + 1) % BUF->size) #define nextEndIndex(BUF) ((BUF->end + 1) % BUF->size)
#define isBufferEmpty(BUF) (BUF->end == BUF->start) #define isBufferEmpty(BUF) (BUF->end == BUF->start)
#define isBufferFull(BUF) (nextEndIndex(BUF) == 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) \ #define bufferWrite(BUF, ELEM) \
BUF->elems[BUF->end] = ELEM; \ BUF->elems[BUF->end] = ELEM; \