int main(int argc, char *argv[]) { int wsize = atoi(argv[1]); lz_info lzi; lz_user_data lzu = {stdin, stdout, 1, 1, 1}; lz_init(&lzi, wsize, wsize, MAX_MATCH, MIN_MATCH, 8192, tmp_get_chars, tmp_output_match, tmp_output_literal,&lzu); lz_compress(&lzi); return 0; }
void lz_output(struct lz_state *sp) { struct freq freq[16]; int i; int maxcode; int pixbits; accum = 0; accbptr = 32; bitptr = 0; outbytes = 0; lz_compress(sp); for(i = 0; i < 16; i++) { freq[i].sym = i; freq[i].count = 0; freq[i].code = i; } for(i = 0; i < sp->tokptr; i++) { if (sp->toks[i].type == LZ_PTR) continue; freq[sp->toks[i].u.data].count++; } printf("#define MIN_DELTA\t%d\n", MIN_DELTA); printf("#define MIN_RUN\t\t%d\n", MIN_RUN); printf("#define MAX_RUN\t\t%d\n", MAX_RUN); printf("#define BIT_SCALE\t%d\n", BIT_SCALE); printf("#define MARK_SCALE\t%d\n", MARK_SCALE); printf("#define MIN_SCALE\t%d\n", MIN_SCALE); // sort by frequency qsort(freq, 16, sizeof(*freq), freq_sort_count); printf("static const unsigned char tokmap[] FLASH = {\n\t"); // map symbols to output codes for(maxcode = i = 0; i < 16; i++) { freq[i].code = i; if (freq[i].count != 0) maxcode = i; } for(i = 0; i <= maxcode; i++) printf("%d, ", freq[i].sym); printf("\n};\n"); pixbits = numbits(maxcode); #ifdef FIXPIX printf("#define GETPIX() (LPM(&tokmap[getbits(%d)]))\n", pixbits); #else printf("#define GETPIX() (LPM(&tokmap[getnum()]))\n"); #endif // index by symbols again qsort(freq, 16, sizeof(*freq), freq_sort_sym); printf("static const unsigned char lz_data[] FLASH = {\n\t"); for(i = 0; i < sp->tokptr; i++) { struct lztok *tp = &sp->toks[i]; tp->offset = bitptr; switch (tp->type) { case LZ_PTR: { int delta = (bitptr - sp->toks[tp->u.ptr.offset].offset); emit(1, 1); /* Pointer */ assert(delta > 0); emitnum(delta); assert(tp->u.ptr.len >= MIN_RUN); assert(tp->u.ptr.len < MAX_RUN); emitnum(tp->u.ptr.len - MIN_RUN); break; } case LZ_DATA: emit(0, 1); /* Data */ #ifdef FIXPIX emit(freq[tp->u.data].code, pixbits); #else emitnum(freq[tp->u.data].code); #endif break; } } while(accbptr < 32) { printf("0x%02x,%s", (accum >> 24) & 0xff, (outbytes++ % 8) == 7 ? "\n\t":" "); accum <<= 8; accbptr += 8; } printf("\n};\n"); printf("/* %d tokens, %d bits (%d bytes) */\n", sp->tokptr, bitptr, outbytes); }
int lz_mark(struct lz_state *sp) { lz_compress(sp); return sp->tokptr; }