1*221b1638SMasahiro Yamada /* inflate.c -- zlib decompression 2*221b1638SMasahiro Yamada * Copyright (C) 1995-2016 Mark Adler 3*221b1638SMasahiro Yamada * For conditions of distribution and use, see copyright notice in zlib.h 4*221b1638SMasahiro Yamada */ 5*221b1638SMasahiro Yamada 6*221b1638SMasahiro Yamada /* 7*221b1638SMasahiro Yamada * Change history: 8*221b1638SMasahiro Yamada * 9*221b1638SMasahiro Yamada * 1.2.beta0 24 Nov 2002 10*221b1638SMasahiro Yamada * - First version -- complete rewrite of inflate to simplify code, avoid 11*221b1638SMasahiro Yamada * creation of window when not needed, minimize use of window when it is 12*221b1638SMasahiro Yamada * needed, make inffast.c even faster, implement gzip decoding, and to 13*221b1638SMasahiro Yamada * improve code readability and style over the previous zlib inflate code 14*221b1638SMasahiro Yamada * 15*221b1638SMasahiro Yamada * 1.2.beta1 25 Nov 2002 16*221b1638SMasahiro Yamada * - Use pointers for available input and output checking in inffast.c 17*221b1638SMasahiro Yamada * - Remove input and output counters in inffast.c 18*221b1638SMasahiro Yamada * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 19*221b1638SMasahiro Yamada * - Remove unnecessary second byte pull from length extra in inffast.c 20*221b1638SMasahiro Yamada * - Unroll direct copy to three copies per loop in inffast.c 21*221b1638SMasahiro Yamada * 22*221b1638SMasahiro Yamada * 1.2.beta2 4 Dec 2002 23*221b1638SMasahiro Yamada * - Change external routine names to reduce potential conflicts 24*221b1638SMasahiro Yamada * - Correct filename to inffixed.h for fixed tables in inflate.c 25*221b1638SMasahiro Yamada * - Make hbuf[] unsigned char to match parameter type in inflate.c 26*221b1638SMasahiro Yamada * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) 27*221b1638SMasahiro Yamada * to avoid negation problem on Alphas (64 bit) in inflate.c 28*221b1638SMasahiro Yamada * 29*221b1638SMasahiro Yamada * 1.2.beta3 22 Dec 2002 30*221b1638SMasahiro Yamada * - Add comments on state->bits assertion in inffast.c 31*221b1638SMasahiro Yamada * - Add comments on op field in inftrees.h 32*221b1638SMasahiro Yamada * - Fix bug in reuse of allocated window after inflateReset() 33*221b1638SMasahiro Yamada * - Remove bit fields--back to byte structure for speed 34*221b1638SMasahiro Yamada * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths 35*221b1638SMasahiro Yamada * - Change post-increments to pre-increments in inflate_fast(), PPC biased? 36*221b1638SMasahiro Yamada * - Add compile time option, POSTINC, to use post-increments instead (Intel?) 37*221b1638SMasahiro Yamada * - Make MATCH copy in inflate() much faster for when inflate_fast() not used 38*221b1638SMasahiro Yamada * - Use local copies of stream next and avail values, as well as local bit 39*221b1638SMasahiro Yamada * buffer and bit count in inflate()--for speed when inflate_fast() not used 40*221b1638SMasahiro Yamada * 41*221b1638SMasahiro Yamada * 1.2.beta4 1 Jan 2003 42*221b1638SMasahiro Yamada * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings 43*221b1638SMasahiro Yamada * - Move a comment on output buffer sizes from inffast.c to inflate.c 44*221b1638SMasahiro Yamada * - Add comments in inffast.c to introduce the inflate_fast() routine 45*221b1638SMasahiro Yamada * - Rearrange window copies in inflate_fast() for speed and simplification 46*221b1638SMasahiro Yamada * - Unroll last copy for window match in inflate_fast() 47*221b1638SMasahiro Yamada * - Use local copies of window variables in inflate_fast() for speed 48*221b1638SMasahiro Yamada * - Pull out common wnext == 0 case for speed in inflate_fast() 49*221b1638SMasahiro Yamada * - Make op and len in inflate_fast() unsigned for consistency 50*221b1638SMasahiro Yamada * - Add FAR to lcode and dcode declarations in inflate_fast() 51*221b1638SMasahiro Yamada * - Simplified bad distance check in inflate_fast() 52*221b1638SMasahiro Yamada * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new 53*221b1638SMasahiro Yamada * source file infback.c to provide a call-back interface to inflate for 54*221b1638SMasahiro Yamada * programs like gzip and unzip -- uses window as output buffer to avoid 55*221b1638SMasahiro Yamada * window copying 56*221b1638SMasahiro Yamada * 57*221b1638SMasahiro Yamada * 1.2.beta5 1 Jan 2003 58*221b1638SMasahiro Yamada * - Improved inflateBack() interface to allow the caller to provide initial 59*221b1638SMasahiro Yamada * input in strm. 60*221b1638SMasahiro Yamada * - Fixed stored blocks bug in inflateBack() 61*221b1638SMasahiro Yamada * 62*221b1638SMasahiro Yamada * 1.2.beta6 4 Jan 2003 63*221b1638SMasahiro Yamada * - Added comments in inffast.c on effectiveness of POSTINC 64*221b1638SMasahiro Yamada * - Typecasting all around to reduce compiler warnings 65*221b1638SMasahiro Yamada * - Changed loops from while (1) or do {} while (1) to for (;;), again to 66*221b1638SMasahiro Yamada * make compilers happy 67*221b1638SMasahiro Yamada * - Changed type of window in inflateBackInit() to unsigned char * 68*221b1638SMasahiro Yamada * 69*221b1638SMasahiro Yamada * 1.2.beta7 27 Jan 2003 70*221b1638SMasahiro Yamada * - Changed many types to unsigned or unsigned short to avoid warnings 71*221b1638SMasahiro Yamada * - Added inflateCopy() function 72*221b1638SMasahiro Yamada * 73*221b1638SMasahiro Yamada * 1.2.0 9 Mar 2003 74*221b1638SMasahiro Yamada * - Changed inflateBack() interface to provide separate opaque descriptors 75*221b1638SMasahiro Yamada * for the in() and out() functions 76*221b1638SMasahiro Yamada * - Changed inflateBack() argument and in_func typedef to swap the length 77*221b1638SMasahiro Yamada * and buffer address return values for the input function 78*221b1638SMasahiro Yamada * - Check next_in and next_out for Z_NULL on entry to inflate() 79*221b1638SMasahiro Yamada * 80*221b1638SMasahiro Yamada * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. 81*221b1638SMasahiro Yamada */ 82*221b1638SMasahiro Yamada 83*221b1638SMasahiro Yamada #include "zutil.h" 84*221b1638SMasahiro Yamada #include "inftrees.h" 85*221b1638SMasahiro Yamada #include "inflate.h" 86*221b1638SMasahiro Yamada #include "inffast.h" 87*221b1638SMasahiro Yamada 88*221b1638SMasahiro Yamada #ifdef MAKEFIXED 89*221b1638SMasahiro Yamada # ifndef BUILDFIXED 90*221b1638SMasahiro Yamada # define BUILDFIXED 91*221b1638SMasahiro Yamada # endif 92*221b1638SMasahiro Yamada #endif 93*221b1638SMasahiro Yamada 94*221b1638SMasahiro Yamada /* function prototypes */ 95*221b1638SMasahiro Yamada local int inflateStateCheck OF((z_streamp strm)); 96*221b1638SMasahiro Yamada local void fixedtables OF((struct inflate_state FAR *state)); 97*221b1638SMasahiro Yamada local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, 98*221b1638SMasahiro Yamada unsigned copy)); 99*221b1638SMasahiro Yamada #ifdef BUILDFIXED 100*221b1638SMasahiro Yamada void makefixed OF((void)); 101*221b1638SMasahiro Yamada #endif 102*221b1638SMasahiro Yamada local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, 103*221b1638SMasahiro Yamada unsigned len)); 104*221b1638SMasahiro Yamada 105*221b1638SMasahiro Yamada local int inflateStateCheck(strm) 106*221b1638SMasahiro Yamada z_streamp strm; 107*221b1638SMasahiro Yamada { 108*221b1638SMasahiro Yamada struct inflate_state FAR *state; 109*221b1638SMasahiro Yamada if (strm == Z_NULL || 110*221b1638SMasahiro Yamada strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) 111*221b1638SMasahiro Yamada return 1; 112*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 113*221b1638SMasahiro Yamada if (state == Z_NULL || state->strm != strm || 114*221b1638SMasahiro Yamada state->mode < HEAD || state->mode > SYNC) 115*221b1638SMasahiro Yamada return 1; 116*221b1638SMasahiro Yamada return 0; 117*221b1638SMasahiro Yamada } 118*221b1638SMasahiro Yamada 119*221b1638SMasahiro Yamada int ZEXPORT inflateResetKeep(strm) 120*221b1638SMasahiro Yamada z_streamp strm; 121*221b1638SMasahiro Yamada { 122*221b1638SMasahiro Yamada struct inflate_state FAR *state; 123*221b1638SMasahiro Yamada 124*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 125*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 126*221b1638SMasahiro Yamada strm->total_in = strm->total_out = state->total = 0; 127*221b1638SMasahiro Yamada strm->msg = Z_NULL; 128*221b1638SMasahiro Yamada if (state->wrap) /* to support ill-conceived Java test suite */ 129*221b1638SMasahiro Yamada strm->adler = state->wrap & 1; 130*221b1638SMasahiro Yamada state->mode = HEAD; 131*221b1638SMasahiro Yamada state->last = 0; 132*221b1638SMasahiro Yamada state->havedict = 0; 133*221b1638SMasahiro Yamada state->dmax = 32768U; 134*221b1638SMasahiro Yamada state->head = Z_NULL; 135*221b1638SMasahiro Yamada state->hold = 0; 136*221b1638SMasahiro Yamada state->bits = 0; 137*221b1638SMasahiro Yamada state->lencode = state->distcode = state->next = state->codes; 138*221b1638SMasahiro Yamada state->sane = 1; 139*221b1638SMasahiro Yamada state->back = -1; 140*221b1638SMasahiro Yamada Tracev((stderr, "inflate: reset\n")); 141*221b1638SMasahiro Yamada return Z_OK; 142*221b1638SMasahiro Yamada } 143*221b1638SMasahiro Yamada 144*221b1638SMasahiro Yamada int ZEXPORT inflateReset(strm) 145*221b1638SMasahiro Yamada z_streamp strm; 146*221b1638SMasahiro Yamada { 147*221b1638SMasahiro Yamada struct inflate_state FAR *state; 148*221b1638SMasahiro Yamada 149*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 150*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 151*221b1638SMasahiro Yamada state->wsize = 0; 152*221b1638SMasahiro Yamada state->whave = 0; 153*221b1638SMasahiro Yamada state->wnext = 0; 154*221b1638SMasahiro Yamada return inflateResetKeep(strm); 155*221b1638SMasahiro Yamada } 156*221b1638SMasahiro Yamada 157*221b1638SMasahiro Yamada int ZEXPORT inflateReset2(strm, windowBits) 158*221b1638SMasahiro Yamada z_streamp strm; 159*221b1638SMasahiro Yamada int windowBits; 160*221b1638SMasahiro Yamada { 161*221b1638SMasahiro Yamada int wrap; 162*221b1638SMasahiro Yamada struct inflate_state FAR *state; 163*221b1638SMasahiro Yamada 164*221b1638SMasahiro Yamada /* get the state */ 165*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 166*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 167*221b1638SMasahiro Yamada 168*221b1638SMasahiro Yamada /* extract wrap request from windowBits parameter */ 169*221b1638SMasahiro Yamada if (windowBits < 0) { 170*221b1638SMasahiro Yamada wrap = 0; 171*221b1638SMasahiro Yamada windowBits = -windowBits; 172*221b1638SMasahiro Yamada } 173*221b1638SMasahiro Yamada else { 174*221b1638SMasahiro Yamada wrap = (windowBits >> 4) + 5; 175*221b1638SMasahiro Yamada #ifdef GUNZIP 176*221b1638SMasahiro Yamada if (windowBits < 48) 177*221b1638SMasahiro Yamada windowBits &= 15; 178*221b1638SMasahiro Yamada #endif 179*221b1638SMasahiro Yamada } 180*221b1638SMasahiro Yamada 181*221b1638SMasahiro Yamada /* set number of window bits, free window if different */ 182*221b1638SMasahiro Yamada if (windowBits && (windowBits < 8 || windowBits > 15)) 183*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 184*221b1638SMasahiro Yamada if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { 185*221b1638SMasahiro Yamada ZFREE(strm, state->window); 186*221b1638SMasahiro Yamada state->window = Z_NULL; 187*221b1638SMasahiro Yamada } 188*221b1638SMasahiro Yamada 189*221b1638SMasahiro Yamada /* update state and reset the rest of it */ 190*221b1638SMasahiro Yamada state->wrap = wrap; 191*221b1638SMasahiro Yamada state->wbits = (unsigned)windowBits; 192*221b1638SMasahiro Yamada return inflateReset(strm); 193*221b1638SMasahiro Yamada } 194*221b1638SMasahiro Yamada 195*221b1638SMasahiro Yamada int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) 196*221b1638SMasahiro Yamada z_streamp strm; 197*221b1638SMasahiro Yamada int windowBits; 198*221b1638SMasahiro Yamada const char *version; 199*221b1638SMasahiro Yamada int stream_size; 200*221b1638SMasahiro Yamada { 201*221b1638SMasahiro Yamada int ret; 202*221b1638SMasahiro Yamada struct inflate_state FAR *state; 203*221b1638SMasahiro Yamada 204*221b1638SMasahiro Yamada if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || 205*221b1638SMasahiro Yamada stream_size != (int)(sizeof(z_stream))) 206*221b1638SMasahiro Yamada return Z_VERSION_ERROR; 207*221b1638SMasahiro Yamada if (strm == Z_NULL) return Z_STREAM_ERROR; 208*221b1638SMasahiro Yamada strm->msg = Z_NULL; /* in case we return an error */ 209*221b1638SMasahiro Yamada if (strm->zalloc == (alloc_func)0) { 210*221b1638SMasahiro Yamada #ifdef Z_SOLO 211*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 212*221b1638SMasahiro Yamada #else 213*221b1638SMasahiro Yamada strm->zalloc = zcalloc; 214*221b1638SMasahiro Yamada strm->opaque = (voidpf)0; 215*221b1638SMasahiro Yamada #endif 216*221b1638SMasahiro Yamada } 217*221b1638SMasahiro Yamada if (strm->zfree == (free_func)0) 218*221b1638SMasahiro Yamada #ifdef Z_SOLO 219*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 220*221b1638SMasahiro Yamada #else 221*221b1638SMasahiro Yamada strm->zfree = zcfree; 222*221b1638SMasahiro Yamada #endif 223*221b1638SMasahiro Yamada state = (struct inflate_state FAR *) 224*221b1638SMasahiro Yamada ZALLOC(strm, 1, sizeof(struct inflate_state)); 225*221b1638SMasahiro Yamada if (state == Z_NULL) return Z_MEM_ERROR; 226*221b1638SMasahiro Yamada Tracev((stderr, "inflate: allocated\n")); 227*221b1638SMasahiro Yamada strm->state = (struct internal_state FAR *)state; 228*221b1638SMasahiro Yamada state->strm = strm; 229*221b1638SMasahiro Yamada state->window = Z_NULL; 230*221b1638SMasahiro Yamada state->mode = HEAD; /* to pass state test in inflateReset2() */ 231*221b1638SMasahiro Yamada ret = inflateReset2(strm, windowBits); 232*221b1638SMasahiro Yamada if (ret != Z_OK) { 233*221b1638SMasahiro Yamada ZFREE(strm, state); 234*221b1638SMasahiro Yamada strm->state = Z_NULL; 235*221b1638SMasahiro Yamada } 236*221b1638SMasahiro Yamada return ret; 237*221b1638SMasahiro Yamada } 238*221b1638SMasahiro Yamada 239*221b1638SMasahiro Yamada int ZEXPORT inflateInit_(strm, version, stream_size) 240*221b1638SMasahiro Yamada z_streamp strm; 241*221b1638SMasahiro Yamada const char *version; 242*221b1638SMasahiro Yamada int stream_size; 243*221b1638SMasahiro Yamada { 244*221b1638SMasahiro Yamada return inflateInit2_(strm, DEF_WBITS, version, stream_size); 245*221b1638SMasahiro Yamada } 246*221b1638SMasahiro Yamada 247*221b1638SMasahiro Yamada int ZEXPORT inflatePrime(strm, bits, value) 248*221b1638SMasahiro Yamada z_streamp strm; 249*221b1638SMasahiro Yamada int bits; 250*221b1638SMasahiro Yamada int value; 251*221b1638SMasahiro Yamada { 252*221b1638SMasahiro Yamada struct inflate_state FAR *state; 253*221b1638SMasahiro Yamada 254*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 255*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 256*221b1638SMasahiro Yamada if (bits < 0) { 257*221b1638SMasahiro Yamada state->hold = 0; 258*221b1638SMasahiro Yamada state->bits = 0; 259*221b1638SMasahiro Yamada return Z_OK; 260*221b1638SMasahiro Yamada } 261*221b1638SMasahiro Yamada if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; 262*221b1638SMasahiro Yamada value &= (1L << bits) - 1; 263*221b1638SMasahiro Yamada state->hold += (unsigned)value << state->bits; 264*221b1638SMasahiro Yamada state->bits += (uInt)bits; 265*221b1638SMasahiro Yamada return Z_OK; 266*221b1638SMasahiro Yamada } 267*221b1638SMasahiro Yamada 268*221b1638SMasahiro Yamada /* 269*221b1638SMasahiro Yamada Return state with length and distance decoding tables and index sizes set to 270*221b1638SMasahiro Yamada fixed code decoding. Normally this returns fixed tables from inffixed.h. 271*221b1638SMasahiro Yamada If BUILDFIXED is defined, then instead this routine builds the tables the 272*221b1638SMasahiro Yamada first time it's called, and returns those tables the first time and 273*221b1638SMasahiro Yamada thereafter. This reduces the size of the code by about 2K bytes, in 274*221b1638SMasahiro Yamada exchange for a little execution time. However, BUILDFIXED should not be 275*221b1638SMasahiro Yamada used for threaded applications, since the rewriting of the tables and virgin 276*221b1638SMasahiro Yamada may not be thread-safe. 277*221b1638SMasahiro Yamada */ 278*221b1638SMasahiro Yamada local void fixedtables(state) 279*221b1638SMasahiro Yamada struct inflate_state FAR *state; 280*221b1638SMasahiro Yamada { 281*221b1638SMasahiro Yamada #ifdef BUILDFIXED 282*221b1638SMasahiro Yamada static int virgin = 1; 283*221b1638SMasahiro Yamada static code *lenfix, *distfix; 284*221b1638SMasahiro Yamada static code fixed[544]; 285*221b1638SMasahiro Yamada 286*221b1638SMasahiro Yamada /* build fixed huffman tables if first call (may not be thread safe) */ 287*221b1638SMasahiro Yamada if (virgin) { 288*221b1638SMasahiro Yamada unsigned sym, bits; 289*221b1638SMasahiro Yamada static code *next; 290*221b1638SMasahiro Yamada 291*221b1638SMasahiro Yamada /* literal/length table */ 292*221b1638SMasahiro Yamada sym = 0; 293*221b1638SMasahiro Yamada while (sym < 144) state->lens[sym++] = 8; 294*221b1638SMasahiro Yamada while (sym < 256) state->lens[sym++] = 9; 295*221b1638SMasahiro Yamada while (sym < 280) state->lens[sym++] = 7; 296*221b1638SMasahiro Yamada while (sym < 288) state->lens[sym++] = 8; 297*221b1638SMasahiro Yamada next = fixed; 298*221b1638SMasahiro Yamada lenfix = next; 299*221b1638SMasahiro Yamada bits = 9; 300*221b1638SMasahiro Yamada inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); 301*221b1638SMasahiro Yamada 302*221b1638SMasahiro Yamada /* distance table */ 303*221b1638SMasahiro Yamada sym = 0; 304*221b1638SMasahiro Yamada while (sym < 32) state->lens[sym++] = 5; 305*221b1638SMasahiro Yamada distfix = next; 306*221b1638SMasahiro Yamada bits = 5; 307*221b1638SMasahiro Yamada inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); 308*221b1638SMasahiro Yamada 309*221b1638SMasahiro Yamada /* do this just once */ 310*221b1638SMasahiro Yamada virgin = 0; 311*221b1638SMasahiro Yamada } 312*221b1638SMasahiro Yamada #else /* !BUILDFIXED */ 313*221b1638SMasahiro Yamada # include "inffixed.h" 314*221b1638SMasahiro Yamada #endif /* BUILDFIXED */ 315*221b1638SMasahiro Yamada state->lencode = lenfix; 316*221b1638SMasahiro Yamada state->lenbits = 9; 317*221b1638SMasahiro Yamada state->distcode = distfix; 318*221b1638SMasahiro Yamada state->distbits = 5; 319*221b1638SMasahiro Yamada } 320*221b1638SMasahiro Yamada 321*221b1638SMasahiro Yamada #ifdef MAKEFIXED 322*221b1638SMasahiro Yamada #include <stdio.h> 323*221b1638SMasahiro Yamada 324*221b1638SMasahiro Yamada /* 325*221b1638SMasahiro Yamada Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also 326*221b1638SMasahiro Yamada defines BUILDFIXED, so the tables are built on the fly. makefixed() writes 327*221b1638SMasahiro Yamada those tables to stdout, which would be piped to inffixed.h. A small program 328*221b1638SMasahiro Yamada can simply call makefixed to do this: 329*221b1638SMasahiro Yamada 330*221b1638SMasahiro Yamada void makefixed(void); 331*221b1638SMasahiro Yamada 332*221b1638SMasahiro Yamada int main(void) 333*221b1638SMasahiro Yamada { 334*221b1638SMasahiro Yamada makefixed(); 335*221b1638SMasahiro Yamada return 0; 336*221b1638SMasahiro Yamada } 337*221b1638SMasahiro Yamada 338*221b1638SMasahiro Yamada Then that can be linked with zlib built with MAKEFIXED defined and run: 339*221b1638SMasahiro Yamada 340*221b1638SMasahiro Yamada a.out > inffixed.h 341*221b1638SMasahiro Yamada */ 342*221b1638SMasahiro Yamada void makefixed() 343*221b1638SMasahiro Yamada { 344*221b1638SMasahiro Yamada unsigned low, size; 345*221b1638SMasahiro Yamada struct inflate_state state; 346*221b1638SMasahiro Yamada 347*221b1638SMasahiro Yamada fixedtables(&state); 348*221b1638SMasahiro Yamada puts(" /* inffixed.h -- table for decoding fixed codes"); 349*221b1638SMasahiro Yamada puts(" * Generated automatically by makefixed()."); 350*221b1638SMasahiro Yamada puts(" */"); 351*221b1638SMasahiro Yamada puts(""); 352*221b1638SMasahiro Yamada puts(" /* WARNING: this file should *not* be used by applications."); 353*221b1638SMasahiro Yamada puts(" It is part of the implementation of this library and is"); 354*221b1638SMasahiro Yamada puts(" subject to change. Applications should only use zlib.h."); 355*221b1638SMasahiro Yamada puts(" */"); 356*221b1638SMasahiro Yamada puts(""); 357*221b1638SMasahiro Yamada size = 1U << 9; 358*221b1638SMasahiro Yamada printf(" static const code lenfix[%u] = {", size); 359*221b1638SMasahiro Yamada low = 0; 360*221b1638SMasahiro Yamada for (;;) { 361*221b1638SMasahiro Yamada if ((low % 7) == 0) printf("\n "); 362*221b1638SMasahiro Yamada printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, 363*221b1638SMasahiro Yamada state.lencode[low].bits, state.lencode[low].val); 364*221b1638SMasahiro Yamada if (++low == size) break; 365*221b1638SMasahiro Yamada putchar(','); 366*221b1638SMasahiro Yamada } 367*221b1638SMasahiro Yamada puts("\n };"); 368*221b1638SMasahiro Yamada size = 1U << 5; 369*221b1638SMasahiro Yamada printf("\n static const code distfix[%u] = {", size); 370*221b1638SMasahiro Yamada low = 0; 371*221b1638SMasahiro Yamada for (;;) { 372*221b1638SMasahiro Yamada if ((low % 6) == 0) printf("\n "); 373*221b1638SMasahiro Yamada printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, 374*221b1638SMasahiro Yamada state.distcode[low].val); 375*221b1638SMasahiro Yamada if (++low == size) break; 376*221b1638SMasahiro Yamada putchar(','); 377*221b1638SMasahiro Yamada } 378*221b1638SMasahiro Yamada puts("\n };"); 379*221b1638SMasahiro Yamada } 380*221b1638SMasahiro Yamada #endif /* MAKEFIXED */ 381*221b1638SMasahiro Yamada 382*221b1638SMasahiro Yamada /* 383*221b1638SMasahiro Yamada Update the window with the last wsize (normally 32K) bytes written before 384*221b1638SMasahiro Yamada returning. If window does not exist yet, create it. This is only called 385*221b1638SMasahiro Yamada when a window is already in use, or when output has been written during this 386*221b1638SMasahiro Yamada inflate call, but the end of the deflate stream has not been reached yet. 387*221b1638SMasahiro Yamada It is also called to create a window for dictionary data when a dictionary 388*221b1638SMasahiro Yamada is loaded. 389*221b1638SMasahiro Yamada 390*221b1638SMasahiro Yamada Providing output buffers larger than 32K to inflate() should provide a speed 391*221b1638SMasahiro Yamada advantage, since only the last 32K of output is copied to the sliding window 392*221b1638SMasahiro Yamada upon return from inflate(), and since all distances after the first 32K of 393*221b1638SMasahiro Yamada output will fall in the output data, making match copies simpler and faster. 394*221b1638SMasahiro Yamada The advantage may be dependent on the size of the processor's data caches. 395*221b1638SMasahiro Yamada */ 396*221b1638SMasahiro Yamada local int updatewindow(strm, end, copy) 397*221b1638SMasahiro Yamada z_streamp strm; 398*221b1638SMasahiro Yamada const Bytef *end; 399*221b1638SMasahiro Yamada unsigned copy; 400*221b1638SMasahiro Yamada { 401*221b1638SMasahiro Yamada struct inflate_state FAR *state; 402*221b1638SMasahiro Yamada unsigned dist; 403*221b1638SMasahiro Yamada 404*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 405*221b1638SMasahiro Yamada 406*221b1638SMasahiro Yamada /* if it hasn't been done already, allocate space for the window */ 407*221b1638SMasahiro Yamada if (state->window == Z_NULL) { 408*221b1638SMasahiro Yamada state->window = (unsigned char FAR *) 409*221b1638SMasahiro Yamada ZALLOC(strm, 1U << state->wbits, 410*221b1638SMasahiro Yamada sizeof(unsigned char)); 411*221b1638SMasahiro Yamada if (state->window == Z_NULL) return 1; 412*221b1638SMasahiro Yamada } 413*221b1638SMasahiro Yamada 414*221b1638SMasahiro Yamada /* if window not in use yet, initialize */ 415*221b1638SMasahiro Yamada if (state->wsize == 0) { 416*221b1638SMasahiro Yamada state->wsize = 1U << state->wbits; 417*221b1638SMasahiro Yamada state->wnext = 0; 418*221b1638SMasahiro Yamada state->whave = 0; 419*221b1638SMasahiro Yamada } 420*221b1638SMasahiro Yamada 421*221b1638SMasahiro Yamada /* copy state->wsize or less output bytes into the circular window */ 422*221b1638SMasahiro Yamada if (copy >= state->wsize) { 423*221b1638SMasahiro Yamada zmemcpy(state->window, end - state->wsize, state->wsize); 424*221b1638SMasahiro Yamada state->wnext = 0; 425*221b1638SMasahiro Yamada state->whave = state->wsize; 426*221b1638SMasahiro Yamada } 427*221b1638SMasahiro Yamada else { 428*221b1638SMasahiro Yamada dist = state->wsize - state->wnext; 429*221b1638SMasahiro Yamada if (dist > copy) dist = copy; 430*221b1638SMasahiro Yamada zmemcpy(state->window + state->wnext, end - copy, dist); 431*221b1638SMasahiro Yamada copy -= dist; 432*221b1638SMasahiro Yamada if (copy) { 433*221b1638SMasahiro Yamada zmemcpy(state->window, end - copy, copy); 434*221b1638SMasahiro Yamada state->wnext = copy; 435*221b1638SMasahiro Yamada state->whave = state->wsize; 436*221b1638SMasahiro Yamada } 437*221b1638SMasahiro Yamada else { 438*221b1638SMasahiro Yamada state->wnext += dist; 439*221b1638SMasahiro Yamada if (state->wnext == state->wsize) state->wnext = 0; 440*221b1638SMasahiro Yamada if (state->whave < state->wsize) state->whave += dist; 441*221b1638SMasahiro Yamada } 442*221b1638SMasahiro Yamada } 443*221b1638SMasahiro Yamada return 0; 444*221b1638SMasahiro Yamada } 445*221b1638SMasahiro Yamada 446*221b1638SMasahiro Yamada /* Macros for inflate(): */ 447*221b1638SMasahiro Yamada 448*221b1638SMasahiro Yamada /* check function to use adler32() for zlib or crc32() for gzip */ 449*221b1638SMasahiro Yamada #ifdef GUNZIP 450*221b1638SMasahiro Yamada # define UPDATE(check, buf, len) \ 451*221b1638SMasahiro Yamada (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) 452*221b1638SMasahiro Yamada #else 453*221b1638SMasahiro Yamada # define UPDATE(check, buf, len) adler32(check, buf, len) 454*221b1638SMasahiro Yamada #endif 455*221b1638SMasahiro Yamada 456*221b1638SMasahiro Yamada /* check macros for header crc */ 457*221b1638SMasahiro Yamada #ifdef GUNZIP 458*221b1638SMasahiro Yamada # define CRC2(check, word) \ 459*221b1638SMasahiro Yamada do { \ 460*221b1638SMasahiro Yamada hbuf[0] = (unsigned char)(word); \ 461*221b1638SMasahiro Yamada hbuf[1] = (unsigned char)((word) >> 8); \ 462*221b1638SMasahiro Yamada check = crc32(check, hbuf, 2); \ 463*221b1638SMasahiro Yamada } while (0) 464*221b1638SMasahiro Yamada 465*221b1638SMasahiro Yamada # define CRC4(check, word) \ 466*221b1638SMasahiro Yamada do { \ 467*221b1638SMasahiro Yamada hbuf[0] = (unsigned char)(word); \ 468*221b1638SMasahiro Yamada hbuf[1] = (unsigned char)((word) >> 8); \ 469*221b1638SMasahiro Yamada hbuf[2] = (unsigned char)((word) >> 16); \ 470*221b1638SMasahiro Yamada hbuf[3] = (unsigned char)((word) >> 24); \ 471*221b1638SMasahiro Yamada check = crc32(check, hbuf, 4); \ 472*221b1638SMasahiro Yamada } while (0) 473*221b1638SMasahiro Yamada #endif 474*221b1638SMasahiro Yamada 475*221b1638SMasahiro Yamada /* Load registers with state in inflate() for speed */ 476*221b1638SMasahiro Yamada #define LOAD() \ 477*221b1638SMasahiro Yamada do { \ 478*221b1638SMasahiro Yamada put = strm->next_out; \ 479*221b1638SMasahiro Yamada left = strm->avail_out; \ 480*221b1638SMasahiro Yamada next = strm->next_in; \ 481*221b1638SMasahiro Yamada have = strm->avail_in; \ 482*221b1638SMasahiro Yamada hold = state->hold; \ 483*221b1638SMasahiro Yamada bits = state->bits; \ 484*221b1638SMasahiro Yamada } while (0) 485*221b1638SMasahiro Yamada 486*221b1638SMasahiro Yamada /* Restore state from registers in inflate() */ 487*221b1638SMasahiro Yamada #define RESTORE() \ 488*221b1638SMasahiro Yamada do { \ 489*221b1638SMasahiro Yamada strm->next_out = put; \ 490*221b1638SMasahiro Yamada strm->avail_out = left; \ 491*221b1638SMasahiro Yamada strm->next_in = next; \ 492*221b1638SMasahiro Yamada strm->avail_in = have; \ 493*221b1638SMasahiro Yamada state->hold = hold; \ 494*221b1638SMasahiro Yamada state->bits = bits; \ 495*221b1638SMasahiro Yamada } while (0) 496*221b1638SMasahiro Yamada 497*221b1638SMasahiro Yamada /* Clear the input bit accumulator */ 498*221b1638SMasahiro Yamada #define INITBITS() \ 499*221b1638SMasahiro Yamada do { \ 500*221b1638SMasahiro Yamada hold = 0; \ 501*221b1638SMasahiro Yamada bits = 0; \ 502*221b1638SMasahiro Yamada } while (0) 503*221b1638SMasahiro Yamada 504*221b1638SMasahiro Yamada /* Get a byte of input into the bit accumulator, or return from inflate() 505*221b1638SMasahiro Yamada if there is no input available. */ 506*221b1638SMasahiro Yamada #define PULLBYTE() \ 507*221b1638SMasahiro Yamada do { \ 508*221b1638SMasahiro Yamada if (have == 0) goto inf_leave; \ 509*221b1638SMasahiro Yamada have--; \ 510*221b1638SMasahiro Yamada hold += (unsigned long)(*next++) << bits; \ 511*221b1638SMasahiro Yamada bits += 8; \ 512*221b1638SMasahiro Yamada } while (0) 513*221b1638SMasahiro Yamada 514*221b1638SMasahiro Yamada /* Assure that there are at least n bits in the bit accumulator. If there is 515*221b1638SMasahiro Yamada not enough available input to do that, then return from inflate(). */ 516*221b1638SMasahiro Yamada #define NEEDBITS(n) \ 517*221b1638SMasahiro Yamada do { \ 518*221b1638SMasahiro Yamada while (bits < (unsigned)(n)) \ 519*221b1638SMasahiro Yamada PULLBYTE(); \ 520*221b1638SMasahiro Yamada } while (0) 521*221b1638SMasahiro Yamada 522*221b1638SMasahiro Yamada /* Return the low n bits of the bit accumulator (n < 16) */ 523*221b1638SMasahiro Yamada #define BITS(n) \ 524*221b1638SMasahiro Yamada ((unsigned)hold & ((1U << (n)) - 1)) 525*221b1638SMasahiro Yamada 526*221b1638SMasahiro Yamada /* Remove n bits from the bit accumulator */ 527*221b1638SMasahiro Yamada #define DROPBITS(n) \ 528*221b1638SMasahiro Yamada do { \ 529*221b1638SMasahiro Yamada hold >>= (n); \ 530*221b1638SMasahiro Yamada bits -= (unsigned)(n); \ 531*221b1638SMasahiro Yamada } while (0) 532*221b1638SMasahiro Yamada 533*221b1638SMasahiro Yamada /* Remove zero to seven bits as needed to go to a byte boundary */ 534*221b1638SMasahiro Yamada #define BYTEBITS() \ 535*221b1638SMasahiro Yamada do { \ 536*221b1638SMasahiro Yamada hold >>= bits & 7; \ 537*221b1638SMasahiro Yamada bits -= bits & 7; \ 538*221b1638SMasahiro Yamada } while (0) 539*221b1638SMasahiro Yamada 540*221b1638SMasahiro Yamada /* 541*221b1638SMasahiro Yamada inflate() uses a state machine to process as much input data and generate as 542*221b1638SMasahiro Yamada much output data as possible before returning. The state machine is 543*221b1638SMasahiro Yamada structured roughly as follows: 544*221b1638SMasahiro Yamada 545*221b1638SMasahiro Yamada for (;;) switch (state) { 546*221b1638SMasahiro Yamada ... 547*221b1638SMasahiro Yamada case STATEn: 548*221b1638SMasahiro Yamada if (not enough input data or output space to make progress) 549*221b1638SMasahiro Yamada return; 550*221b1638SMasahiro Yamada ... make progress ... 551*221b1638SMasahiro Yamada state = STATEm; 552*221b1638SMasahiro Yamada break; 553*221b1638SMasahiro Yamada ... 554*221b1638SMasahiro Yamada } 555*221b1638SMasahiro Yamada 556*221b1638SMasahiro Yamada so when inflate() is called again, the same case is attempted again, and 557*221b1638SMasahiro Yamada if the appropriate resources are provided, the machine proceeds to the 558*221b1638SMasahiro Yamada next state. The NEEDBITS() macro is usually the way the state evaluates 559*221b1638SMasahiro Yamada whether it can proceed or should return. NEEDBITS() does the return if 560*221b1638SMasahiro Yamada the requested bits are not available. The typical use of the BITS macros 561*221b1638SMasahiro Yamada is: 562*221b1638SMasahiro Yamada 563*221b1638SMasahiro Yamada NEEDBITS(n); 564*221b1638SMasahiro Yamada ... do something with BITS(n) ... 565*221b1638SMasahiro Yamada DROPBITS(n); 566*221b1638SMasahiro Yamada 567*221b1638SMasahiro Yamada where NEEDBITS(n) either returns from inflate() if there isn't enough 568*221b1638SMasahiro Yamada input left to load n bits into the accumulator, or it continues. BITS(n) 569*221b1638SMasahiro Yamada gives the low n bits in the accumulator. When done, DROPBITS(n) drops 570*221b1638SMasahiro Yamada the low n bits off the accumulator. INITBITS() clears the accumulator 571*221b1638SMasahiro Yamada and sets the number of available bits to zero. BYTEBITS() discards just 572*221b1638SMasahiro Yamada enough bits to put the accumulator on a byte boundary. After BYTEBITS() 573*221b1638SMasahiro Yamada and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. 574*221b1638SMasahiro Yamada 575*221b1638SMasahiro Yamada NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return 576*221b1638SMasahiro Yamada if there is no input available. The decoding of variable length codes uses 577*221b1638SMasahiro Yamada PULLBYTE() directly in order to pull just enough bytes to decode the next 578*221b1638SMasahiro Yamada code, and no more. 579*221b1638SMasahiro Yamada 580*221b1638SMasahiro Yamada Some states loop until they get enough input, making sure that enough 581*221b1638SMasahiro Yamada state information is maintained to continue the loop where it left off 582*221b1638SMasahiro Yamada if NEEDBITS() returns in the loop. For example, want, need, and keep 583*221b1638SMasahiro Yamada would all have to actually be part of the saved state in case NEEDBITS() 584*221b1638SMasahiro Yamada returns: 585*221b1638SMasahiro Yamada 586*221b1638SMasahiro Yamada case STATEw: 587*221b1638SMasahiro Yamada while (want < need) { 588*221b1638SMasahiro Yamada NEEDBITS(n); 589*221b1638SMasahiro Yamada keep[want++] = BITS(n); 590*221b1638SMasahiro Yamada DROPBITS(n); 591*221b1638SMasahiro Yamada } 592*221b1638SMasahiro Yamada state = STATEx; 593*221b1638SMasahiro Yamada case STATEx: 594*221b1638SMasahiro Yamada 595*221b1638SMasahiro Yamada As shown above, if the next state is also the next case, then the break 596*221b1638SMasahiro Yamada is omitted. 597*221b1638SMasahiro Yamada 598*221b1638SMasahiro Yamada A state may also return if there is not enough output space available to 599*221b1638SMasahiro Yamada complete that state. Those states are copying stored data, writing a 600*221b1638SMasahiro Yamada literal byte, and copying a matching string. 601*221b1638SMasahiro Yamada 602*221b1638SMasahiro Yamada When returning, a "goto inf_leave" is used to update the total counters, 603*221b1638SMasahiro Yamada update the check value, and determine whether any progress has been made 604*221b1638SMasahiro Yamada during that inflate() call in order to return the proper return code. 605*221b1638SMasahiro Yamada Progress is defined as a change in either strm->avail_in or strm->avail_out. 606*221b1638SMasahiro Yamada When there is a window, goto inf_leave will update the window with the last 607*221b1638SMasahiro Yamada output written. If a goto inf_leave occurs in the middle of decompression 608*221b1638SMasahiro Yamada and there is no window currently, goto inf_leave will create one and copy 609*221b1638SMasahiro Yamada output to the window for the next call of inflate(). 610*221b1638SMasahiro Yamada 611*221b1638SMasahiro Yamada In this implementation, the flush parameter of inflate() only affects the 612*221b1638SMasahiro Yamada return code (per zlib.h). inflate() always writes as much as possible to 613*221b1638SMasahiro Yamada strm->next_out, given the space available and the provided input--the effect 614*221b1638SMasahiro Yamada documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers 615*221b1638SMasahiro Yamada the allocation of and copying into a sliding window until necessary, which 616*221b1638SMasahiro Yamada provides the effect documented in zlib.h for Z_FINISH when the entire input 617*221b1638SMasahiro Yamada stream available. So the only thing the flush parameter actually does is: 618*221b1638SMasahiro Yamada when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it 619*221b1638SMasahiro Yamada will return Z_BUF_ERROR if it has not reached the end of the stream. 620*221b1638SMasahiro Yamada */ 621*221b1638SMasahiro Yamada 622*221b1638SMasahiro Yamada int ZEXPORT inflate(strm, flush) 623*221b1638SMasahiro Yamada z_streamp strm; 624*221b1638SMasahiro Yamada int flush; 625*221b1638SMasahiro Yamada { 626*221b1638SMasahiro Yamada struct inflate_state FAR *state; 627*221b1638SMasahiro Yamada z_const unsigned char FAR *next; /* next input */ 628*221b1638SMasahiro Yamada unsigned char FAR *put; /* next output */ 629*221b1638SMasahiro Yamada unsigned have, left; /* available input and output */ 630*221b1638SMasahiro Yamada unsigned long hold; /* bit buffer */ 631*221b1638SMasahiro Yamada unsigned bits; /* bits in bit buffer */ 632*221b1638SMasahiro Yamada unsigned in, out; /* save starting available input and output */ 633*221b1638SMasahiro Yamada unsigned copy; /* number of stored or match bytes to copy */ 634*221b1638SMasahiro Yamada unsigned char FAR *from; /* where to copy match bytes from */ 635*221b1638SMasahiro Yamada code here; /* current decoding table entry */ 636*221b1638SMasahiro Yamada code last; /* parent table entry */ 637*221b1638SMasahiro Yamada unsigned len; /* length to copy for repeats, bits to drop */ 638*221b1638SMasahiro Yamada int ret; /* return code */ 639*221b1638SMasahiro Yamada #ifdef GUNZIP 640*221b1638SMasahiro Yamada unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ 641*221b1638SMasahiro Yamada #endif 642*221b1638SMasahiro Yamada static const unsigned short order[19] = /* permutation of code lengths */ 643*221b1638SMasahiro Yamada {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 644*221b1638SMasahiro Yamada 645*221b1638SMasahiro Yamada if (inflateStateCheck(strm) || strm->next_out == Z_NULL || 646*221b1638SMasahiro Yamada (strm->next_in == Z_NULL && strm->avail_in != 0)) 647*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 648*221b1638SMasahiro Yamada 649*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 650*221b1638SMasahiro Yamada if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ 651*221b1638SMasahiro Yamada LOAD(); 652*221b1638SMasahiro Yamada in = have; 653*221b1638SMasahiro Yamada out = left; 654*221b1638SMasahiro Yamada ret = Z_OK; 655*221b1638SMasahiro Yamada for (;;) 656*221b1638SMasahiro Yamada switch (state->mode) { 657*221b1638SMasahiro Yamada case HEAD: 658*221b1638SMasahiro Yamada if (state->wrap == 0) { 659*221b1638SMasahiro Yamada state->mode = TYPEDO; 660*221b1638SMasahiro Yamada break; 661*221b1638SMasahiro Yamada } 662*221b1638SMasahiro Yamada NEEDBITS(16); 663*221b1638SMasahiro Yamada #ifdef GUNZIP 664*221b1638SMasahiro Yamada if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ 665*221b1638SMasahiro Yamada if (state->wbits == 0) 666*221b1638SMasahiro Yamada state->wbits = 15; 667*221b1638SMasahiro Yamada state->check = crc32(0L, Z_NULL, 0); 668*221b1638SMasahiro Yamada CRC2(state->check, hold); 669*221b1638SMasahiro Yamada INITBITS(); 670*221b1638SMasahiro Yamada state->mode = FLAGS; 671*221b1638SMasahiro Yamada break; 672*221b1638SMasahiro Yamada } 673*221b1638SMasahiro Yamada state->flags = 0; /* expect zlib header */ 674*221b1638SMasahiro Yamada if (state->head != Z_NULL) 675*221b1638SMasahiro Yamada state->head->done = -1; 676*221b1638SMasahiro Yamada if (!(state->wrap & 1) || /* check if zlib header allowed */ 677*221b1638SMasahiro Yamada #else 678*221b1638SMasahiro Yamada if ( 679*221b1638SMasahiro Yamada #endif 680*221b1638SMasahiro Yamada ((BITS(8) << 8) + (hold >> 8)) % 31) { 681*221b1638SMasahiro Yamada strm->msg = (char *)"incorrect header check"; 682*221b1638SMasahiro Yamada state->mode = BAD; 683*221b1638SMasahiro Yamada break; 684*221b1638SMasahiro Yamada } 685*221b1638SMasahiro Yamada if (BITS(4) != Z_DEFLATED) { 686*221b1638SMasahiro Yamada strm->msg = (char *)"unknown compression method"; 687*221b1638SMasahiro Yamada state->mode = BAD; 688*221b1638SMasahiro Yamada break; 689*221b1638SMasahiro Yamada } 690*221b1638SMasahiro Yamada DROPBITS(4); 691*221b1638SMasahiro Yamada len = BITS(4) + 8; 692*221b1638SMasahiro Yamada if (state->wbits == 0) 693*221b1638SMasahiro Yamada state->wbits = len; 694*221b1638SMasahiro Yamada if (len > 15 || len > state->wbits) { 695*221b1638SMasahiro Yamada strm->msg = (char *)"invalid window size"; 696*221b1638SMasahiro Yamada state->mode = BAD; 697*221b1638SMasahiro Yamada break; 698*221b1638SMasahiro Yamada } 699*221b1638SMasahiro Yamada state->dmax = 1U << len; 700*221b1638SMasahiro Yamada Tracev((stderr, "inflate: zlib header ok\n")); 701*221b1638SMasahiro Yamada strm->adler = state->check = adler32(0L, Z_NULL, 0); 702*221b1638SMasahiro Yamada state->mode = hold & 0x200 ? DICTID : TYPE; 703*221b1638SMasahiro Yamada INITBITS(); 704*221b1638SMasahiro Yamada break; 705*221b1638SMasahiro Yamada #ifdef GUNZIP 706*221b1638SMasahiro Yamada case FLAGS: 707*221b1638SMasahiro Yamada NEEDBITS(16); 708*221b1638SMasahiro Yamada state->flags = (int)(hold); 709*221b1638SMasahiro Yamada if ((state->flags & 0xff) != Z_DEFLATED) { 710*221b1638SMasahiro Yamada strm->msg = (char *)"unknown compression method"; 711*221b1638SMasahiro Yamada state->mode = BAD; 712*221b1638SMasahiro Yamada break; 713*221b1638SMasahiro Yamada } 714*221b1638SMasahiro Yamada if (state->flags & 0xe000) { 715*221b1638SMasahiro Yamada strm->msg = (char *)"unknown header flags set"; 716*221b1638SMasahiro Yamada state->mode = BAD; 717*221b1638SMasahiro Yamada break; 718*221b1638SMasahiro Yamada } 719*221b1638SMasahiro Yamada if (state->head != Z_NULL) 720*221b1638SMasahiro Yamada state->head->text = (int)((hold >> 8) & 1); 721*221b1638SMasahiro Yamada if ((state->flags & 0x0200) && (state->wrap & 4)) 722*221b1638SMasahiro Yamada CRC2(state->check, hold); 723*221b1638SMasahiro Yamada INITBITS(); 724*221b1638SMasahiro Yamada state->mode = TIME; 725*221b1638SMasahiro Yamada case TIME: 726*221b1638SMasahiro Yamada NEEDBITS(32); 727*221b1638SMasahiro Yamada if (state->head != Z_NULL) 728*221b1638SMasahiro Yamada state->head->time = hold; 729*221b1638SMasahiro Yamada if ((state->flags & 0x0200) && (state->wrap & 4)) 730*221b1638SMasahiro Yamada CRC4(state->check, hold); 731*221b1638SMasahiro Yamada INITBITS(); 732*221b1638SMasahiro Yamada state->mode = OS; 733*221b1638SMasahiro Yamada case OS: 734*221b1638SMasahiro Yamada NEEDBITS(16); 735*221b1638SMasahiro Yamada if (state->head != Z_NULL) { 736*221b1638SMasahiro Yamada state->head->xflags = (int)(hold & 0xff); 737*221b1638SMasahiro Yamada state->head->os = (int)(hold >> 8); 738*221b1638SMasahiro Yamada } 739*221b1638SMasahiro Yamada if ((state->flags & 0x0200) && (state->wrap & 4)) 740*221b1638SMasahiro Yamada CRC2(state->check, hold); 741*221b1638SMasahiro Yamada INITBITS(); 742*221b1638SMasahiro Yamada state->mode = EXLEN; 743*221b1638SMasahiro Yamada case EXLEN: 744*221b1638SMasahiro Yamada if (state->flags & 0x0400) { 745*221b1638SMasahiro Yamada NEEDBITS(16); 746*221b1638SMasahiro Yamada state->length = (unsigned)(hold); 747*221b1638SMasahiro Yamada if (state->head != Z_NULL) 748*221b1638SMasahiro Yamada state->head->extra_len = (unsigned)hold; 749*221b1638SMasahiro Yamada if ((state->flags & 0x0200) && (state->wrap & 4)) 750*221b1638SMasahiro Yamada CRC2(state->check, hold); 751*221b1638SMasahiro Yamada INITBITS(); 752*221b1638SMasahiro Yamada } 753*221b1638SMasahiro Yamada else if (state->head != Z_NULL) 754*221b1638SMasahiro Yamada state->head->extra = Z_NULL; 755*221b1638SMasahiro Yamada state->mode = EXTRA; 756*221b1638SMasahiro Yamada case EXTRA: 757*221b1638SMasahiro Yamada if (state->flags & 0x0400) { 758*221b1638SMasahiro Yamada copy = state->length; 759*221b1638SMasahiro Yamada if (copy > have) copy = have; 760*221b1638SMasahiro Yamada if (copy) { 761*221b1638SMasahiro Yamada if (state->head != Z_NULL && 762*221b1638SMasahiro Yamada state->head->extra != Z_NULL) { 763*221b1638SMasahiro Yamada len = state->head->extra_len - state->length; 764*221b1638SMasahiro Yamada zmemcpy(state->head->extra + len, next, 765*221b1638SMasahiro Yamada len + copy > state->head->extra_max ? 766*221b1638SMasahiro Yamada state->head->extra_max - len : copy); 767*221b1638SMasahiro Yamada } 768*221b1638SMasahiro Yamada if ((state->flags & 0x0200) && (state->wrap & 4)) 769*221b1638SMasahiro Yamada state->check = crc32(state->check, next, copy); 770*221b1638SMasahiro Yamada have -= copy; 771*221b1638SMasahiro Yamada next += copy; 772*221b1638SMasahiro Yamada state->length -= copy; 773*221b1638SMasahiro Yamada } 774*221b1638SMasahiro Yamada if (state->length) goto inf_leave; 775*221b1638SMasahiro Yamada } 776*221b1638SMasahiro Yamada state->length = 0; 777*221b1638SMasahiro Yamada state->mode = NAME; 778*221b1638SMasahiro Yamada case NAME: 779*221b1638SMasahiro Yamada if (state->flags & 0x0800) { 780*221b1638SMasahiro Yamada if (have == 0) goto inf_leave; 781*221b1638SMasahiro Yamada copy = 0; 782*221b1638SMasahiro Yamada do { 783*221b1638SMasahiro Yamada len = (unsigned)(next[copy++]); 784*221b1638SMasahiro Yamada if (state->head != Z_NULL && 785*221b1638SMasahiro Yamada state->head->name != Z_NULL && 786*221b1638SMasahiro Yamada state->length < state->head->name_max) 787*221b1638SMasahiro Yamada state->head->name[state->length++] = (Bytef)len; 788*221b1638SMasahiro Yamada } while (len && copy < have); 789*221b1638SMasahiro Yamada if ((state->flags & 0x0200) && (state->wrap & 4)) 790*221b1638SMasahiro Yamada state->check = crc32(state->check, next, copy); 791*221b1638SMasahiro Yamada have -= copy; 792*221b1638SMasahiro Yamada next += copy; 793*221b1638SMasahiro Yamada if (len) goto inf_leave; 794*221b1638SMasahiro Yamada } 795*221b1638SMasahiro Yamada else if (state->head != Z_NULL) 796*221b1638SMasahiro Yamada state->head->name = Z_NULL; 797*221b1638SMasahiro Yamada state->length = 0; 798*221b1638SMasahiro Yamada state->mode = COMMENT; 799*221b1638SMasahiro Yamada case COMMENT: 800*221b1638SMasahiro Yamada if (state->flags & 0x1000) { 801*221b1638SMasahiro Yamada if (have == 0) goto inf_leave; 802*221b1638SMasahiro Yamada copy = 0; 803*221b1638SMasahiro Yamada do { 804*221b1638SMasahiro Yamada len = (unsigned)(next[copy++]); 805*221b1638SMasahiro Yamada if (state->head != Z_NULL && 806*221b1638SMasahiro Yamada state->head->comment != Z_NULL && 807*221b1638SMasahiro Yamada state->length < state->head->comm_max) 808*221b1638SMasahiro Yamada state->head->comment[state->length++] = (Bytef)len; 809*221b1638SMasahiro Yamada } while (len && copy < have); 810*221b1638SMasahiro Yamada if ((state->flags & 0x0200) && (state->wrap & 4)) 811*221b1638SMasahiro Yamada state->check = crc32(state->check, next, copy); 812*221b1638SMasahiro Yamada have -= copy; 813*221b1638SMasahiro Yamada next += copy; 814*221b1638SMasahiro Yamada if (len) goto inf_leave; 815*221b1638SMasahiro Yamada } 816*221b1638SMasahiro Yamada else if (state->head != Z_NULL) 817*221b1638SMasahiro Yamada state->head->comment = Z_NULL; 818*221b1638SMasahiro Yamada state->mode = HCRC; 819*221b1638SMasahiro Yamada case HCRC: 820*221b1638SMasahiro Yamada if (state->flags & 0x0200) { 821*221b1638SMasahiro Yamada NEEDBITS(16); 822*221b1638SMasahiro Yamada if ((state->wrap & 4) && hold != (state->check & 0xffff)) { 823*221b1638SMasahiro Yamada strm->msg = (char *)"header crc mismatch"; 824*221b1638SMasahiro Yamada state->mode = BAD; 825*221b1638SMasahiro Yamada break; 826*221b1638SMasahiro Yamada } 827*221b1638SMasahiro Yamada INITBITS(); 828*221b1638SMasahiro Yamada } 829*221b1638SMasahiro Yamada if (state->head != Z_NULL) { 830*221b1638SMasahiro Yamada state->head->hcrc = (int)((state->flags >> 9) & 1); 831*221b1638SMasahiro Yamada state->head->done = 1; 832*221b1638SMasahiro Yamada } 833*221b1638SMasahiro Yamada strm->adler = state->check = crc32(0L, Z_NULL, 0); 834*221b1638SMasahiro Yamada state->mode = TYPE; 835*221b1638SMasahiro Yamada break; 836*221b1638SMasahiro Yamada #endif 837*221b1638SMasahiro Yamada case DICTID: 838*221b1638SMasahiro Yamada NEEDBITS(32); 839*221b1638SMasahiro Yamada strm->adler = state->check = ZSWAP32(hold); 840*221b1638SMasahiro Yamada INITBITS(); 841*221b1638SMasahiro Yamada state->mode = DICT; 842*221b1638SMasahiro Yamada case DICT: 843*221b1638SMasahiro Yamada if (state->havedict == 0) { 844*221b1638SMasahiro Yamada RESTORE(); 845*221b1638SMasahiro Yamada return Z_NEED_DICT; 846*221b1638SMasahiro Yamada } 847*221b1638SMasahiro Yamada strm->adler = state->check = adler32(0L, Z_NULL, 0); 848*221b1638SMasahiro Yamada state->mode = TYPE; 849*221b1638SMasahiro Yamada case TYPE: 850*221b1638SMasahiro Yamada if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; 851*221b1638SMasahiro Yamada case TYPEDO: 852*221b1638SMasahiro Yamada if (state->last) { 853*221b1638SMasahiro Yamada BYTEBITS(); 854*221b1638SMasahiro Yamada state->mode = CHECK; 855*221b1638SMasahiro Yamada break; 856*221b1638SMasahiro Yamada } 857*221b1638SMasahiro Yamada NEEDBITS(3); 858*221b1638SMasahiro Yamada state->last = BITS(1); 859*221b1638SMasahiro Yamada DROPBITS(1); 860*221b1638SMasahiro Yamada switch (BITS(2)) { 861*221b1638SMasahiro Yamada case 0: /* stored block */ 862*221b1638SMasahiro Yamada Tracev((stderr, "inflate: stored block%s\n", 863*221b1638SMasahiro Yamada state->last ? " (last)" : "")); 864*221b1638SMasahiro Yamada state->mode = STORED; 865*221b1638SMasahiro Yamada break; 866*221b1638SMasahiro Yamada case 1: /* fixed block */ 867*221b1638SMasahiro Yamada fixedtables(state); 868*221b1638SMasahiro Yamada Tracev((stderr, "inflate: fixed codes block%s\n", 869*221b1638SMasahiro Yamada state->last ? " (last)" : "")); 870*221b1638SMasahiro Yamada state->mode = LEN_; /* decode codes */ 871*221b1638SMasahiro Yamada if (flush == Z_TREES) { 872*221b1638SMasahiro Yamada DROPBITS(2); 873*221b1638SMasahiro Yamada goto inf_leave; 874*221b1638SMasahiro Yamada } 875*221b1638SMasahiro Yamada break; 876*221b1638SMasahiro Yamada case 2: /* dynamic block */ 877*221b1638SMasahiro Yamada Tracev((stderr, "inflate: dynamic codes block%s\n", 878*221b1638SMasahiro Yamada state->last ? " (last)" : "")); 879*221b1638SMasahiro Yamada state->mode = TABLE; 880*221b1638SMasahiro Yamada break; 881*221b1638SMasahiro Yamada case 3: 882*221b1638SMasahiro Yamada strm->msg = (char *)"invalid block type"; 883*221b1638SMasahiro Yamada state->mode = BAD; 884*221b1638SMasahiro Yamada } 885*221b1638SMasahiro Yamada DROPBITS(2); 886*221b1638SMasahiro Yamada break; 887*221b1638SMasahiro Yamada case STORED: 888*221b1638SMasahiro Yamada BYTEBITS(); /* go to byte boundary */ 889*221b1638SMasahiro Yamada NEEDBITS(32); 890*221b1638SMasahiro Yamada if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { 891*221b1638SMasahiro Yamada strm->msg = (char *)"invalid stored block lengths"; 892*221b1638SMasahiro Yamada state->mode = BAD; 893*221b1638SMasahiro Yamada break; 894*221b1638SMasahiro Yamada } 895*221b1638SMasahiro Yamada state->length = (unsigned)hold & 0xffff; 896*221b1638SMasahiro Yamada Tracev((stderr, "inflate: stored length %u\n", 897*221b1638SMasahiro Yamada state->length)); 898*221b1638SMasahiro Yamada INITBITS(); 899*221b1638SMasahiro Yamada state->mode = COPY_; 900*221b1638SMasahiro Yamada if (flush == Z_TREES) goto inf_leave; 901*221b1638SMasahiro Yamada case COPY_: 902*221b1638SMasahiro Yamada state->mode = COPY; 903*221b1638SMasahiro Yamada case COPY: 904*221b1638SMasahiro Yamada copy = state->length; 905*221b1638SMasahiro Yamada if (copy) { 906*221b1638SMasahiro Yamada if (copy > have) copy = have; 907*221b1638SMasahiro Yamada if (copy > left) copy = left; 908*221b1638SMasahiro Yamada if (copy == 0) goto inf_leave; 909*221b1638SMasahiro Yamada zmemcpy(put, next, copy); 910*221b1638SMasahiro Yamada have -= copy; 911*221b1638SMasahiro Yamada next += copy; 912*221b1638SMasahiro Yamada left -= copy; 913*221b1638SMasahiro Yamada put += copy; 914*221b1638SMasahiro Yamada state->length -= copy; 915*221b1638SMasahiro Yamada break; 916*221b1638SMasahiro Yamada } 917*221b1638SMasahiro Yamada Tracev((stderr, "inflate: stored end\n")); 918*221b1638SMasahiro Yamada state->mode = TYPE; 919*221b1638SMasahiro Yamada break; 920*221b1638SMasahiro Yamada case TABLE: 921*221b1638SMasahiro Yamada NEEDBITS(14); 922*221b1638SMasahiro Yamada state->nlen = BITS(5) + 257; 923*221b1638SMasahiro Yamada DROPBITS(5); 924*221b1638SMasahiro Yamada state->ndist = BITS(5) + 1; 925*221b1638SMasahiro Yamada DROPBITS(5); 926*221b1638SMasahiro Yamada state->ncode = BITS(4) + 4; 927*221b1638SMasahiro Yamada DROPBITS(4); 928*221b1638SMasahiro Yamada #ifndef PKZIP_BUG_WORKAROUND 929*221b1638SMasahiro Yamada if (state->nlen > 286 || state->ndist > 30) { 930*221b1638SMasahiro Yamada strm->msg = (char *)"too many length or distance symbols"; 931*221b1638SMasahiro Yamada state->mode = BAD; 932*221b1638SMasahiro Yamada break; 933*221b1638SMasahiro Yamada } 934*221b1638SMasahiro Yamada #endif 935*221b1638SMasahiro Yamada Tracev((stderr, "inflate: table sizes ok\n")); 936*221b1638SMasahiro Yamada state->have = 0; 937*221b1638SMasahiro Yamada state->mode = LENLENS; 938*221b1638SMasahiro Yamada case LENLENS: 939*221b1638SMasahiro Yamada while (state->have < state->ncode) { 940*221b1638SMasahiro Yamada NEEDBITS(3); 941*221b1638SMasahiro Yamada state->lens[order[state->have++]] = (unsigned short)BITS(3); 942*221b1638SMasahiro Yamada DROPBITS(3); 943*221b1638SMasahiro Yamada } 944*221b1638SMasahiro Yamada while (state->have < 19) 945*221b1638SMasahiro Yamada state->lens[order[state->have++]] = 0; 946*221b1638SMasahiro Yamada state->next = state->codes; 947*221b1638SMasahiro Yamada state->lencode = (const code FAR *)(state->next); 948*221b1638SMasahiro Yamada state->lenbits = 7; 949*221b1638SMasahiro Yamada ret = inflate_table(CODES, state->lens, 19, &(state->next), 950*221b1638SMasahiro Yamada &(state->lenbits), state->work); 951*221b1638SMasahiro Yamada if (ret) { 952*221b1638SMasahiro Yamada strm->msg = (char *)"invalid code lengths set"; 953*221b1638SMasahiro Yamada state->mode = BAD; 954*221b1638SMasahiro Yamada break; 955*221b1638SMasahiro Yamada } 956*221b1638SMasahiro Yamada Tracev((stderr, "inflate: code lengths ok\n")); 957*221b1638SMasahiro Yamada state->have = 0; 958*221b1638SMasahiro Yamada state->mode = CODELENS; 959*221b1638SMasahiro Yamada case CODELENS: 960*221b1638SMasahiro Yamada while (state->have < state->nlen + state->ndist) { 961*221b1638SMasahiro Yamada for (;;) { 962*221b1638SMasahiro Yamada here = state->lencode[BITS(state->lenbits)]; 963*221b1638SMasahiro Yamada if ((unsigned)(here.bits) <= bits) break; 964*221b1638SMasahiro Yamada PULLBYTE(); 965*221b1638SMasahiro Yamada } 966*221b1638SMasahiro Yamada if (here.val < 16) { 967*221b1638SMasahiro Yamada DROPBITS(here.bits); 968*221b1638SMasahiro Yamada state->lens[state->have++] = here.val; 969*221b1638SMasahiro Yamada } 970*221b1638SMasahiro Yamada else { 971*221b1638SMasahiro Yamada if (here.val == 16) { 972*221b1638SMasahiro Yamada NEEDBITS(here.bits + 2); 973*221b1638SMasahiro Yamada DROPBITS(here.bits); 974*221b1638SMasahiro Yamada if (state->have == 0) { 975*221b1638SMasahiro Yamada strm->msg = (char *)"invalid bit length repeat"; 976*221b1638SMasahiro Yamada state->mode = BAD; 977*221b1638SMasahiro Yamada break; 978*221b1638SMasahiro Yamada } 979*221b1638SMasahiro Yamada len = state->lens[state->have - 1]; 980*221b1638SMasahiro Yamada copy = 3 + BITS(2); 981*221b1638SMasahiro Yamada DROPBITS(2); 982*221b1638SMasahiro Yamada } 983*221b1638SMasahiro Yamada else if (here.val == 17) { 984*221b1638SMasahiro Yamada NEEDBITS(here.bits + 3); 985*221b1638SMasahiro Yamada DROPBITS(here.bits); 986*221b1638SMasahiro Yamada len = 0; 987*221b1638SMasahiro Yamada copy = 3 + BITS(3); 988*221b1638SMasahiro Yamada DROPBITS(3); 989*221b1638SMasahiro Yamada } 990*221b1638SMasahiro Yamada else { 991*221b1638SMasahiro Yamada NEEDBITS(here.bits + 7); 992*221b1638SMasahiro Yamada DROPBITS(here.bits); 993*221b1638SMasahiro Yamada len = 0; 994*221b1638SMasahiro Yamada copy = 11 + BITS(7); 995*221b1638SMasahiro Yamada DROPBITS(7); 996*221b1638SMasahiro Yamada } 997*221b1638SMasahiro Yamada if (state->have + copy > state->nlen + state->ndist) { 998*221b1638SMasahiro Yamada strm->msg = (char *)"invalid bit length repeat"; 999*221b1638SMasahiro Yamada state->mode = BAD; 1000*221b1638SMasahiro Yamada break; 1001*221b1638SMasahiro Yamada } 1002*221b1638SMasahiro Yamada while (copy--) 1003*221b1638SMasahiro Yamada state->lens[state->have++] = (unsigned short)len; 1004*221b1638SMasahiro Yamada } 1005*221b1638SMasahiro Yamada } 1006*221b1638SMasahiro Yamada 1007*221b1638SMasahiro Yamada /* handle error breaks in while */ 1008*221b1638SMasahiro Yamada if (state->mode == BAD) break; 1009*221b1638SMasahiro Yamada 1010*221b1638SMasahiro Yamada /* check for end-of-block code (better have one) */ 1011*221b1638SMasahiro Yamada if (state->lens[256] == 0) { 1012*221b1638SMasahiro Yamada strm->msg = (char *)"invalid code -- missing end-of-block"; 1013*221b1638SMasahiro Yamada state->mode = BAD; 1014*221b1638SMasahiro Yamada break; 1015*221b1638SMasahiro Yamada } 1016*221b1638SMasahiro Yamada 1017*221b1638SMasahiro Yamada /* build code tables -- note: do not change the lenbits or distbits 1018*221b1638SMasahiro Yamada values here (9 and 6) without reading the comments in inftrees.h 1019*221b1638SMasahiro Yamada concerning the ENOUGH constants, which depend on those values */ 1020*221b1638SMasahiro Yamada state->next = state->codes; 1021*221b1638SMasahiro Yamada state->lencode = (const code FAR *)(state->next); 1022*221b1638SMasahiro Yamada state->lenbits = 9; 1023*221b1638SMasahiro Yamada ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), 1024*221b1638SMasahiro Yamada &(state->lenbits), state->work); 1025*221b1638SMasahiro Yamada if (ret) { 1026*221b1638SMasahiro Yamada strm->msg = (char *)"invalid literal/lengths set"; 1027*221b1638SMasahiro Yamada state->mode = BAD; 1028*221b1638SMasahiro Yamada break; 1029*221b1638SMasahiro Yamada } 1030*221b1638SMasahiro Yamada state->distcode = (const code FAR *)(state->next); 1031*221b1638SMasahiro Yamada state->distbits = 6; 1032*221b1638SMasahiro Yamada ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, 1033*221b1638SMasahiro Yamada &(state->next), &(state->distbits), state->work); 1034*221b1638SMasahiro Yamada if (ret) { 1035*221b1638SMasahiro Yamada strm->msg = (char *)"invalid distances set"; 1036*221b1638SMasahiro Yamada state->mode = BAD; 1037*221b1638SMasahiro Yamada break; 1038*221b1638SMasahiro Yamada } 1039*221b1638SMasahiro Yamada Tracev((stderr, "inflate: codes ok\n")); 1040*221b1638SMasahiro Yamada state->mode = LEN_; 1041*221b1638SMasahiro Yamada if (flush == Z_TREES) goto inf_leave; 1042*221b1638SMasahiro Yamada case LEN_: 1043*221b1638SMasahiro Yamada state->mode = LEN; 1044*221b1638SMasahiro Yamada case LEN: 1045*221b1638SMasahiro Yamada if (have >= 6 && left >= 258) { 1046*221b1638SMasahiro Yamada RESTORE(); 1047*221b1638SMasahiro Yamada inflate_fast(strm, out); 1048*221b1638SMasahiro Yamada LOAD(); 1049*221b1638SMasahiro Yamada if (state->mode == TYPE) 1050*221b1638SMasahiro Yamada state->back = -1; 1051*221b1638SMasahiro Yamada break; 1052*221b1638SMasahiro Yamada } 1053*221b1638SMasahiro Yamada state->back = 0; 1054*221b1638SMasahiro Yamada for (;;) { 1055*221b1638SMasahiro Yamada here = state->lencode[BITS(state->lenbits)]; 1056*221b1638SMasahiro Yamada if ((unsigned)(here.bits) <= bits) break; 1057*221b1638SMasahiro Yamada PULLBYTE(); 1058*221b1638SMasahiro Yamada } 1059*221b1638SMasahiro Yamada if (here.op && (here.op & 0xf0) == 0) { 1060*221b1638SMasahiro Yamada last = here; 1061*221b1638SMasahiro Yamada for (;;) { 1062*221b1638SMasahiro Yamada here = state->lencode[last.val + 1063*221b1638SMasahiro Yamada (BITS(last.bits + last.op) >> last.bits)]; 1064*221b1638SMasahiro Yamada if ((unsigned)(last.bits + here.bits) <= bits) break; 1065*221b1638SMasahiro Yamada PULLBYTE(); 1066*221b1638SMasahiro Yamada } 1067*221b1638SMasahiro Yamada DROPBITS(last.bits); 1068*221b1638SMasahiro Yamada state->back += last.bits; 1069*221b1638SMasahiro Yamada } 1070*221b1638SMasahiro Yamada DROPBITS(here.bits); 1071*221b1638SMasahiro Yamada state->back += here.bits; 1072*221b1638SMasahiro Yamada state->length = (unsigned)here.val; 1073*221b1638SMasahiro Yamada if ((int)(here.op) == 0) { 1074*221b1638SMasahiro Yamada Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? 1075*221b1638SMasahiro Yamada "inflate: literal '%c'\n" : 1076*221b1638SMasahiro Yamada "inflate: literal 0x%02x\n", here.val)); 1077*221b1638SMasahiro Yamada state->mode = LIT; 1078*221b1638SMasahiro Yamada break; 1079*221b1638SMasahiro Yamada } 1080*221b1638SMasahiro Yamada if (here.op & 32) { 1081*221b1638SMasahiro Yamada Tracevv((stderr, "inflate: end of block\n")); 1082*221b1638SMasahiro Yamada state->back = -1; 1083*221b1638SMasahiro Yamada state->mode = TYPE; 1084*221b1638SMasahiro Yamada break; 1085*221b1638SMasahiro Yamada } 1086*221b1638SMasahiro Yamada if (here.op & 64) { 1087*221b1638SMasahiro Yamada strm->msg = (char *)"invalid literal/length code"; 1088*221b1638SMasahiro Yamada state->mode = BAD; 1089*221b1638SMasahiro Yamada break; 1090*221b1638SMasahiro Yamada } 1091*221b1638SMasahiro Yamada state->extra = (unsigned)(here.op) & 15; 1092*221b1638SMasahiro Yamada state->mode = LENEXT; 1093*221b1638SMasahiro Yamada case LENEXT: 1094*221b1638SMasahiro Yamada if (state->extra) { 1095*221b1638SMasahiro Yamada NEEDBITS(state->extra); 1096*221b1638SMasahiro Yamada state->length += BITS(state->extra); 1097*221b1638SMasahiro Yamada DROPBITS(state->extra); 1098*221b1638SMasahiro Yamada state->back += state->extra; 1099*221b1638SMasahiro Yamada } 1100*221b1638SMasahiro Yamada Tracevv((stderr, "inflate: length %u\n", state->length)); 1101*221b1638SMasahiro Yamada state->was = state->length; 1102*221b1638SMasahiro Yamada state->mode = DIST; 1103*221b1638SMasahiro Yamada case DIST: 1104*221b1638SMasahiro Yamada for (;;) { 1105*221b1638SMasahiro Yamada here = state->distcode[BITS(state->distbits)]; 1106*221b1638SMasahiro Yamada if ((unsigned)(here.bits) <= bits) break; 1107*221b1638SMasahiro Yamada PULLBYTE(); 1108*221b1638SMasahiro Yamada } 1109*221b1638SMasahiro Yamada if ((here.op & 0xf0) == 0) { 1110*221b1638SMasahiro Yamada last = here; 1111*221b1638SMasahiro Yamada for (;;) { 1112*221b1638SMasahiro Yamada here = state->distcode[last.val + 1113*221b1638SMasahiro Yamada (BITS(last.bits + last.op) >> last.bits)]; 1114*221b1638SMasahiro Yamada if ((unsigned)(last.bits + here.bits) <= bits) break; 1115*221b1638SMasahiro Yamada PULLBYTE(); 1116*221b1638SMasahiro Yamada } 1117*221b1638SMasahiro Yamada DROPBITS(last.bits); 1118*221b1638SMasahiro Yamada state->back += last.bits; 1119*221b1638SMasahiro Yamada } 1120*221b1638SMasahiro Yamada DROPBITS(here.bits); 1121*221b1638SMasahiro Yamada state->back += here.bits; 1122*221b1638SMasahiro Yamada if (here.op & 64) { 1123*221b1638SMasahiro Yamada strm->msg = (char *)"invalid distance code"; 1124*221b1638SMasahiro Yamada state->mode = BAD; 1125*221b1638SMasahiro Yamada break; 1126*221b1638SMasahiro Yamada } 1127*221b1638SMasahiro Yamada state->offset = (unsigned)here.val; 1128*221b1638SMasahiro Yamada state->extra = (unsigned)(here.op) & 15; 1129*221b1638SMasahiro Yamada state->mode = DISTEXT; 1130*221b1638SMasahiro Yamada case DISTEXT: 1131*221b1638SMasahiro Yamada if (state->extra) { 1132*221b1638SMasahiro Yamada NEEDBITS(state->extra); 1133*221b1638SMasahiro Yamada state->offset += BITS(state->extra); 1134*221b1638SMasahiro Yamada DROPBITS(state->extra); 1135*221b1638SMasahiro Yamada state->back += state->extra; 1136*221b1638SMasahiro Yamada } 1137*221b1638SMasahiro Yamada #ifdef INFLATE_STRICT 1138*221b1638SMasahiro Yamada if (state->offset > state->dmax) { 1139*221b1638SMasahiro Yamada strm->msg = (char *)"invalid distance too far back"; 1140*221b1638SMasahiro Yamada state->mode = BAD; 1141*221b1638SMasahiro Yamada break; 1142*221b1638SMasahiro Yamada } 1143*221b1638SMasahiro Yamada #endif 1144*221b1638SMasahiro Yamada Tracevv((stderr, "inflate: distance %u\n", state->offset)); 1145*221b1638SMasahiro Yamada state->mode = MATCH; 1146*221b1638SMasahiro Yamada case MATCH: 1147*221b1638SMasahiro Yamada if (left == 0) goto inf_leave; 1148*221b1638SMasahiro Yamada copy = out - left; 1149*221b1638SMasahiro Yamada if (state->offset > copy) { /* copy from window */ 1150*221b1638SMasahiro Yamada copy = state->offset - copy; 1151*221b1638SMasahiro Yamada if (copy > state->whave) { 1152*221b1638SMasahiro Yamada if (state->sane) { 1153*221b1638SMasahiro Yamada strm->msg = (char *)"invalid distance too far back"; 1154*221b1638SMasahiro Yamada state->mode = BAD; 1155*221b1638SMasahiro Yamada break; 1156*221b1638SMasahiro Yamada } 1157*221b1638SMasahiro Yamada #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR 1158*221b1638SMasahiro Yamada Trace((stderr, "inflate.c too far\n")); 1159*221b1638SMasahiro Yamada copy -= state->whave; 1160*221b1638SMasahiro Yamada if (copy > state->length) copy = state->length; 1161*221b1638SMasahiro Yamada if (copy > left) copy = left; 1162*221b1638SMasahiro Yamada left -= copy; 1163*221b1638SMasahiro Yamada state->length -= copy; 1164*221b1638SMasahiro Yamada do { 1165*221b1638SMasahiro Yamada *put++ = 0; 1166*221b1638SMasahiro Yamada } while (--copy); 1167*221b1638SMasahiro Yamada if (state->length == 0) state->mode = LEN; 1168*221b1638SMasahiro Yamada break; 1169*221b1638SMasahiro Yamada #endif 1170*221b1638SMasahiro Yamada } 1171*221b1638SMasahiro Yamada if (copy > state->wnext) { 1172*221b1638SMasahiro Yamada copy -= state->wnext; 1173*221b1638SMasahiro Yamada from = state->window + (state->wsize - copy); 1174*221b1638SMasahiro Yamada } 1175*221b1638SMasahiro Yamada else 1176*221b1638SMasahiro Yamada from = state->window + (state->wnext - copy); 1177*221b1638SMasahiro Yamada if (copy > state->length) copy = state->length; 1178*221b1638SMasahiro Yamada } 1179*221b1638SMasahiro Yamada else { /* copy from output */ 1180*221b1638SMasahiro Yamada from = put - state->offset; 1181*221b1638SMasahiro Yamada copy = state->length; 1182*221b1638SMasahiro Yamada } 1183*221b1638SMasahiro Yamada if (copy > left) copy = left; 1184*221b1638SMasahiro Yamada left -= copy; 1185*221b1638SMasahiro Yamada state->length -= copy; 1186*221b1638SMasahiro Yamada do { 1187*221b1638SMasahiro Yamada *put++ = *from++; 1188*221b1638SMasahiro Yamada } while (--copy); 1189*221b1638SMasahiro Yamada if (state->length == 0) state->mode = LEN; 1190*221b1638SMasahiro Yamada break; 1191*221b1638SMasahiro Yamada case LIT: 1192*221b1638SMasahiro Yamada if (left == 0) goto inf_leave; 1193*221b1638SMasahiro Yamada *put++ = (unsigned char)(state->length); 1194*221b1638SMasahiro Yamada left--; 1195*221b1638SMasahiro Yamada state->mode = LEN; 1196*221b1638SMasahiro Yamada break; 1197*221b1638SMasahiro Yamada case CHECK: 1198*221b1638SMasahiro Yamada if (state->wrap) { 1199*221b1638SMasahiro Yamada NEEDBITS(32); 1200*221b1638SMasahiro Yamada out -= left; 1201*221b1638SMasahiro Yamada strm->total_out += out; 1202*221b1638SMasahiro Yamada state->total += out; 1203*221b1638SMasahiro Yamada if ((state->wrap & 4) && out) 1204*221b1638SMasahiro Yamada strm->adler = state->check = 1205*221b1638SMasahiro Yamada UPDATE(state->check, put - out, out); 1206*221b1638SMasahiro Yamada out = left; 1207*221b1638SMasahiro Yamada if ((state->wrap & 4) && ( 1208*221b1638SMasahiro Yamada #ifdef GUNZIP 1209*221b1638SMasahiro Yamada state->flags ? hold : 1210*221b1638SMasahiro Yamada #endif 1211*221b1638SMasahiro Yamada ZSWAP32(hold)) != state->check) { 1212*221b1638SMasahiro Yamada strm->msg = (char *)"incorrect data check"; 1213*221b1638SMasahiro Yamada state->mode = BAD; 1214*221b1638SMasahiro Yamada break; 1215*221b1638SMasahiro Yamada } 1216*221b1638SMasahiro Yamada INITBITS(); 1217*221b1638SMasahiro Yamada Tracev((stderr, "inflate: check matches trailer\n")); 1218*221b1638SMasahiro Yamada } 1219*221b1638SMasahiro Yamada #ifdef GUNZIP 1220*221b1638SMasahiro Yamada state->mode = LENGTH; 1221*221b1638SMasahiro Yamada case LENGTH: 1222*221b1638SMasahiro Yamada if (state->wrap && state->flags) { 1223*221b1638SMasahiro Yamada NEEDBITS(32); 1224*221b1638SMasahiro Yamada if (hold != (state->total & 0xffffffffUL)) { 1225*221b1638SMasahiro Yamada strm->msg = (char *)"incorrect length check"; 1226*221b1638SMasahiro Yamada state->mode = BAD; 1227*221b1638SMasahiro Yamada break; 1228*221b1638SMasahiro Yamada } 1229*221b1638SMasahiro Yamada INITBITS(); 1230*221b1638SMasahiro Yamada Tracev((stderr, "inflate: length matches trailer\n")); 1231*221b1638SMasahiro Yamada } 1232*221b1638SMasahiro Yamada #endif 1233*221b1638SMasahiro Yamada state->mode = DONE; 1234*221b1638SMasahiro Yamada case DONE: 1235*221b1638SMasahiro Yamada ret = Z_STREAM_END; 1236*221b1638SMasahiro Yamada goto inf_leave; 1237*221b1638SMasahiro Yamada case BAD: 1238*221b1638SMasahiro Yamada ret = Z_DATA_ERROR; 1239*221b1638SMasahiro Yamada goto inf_leave; 1240*221b1638SMasahiro Yamada case MEM: 1241*221b1638SMasahiro Yamada return Z_MEM_ERROR; 1242*221b1638SMasahiro Yamada case SYNC: 1243*221b1638SMasahiro Yamada default: 1244*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 1245*221b1638SMasahiro Yamada } 1246*221b1638SMasahiro Yamada 1247*221b1638SMasahiro Yamada /* 1248*221b1638SMasahiro Yamada Return from inflate(), updating the total counts and the check value. 1249*221b1638SMasahiro Yamada If there was no progress during the inflate() call, return a buffer 1250*221b1638SMasahiro Yamada error. Call updatewindow() to create and/or update the window state. 1251*221b1638SMasahiro Yamada Note: a memory error from inflate() is non-recoverable. 1252*221b1638SMasahiro Yamada */ 1253*221b1638SMasahiro Yamada inf_leave: 1254*221b1638SMasahiro Yamada RESTORE(); 1255*221b1638SMasahiro Yamada if (state->wsize || (out != strm->avail_out && state->mode < BAD && 1256*221b1638SMasahiro Yamada (state->mode < CHECK || flush != Z_FINISH))) 1257*221b1638SMasahiro Yamada if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { 1258*221b1638SMasahiro Yamada state->mode = MEM; 1259*221b1638SMasahiro Yamada return Z_MEM_ERROR; 1260*221b1638SMasahiro Yamada } 1261*221b1638SMasahiro Yamada in -= strm->avail_in; 1262*221b1638SMasahiro Yamada out -= strm->avail_out; 1263*221b1638SMasahiro Yamada strm->total_in += in; 1264*221b1638SMasahiro Yamada strm->total_out += out; 1265*221b1638SMasahiro Yamada state->total += out; 1266*221b1638SMasahiro Yamada if ((state->wrap & 4) && out) 1267*221b1638SMasahiro Yamada strm->adler = state->check = 1268*221b1638SMasahiro Yamada UPDATE(state->check, strm->next_out - out, out); 1269*221b1638SMasahiro Yamada strm->data_type = (int)state->bits + (state->last ? 64 : 0) + 1270*221b1638SMasahiro Yamada (state->mode == TYPE ? 128 : 0) + 1271*221b1638SMasahiro Yamada (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); 1272*221b1638SMasahiro Yamada if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) 1273*221b1638SMasahiro Yamada ret = Z_BUF_ERROR; 1274*221b1638SMasahiro Yamada return ret; 1275*221b1638SMasahiro Yamada } 1276*221b1638SMasahiro Yamada 1277*221b1638SMasahiro Yamada int ZEXPORT inflateEnd(strm) 1278*221b1638SMasahiro Yamada z_streamp strm; 1279*221b1638SMasahiro Yamada { 1280*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1281*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) 1282*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 1283*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1284*221b1638SMasahiro Yamada if (state->window != Z_NULL) ZFREE(strm, state->window); 1285*221b1638SMasahiro Yamada ZFREE(strm, strm->state); 1286*221b1638SMasahiro Yamada strm->state = Z_NULL; 1287*221b1638SMasahiro Yamada Tracev((stderr, "inflate: end\n")); 1288*221b1638SMasahiro Yamada return Z_OK; 1289*221b1638SMasahiro Yamada } 1290*221b1638SMasahiro Yamada 1291*221b1638SMasahiro Yamada int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) 1292*221b1638SMasahiro Yamada z_streamp strm; 1293*221b1638SMasahiro Yamada Bytef *dictionary; 1294*221b1638SMasahiro Yamada uInt *dictLength; 1295*221b1638SMasahiro Yamada { 1296*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1297*221b1638SMasahiro Yamada 1298*221b1638SMasahiro Yamada /* check state */ 1299*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 1300*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1301*221b1638SMasahiro Yamada 1302*221b1638SMasahiro Yamada /* copy dictionary */ 1303*221b1638SMasahiro Yamada if (state->whave && dictionary != Z_NULL) { 1304*221b1638SMasahiro Yamada zmemcpy(dictionary, state->window + state->wnext, 1305*221b1638SMasahiro Yamada state->whave - state->wnext); 1306*221b1638SMasahiro Yamada zmemcpy(dictionary + state->whave - state->wnext, 1307*221b1638SMasahiro Yamada state->window, state->wnext); 1308*221b1638SMasahiro Yamada } 1309*221b1638SMasahiro Yamada if (dictLength != Z_NULL) 1310*221b1638SMasahiro Yamada *dictLength = state->whave; 1311*221b1638SMasahiro Yamada return Z_OK; 1312*221b1638SMasahiro Yamada } 1313*221b1638SMasahiro Yamada 1314*221b1638SMasahiro Yamada int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) 1315*221b1638SMasahiro Yamada z_streamp strm; 1316*221b1638SMasahiro Yamada const Bytef *dictionary; 1317*221b1638SMasahiro Yamada uInt dictLength; 1318*221b1638SMasahiro Yamada { 1319*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1320*221b1638SMasahiro Yamada unsigned long dictid; 1321*221b1638SMasahiro Yamada int ret; 1322*221b1638SMasahiro Yamada 1323*221b1638SMasahiro Yamada /* check state */ 1324*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 1325*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1326*221b1638SMasahiro Yamada if (state->wrap != 0 && state->mode != DICT) 1327*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 1328*221b1638SMasahiro Yamada 1329*221b1638SMasahiro Yamada /* check for correct dictionary identifier */ 1330*221b1638SMasahiro Yamada if (state->mode == DICT) { 1331*221b1638SMasahiro Yamada dictid = adler32(0L, Z_NULL, 0); 1332*221b1638SMasahiro Yamada dictid = adler32(dictid, dictionary, dictLength); 1333*221b1638SMasahiro Yamada if (dictid != state->check) 1334*221b1638SMasahiro Yamada return Z_DATA_ERROR; 1335*221b1638SMasahiro Yamada } 1336*221b1638SMasahiro Yamada 1337*221b1638SMasahiro Yamada /* copy dictionary to window using updatewindow(), which will amend the 1338*221b1638SMasahiro Yamada existing dictionary if appropriate */ 1339*221b1638SMasahiro Yamada ret = updatewindow(strm, dictionary + dictLength, dictLength); 1340*221b1638SMasahiro Yamada if (ret) { 1341*221b1638SMasahiro Yamada state->mode = MEM; 1342*221b1638SMasahiro Yamada return Z_MEM_ERROR; 1343*221b1638SMasahiro Yamada } 1344*221b1638SMasahiro Yamada state->havedict = 1; 1345*221b1638SMasahiro Yamada Tracev((stderr, "inflate: dictionary set\n")); 1346*221b1638SMasahiro Yamada return Z_OK; 1347*221b1638SMasahiro Yamada } 1348*221b1638SMasahiro Yamada 1349*221b1638SMasahiro Yamada int ZEXPORT inflateGetHeader(strm, head) 1350*221b1638SMasahiro Yamada z_streamp strm; 1351*221b1638SMasahiro Yamada gz_headerp head; 1352*221b1638SMasahiro Yamada { 1353*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1354*221b1638SMasahiro Yamada 1355*221b1638SMasahiro Yamada /* check state */ 1356*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 1357*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1358*221b1638SMasahiro Yamada if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; 1359*221b1638SMasahiro Yamada 1360*221b1638SMasahiro Yamada /* save header structure */ 1361*221b1638SMasahiro Yamada state->head = head; 1362*221b1638SMasahiro Yamada head->done = 0; 1363*221b1638SMasahiro Yamada return Z_OK; 1364*221b1638SMasahiro Yamada } 1365*221b1638SMasahiro Yamada 1366*221b1638SMasahiro Yamada /* 1367*221b1638SMasahiro Yamada Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found 1368*221b1638SMasahiro Yamada or when out of input. When called, *have is the number of pattern bytes 1369*221b1638SMasahiro Yamada found in order so far, in 0..3. On return *have is updated to the new 1370*221b1638SMasahiro Yamada state. If on return *have equals four, then the pattern was found and the 1371*221b1638SMasahiro Yamada return value is how many bytes were read including the last byte of the 1372*221b1638SMasahiro Yamada pattern. If *have is less than four, then the pattern has not been found 1373*221b1638SMasahiro Yamada yet and the return value is len. In the latter case, syncsearch() can be 1374*221b1638SMasahiro Yamada called again with more data and the *have state. *have is initialized to 1375*221b1638SMasahiro Yamada zero for the first call. 1376*221b1638SMasahiro Yamada */ 1377*221b1638SMasahiro Yamada local unsigned syncsearch(have, buf, len) 1378*221b1638SMasahiro Yamada unsigned FAR *have; 1379*221b1638SMasahiro Yamada const unsigned char FAR *buf; 1380*221b1638SMasahiro Yamada unsigned len; 1381*221b1638SMasahiro Yamada { 1382*221b1638SMasahiro Yamada unsigned got; 1383*221b1638SMasahiro Yamada unsigned next; 1384*221b1638SMasahiro Yamada 1385*221b1638SMasahiro Yamada got = *have; 1386*221b1638SMasahiro Yamada next = 0; 1387*221b1638SMasahiro Yamada while (next < len && got < 4) { 1388*221b1638SMasahiro Yamada if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) 1389*221b1638SMasahiro Yamada got++; 1390*221b1638SMasahiro Yamada else if (buf[next]) 1391*221b1638SMasahiro Yamada got = 0; 1392*221b1638SMasahiro Yamada else 1393*221b1638SMasahiro Yamada got = 4 - got; 1394*221b1638SMasahiro Yamada next++; 1395*221b1638SMasahiro Yamada } 1396*221b1638SMasahiro Yamada *have = got; 1397*221b1638SMasahiro Yamada return next; 1398*221b1638SMasahiro Yamada } 1399*221b1638SMasahiro Yamada 1400*221b1638SMasahiro Yamada int ZEXPORT inflateSync(strm) 1401*221b1638SMasahiro Yamada z_streamp strm; 1402*221b1638SMasahiro Yamada { 1403*221b1638SMasahiro Yamada unsigned len; /* number of bytes to look at or looked at */ 1404*221b1638SMasahiro Yamada unsigned long in, out; /* temporary to save total_in and total_out */ 1405*221b1638SMasahiro Yamada unsigned char buf[4]; /* to restore bit buffer to byte string */ 1406*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1407*221b1638SMasahiro Yamada 1408*221b1638SMasahiro Yamada /* check parameters */ 1409*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 1410*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1411*221b1638SMasahiro Yamada if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; 1412*221b1638SMasahiro Yamada 1413*221b1638SMasahiro Yamada /* if first time, start search in bit buffer */ 1414*221b1638SMasahiro Yamada if (state->mode != SYNC) { 1415*221b1638SMasahiro Yamada state->mode = SYNC; 1416*221b1638SMasahiro Yamada state->hold <<= state->bits & 7; 1417*221b1638SMasahiro Yamada state->bits -= state->bits & 7; 1418*221b1638SMasahiro Yamada len = 0; 1419*221b1638SMasahiro Yamada while (state->bits >= 8) { 1420*221b1638SMasahiro Yamada buf[len++] = (unsigned char)(state->hold); 1421*221b1638SMasahiro Yamada state->hold >>= 8; 1422*221b1638SMasahiro Yamada state->bits -= 8; 1423*221b1638SMasahiro Yamada } 1424*221b1638SMasahiro Yamada state->have = 0; 1425*221b1638SMasahiro Yamada syncsearch(&(state->have), buf, len); 1426*221b1638SMasahiro Yamada } 1427*221b1638SMasahiro Yamada 1428*221b1638SMasahiro Yamada /* search available input */ 1429*221b1638SMasahiro Yamada len = syncsearch(&(state->have), strm->next_in, strm->avail_in); 1430*221b1638SMasahiro Yamada strm->avail_in -= len; 1431*221b1638SMasahiro Yamada strm->next_in += len; 1432*221b1638SMasahiro Yamada strm->total_in += len; 1433*221b1638SMasahiro Yamada 1434*221b1638SMasahiro Yamada /* return no joy or set up to restart inflate() on a new block */ 1435*221b1638SMasahiro Yamada if (state->have != 4) return Z_DATA_ERROR; 1436*221b1638SMasahiro Yamada in = strm->total_in; out = strm->total_out; 1437*221b1638SMasahiro Yamada inflateReset(strm); 1438*221b1638SMasahiro Yamada strm->total_in = in; strm->total_out = out; 1439*221b1638SMasahiro Yamada state->mode = TYPE; 1440*221b1638SMasahiro Yamada return Z_OK; 1441*221b1638SMasahiro Yamada } 1442*221b1638SMasahiro Yamada 1443*221b1638SMasahiro Yamada /* 1444*221b1638SMasahiro Yamada Returns true if inflate is currently at the end of a block generated by 1445*221b1638SMasahiro Yamada Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP 1446*221b1638SMasahiro Yamada implementation to provide an additional safety check. PPP uses 1447*221b1638SMasahiro Yamada Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored 1448*221b1638SMasahiro Yamada block. When decompressing, PPP checks that at the end of input packet, 1449*221b1638SMasahiro Yamada inflate is waiting for these length bytes. 1450*221b1638SMasahiro Yamada */ 1451*221b1638SMasahiro Yamada int ZEXPORT inflateSyncPoint(strm) 1452*221b1638SMasahiro Yamada z_streamp strm; 1453*221b1638SMasahiro Yamada { 1454*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1455*221b1638SMasahiro Yamada 1456*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 1457*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1458*221b1638SMasahiro Yamada return state->mode == STORED && state->bits == 0; 1459*221b1638SMasahiro Yamada } 1460*221b1638SMasahiro Yamada 1461*221b1638SMasahiro Yamada int ZEXPORT inflateCopy(dest, source) 1462*221b1638SMasahiro Yamada z_streamp dest; 1463*221b1638SMasahiro Yamada z_streamp source; 1464*221b1638SMasahiro Yamada { 1465*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1466*221b1638SMasahiro Yamada struct inflate_state FAR *copy; 1467*221b1638SMasahiro Yamada unsigned char FAR *window; 1468*221b1638SMasahiro Yamada unsigned wsize; 1469*221b1638SMasahiro Yamada 1470*221b1638SMasahiro Yamada /* check input */ 1471*221b1638SMasahiro Yamada if (inflateStateCheck(source) || dest == Z_NULL) 1472*221b1638SMasahiro Yamada return Z_STREAM_ERROR; 1473*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)source->state; 1474*221b1638SMasahiro Yamada 1475*221b1638SMasahiro Yamada /* allocate space */ 1476*221b1638SMasahiro Yamada copy = (struct inflate_state FAR *) 1477*221b1638SMasahiro Yamada ZALLOC(source, 1, sizeof(struct inflate_state)); 1478*221b1638SMasahiro Yamada if (copy == Z_NULL) return Z_MEM_ERROR; 1479*221b1638SMasahiro Yamada window = Z_NULL; 1480*221b1638SMasahiro Yamada if (state->window != Z_NULL) { 1481*221b1638SMasahiro Yamada window = (unsigned char FAR *) 1482*221b1638SMasahiro Yamada ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); 1483*221b1638SMasahiro Yamada if (window == Z_NULL) { 1484*221b1638SMasahiro Yamada ZFREE(source, copy); 1485*221b1638SMasahiro Yamada return Z_MEM_ERROR; 1486*221b1638SMasahiro Yamada } 1487*221b1638SMasahiro Yamada } 1488*221b1638SMasahiro Yamada 1489*221b1638SMasahiro Yamada /* copy state */ 1490*221b1638SMasahiro Yamada zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); 1491*221b1638SMasahiro Yamada zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); 1492*221b1638SMasahiro Yamada copy->strm = dest; 1493*221b1638SMasahiro Yamada if (state->lencode >= state->codes && 1494*221b1638SMasahiro Yamada state->lencode <= state->codes + ENOUGH - 1) { 1495*221b1638SMasahiro Yamada copy->lencode = copy->codes + (state->lencode - state->codes); 1496*221b1638SMasahiro Yamada copy->distcode = copy->codes + (state->distcode - state->codes); 1497*221b1638SMasahiro Yamada } 1498*221b1638SMasahiro Yamada copy->next = copy->codes + (state->next - state->codes); 1499*221b1638SMasahiro Yamada if (window != Z_NULL) { 1500*221b1638SMasahiro Yamada wsize = 1U << state->wbits; 1501*221b1638SMasahiro Yamada zmemcpy(window, state->window, wsize); 1502*221b1638SMasahiro Yamada } 1503*221b1638SMasahiro Yamada copy->window = window; 1504*221b1638SMasahiro Yamada dest->state = (struct internal_state FAR *)copy; 1505*221b1638SMasahiro Yamada return Z_OK; 1506*221b1638SMasahiro Yamada } 1507*221b1638SMasahiro Yamada 1508*221b1638SMasahiro Yamada int ZEXPORT inflateUndermine(strm, subvert) 1509*221b1638SMasahiro Yamada z_streamp strm; 1510*221b1638SMasahiro Yamada int subvert; 1511*221b1638SMasahiro Yamada { 1512*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1513*221b1638SMasahiro Yamada 1514*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 1515*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1516*221b1638SMasahiro Yamada #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR 1517*221b1638SMasahiro Yamada state->sane = !subvert; 1518*221b1638SMasahiro Yamada return Z_OK; 1519*221b1638SMasahiro Yamada #else 1520*221b1638SMasahiro Yamada (void)subvert; 1521*221b1638SMasahiro Yamada state->sane = 1; 1522*221b1638SMasahiro Yamada return Z_DATA_ERROR; 1523*221b1638SMasahiro Yamada #endif 1524*221b1638SMasahiro Yamada } 1525*221b1638SMasahiro Yamada 1526*221b1638SMasahiro Yamada int ZEXPORT inflateValidate(strm, check) 1527*221b1638SMasahiro Yamada z_streamp strm; 1528*221b1638SMasahiro Yamada int check; 1529*221b1638SMasahiro Yamada { 1530*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1531*221b1638SMasahiro Yamada 1532*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return Z_STREAM_ERROR; 1533*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1534*221b1638SMasahiro Yamada if (check) 1535*221b1638SMasahiro Yamada state->wrap |= 4; 1536*221b1638SMasahiro Yamada else 1537*221b1638SMasahiro Yamada state->wrap &= ~4; 1538*221b1638SMasahiro Yamada return Z_OK; 1539*221b1638SMasahiro Yamada } 1540*221b1638SMasahiro Yamada 1541*221b1638SMasahiro Yamada long ZEXPORT inflateMark(strm) 1542*221b1638SMasahiro Yamada z_streamp strm; 1543*221b1638SMasahiro Yamada { 1544*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1545*221b1638SMasahiro Yamada 1546*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) 1547*221b1638SMasahiro Yamada return -(1L << 16); 1548*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1549*221b1638SMasahiro Yamada return (long)(((unsigned long)((long)state->back)) << 16) + 1550*221b1638SMasahiro Yamada (state->mode == COPY ? state->length : 1551*221b1638SMasahiro Yamada (state->mode == MATCH ? state->was - state->length : 0)); 1552*221b1638SMasahiro Yamada } 1553*221b1638SMasahiro Yamada 1554*221b1638SMasahiro Yamada unsigned long ZEXPORT inflateCodesUsed(strm) 1555*221b1638SMasahiro Yamada z_streamp strm; 1556*221b1638SMasahiro Yamada { 1557*221b1638SMasahiro Yamada struct inflate_state FAR *state; 1558*221b1638SMasahiro Yamada if (inflateStateCheck(strm)) return (unsigned long)-1; 1559*221b1638SMasahiro Yamada state = (struct inflate_state FAR *)strm->state; 1560*221b1638SMasahiro Yamada return (unsigned long)(state->next - state->codes); 1561*221b1638SMasahiro Yamada } 1562