1/* inflate_p.h -- Private inline functions and macros shared with more than one deflate method
2 *
3 */
4
5#ifndef INFLATE_P_H
6#define INFLATE_P_H
7
8/*
9 * Macros shared by inflate() and inflateBack()
10 */
11
12/* check function to use adler32() for zlib or crc32() for gzip */
13#ifdef GUNZIP
14# define UPDATE(check, buf, len) \
15 (state->flags ? PREFIX(crc32)(check, buf, len) : functable.adler32(check, buf, len))
16#else
17# define UPDATE(check, buf, len) functable.adler32(check, buf, len)
18#endif
19
20/* check macros for header crc */
21#ifdef GUNZIP
22# define CRC2(check, word) \
23 do { \
24 hbuf[0] = (unsigned char)(word); \
25 hbuf[1] = (unsigned char)((word) >> 8); \
26 check = PREFIX(crc32)(check, hbuf, 2); \
27 } while (0)
28
29# define CRC4(check, word) \
30 do { \
31 hbuf[0] = (unsigned char)(word); \
32 hbuf[1] = (unsigned char)((word) >> 8); \
33 hbuf[2] = (unsigned char)((word) >> 16); \
34 hbuf[3] = (unsigned char)((word) >> 24); \
35 check = PREFIX(crc32)(check, hbuf, 4); \
36 } while (0)
37#endif
38
39/* Load registers with state in inflate() for speed */
40#define LOAD() \
41 do { \
42 put = strm->next_out; \
43 left = strm->avail_out; \
44 next = strm->next_in; \
45 have = strm->avail_in; \
46 hold = state->hold; \
47 bits = state->bits; \
48 } while (0)
49
50/* Restore state from registers in inflate() */
51#define RESTORE() \
52 do { \
53 strm->next_out = put; \
54 strm->avail_out = left; \
55 strm->next_in = next; \
56 strm->avail_in = have; \
57 state->hold = hold; \
58 state->bits = bits; \
59 } while (0)
60
61/* Clear the input bit accumulator */
62#define INITBITS() \
63 do { \
64 hold = 0; \
65 bits = 0; \
66 } while (0)
67
68/* Ensure that there is at least n bits in the bit accumulator. If there is
69 not enough available input to do that, then return from inflate()/inflateBack(). */
70#define NEEDBITS(n) \
71 do { \
72 while (bits < (unsigned)(n)) \
73 PULLBYTE(); \
74 } while (0)
75
76/* Return the low n bits of the bit accumulator (n < 16) */
77#define BITS(n) \
78 (hold & ((1U << (n)) - 1))
79
80/* Remove n bits from the bit accumulator */
81#define DROPBITS(n) \
82 do { \
83 hold >>= (n); \
84 bits -= (unsigned)(n); \
85 } while (0)
86
87/* Remove zero to seven bits as needed to go to a byte boundary */
88#define BYTEBITS() \
89 do { \
90 hold >>= bits & 7; \
91 bits -= bits & 7; \
92 } while (0)
93
94#endif
95