Eneboo - Documentación para desarrolladores
|
00001 /* infutil.h -- types and macros common to blocks and codes 00002 * Copyright (C) 1995-2002 Mark Adler 00003 * For conditions of distribution and use, see copyright notice in zlib.h 00004 */ 00005 00006 /* WARNING: this file should *not* be used by applications. It is 00007 part of the implementation of the compression library and is 00008 subject to change. Applications should only use zlib.h. 00009 */ 00010 00011 #ifndef _INFUTIL_H 00012 #define _INFUTIL_H 00013 00014 typedef enum { 00015 TYPE, /* get type bits (3, including end bit) */ 00016 LENS, /* get lengths for stored */ 00017 STORED, /* processing stored block */ 00018 TABLE, /* get table lengths */ 00019 BTREE, /* get bit lengths tree for a dynamic block */ 00020 DTREE, /* get length, distance trees for a dynamic block */ 00021 CODES, /* processing fixed or dynamic block */ 00022 DRY, /* output remaining window bytes */ 00023 DONE, /* finished last block, done */ 00024 BAD} /* got a data error--stuck here */ 00025 inflate_block_mode; 00026 00027 /* inflate blocks semi-private state */ 00028 struct inflate_blocks_state { 00029 00030 /* mode */ 00031 inflate_block_mode mode; /* current inflate_block mode */ 00032 00033 /* mode dependent information */ 00034 union { 00035 uInt left; /* if STORED, bytes left to copy */ 00036 struct { 00037 uInt table; /* table lengths (14 bits) */ 00038 uInt index; /* index into blens (or border) */ 00039 uIntf *blens; /* bit lengths of codes */ 00040 uInt bb; /* bit length tree depth */ 00041 inflate_huft *tb; /* bit length decoding tree */ 00042 } trees; /* if DTREE, decoding info for trees */ 00043 struct { 00044 inflate_codes_statef 00045 *codes; 00046 } decode; /* if CODES, current state */ 00047 } sub; /* submode */ 00048 uInt last; /* true if this block is the last block */ 00049 00050 /* mode independent information */ 00051 uInt bitk; /* bits in bit buffer */ 00052 uLong bitb; /* bit buffer */ 00053 inflate_huft *hufts; /* single malloc for tree space */ 00054 Bytef *window; /* sliding window */ 00055 Bytef *end; /* one byte after sliding window */ 00056 Bytef *read; /* window read pointer */ 00057 Bytef *write; /* window write pointer */ 00058 check_func checkfn; /* check function */ 00059 uLong check; /* check on output */ 00060 00061 }; 00062 00063 00064 /* defines for inflate input/output */ 00065 /* update pointers and return */ 00066 #define UPDBITS {s->bitb=b;s->bitk=k;} 00067 #define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} 00068 #define UPDOUT {s->write=q;} 00069 #define UPDATE {UPDBITS UPDIN UPDOUT} 00070 #define LEAVE {UPDATE return inflate_flush(s,z,r);} 00071 /* get bytes and bits */ 00072 #define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} 00073 #define NEEDBYTE {if(n)r=Z_OK;else LEAVE} 00074 #define NEXTBYTE (n--,*p++) 00075 #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} 00076 #define DUMPBITS(j) {b>>=(j);k-=(j);} 00077 /* output bytes */ 00078 #define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) 00079 #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} 00080 #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} 00081 #define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} 00082 #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} 00083 #define OUTBYTE(a) {*q++=(Byte)(a);m--;} 00084 /* load local pointers */ 00085 #define LOAD {LOADIN LOADOUT} 00086 00087 /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ 00088 extern uInt inflate_mask[17]; 00089 00090 /* copy as much as possible from the sliding window to the output area */ 00091 extern int inflate_flush OF(( 00092 inflate_blocks_statef *, 00093 z_streamp , 00094 int)); 00095 00096 struct internal_state {int dummy;}; /* for buggy compilers */ 00097 00098 #endif