120 lines
3.4 KiB
C
120 lines
3.4 KiB
C
/* maketree.c -- make inffixed.h table for decoding fixed codes
|
|
* Copyright (C) 1998 Mark Adler
|
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
*/
|
|
|
|
/* WARNING: this file should *not* be used by applications. It is
|
|
part of the implementation of the compression library and is
|
|
subject to change. Applications should only use zlib.h.
|
|
*/
|
|
|
|
/* This program is included in the distribution for completeness.
|
|
You do not need to compile or run this program since inffixed.h
|
|
is already included in the distribution. To use this program
|
|
you need to compile zlib with BUILDFIXED defined and then compile
|
|
and link this program with the zlib library. Then the output of
|
|
this program can be piped to inffixed.h. */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "zutil.h"
|
|
#include "inftrees.h"
|
|
|
|
/* simplify the use of the inflate_huft type with some defines */
|
|
#define exop word.what.Exop
|
|
#define bits word.what.Bits
|
|
|
|
/* showtree is only used for debugging purposes */
|
|
void showtree(uInt b, inflate_huft *t, int d)
|
|
{
|
|
int i, e;
|
|
char p[2*d+1];
|
|
|
|
for (i = 0; i < 2*d; i++)
|
|
p[i] = ' ';
|
|
p[i] = 0;
|
|
printf("%s[%d]\n", p, 1<<b);
|
|
for (i = 0; i < (1<<b); i++)
|
|
{
|
|
e = t[i].exop;
|
|
if (e == 0) /* simple code */
|
|
printf("%s%d(%d): literal=%d\n", p, i, t[i].bits, t[i].base);
|
|
else if (e & 16) /* length */
|
|
printf("%s%d(%d): length/distance=%d+(%d)\n",
|
|
p, i, t[i].bits, t[i].base, e & 15);
|
|
else if ((e & 64) == 0) /* next table */
|
|
{
|
|
printf("%s%d(%d): *sub table*\n", p, i, t[i].bits);
|
|
showtree(e, t + t[i].base, d + 1);
|
|
}
|
|
else if (e & 32) /* end of block */
|
|
printf("%s%d(%d): end of block\n", p, i, t[i].bits);
|
|
else /* bad code */
|
|
printf("%s%d: bad code\n", p, i);
|
|
}
|
|
}
|
|
|
|
/* generate initialization table for an inflate_huft structure array */
|
|
void maketree(uInt b, inflate_huft *t)
|
|
{
|
|
int i, e;
|
|
|
|
i = 0;
|
|
while (1)
|
|
{
|
|
e = t[i].exop;
|
|
if (e && (e & (16+64)) == 0) /* table pointer */
|
|
{
|
|
fprintf(stderr, "maketree: cannot initialize sub-tables!\n");
|
|
exit(1);
|
|
}
|
|
if (i % 4 == 0)
|
|
printf("\n ");
|
|
printf(" {{{%u,%u}},%u}", t[i].exop, t[i].bits, t[i].base);
|
|
if (++i == (1<<b))
|
|
break;
|
|
putchar(',');
|
|
}
|
|
puts("");
|
|
}
|
|
|
|
/* create the fixed tables in C initialization syntax */
|
|
void main(void)
|
|
{
|
|
int r;
|
|
uInt bl, bd;
|
|
inflate_huft *tl, *td;
|
|
z_stream z;
|
|
|
|
z.zalloc = zcalloc;
|
|
z.opaque = (voidpf)0;
|
|
z.zfree = zcfree;
|
|
r = inflate_trees_fixed(&bl, &bd, &tl, &td, &z);
|
|
if (r)
|
|
{
|
|
fprintf(stderr, "inflate_trees_fixed error %d\n", r);
|
|
return;
|
|
}
|
|
/* puts("Literal/Length Tree:");
|
|
showtree(bl, tl, 1);
|
|
puts("Distance Tree:");
|
|
showtree(bd, td, 1); */
|
|
puts("/* inffixed.h -- table for decoding fixed codes");
|
|
puts(" * Generated automatically by the maketree.c program");
|
|
puts(" */");
|
|
puts("");
|
|
puts("/* WARNING: this file should *not* be used by applications. It is");
|
|
puts(" part of the implementation of the compression library and is");
|
|
puts(" subject to change. Applications should only use zlib.h.");
|
|
puts(" */");
|
|
puts("");
|
|
printf("local uInt fixed_bl = %d;\n", bl);
|
|
printf("local uInt fixed_bd = %d;\n", bd);
|
|
printf("local inflate_huft fixed_tl[] = {");
|
|
maketree(bl, tl);
|
|
puts(" };");
|
|
printf("local inflate_huft fixed_td[] = {");
|
|
maketree(bd, td);
|
|
puts(" };");
|
|
}
|