infblock.c

Go to the documentation of this file.
00001 /* infblock.c -- interpret and process block types to last block
00002  * Copyright (C) 1995-2002 Mark Adler
00003  * For conditions of distribution and use, see copyright notice in zlib.h
00004  */
00005 
00006 #include "zutil.h"
00007 #include "infblock.h"
00008 #include "inftrees.h"
00009 #include "infcodes.h"
00010 #include "infutil.h"
00011 
00012 
00013 /* simplify the use of the inflate_huft type with some defines */
00014 #define exop word.what.Exop
00015 #define bits word.what.Bits
00016 
00017 /* Table for deflate from PKZIP's appnote.txt. */
00018 local const uInt border[] = { /* Order of the bit length code lengths */
00019         16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
00020 
00021 /*
00022    Notes beyond the 1.93a appnote.txt:
00023 
00024    1. Distance pointers never point before the beginning of the output
00025       stream.
00026    2. Distance pointers can point back across blocks, up to 32k away.
00027    3. There is an implied maximum of 7 bits for the bit length table and
00028       15 bits for the actual data.
00029    4. If only one code exists, then it is encoded using one bit.  (Zero
00030       would be more efficient, but perhaps a little confusing.)  If two
00031       codes exist, they are coded using one bit each (0 and 1).
00032    5. There is no way of sending zero distance codes--a dummy must be
00033       sent if there are none.  (History: a pre 2.0 version of PKZIP would
00034       store blocks with no distance codes, but this was discovered to be
00035       too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
00036       zero distance codes, which is sent as one code of zero bits in
00037       length.
00038    6. There are up to 286 literal/length codes.  Code 256 represents the
00039       end-of-block.  Note however that the static length tree defines
00040       288 codes just to fill out the Huffman codes.  Codes 286 and 287
00041       cannot be used though, since there is no length base or extra bits
00042       defined for them.  Similarily, there are up to 30 distance codes.
00043       However, static trees define 32 codes (all 5 bits) to fill out the
00044       Huffman codes, but the last two had better not show up in the data.
00045    7. Unzip can check dynamic Huffman blocks for complete code sets.
00046       The exception is that a single code would not be complete (see #4).
00047    8. The five bits following the block type is really the number of
00048       literal codes sent minus 257.
00049    9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
00050       (1+6+6).  Therefore, to output three times the length, you output
00051       three codes (1+1+1), whereas to output four times the same length,
00052       you only need two codes (1+3).  Hmm.
00053   10. In the tree reconstruction algorithm, Code = Code + Increment
00054       only if BitLength(i) is not zero.  (Pretty obvious.)
00055   11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
00056   12. Note: length code 284 can represent 227-258, but length code 285
00057       really is 258.  The last length deserves its own, short code
00058       since it gets used a lot in very redundant files.  The length
00059       258 is special since 258 - 3 (the min match length) is 255.
00060   13. The literal/length and distance code bit lengths are read as a
00061       single stream of lengths.  It is possible (and advantageous) for
00062       a repeat code (16, 17, or 18) to go across the boundary between
00063       the two sets of lengths.
00064  */
00065 
00066 
00067 local void inflate_blocks_reset( /* s, z, c) */
00068 inflate_blocks_statef *s,
00069 z_streamp z,
00070 uLongf *c )
00071 {
00072   if (c != Z_NULL)
00073     *c = s->check;
00074   if (s->mode == BTREE || s->mode == DTREE)
00075     ZFREE(z, s->sub.trees.blens);
00076   if (s->mode == CODES)
00077     inflate_codes_free(s->sub.decode.codes, z);
00078   s->mode = TYPE;
00079   s->bitk = 0;
00080   s->bitb = 0;
00081   s->read = s->write = s->window;
00082   if (s->checkfn != Z_NULL)
00083     z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
00084   Tracev((stderr, "inflate:   blocks reset\n"));
00085 }
00086 
00087 
00088 local inflate_blocks_statef *inflate_blocks_new( /* z, c, w) */
00089 z_streamp z,
00090 check_func c,
00091 uInt w )
00092 {
00093   inflate_blocks_statef *s;
00094 
00095   if ((s = (inflate_blocks_statef *)ZALLOC
00096        (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
00097     return s;
00098   if ((s->hufts =
00099        (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
00100   {
00101     ZFREE(z, s);
00102     return Z_NULL;
00103   }
00104   if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
00105   {
00106     ZFREE(z, s->hufts);
00107     ZFREE(z, s);
00108     return Z_NULL;
00109   }
00110   s->end = s->window + w;
00111   s->checkfn = c;
00112   s->mode = TYPE;
00113   Tracev((stderr, "inflate:   blocks allocated\n"));
00114   inflate_blocks_reset(s, z, Z_NULL);
00115   return s;
00116 }
00117 
00118 
00119 local int inflate_blocks( /* s, z, r) */
00120 inflate_blocks_statef *s,
00121 z_streamp z,
00122 int r )
00123 {
00124   uInt t;               /* temporary storage */
00125   uLong b;              /* bit buffer */
00126   uInt k;               /* bits in bit buffer */
00127   Bytef *p;             /* input data pointer */
00128   uInt n;               /* bytes available there */
00129   Bytef *q;             /* output window write pointer */
00130   uInt m;               /* bytes to end of window or read pointer */
00131 
00132   /* copy input/output information to locals (UPDATE macro restores) */
00133   LOAD
00134 
00135   /* process input based on current state */
00136   while (1) switch (s->mode)
00137   {
00138     case TYPE:
00139       NEEDBITS(3)
00140       t = (uInt)b & 7;
00141       s->last = t & 1;
00142       switch (t >> 1)
00143       {
00144         case 0:                         /* stored */
00145           Tracev((stderr, "inflate:     stored block%s\n",
00146                  s->last ? " (last)" : ""));
00147           DUMPBITS(3)
00148           t = k & 7;                    /* go to byte boundary */
00149           DUMPBITS(t)
00150           s->mode = LENS;               /* get length of stored block */
00151           break;
00152         case 1:                         /* fixed */
00153           Tracev((stderr, "inflate:     fixed codes block%s\n",
00154                  s->last ? " (last)" : ""));
00155           {
00156             uInt bl, bd;
00157             inflate_huft *tl, *td;
00158 
00159             inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl,
00160                                           (const inflate_huft**)&td, z);
00161             s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
00162             if (s->sub.decode.codes == Z_NULL)
00163             {
00164               r = Z_MEM_ERROR;
00165               LEAVE
00166             }
00167           }
00168           DUMPBITS(3)
00169           s->mode = CODES;
00170           break;
00171         case 2:                         /* dynamic */
00172           Tracev((stderr, "inflate:     dynamic codes block%s\n",
00173                  s->last ? " (last)" : ""));
00174           DUMPBITS(3)
00175           s->mode = TABLE;
00176           break;
00177         case 3:                         /* illegal */
00178           DUMPBITS(3)
00179           s->mode = BAD;
00180           z->msg = (char*)"invalid block type";
00181           r = Z_DATA_ERROR;
00182           LEAVE
00183       }
00184       break;
00185     case LENS:
00186       NEEDBITS(32)
00187       if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
00188       {
00189         s->mode = BAD;
00190         z->msg = (char*)"invalid stored block lengths";
00191         r = Z_DATA_ERROR;
00192         LEAVE
00193       }
00194       s->sub.left = (uInt)b & 0xffff;
00195       b = k = 0;                      /* dump bits */
00196       Tracev((stderr, "inflate:       stored length %u\n", s->sub.left));
00197       s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
00198       break;
00199     case STORED:
00200       if (n == 0)
00201         LEAVE
00202       NEEDOUT
00203       t = s->sub.left;
00204       if (t > n) t = n;
00205       if (t > m) t = m;
00206       zmemcpy(q, p, t);
00207       p += t;  n -= t;
00208       q += t;  m -= t;
00209       if ((s->sub.left -= t) != 0)
00210         break;
00211       Tracev((stderr, "inflate:       stored end, %lu total out\n",
00212               z->total_out + (q >= s->read ? q - s->read :
00213               (s->end - s->read) + (q - s->window))));
00214       s->mode = s->last ? DRY : TYPE;
00215       break;
00216     case TABLE:
00217       NEEDBITS(14)
00218       s->sub.trees.table = t = (uInt)b & 0x3fff;
00219 #ifndef PKZIP_BUG_WORKAROUND
00220       if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
00221       {
00222         s->mode = BAD;
00223         z->msg = (char*)"too many length or distance symbols";
00224         r = Z_DATA_ERROR;
00225         LEAVE
00226       }
00227 #endif
00228       t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
00229       if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
00230       {
00231         r = Z_MEM_ERROR;
00232         LEAVE
00233       }
00234       DUMPBITS(14)
00235       s->sub.trees.index = 0;
00236       Tracev((stderr, "inflate:       table sizes ok\n"));
00237       s->mode = BTREE;
00238     case BTREE:
00239       while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
00240       {
00241         NEEDBITS(3)
00242         s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
00243         DUMPBITS(3)
00244       }
00245       while (s->sub.trees.index < 19)
00246         s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
00247       s->sub.trees.bb = 7;
00248       t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
00249                              &s->sub.trees.tb, s->hufts, z);
00250       if (t != Z_OK)
00251       {
00252         r = t;
00253         if (r == Z_DATA_ERROR)
00254         {
00255           ZFREE(z, s->sub.trees.blens);
00256           s->mode = BAD;
00257         }
00258         LEAVE
00259       }
00260       s->sub.trees.index = 0;
00261       Tracev((stderr, "inflate:       bits tree ok\n"));
00262       s->mode = DTREE;
00263     case DTREE:
00264       while (t = s->sub.trees.table,
00265              s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
00266       {
00267         inflate_huft *h;
00268         uInt i, j, c;
00269 
00270         t = s->sub.trees.bb;
00271         NEEDBITS(t)
00272         h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
00273         t = h->bits;
00274         c = h->base;
00275         if (c < 16)
00276         {
00277           DUMPBITS(t)
00278           s->sub.trees.blens[s->sub.trees.index++] = c;
00279         }
00280         else /* c == 16..18 */
00281         {
00282           i = c == 18 ? 7 : c - 14;
00283           j = c == 18 ? 11 : 3;
00284           NEEDBITS(t + i)
00285           DUMPBITS(t)
00286           j += (uInt)b & inflate_mask[i];
00287           DUMPBITS(i)
00288           i = s->sub.trees.index;
00289           t = s->sub.trees.table;
00290           if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
00291               (c == 16 && i < 1))
00292           {
00293             ZFREE(z, s->sub.trees.blens);
00294             s->mode = BAD;
00295             z->msg = (char*)"invalid bit length repeat";
00296             r = Z_DATA_ERROR;
00297             LEAVE
00298           }
00299           c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
00300           do {
00301             s->sub.trees.blens[i++] = c;
00302           } while (--j);
00303           s->sub.trees.index = i;
00304         }
00305       }
00306       s->sub.trees.tb = Z_NULL;
00307       {
00308         uInt bl, bd;
00309         inflate_huft *tl, *td;
00310         inflate_codes_statef *c;
00311 
00312         bl = 9;         /* must be <= 9 for lookahead assumptions */
00313         bd = 6;         /* must be <= 9 for lookahead assumptions */
00314         t = s->sub.trees.table;
00315         t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
00316                                   s->sub.trees.blens, &bl, &bd, &tl, &td,
00317                                   s->hufts, z);
00318         if (t != Z_OK)
00319         {
00320           if (t == (uInt)Z_DATA_ERROR)
00321           {
00322             ZFREE(z, s->sub.trees.blens);
00323             s->mode = BAD;
00324           }
00325           r = t;
00326           LEAVE
00327         }
00328         Tracev((stderr, "inflate:       trees ok\n"));
00329         if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
00330         {
00331           r = Z_MEM_ERROR;
00332           LEAVE
00333         }
00334         s->sub.decode.codes = c;
00335       }
00336       ZFREE(z, s->sub.trees.blens);
00337       s->mode = CODES;
00338     case CODES:
00339       UPDATE
00340       if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
00341         return inflate_flush(s, z, r);
00342       r = Z_OK;
00343       inflate_codes_free(s->sub.decode.codes, z);
00344       LOAD
00345       Tracev((stderr, "inflate:       codes end, %lu total out\n",
00346               z->total_out + (q >= s->read ? q - s->read :
00347               (s->end - s->read) + (q - s->window))));
00348       if (!s->last)
00349       {
00350         s->mode = TYPE;
00351         break;
00352       }
00353       s->mode = DRY;
00354     case DRY:
00355       FLUSH
00356       if (s->read != s->write)
00357         LEAVE
00358       s->mode = DONE;
00359     case DONE:
00360       r = Z_STREAM_END;
00361       LEAVE
00362     case BAD:
00363       r = Z_DATA_ERROR;
00364       LEAVE
00365     default:
00366       r = Z_STREAM_ERROR;
00367       LEAVE
00368   }
00369 #ifdef NEED_DUMMY_RETURN
00370   return 0;
00371 #endif
00372 }
00373 
00374 
00375 local int inflate_blocks_free( /* s, z) */
00376 inflate_blocks_statef *s,
00377 z_streamp z )
00378 {
00379   inflate_blocks_reset(s, z, Z_NULL);
00380   ZFREE(z, s->window);
00381   ZFREE(z, s->hufts);
00382   ZFREE(z, s);
00383   Tracev((stderr, "inflate:   blocks freed\n"));
00384   return Z_OK;
00385 }
00386 
00387 

Generated on Tue Jul 5 14:13:47 2011 for ROOT_528-00b_version by  doxygen 1.5.1