Annotation of coherent/b/bin/unzip/explode.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.