| 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 | |