support read-write overlap in C compressor

master
Connor Olding 4 years ago
parent e489f7cb3f
commit 13c8d5694b
  1. 22
      compressor.c

@ -15,6 +15,10 @@ typedef unsigned int u32;
#define MAX_LEN 66
#define BUF_START 0x3BE
#ifndef RW_OVERLAP
#define RW_OVERLAP 1
#endif
char *program_name;
long compress(const u8 *bufi, long size, u8 *bufo) {
@ -37,12 +41,22 @@ long compress(const u8 *bufi, long size, u8 *bufo) {
for (int j = 0; j < BUF_LEN; j++) {
int match_i = PMOD(buf_i - j, BUF_LEN);
int match_len = 0;
#if RW_OVERLAP
int overlap = 0;
#endif
for (;;) {
int buf_off = (match_i + match_len) % BUF_LEN;
u8 b = buf[buf_off];
if (b != sub[match_len]) { break; }
// TODO: handle pseudo-writes to buffer.
if (buf_off == buf_i) { break; }
#if RW_OVERLAP
if (overlap > 0 || (buf_off == buf_i && j != 0)) {
if (sub[overlap % j] != sub[match_len]) { break; }
overlap++;
} else {
if (buf[buf_off] != sub[match_len]) { break; }
}
#else
if (buf_off == buf_i && j != 0) { break; }
if (buf[buf_off] != sub[match_len]) { break; }
#endif
match_len++;
if (match_len == MAX_LEN) { break; }
if (match_len == sub_len) { break; }

Loading…
Cancel
Save