| /* infutil.h -- types and macros common to blocks and codes | 
 |  * Copyright (C) 1995-1998 Mark Adler | 
 |  * For conditions of distribution and use, see copyright notice in zlib.h  | 
 |  */ | 
 |  | 
 | /* WARNING: this file should *not* be used by applications. It is | 
 |    part of the implementation of the compression library and is | 
 |    subject to change. Applications should only use zlib.h. | 
 |  */ | 
 |  | 
 | #ifndef _INFUTIL_H | 
 | #define _INFUTIL_H | 
 |  | 
 | #include <linux/zconf.h> | 
 | #include "inftrees.h" | 
 | #include "infcodes.h" | 
 |  | 
 | typedef enum { | 
 |       TYPE,     /* get type bits (3, including end bit) */ | 
 |       LENS,     /* get lengths for stored */ | 
 |       STORED,   /* processing stored block */ | 
 |       TABLE,    /* get table lengths */ | 
 |       BTREE,    /* get bit lengths tree for a dynamic block */ | 
 |       DTREE,    /* get length, distance trees for a dynamic block */ | 
 |       CODES,    /* processing fixed or dynamic block */ | 
 |       DRY,      /* output remaining window bytes */ | 
 |       B_DONE,   /* finished last block, done */ | 
 |       B_BAD}    /* got a data error--stuck here */ | 
 | inflate_block_mode; | 
 |  | 
 | /* inflate blocks semi-private state */ | 
 | struct inflate_blocks_state { | 
 |  | 
 |   /* mode */ | 
 |   inflate_block_mode  mode;     /* current inflate_block mode */ | 
 |  | 
 |   /* mode dependent information */ | 
 |   union { | 
 |     uInt left;          /* if STORED, bytes left to copy */ | 
 |     struct { | 
 |       uInt table;               /* table lengths (14 bits) */ | 
 |       uInt index;               /* index into blens (or border) */ | 
 |       uInt *blens;              /* bit lengths of codes */ | 
 |       uInt bb;                  /* bit length tree depth */ | 
 |       inflate_huft *tb;         /* bit length decoding tree */ | 
 |     } trees;            /* if DTREE, decoding info for trees */ | 
 |     struct { | 
 |       inflate_codes_statef  | 
 |          *codes; | 
 |     } decode;           /* if CODES, current state */ | 
 |   } sub;                /* submode */ | 
 |   uInt last;            /* true if this block is the last block */ | 
 |  | 
 |   /* mode independent information */ | 
 |   uInt bitk;            /* bits in bit buffer */ | 
 |   uLong bitb;           /* bit buffer */ | 
 |   inflate_huft *hufts;  /* single malloc for tree space */ | 
 |   Byte *window;         /* sliding window */ | 
 |   Byte *end;            /* one byte after sliding window */ | 
 |   Byte *read;           /* window read pointer */ | 
 |   Byte *write;          /* window write pointer */ | 
 |   check_func checkfn;   /* check function */ | 
 |   uLong check;          /* check on output */ | 
 |  | 
 | }; | 
 |  | 
 |  | 
 | /* defines for inflate input/output */ | 
 | /*   update pointers and return */ | 
 | #define UPDBITS {s->bitb=b;s->bitk=k;} | 
 | #define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} | 
 | #define UPDOUT {s->write=q;} | 
 | #define UPDATE {UPDBITS UPDIN UPDOUT} | 
 | #define LEAVE {UPDATE return zlib_inflate_flush(s,z,r);} | 
 | /*   get bytes and bits */ | 
 | #define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} | 
 | #define NEEDBYTE {if(n)r=Z_OK;else LEAVE} | 
 | #define NEXTBYTE (n--,*p++) | 
 | #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} | 
 | #define DUMPBITS(j) {b>>=(j);k-=(j);} | 
 | /*   output bytes */ | 
 | #define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) | 
 | #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} | 
 | #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} | 
 | #define FLUSH {UPDOUT r=zlib_inflate_flush(s,z,r); LOADOUT} | 
 | #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} | 
 | #define OUTBYTE(a) {*q++=(Byte)(a);m--;} | 
 | /*   load local pointers */ | 
 | #define LOAD {LOADIN LOADOUT} | 
 |  | 
 | /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ | 
 | extern uInt zlib_inflate_mask[17]; | 
 |  | 
 | /* copy as much as possible from the sliding window to the output area */ | 
 | extern int zlib_inflate_flush ( | 
 |     inflate_blocks_statef *, | 
 |     z_streamp , | 
 |     int); | 
 |  | 
 | /* inflate private state */ | 
 | typedef enum { | 
 |       METHOD,   /* waiting for method byte */ | 
 |       FLAG,     /* waiting for flag byte */ | 
 |       DICT4,    /* four dictionary check bytes to go */ | 
 |       DICT3,    /* three dictionary check bytes to go */ | 
 |       DICT2,    /* two dictionary check bytes to go */ | 
 |       DICT1,    /* one dictionary check byte to go */ | 
 |       DICT0,    /* waiting for inflateSetDictionary */ | 
 |       BLOCKS,   /* decompressing blocks */ | 
 |       CHECK4,   /* four check bytes to go */ | 
 |       CHECK3,   /* three check bytes to go */ | 
 |       CHECK2,   /* two check bytes to go */ | 
 |       CHECK1,   /* one check byte to go */ | 
 |       I_DONE,   /* finished check, done */ | 
 |       I_BAD}    /* got an error--stay here */ | 
 | inflate_mode; | 
 |  | 
 | struct internal_state { | 
 |  | 
 |   /* mode */ | 
 |   inflate_mode  mode;   /* current inflate mode */ | 
 |  | 
 |   /* mode dependent information */ | 
 |   union { | 
 |     uInt method;        /* if FLAGS, method byte */ | 
 |     struct { | 
 |       uLong was;                /* computed check value */ | 
 |       uLong need;               /* stream check value */ | 
 |     } check;            /* if CHECK, check values to compare */ | 
 |     uInt marker;        /* if BAD, inflateSync's marker bytes count */ | 
 |   } sub;        /* submode */ | 
 |  | 
 |   /* mode independent information */ | 
 |   int  nowrap;          /* flag for no wrapper */ | 
 |   uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */ | 
 |   inflate_blocks_statef  | 
 |     *blocks;            /* current inflate_blocks state */ | 
 |  | 
 | }; | 
 |  | 
 | /* inflate codes private state */ | 
 | typedef enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ | 
 |       START,    /* x: set up for LEN */ | 
 |       LEN,      /* i: get length/literal/eob next */ | 
 |       LENEXT,   /* i: getting length extra (have base) */ | 
 |       DIST,     /* i: get distance next */ | 
 |       DISTEXT,  /* i: getting distance extra */ | 
 |       COPY,     /* o: copying bytes in window, waiting for space */ | 
 |       LIT,      /* o: got literal, waiting for output space */ | 
 |       WASH,     /* o: got eob, possibly still output waiting */ | 
 |       END,      /* x: got eob and all data flushed */ | 
 |       BADCODE}  /* x: got error */ | 
 | inflate_codes_mode; | 
 |  | 
 | struct inflate_codes_state { | 
 |  | 
 |   /* mode */ | 
 |   inflate_codes_mode mode;      /* current inflate_codes mode */ | 
 |  | 
 |   /* mode dependent information */ | 
 |   uInt len; | 
 |   union { | 
 |     struct { | 
 |       inflate_huft *tree;       /* pointer into tree */ | 
 |       uInt need;                /* bits needed */ | 
 |     } code;             /* if LEN or DIST, where in tree */ | 
 |     uInt lit;           /* if LIT, literal */ | 
 |     struct { | 
 |       uInt get;                 /* bits to get for extra */ | 
 |       uInt dist;                /* distance back to copy from */ | 
 |     } copy;             /* if EXT or COPY, where and how much */ | 
 |   } sub;                /* submode */ | 
 |  | 
 |   /* mode independent information */ | 
 |   Byte lbits;           /* ltree bits decoded per branch */ | 
 |   Byte dbits;           /* dtree bits decoder per branch */ | 
 |   inflate_huft *ltree;          /* literal/length/eob tree */ | 
 |   inflate_huft *dtree;          /* distance tree */ | 
 |  | 
 | }; | 
 |  | 
 | /* memory allocation for inflation */ | 
 |  | 
 | struct inflate_workspace { | 
 | 	inflate_codes_statef working_state; | 
 | 	struct inflate_blocks_state working_blocks_state; | 
 | 	struct internal_state internal_state; | 
 | 	unsigned int tree_work_area_1[19]; | 
 | 	unsigned int tree_work_area_2[288]; | 
 | 	unsigned working_blens[258 + 0x1f + 0x1f]; | 
 | 	inflate_huft working_hufts[MANY]; | 
 | 	unsigned char working_window[1 << MAX_WBITS]; | 
 | }; | 
 |  | 
 | #define WS(z) ((struct inflate_workspace *)(z->workspace)) | 
 |  | 
 | #endif |