summaryrefslogtreecommitdiff
path: root/infutil.h
blob: af07372805a2731d85202c0b5e47713c58767379 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* infutil.h -- types and macros common to blocks and codes
 * Copyright (C) 1995 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.
 */

/* inflate blocks semi-private state */
struct inflate_blocks_state {

  /* mode */
  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 */
      DONE,	/* finished last block, done */
      ERROR}	/* got a data error--stuck here */
    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_state
      *codes;		/* 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 */
  Byte *window;		/* sliding window */
  Byte *end;		/* one byte after sliding window */
  Byte *read;		/* window read pointer */
  Byte *write;		/* window write pointer */
  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 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 (q<s->read?s->read-q-1:s->end-q)
#define LOADOUT {q=s->write;m=WAVAIL;}
#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=WAVAIL;}}
#define FLUSH {UPDOUT r=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 */
extern uInt inflate_mask[];

/* copy as much as possible from the sliding window to the output area */
extern int inflate_flush __P((
    struct inflate_blocks_state *,
    z_stream *,
    int));

struct internal_state      {int dummy;}; /* for buggy compilers */