diff options
author | csgr <csgr@FreeBSD.org> | 1994-10-07 23:18:18 +0000 |
---|---|---|
committer | csgr <csgr@FreeBSD.org> | 1994-10-07 23:18:18 +0000 |
commit | b2767579ff2a641ef763f05e59921a91c276a75e (patch) | |
tree | c3677b4540865fc35fe4c1408c54eeb855503837 /sys/kern/inflate.c | |
parent | 20af18de708771b6ecca4b27236ff58e3f077395 (diff) | |
download | FreeBSD-src-b2767579ff2a641ef763f05e59921a91c276a75e.zip FreeBSD-src-b2767579ff2a641ef763f05e59921a91c276a75e.tar.gz |
Make inflate() reentrant - no more global variables.
(The gzip image activator now needs a good code tidy up.)
Diffstat (limited to 'sys/kern/inflate.c')
-rw-r--r-- | sys/kern/inflate.c | 94 |
1 files changed, 53 insertions, 41 deletions
diff --git a/sys/kern/inflate.c b/sys/kern/inflate.c index f68fab8..bf96a58 100644 --- a/sys/kern/inflate.c +++ b/sys/kern/inflate.c @@ -41,9 +41,6 @@ #include <vm/vm_kern.h> /* Stuff to make inflate() work */ -# define uch u_char -# define ush u_short -# define ulg u_long # define memzero(dest,len) bzero(dest,len) # define NOMEMCPY #define FPRINTF printf @@ -385,15 +382,14 @@ struct huft { # define OF(a) () # endif /* ?__STDC__ */ #endif -static int huft_build OF((struct gzip *,unsigned *, unsigned, unsigned, const ush *, const ush *, - struct huft **, int *)); +static int huft_build OF((struct gzip *,unsigned *, unsigned, unsigned, const ush *, const ush *, struct huft **, int *, struct gz_global *)); static int huft_free OF((struct gzip *,struct huft *)); -static int inflate_codes OF((struct gzip *,struct huft *, struct huft *, int, int)); -static int inflate_stored OF((struct gzip *)); -static int inflate_fixed OF((struct gzip *)); -static int inflate_dynamic OF((struct gzip *)); -static int inflate_block OF((struct gzip *,int *)); -static int inflate_free OF((struct gzip *)); +static int inflate_codes OF((struct gzip *,struct huft *, struct huft *, int, int, struct gz_global *)); +static int inflate_stored OF((struct gzip *, struct gz_global *)); +static int inflate_fixed OF((struct gzip *, struct gz_global *)); +static int inflate_dynamic OF((struct gzip *, struct gz_global *)); +static int inflate_block OF((struct gzip *,int *, struct gz_global *)); +static int inflate_free OF((struct gzip *, struct gz_global *)); /* The inflate algorithm uses a sliding 32K byte window on the uncompressed @@ -426,7 +422,7 @@ static const ush cpdext[] = { /* Extra bits for distance codes */ 12, 12, 13, 13}; /* And'ing with mask[n] masks the lower n bits */ -const ush mask[] = { +static const ush mask[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff @@ -453,9 +449,12 @@ const ush mask[] = { block. See the huft_build() routine. */ -/* !!! XXX !!! */ -ulg bb; /* bit buffer */ -unsigned bk; /* bits in bit buffer */ +/* + * The following 2 were global variables. + * They are now fields of the gz_global structure. + */ +#define bb (glbl->bb) /* bit buffer */ +#define bk (glbl->bk) /* bits in bit buffer */ #ifndef CHECK_EOF # define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<<k;k+=8;}} @@ -500,19 +499,21 @@ unsigned bk; /* bits in bit buffer */ */ -const int lbits = 9; /* bits in base literal/length lookup table */ -const int dbits = 6; /* bits in base distance lookup table */ +static const int lbits = 9; /* bits in base literal/length lookup table */ +static const int dbits = 6; /* bits in base distance lookup table */ /* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ #define BMAX 16 /* maximum bit length of any code (16 for explode) */ #define N_MAX 288 /* maximum number of codes in any set */ -/* !!! XXX !!! */ -unsigned hufts; /* track memory usage */ +/* + * This also used to be a global variable + */ +#define hufts (glbl->hufts) -static int huft_build(gz,b, n, s, d, e, t, m) +static int huft_build(gz,b, n, s, d, e, t, m, glbl) struct gzip *gz; unsigned *b; /* code lengths in bits (all assumed <= BMAX) */ unsigned n; /* number of codes (assumed <= N_MAX) */ @@ -521,6 +522,7 @@ const ush *d; /* list of base values for non-simple codes */ const ush *e; /* list of extra bits for non-simple codes */ struct huft **t; /* result: starting table */ int *m; /* maximum lookup bits, returns actual */ +struct gz_global * glbl; /* Given a list of code lengths and a maximum table size, make a set of tables to decode that set of codes. Return zero on success, one if the given code set is incomplete (the tables are still built in this @@ -743,10 +745,11 @@ struct huft *t; /* table to free */ #else -static int inflate_codes(gz,tl, td, bl, bd) +static int inflate_codes(gz,tl, td, bl, bd, glbl) struct gzip *gz; struct huft *tl, *td; /* literal/length and distance decoder tables */ int bl, bd; /* number of bits decoded by tl[] and td[] */ +struct gz_global * glbl;/* global variables */ /* inflate (decompress) the codes in a deflated (compressed) block. Return an error code or zero if it all goes ok. */ { @@ -854,8 +857,9 @@ int bl, bd; /* number of bits decoded by tl[] and td[] */ -static int inflate_stored(gz) +static int inflate_stored(gz, glbl) struct gzip *gz; +struct gz_global * glbl; /* "decompress" an inflated type 0 (stored) block. */ { unsigned n; /* number of bytes in block */ @@ -909,13 +913,15 @@ struct gzip *gz; /* Globals for literal tables (built once) */ -/* !!! XXX !!! */ -struct huft *fixed_tl = (struct huft *)NULL; -struct huft *fixed_td; -int fixed_bl, fixed_bd; +/* The real variables are now in the struct gz_global */ +#define fixed_tl (glbl->fixed_tl) +#define fixed_td (glbl->fixed_td) +#define fixed_bl (glbl->fixed_bl) +#define fixed_bd (glbl->fixed_bd) -static int inflate_fixed(gz) +static int inflate_fixed(gz, glbl) struct gzip *gz; +struct gz_global *glbl; /* decompress an inflated type 1 (fixed Huffman codes) block. We should either replace this with a custom decoder, or at least precompute the Huffman tables. */ @@ -938,7 +944,7 @@ struct gzip *gz; l[i] = 8; fixed_bl = 7; if ((i = huft_build(gz,l, 288, 257, cplens, cplext, - &fixed_tl, &fixed_bl)) != 0) + &fixed_tl, &fixed_bl, glbl)) != 0) { fixed_tl = (struct huft *)NULL; return i; @@ -948,7 +954,8 @@ struct gzip *gz; for (i = 0; i < 30; i++) /* make an incomplete code set */ l[i] = 5; fixed_bd = 5; - if ((i = huft_build(gz,l, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd)) > 1) + if ((i = huft_build(gz,l, 30, 0, cpdist, cpdext, + &fixed_td, &fixed_bd, glbl)) > 1) { huft_free(gz,fixed_tl); fixed_tl = (struct huft *)NULL; @@ -958,13 +965,14 @@ struct gzip *gz; /* decompress until an end-of-block code */ - return inflate_codes(gz,fixed_tl, fixed_td, fixed_bl, fixed_bd) != 0; + return inflate_codes(gz,fixed_tl, fixed_td, fixed_bl, fixed_bd, glbl) != 0; } -static int inflate_dynamic(gz) +static int inflate_dynamic(gz, glbl) struct gzip *gz; +struct gz_global * glbl; /* decompress an inflated type 2 (dynamic Huffman codes) block. */ { int i; /* temporary variables */ @@ -1025,7 +1033,7 @@ struct gzip *gz; /* build decoding table for trees--single level, 7 bit lookup */ bl = 7; - if ((i = huft_build(gz,ll, 19, 19, NULL, NULL, &tl, &bl)) != 0) + if ((i = huft_build(gz,ll, 19, 19, NULL, NULL, &tl, &bl, glbl)) != 0) { if (i == 1) huft_free(gz,tl); @@ -1091,7 +1099,7 @@ struct gzip *gz; /* build the decoding tables for literal/length and distance codes */ bl = lbits; - if ((i = huft_build(gz,ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) + if ((i = huft_build(gz,ll, nl, 257, cplens, cplext, &tl, &bl, glbl)) != 0) { if (i == 1 && !qflag) { FPRINTF( "(incomplete l-tree) "); @@ -1100,7 +1108,7 @@ struct gzip *gz; return i; /* incomplete code set */ } bd = dbits; - if ((i = huft_build(gz,ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) + if ((i = huft_build(gz,ll + nl, nd, 0, cpdist, cpdext, &td, &bd, glbl)) != 0) { if (i == 1 && !qflag) { FPRINTF( "(incomplete d-tree) "); @@ -1117,7 +1125,7 @@ struct gzip *gz; /* decompress until an end-of-block code */ - if (inflate_codes(gz,tl, td, bl, bd)) + if (inflate_codes(gz,tl, td, bl, bd, glbl)) return 1; @@ -1129,9 +1137,10 @@ struct gzip *gz; -static int inflate_block(gz,e) +static int inflate_block(gz,e, glbl) struct gzip *gz; int *e; /* last block flag */ +struct gz_global * glbl; /* decompress an inflated block */ { unsigned t; /* block type */ @@ -1163,11 +1172,11 @@ int *e; /* last block flag */ /* inflate that block type */ if (t == 2) - return inflate_dynamic(gz); + return inflate_dynamic(gz, glbl); if (t == 0) - return inflate_stored(gz); + return inflate_stored(gz, glbl); if (t == 1) - return inflate_fixed(gz); + return inflate_fixed(gz, glbl); /* bad block type */ @@ -1186,6 +1195,8 @@ struct gz_global * glbl; unsigned h; /* maximum struct huft's malloc'ed */ + fixed_tl = (struct huft *)NULL; + /* initialize window, bit buffer */ wp = 0; bk = 0; @@ -1196,7 +1207,7 @@ struct gz_global * glbl; h = 0; do { hufts = 0; - if ((r = inflate_block(gz,&e)) != 0) + if ((r = inflate_block(gz,&e, glbl)) != 0) return r; if (hufts > h) h = hufts; @@ -1215,8 +1226,9 @@ struct gz_global * glbl; -static int inflate_free(gz) +static int inflate_free(gz, glbl) struct gzip *gz; +struct gz_global * glbl; { if (fixed_tl != (struct huft *)NULL) { |