Make ringbuffer work
This commit is contained in:
parent
f6a15f0f4a
commit
8a190c9f10
@ -328,10 +328,12 @@ int fastlz_decompress(const void* input, int length, void* output)
|
||||
return op - (flzuint8*)output;
|
||||
|
||||
}
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <assert.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 { \
|
||||
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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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; \
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user