I hereby claim:
- I am davidreynolds on github.
- I am davidreynolds (https://keybase.io/davidreynolds) on keybase.
- I have a public key ASB4zsD-ckVCftr8f4WizYIiNduJww_ctMjbtrZV2Fbk3Ao
To claim this, I am signing this object:
I hereby claim:
To claim this, I am signing this object:
| /* LZSS encoder-decoder (c) Haruhiko Okumura */ | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #define EI 11 /* typically 10..13 */ | |
| #define EJ 4 /* typically 4..5 */ | |
| #define P 1 /* If match length <= P then output one character */ | |
| #define N (1 << EI) /* buffer size */ | |
| #define F ((1 << EJ) + P) /* lookahead buffer size */ |
| int getbit(int n) /* get n bits */ | |
| { | |
| int i, x; | |
| static int buf, mask = 0; | |
| x = 0; | |
| for (i = 0; i < n; i++) { | |
| if (mask == 0) { | |
| if ((buf = fgetc(infile)) == EOF) return EOF; | |
| mask = 128; |
| void decode(void) | |
| { | |
| int i, j, k, r, c; | |
| for (i = 0; i < N - F; i++) buffer[i] = ' '; | |
| r = N - F; | |
| while ((c = getbit(1)) != EOF) { | |
| if (c) { | |
| if ((c = getbit(8)) == EOF) break; | |
| fputc(c, outfile); |
| void flush_bit_buffer(void) | |
| { | |
| if (bit_mask != 128) { | |
| if (fputc(bit_buffer, outfile) == EOF) error(); | |
| codecount++; | |
| } | |
| } |
| void output1(int c) | |
| { | |
| int mask; | |
| putbit1(); | |
| mask = 256; | |
| while (mask >>= 1) { | |
| if (c & mask) putbit1(); | |
| else putbit0(); | |
| } |
| void putbit1(void) | |
| { | |
| bit_buffer |= bit_mask; | |
| if ((bit_mask >>= 1) == 0) { | |
| if (fputc(bit_buffer, outfile) == EOF) error(); | |
| bit_buffer = 0; bit_mask = 128; codecount++; | |
| } | |
| } | |
| void putbit0(void) |
| void encode(void) | |
| { | |
| ... | |
| while (r < bufferend) { | |
| ... | |
| r += y; s += y; | |
| if (r >= N * 2 - F) { | |
| for (i = 0; i < N; i++) buffer[i] = buffer[i + N]; | |
| bufferend -= N; r -= N; s -= N; | |
| while (bufferend < N * 2) { |
| void encode(void) | |
| { | |
| ... | |
| while (r < bufferend) { | |
| ... | |
| if (y <= P) output1(c); | |
| else output2(x & (N - 1), y - 2); | |
| ... | |
| } | |
| ... |
| void encode(void) | |
| { | |
| ... | |
| while (r < bufferend) { | |
| f1 = (F <= bufferend - r) ? F : bufferend - r; | |
| x = 0; y = 1; c = buffer[r]; | |
| for (i = r - 1; i <= s; i--) | |
| if (buffer[i] == c) { | |
| for (j = 1; j < f1; j++) | |
| if (buffer[i + j] != buffer[r + j]) break; |