mirror of
https://github.com/GerbilSoft/zlib-ng.git
synced 2025-06-18 11:35:35 -04:00
90 lines
2.6 KiB
C
90 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include "zbuild.h"
|
|
#include "zutil.h"
|
|
#include "inftrees.h"
|
|
#include "inflate.h"
|
|
|
|
// Build and return state with length and distance decoding tables and index sizes set to fixed code decoding.
|
|
void Z_INTERNAL buildfixedtables(struct inflate_state *state) {
|
|
static code *lenfix, *distfix;
|
|
static code fixed[544];
|
|
|
|
// build fixed huffman tables
|
|
unsigned sym, bits;
|
|
static code *next;
|
|
|
|
// literal/length table
|
|
sym = 0;
|
|
while (sym < 144) state->lens[sym++] = 8;
|
|
while (sym < 256) state->lens[sym++] = 9;
|
|
while (sym < 280) state->lens[sym++] = 7;
|
|
while (sym < 288) state->lens[sym++] = 8;
|
|
next = fixed;
|
|
lenfix = next;
|
|
bits = 9;
|
|
zng_inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
|
|
|
|
// distance table
|
|
sym = 0;
|
|
while (sym < 32) state->lens[sym++] = 5;
|
|
distfix = next;
|
|
bits = 5;
|
|
zng_inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
|
|
|
|
state->lencode = lenfix;
|
|
state->lenbits = 9;
|
|
state->distcode = distfix;
|
|
state->distbits = 5;
|
|
}
|
|
|
|
|
|
// Create fixed tables on the fly and write out a inffixed_tbl.h file that is #include'd above.
|
|
// makefixed() writes those tables to stdout, which would be piped to inffixed_tbl.h.
|
|
void makefixed(void) {
|
|
unsigned low, size;
|
|
struct inflate_state state;
|
|
|
|
memset(&state, 0, sizeof(state));
|
|
buildfixedtables(&state);
|
|
puts("/* inffixed_tbl.h -- table for decoding fixed codes");
|
|
puts(" * Generated automatically by makefixed().");
|
|
puts(" */");
|
|
puts("");
|
|
puts("/* WARNING: this file should *not* be used by applications.");
|
|
puts(" * It is part of the implementation of this library and is");
|
|
puts(" * subject to change. Applications should only use zlib.h.");
|
|
puts(" */");
|
|
puts("");
|
|
size = 1U << 9;
|
|
printf("static const code lenfix[%u] = {", size);
|
|
low = 0;
|
|
for (;;) {
|
|
if ((low % 7) == 0)
|
|
printf("\n ");
|
|
printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
|
|
state.lencode[low].bits, state.lencode[low].val);
|
|
if (++low == size)
|
|
break;
|
|
putchar(',');
|
|
}
|
|
puts("\n};");
|
|
size = 1U << 5;
|
|
printf("\nstatic const code distfix[%u] = {", size);
|
|
low = 0;
|
|
for (;;) {
|
|
if ((low % 6) == 0)
|
|
printf("\n ");
|
|
printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val);
|
|
if (++low == size)
|
|
break;
|
|
putchar(',');
|
|
}
|
|
puts("\n};");
|
|
}
|
|
|
|
// The output of this application can be piped out to recreate inffixed_tbl.h
|
|
int main(void) {
|
|
makefixed();
|
|
return 0;
|
|
}
|