|
|
1.1 ! root 1: /* explode.c -- Not copyrighted 1992 by Mark Adler ! 2: version c7, 27 June 1992 */ ! 3: ! 4: ! 5: /* You can do whatever you like with this source file, though I would ! 6: prefer that if you modify it and redistribute it that you include ! 7: comments to that effect with your name and the date. Thank you. ! 8: ! 9: History: ! 10: vers date who what ! 11: ---- --------- -------------- ------------------------------------ ! 12: c1 30 Mar 92 M. Adler explode that uses huft_build from inflate ! 13: (this gives over a 70% speed improvement ! 14: over the original unimplode.c, which ! 15: decoded a bit at a time) ! 16: c2 4 Apr 92 M. Adler fixed bug for file sizes a multiple of 32k. ! 17: c3 10 Apr 92 M. Adler added a little memory tracking if DEBUG ! 18: c4 11 Apr 92 M. Adler added NOMEMCPY do kill use of memcpy() ! 19: c5 21 Apr 92 M. Adler added the WSIZE #define to allow reducing ! 20: the 32K window size for specialized ! 21: applications. ! 22: c6 31 May 92 M. Adler added typecasts to eliminate some warnings ! 23: c7 27 Jun 92 G. Roelofs added more typecasts ! 24: */ ! 25: ! 26: ! 27: /* ! 28: Explode imploded (PKZIP method 6 compressed) data. This compression ! 29: method searches for as much of the current string of bytes (up to a length ! 30: of ~320) in the previous 4K or 8K bytes. If it doesn't find any matches ! 31: (of at least length 2 or 3), it codes the next byte. Otherwise, it codes ! 32: the length of the matched string and its distance backwards from the ! 33: current position. Single bytes ("literals") are preceded by a one (a ! 34: single bit) and are either uncoded (the eight bits go directly into the ! 35: compressed stream for a total of nine bits) or Huffman coded with a ! 36: supplied literal code tree. If literals are coded, then the minimum match ! 37: length is three, otherwise it is two. ! 38: ! 39: There are therefore four kinds of imploded streams: 8K search with coded ! 40: literals (min match = 3), 4K search with coded literals (min match = 3), ! 41: 8K with uncoded literals (min match = 2), and 4K with uncoded literals ! 42: (min match = 2). The kind of stream is identified in two bits of a ! 43: general purpose bit flag that is outside of the compressed stream. ! 44: ! 45: Distance-length pairs are always coded. Distance-length pairs for matched ! 46: strings are preceded by a zero bit (to distinguish them from literals) and ! 47: are always coded. The distance comes first and is either the low six (4K) ! 48: or low seven (8K) bits of the distance (uncoded), followed by the high six ! 49: bits of the distance coded. Then the length is six bits coded (0..63 + ! 50: min match length), and if the maximum such length is coded, then it's ! 51: followed by another eight bits (uncoded) to be added to the coded length. ! 52: This gives a match length range of 2..320 or 3..321 bytes. ! 53: ! 54: The literal, length, and distance codes are all represented in a slightly ! 55: compressed form themselves. What is sent are the lengths of the codes for ! 56: each value, which is sufficient to construct the codes. Each byte of the ! 57: code representation is the code length (the low four bits representing ! 58: 1..16), and the number of values sequentially with that length (the high ! 59: four bits also representing 1..16). There are 256 literal code values (if ! 60: literals are coded), 64 length code values, and 64 distance code values, ! 61: in that order at the beginning of the compressed stream. Each set of code ! 62: values is preceded (redundantly) with a byte indicating how many bytes are ! 63: in the code description that follows, in the range 1..256. ! 64: ! 65: The codes themselves are decoded using tables made by huft_build() from ! 66: the bit lengths. That routine and its comments are in the inflate.c ! 67: module. ! 68: */ ! 69: ! 70: #include "unzip.h" /* this must supply the slide[] (byte) array */ ! 71: ! 72: #ifndef WSIZE ! 73: # define WSIZE 0x8000 /* window size--must be a power of two, and at least ! 74: 8K for zip's implode method */ ! 75: #endif /* !WSIZE */ ! 76: ! 77: ! 78: struct huft { ! 79: byte e; /* number of extra bits or operation */ ! 80: byte b; /* number of bits in this code or subcode */ ! 81: union { ! 82: UWORD n; /* literal, length base, or distance base */ ! 83: struct huft *t; /* pointer to next level of table */ ! 84: } v; ! 85: }; ! 86: ! 87: /* Function prototypes */ ! 88: /* routines from inflate.c */ ! 89: extern unsigned hufts; ! 90: int huft_build OF((unsigned *, unsigned, unsigned, UWORD *, UWORD *, ! 91: struct huft **, int *)); ! 92: int huft_free OF((struct huft *)); ! 93: void flush OF((unsigned)); ! 94: ! 95: /* routines here */ ! 96: int get_tree OF((unsigned *, unsigned)); ! 97: int explode_lit8 OF((struct huft *, struct huft *, struct huft *, ! 98: int, int, int)); ! 99: int explode_lit4 OF((struct huft *, struct huft *, struct huft *, ! 100: int, int, int)); ! 101: int explode_nolit8 OF((struct huft *, struct huft *, int, int)); ! 102: int explode_nolit4 OF((struct huft *, struct huft *, int, int)); ! 103: int explode OF((void)); ! 104: ! 105: ! 106: /* The implode algorithm uses a sliding 4K or 8K byte window on the ! 107: uncompressed stream to find repeated byte strings. This is implemented ! 108: here as a circular buffer. The index is updated simply by incrementing ! 109: and then and'ing with 0x0fff (4K-1) or 0x1fff (8K-1). Here, the 32K ! 110: buffer of inflate is used, and it works just as well to always have ! 111: a 32K circular buffer, so the index is anded with 0x7fff. This is ! 112: done to allow the window to also be used as the output buffer. */ ! 113: /* This must be supplied in an external module useable like "byte slide[8192];" ! 114: or "byte *slide;", where the latter would be malloc'ed. In unzip, slide[] ! 115: is actually a 32K area for use by inflate, which uses a 32K sliding window. ! 116: */ ! 117: ! 118: ! 119: /* Tables for length and distance */ ! 120: UWORD cplen2[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ! 121: 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ! 122: 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, ! 123: 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65}; ! 124: UWORD cplen3[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ! 125: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ! 126: 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, ! 127: 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66}; ! 128: UWORD extra[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 129: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 130: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 131: 8}; ! 132: UWORD cpdist4[] = {1, 65, 129, 193, 257, 321, 385, 449, 513, 577, 641, 705, ! 133: 769, 833, 897, 961, 1025, 1089, 1153, 1217, 1281, 1345, 1409, 1473, ! 134: 1537, 1601, 1665, 1729, 1793, 1857, 1921, 1985, 2049, 2113, 2177, ! 135: 2241, 2305, 2369, 2433, 2497, 2561, 2625, 2689, 2753, 2817, 2881, ! 136: 2945, 3009, 3073, 3137, 3201, 3265, 3329, 3393, 3457, 3521, 3585, ! 137: 3649, 3713, 3777, 3841, 3905, 3969, 4033}; ! 138: UWORD cpdist8[] = {1, 129, 257, 385, 513, 641, 769, 897, 1025, 1153, 1281, ! 139: 1409, 1537, 1665, 1793, 1921, 2049, 2177, 2305, 2433, 2561, 2689, ! 140: 2817, 2945, 3073, 3201, 3329, 3457, 3585, 3713, 3841, 3969, 4097, ! 141: 4225, 4353, 4481, 4609, 4737, 4865, 4993, 5121, 5249, 5377, 5505, ! 142: 5633, 5761, 5889, 6017, 6145, 6273, 6401, 6529, 6657, 6785, 6913, ! 143: 7041, 7169, 7297, 7425, 7553, 7681, 7809, 7937, 8065}; ! 144: ! 145: ! 146: /* Macros for inflate() bit peeking and grabbing. ! 147: The usage is: ! 148: ! 149: NEEDBITS(j) ! 150: x = b & mask_bits[j]; ! 151: DUMPBITS(j) ! 152: ! 153: where NEEDBITS makes sure that b has at least j bits in it, and ! 154: DUMPBITS removes the bits from b. The macros use the variable k ! 155: for the number of bits in b. Normally, b and k are register ! 156: variables for speed. ! 157: */ ! 158: ! 159: extern UWORD bytebuf; /* (use the one in inflate.c) */ ! 160: #define NEXTBYTE (ReadByte(&bytebuf), bytebuf) ! 161: #define NEEDBITS(n) {while(k<(n)){b|=((ULONG)NEXTBYTE)<<k;k+=8;}} ! 162: #define DUMPBITS(n) {b>>=(n);k-=(n);} ! 163: ! 164: ! 165: ! 166: int get_tree(l, n) ! 167: unsigned *l; /* bit lengths */ ! 168: unsigned n; /* number expected */ ! 169: /* Get the bit lengths for a code representation from the compressed ! 170: stream. If get_tree() returns 4, then there is an error in the data. ! 171: Otherwise zero is returned. */ ! 172: { ! 173: unsigned i; /* bytes remaining in list */ ! 174: unsigned k; /* lengths entered */ ! 175: unsigned j; /* number of codes */ ! 176: unsigned b; /* bit length for those codes */ ! 177: ! 178: ! 179: /* get bit lengths */ ! 180: ReadByte(&bytebuf); ! 181: i = bytebuf + 1; /* length/count pairs to read */ ! 182: k = 0; /* next code */ ! 183: do { ! 184: ReadByte(&bytebuf); ! 185: b = ((j = bytebuf) & 0xf) + 1; /* bits in code (1..16) */ ! 186: j = ((j & 0xf0) >> 4) + 1; /* codes with those bits (1..16) */ ! 187: if (k + j > n) ! 188: return 4; /* don't overflow l[] */ ! 189: do { ! 190: l[k++] = b; ! 191: } while (--j); ! 192: } while (--i); ! 193: return k != n ? 4 : 0; /* should have read n of them */ ! 194: } ! 195: ! 196: ! 197: ! 198: int explode_lit8(tb, tl, td, bb, bl, bd) ! 199: struct huft *tb, *tl, *td; /* literal, length, and distance tables */ ! 200: int bb, bl, bd; /* number of bits decoded by those */ ! 201: /* Decompress the imploded data using coded literals and an 8K sliding ! 202: window. */ ! 203: { ! 204: longint s; /* bytes to decompress */ ! 205: register unsigned e; /* table entry flag/number of extra bits */ ! 206: unsigned n, d; /* length and index for copy */ ! 207: unsigned w; /* current window position */ ! 208: struct huft *t; /* pointer to table entry */ ! 209: unsigned mb, ml, md; /* masks for bb, bl, and bd bits */ ! 210: register ULONG b; /* bit buffer */ ! 211: register unsigned k; /* number of bits in bit buffer */ ! 212: unsigned u; /* true if unflushed */ ! 213: ! 214: ! 215: /* explode the coded data */ ! 216: b = k = w = 0; /* initialize bit buffer, window */ ! 217: u = 1; /* buffer unflushed */ ! 218: mb = mask_bits[bb]; /* precompute masks for speed */ ! 219: ml = mask_bits[bl]; ! 220: md = mask_bits[bd]; ! 221: s = ucsize; ! 222: while (s > 0) /* do until ucsize bytes uncompressed */ ! 223: { ! 224: NEEDBITS(1) ! 225: if (b & 1) /* then literal--decode it */ ! 226: { ! 227: DUMPBITS(1) ! 228: s--; ! 229: NEEDBITS((unsigned)bb) /* get coded literal */ ! 230: if ((e = (t = tb + ((~(unsigned)b) & mb))->e) > 16) ! 231: do { ! 232: if (e == 99) ! 233: return 1; ! 234: DUMPBITS(t->b) ! 235: e -= 16; ! 236: NEEDBITS(e) ! 237: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 238: DUMPBITS(t->b) ! 239: slide[w++] = (byte)t->v.n; ! 240: if (w == WSIZE) ! 241: { ! 242: flush(w); ! 243: w = u = 0; ! 244: } ! 245: } ! 246: else /* else distance/length */ ! 247: { ! 248: DUMPBITS(1) ! 249: NEEDBITS(7) /* get distance low bits */ ! 250: d = (unsigned)b & 0x7f; ! 251: DUMPBITS(7) ! 252: NEEDBITS((unsigned)bd) /* get coded distance high bits */ ! 253: if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) ! 254: do { ! 255: if (e == 99) ! 256: return 1; ! 257: DUMPBITS(t->b) ! 258: e -= 16; ! 259: NEEDBITS(e) ! 260: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 261: DUMPBITS(t->b) ! 262: d = w - d - t->v.n; /* construct offset */ ! 263: NEEDBITS((unsigned)bl) /* get coded length */ ! 264: if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) ! 265: do { ! 266: if (e == 99) ! 267: return 1; ! 268: DUMPBITS(t->b) ! 269: e -= 16; ! 270: NEEDBITS(e) ! 271: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 272: DUMPBITS(t->b) ! 273: n = t->v.n; ! 274: if (e) /* get length extra bits */ ! 275: { ! 276: NEEDBITS(8) ! 277: n += (unsigned)b & 0xff; ! 278: DUMPBITS(8) ! 279: } ! 280: ! 281: /* do the copy */ ! 282: s -= n; ! 283: do { ! 284: n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); ! 285: if (u && w <= d) ! 286: { ! 287: memset(slide + w, 0, e); ! 288: w += e; ! 289: d += e; ! 290: } ! 291: else ! 292: #ifndef NOMEMCPY ! 293: if (w - d >= e) /* (this test assumes unsigned comparison) */ ! 294: { ! 295: memcpy(slide + w, slide + d, e); ! 296: w += e; ! 297: d += e; ! 298: } ! 299: else /* do it slow to avoid memcpy() overlap */ ! 300: #endif /* !NOMEMCPY */ ! 301: do { ! 302: slide[w++] = slide[d++]; ! 303: } while (--e); ! 304: if (w == WSIZE) ! 305: { ! 306: flush(w); ! 307: w = u = 0; ! 308: } ! 309: } while (n); ! 310: } ! 311: } ! 312: ! 313: /* flush out slide */ ! 314: flush(w); ! 315: return csize ? 5 : 0; /* should have read csize bytes */ ! 316: } ! 317: ! 318: ! 319: ! 320: int explode_lit4(tb, tl, td, bb, bl, bd) ! 321: struct huft *tb, *tl, *td; /* literal, length, and distance tables */ ! 322: int bb, bl, bd; /* number of bits decoded by those */ ! 323: /* Decompress the imploded data using coded literals and a 4K sliding ! 324: window. */ ! 325: { ! 326: longint s; /* bytes to decompress */ ! 327: register unsigned e; /* table entry flag/number of extra bits */ ! 328: unsigned n, d; /* length and index for copy */ ! 329: unsigned w; /* current window position */ ! 330: struct huft *t; /* pointer to table entry */ ! 331: unsigned mb, ml, md; /* masks for bb, bl, and bd bits */ ! 332: register ULONG b; /* bit buffer */ ! 333: register unsigned k; /* number of bits in bit buffer */ ! 334: unsigned u; /* true if unflushed */ ! 335: ! 336: ! 337: /* explode the coded data */ ! 338: b = k = w = 0; /* initialize bit buffer, window */ ! 339: u = 1; /* buffer unflushed */ ! 340: mb = mask_bits[bb]; /* precompute masks for speed */ ! 341: ml = mask_bits[bl]; ! 342: md = mask_bits[bd]; ! 343: s = ucsize; ! 344: while (s > 0) /* do until ucsize bytes uncompressed */ ! 345: { ! 346: NEEDBITS(1) ! 347: if (b & 1) /* then literal--decode it */ ! 348: { ! 349: DUMPBITS(1) ! 350: s--; ! 351: NEEDBITS((unsigned)bb) /* get coded literal */ ! 352: if ((e = (t = tb + ((~(unsigned)b) & mb))->e) > 16) ! 353: do { ! 354: if (e == 99) ! 355: return 1; ! 356: DUMPBITS(t->b) ! 357: e -= 16; ! 358: NEEDBITS(e) ! 359: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 360: DUMPBITS(t->b) ! 361: slide[w++] = (byte)t->v.n; ! 362: if (w == WSIZE) ! 363: { ! 364: flush(w); ! 365: w = u = 0; ! 366: } ! 367: } ! 368: else /* else distance/length */ ! 369: { ! 370: DUMPBITS(1) ! 371: NEEDBITS(6) /* get distance low bits */ ! 372: d = (unsigned)b & 0x3f; ! 373: DUMPBITS(6) ! 374: NEEDBITS((unsigned)bd) /* get coded distance high bits */ ! 375: if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) ! 376: do { ! 377: if (e == 99) ! 378: return 1; ! 379: DUMPBITS(t->b) ! 380: e -= 16; ! 381: NEEDBITS(e) ! 382: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 383: DUMPBITS(t->b) ! 384: d = w - d - t->v.n; /* construct offset */ ! 385: NEEDBITS((unsigned)bl) /* get coded length */ ! 386: if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) ! 387: do { ! 388: if (e == 99) ! 389: return 1; ! 390: DUMPBITS(t->b) ! 391: e -= 16; ! 392: NEEDBITS(e) ! 393: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 394: DUMPBITS(t->b) ! 395: n = t->v.n; ! 396: if (e) /* get length extra bits */ ! 397: { ! 398: NEEDBITS(8) ! 399: n += (unsigned)b & 0xff; ! 400: DUMPBITS(8) ! 401: } ! 402: ! 403: /* do the copy */ ! 404: s -= n; ! 405: do { ! 406: n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); ! 407: if (u && w <= d) ! 408: { ! 409: memset(slide + w, 0, e); ! 410: w += e; ! 411: d += e; ! 412: } ! 413: else ! 414: #ifndef NOMEMCPY ! 415: if (w - d >= e) /* (this test assumes unsigned comparison) */ ! 416: { ! 417: memcpy(slide + w, slide + d, e); ! 418: w += e; ! 419: d += e; ! 420: } ! 421: else /* do it slow to avoid memcpy() overlap */ ! 422: #endif /* !NOMEMCPY */ ! 423: do { ! 424: slide[w++] = slide[d++]; ! 425: } while (--e); ! 426: if (w == WSIZE) ! 427: { ! 428: flush(w); ! 429: w = u = 0; ! 430: } ! 431: } while (n); ! 432: } ! 433: } ! 434: ! 435: /* flush out slide */ ! 436: flush(w); ! 437: return csize ? 5 : 0; /* should have read csize bytes */ ! 438: } ! 439: ! 440: ! 441: ! 442: int explode_nolit8(tl, td, bl, bd) ! 443: struct huft *tl, *td; /* length and distance decoder tables */ ! 444: int bl, bd; /* number of bits decoded by tl[] and td[] */ ! 445: /* Decompress the imploded data using uncoded literals and an 8K sliding ! 446: window. */ ! 447: { ! 448: longint s; /* bytes to decompress */ ! 449: register unsigned e; /* table entry flag/number of extra bits */ ! 450: unsigned n, d; /* length and index for copy */ ! 451: unsigned w; /* current window position */ ! 452: struct huft *t; /* pointer to table entry */ ! 453: unsigned ml, md; /* masks for bl and bd bits */ ! 454: register ULONG b; /* bit buffer */ ! 455: register unsigned k; /* number of bits in bit buffer */ ! 456: unsigned u; /* true if unflushed */ ! 457: ! 458: ! 459: /* explode the coded data */ ! 460: b = k = w = 0; /* initialize bit buffer, window */ ! 461: u = 1; /* buffer unflushed */ ! 462: ml = mask_bits[bl]; /* precompute masks for speed */ ! 463: md = mask_bits[bd]; ! 464: s = ucsize; ! 465: while (s > 0) /* do until ucsize bytes uncompressed */ ! 466: { ! 467: NEEDBITS(1) ! 468: if (b & 1) /* then literal--get eight bits */ ! 469: { ! 470: DUMPBITS(1) ! 471: s--; ! 472: NEEDBITS(8) ! 473: slide[w++] = (byte)b; ! 474: if (w == WSIZE) ! 475: { ! 476: flush(w); ! 477: w = u = 0; ! 478: } ! 479: DUMPBITS(8) ! 480: } ! 481: else /* else distance/length */ ! 482: { ! 483: DUMPBITS(1) ! 484: NEEDBITS(7) /* get distance low bits */ ! 485: d = (unsigned)b & 0x7f; ! 486: DUMPBITS(7) ! 487: NEEDBITS((unsigned)bd) /* get coded distance high bits */ ! 488: if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) ! 489: do { ! 490: if (e == 99) ! 491: return 1; ! 492: DUMPBITS(t->b) ! 493: e -= 16; ! 494: NEEDBITS(e) ! 495: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 496: DUMPBITS(t->b) ! 497: d = w - d - t->v.n; /* construct offset */ ! 498: NEEDBITS((unsigned)bl) /* get coded length */ ! 499: if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) ! 500: do { ! 501: if (e == 99) ! 502: return 1; ! 503: DUMPBITS(t->b) ! 504: e -= 16; ! 505: NEEDBITS(e) ! 506: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 507: DUMPBITS(t->b) ! 508: n = t->v.n; ! 509: if (e) /* get length extra bits */ ! 510: { ! 511: NEEDBITS(8) ! 512: n += (unsigned)b & 0xff; ! 513: DUMPBITS(8) ! 514: } ! 515: ! 516: /* do the copy */ ! 517: s -= n; ! 518: do { ! 519: n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); ! 520: if (u && w <= d) ! 521: { ! 522: memset(slide + w, 0, e); ! 523: w += e; ! 524: d += e; ! 525: } ! 526: else ! 527: #ifndef NOMEMCPY ! 528: if (w - d >= e) /* (this test assumes unsigned comparison) */ ! 529: { ! 530: memcpy(slide + w, slide + d, e); ! 531: w += e; ! 532: d += e; ! 533: } ! 534: else /* do it slow to avoid memcpy() overlap */ ! 535: #endif /* !NOMEMCPY */ ! 536: do { ! 537: slide[w++] = slide[d++]; ! 538: } while (--e); ! 539: if (w == WSIZE) ! 540: { ! 541: flush(w); ! 542: w = u = 0; ! 543: } ! 544: } while (n); ! 545: } ! 546: } ! 547: ! 548: /* flush out slide */ ! 549: flush(w); ! 550: return csize ? 5 : 0; /* should have read csize bytes */ ! 551: } ! 552: ! 553: ! 554: ! 555: int explode_nolit4(tl, td, bl, bd) ! 556: struct huft *tl, *td; /* length and distance decoder tables */ ! 557: int bl, bd; /* number of bits decoded by tl[] and td[] */ ! 558: /* Decompress the imploded data using uncoded literals and a 4K sliding ! 559: window. */ ! 560: { ! 561: longint s; /* bytes to decompress */ ! 562: register unsigned e; /* table entry flag/number of extra bits */ ! 563: unsigned n, d; /* length and index for copy */ ! 564: unsigned w; /* current window position */ ! 565: struct huft *t; /* pointer to table entry */ ! 566: unsigned ml, md; /* masks for bl and bd bits */ ! 567: register ULONG b; /* bit buffer */ ! 568: register unsigned k; /* number of bits in bit buffer */ ! 569: unsigned u; /* true if unflushed */ ! 570: ! 571: ! 572: /* explode the coded data */ ! 573: b = k = w = 0; /* initialize bit buffer, window */ ! 574: u = 1; /* buffer unflushed */ ! 575: ml = mask_bits[bl]; /* precompute masks for speed */ ! 576: md = mask_bits[bd]; ! 577: s = ucsize; ! 578: while (s > 0) /* do until ucsize bytes uncompressed */ ! 579: { ! 580: NEEDBITS(1) ! 581: if (b & 1) /* then literal--get eight bits */ ! 582: { ! 583: DUMPBITS(1) ! 584: s--; ! 585: NEEDBITS(8) ! 586: slide[w++] = (byte)b; ! 587: if (w == WSIZE) ! 588: { ! 589: flush(w); ! 590: w = u = 0; ! 591: } ! 592: DUMPBITS(8) ! 593: } ! 594: else /* else distance/length */ ! 595: { ! 596: DUMPBITS(1) ! 597: NEEDBITS(6) /* get distance low bits */ ! 598: d = (unsigned)b & 0x3f; ! 599: DUMPBITS(6) ! 600: NEEDBITS((unsigned)bd) /* get coded distance high bits */ ! 601: if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) ! 602: do { ! 603: if (e == 99) ! 604: return 1; ! 605: DUMPBITS(t->b) ! 606: e -= 16; ! 607: NEEDBITS(e) ! 608: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 609: DUMPBITS(t->b) ! 610: d = w - d - t->v.n; /* construct offset */ ! 611: NEEDBITS((unsigned)bl) /* get coded length */ ! 612: if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) ! 613: do { ! 614: if (e == 99) ! 615: return 1; ! 616: DUMPBITS(t->b) ! 617: e -= 16; ! 618: NEEDBITS(e) ! 619: } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); ! 620: DUMPBITS(t->b) ! 621: n = t->v.n; ! 622: if (e) /* get length extra bits */ ! 623: { ! 624: NEEDBITS(8) ! 625: n += (unsigned)b & 0xff; ! 626: DUMPBITS(8) ! 627: } ! 628: ! 629: /* do the copy */ ! 630: s -= n; ! 631: do { ! 632: n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); ! 633: if (u && w <= d) ! 634: { ! 635: memset(slide + w, 0, e); ! 636: w += e; ! 637: d += e; ! 638: } ! 639: else ! 640: #ifndef NOMEMCPY ! 641: if (w - d >= e) /* (this test assumes unsigned comparison) */ ! 642: { ! 643: memcpy(slide + w, slide + d, e); ! 644: w += e; ! 645: d += e; ! 646: } ! 647: else /* do it slow to avoid memcpy() overlap */ ! 648: #endif /* !NOMEMCPY */ ! 649: do { ! 650: slide[w++] = slide[d++]; ! 651: } while (--e); ! 652: if (w == WSIZE) ! 653: { ! 654: flush(w); ! 655: w = u = 0; ! 656: } ! 657: } while (n); ! 658: } ! 659: } ! 660: ! 661: /* flush out slide */ ! 662: flush(w); ! 663: return csize ? 5 : 0; /* should have read csize bytes */ ! 664: } ! 665: ! 666: ! 667: ! 668: int explode() ! 669: /* Explode an imploded compressed stream. Based on the general purpose ! 670: bit flag, decide on coded or uncoded literals, and an 8K or 4K sliding ! 671: window. Construct the literal (if any), length, and distance codes and ! 672: the tables needed to decode them (using huft_build() from inflate.c), ! 673: and call the appropriate routine for the type of data in the remainder ! 674: of the stream. The four routines are nearly identical, differing only ! 675: in whether the literal is decoded or simply read in, and in how many ! 676: bits are read in, uncoded, for the low distance bits. */ ! 677: { ! 678: unsigned r; /* return codes */ ! 679: struct huft *tb; /* literal code table */ ! 680: struct huft *tl; /* length code table */ ! 681: struct huft *td; /* distance code table */ ! 682: int bb; /* bits for tb */ ! 683: int bl; /* bits for tl */ ! 684: int bd; /* bits for td */ ! 685: unsigned l[256]; /* bit lengths for codes */ ! 686: ! 687: ! 688: /* Tune base table sizes. Note: I thought that to truly optimize speed, ! 689: I would have to select different bl, bd, and bb values for different ! 690: compressed file sizes. I was suprised to find out the the values of ! 691: 7, 7, and 9 worked best over a very wide range of sizes, except that ! 692: bd = 8 worked marginally better for large compressed sizes. */ ! 693: bl = 7; ! 694: bd = csize > 200000L ? 8 : 7; ! 695: ! 696: ! 697: /* With literal tree--minimum match length is 3 */ ! 698: hufts = 0; /* initialze huft's malloc'ed */ ! 699: if (lrec.general_purpose_bit_flag & 4) ! 700: { ! 701: bb = 9; /* base table size for literals */ ! 702: if ((r = get_tree(l, 256)) != 0) ! 703: return r; ! 704: if ((r = huft_build(l, 256, 256, NULL, NULL, &tb, &bb)) != 0) ! 705: { ! 706: if (r == 1) ! 707: huft_free(tb); ! 708: return r; ! 709: } ! 710: if ((r = get_tree(l, 64)) != 0) ! 711: return r; ! 712: if ((r = huft_build(l, 64, 0, cplen3, extra, &tl, &bl)) != 0) ! 713: { ! 714: if (r == 1) ! 715: huft_free(tl); ! 716: huft_free(tb); ! 717: return r; ! 718: } ! 719: if ((r = get_tree(l, 64)) != 0) ! 720: return r; ! 721: if (lrec.general_purpose_bit_flag & 2) /* true if 8K */ ! 722: { ! 723: if ((r = huft_build(l, 64, 0, cpdist8, extra, &td, &bd)) != 0) ! 724: { ! 725: if (r == 1) ! 726: huft_free(td); ! 727: huft_free(tl); ! 728: huft_free(tb); ! 729: return r; ! 730: } ! 731: r = explode_lit8(tb, tl, td, bb, bl, bd); ! 732: } ! 733: else /* else 4K */ ! 734: { ! 735: if ((r = huft_build(l, 64, 0, cpdist4, extra, &td, &bd)) != 0) ! 736: { ! 737: if (r == 1) ! 738: huft_free(td); ! 739: huft_free(tl); ! 740: huft_free(tb); ! 741: return r; ! 742: } ! 743: r = explode_lit4(tb, tl, td, bb, bl, bd); ! 744: } ! 745: huft_free(td); ! 746: huft_free(tl); ! 747: huft_free(tb); ! 748: } ! 749: else ! 750: ! 751: ! 752: /* No literal tree--minimum match length is 2 */ ! 753: { ! 754: if ((r = get_tree(l, 64)) != 0) ! 755: return r; ! 756: if ((r = huft_build(l, 64, 0, cplen2, extra, &tl, &bl)) != 0) ! 757: { ! 758: if (r == 1) ! 759: huft_free(tl); ! 760: return r; ! 761: } ! 762: if ((r = get_tree(l, 64)) != 0) ! 763: return r; ! 764: if (lrec.general_purpose_bit_flag & 2) /* true if 8K */ ! 765: { ! 766: if ((r = huft_build(l, 64, 0, cpdist8, extra, &td, &bd)) != 0) ! 767: { ! 768: if (r == 1) ! 769: huft_free(td); ! 770: huft_free(tl); ! 771: return r; ! 772: } ! 773: r = explode_nolit8(tl, td, bl, bd); ! 774: } ! 775: else /* else 4K */ ! 776: { ! 777: if ((r = huft_build(l, 64, 0, cpdist4, extra, &td, &bd)) != 0) ! 778: { ! 779: if (r == 1) ! 780: huft_free(td); ! 781: huft_free(tl); ! 782: return r; ! 783: } ! 784: r = explode_nolit4(tl, td, bl, bd); ! 785: } ! 786: huft_free(td); ! 787: huft_free(tl); ! 788: } ! 789: #ifdef DEBUG ! 790: fprintf(stderr, "<%u > ", hufts); ! 791: #endif /* DEBUG */ ! 792: return r; ! 793: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.