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;
|
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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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; \
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user