if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
s = strm->state;
- if (bits < 0 || bits > 16 ||
- s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
+ if (bits < 0 || bits > BIT_BUF_SIZE ||
+ s->sym_buf < s->pending_out + ((BIT_BUF_SIZE + 7) >> 3))
return Z_BUF_ERROR;
do {
- put = Buf_size - s->bi_valid;
+ put = BIT_BUF_SIZE - s->bi_valid;
if (put > bits)
put = bits;
- s->bi_buf |= (uint16_t)((value & ((1 << put) - 1)) << s->bi_valid);
+ s->bi_buf |= (uint32_t)((value & ((1 << put) - 1)) << s->bi_valid);
s->bi_valid += put;
zng_tr_flush_bits(s);
value >>= put;
#define MAX_BITS 15
/* All codes must not exceed MAX_BITS bits */
-#define Buf_size 16
+#define BIT_BUF_SIZE 32
/* size of bit buffer in bi_buf */
#define END_BLOCK 256
unsigned long bits_sent; /* bit length of compressed data sent mod 2^32 */
#endif
- uint16_t bi_buf;
+ uint32_t bi_buf;
/* Output buffer. bits are inserted starting at the bottom (least
* significant bits).
*/
#ifdef ZLIB_DEBUG
# define send_debug_trace(s, value, length) {\
Tracevv((stderr, " l %2d v %4x ", length, value));\
- Assert(length > 0 && length <= 15, "invalid length");\
+ Assert(length > 0 && length <= BIT_BUF_SIZE - 1, "invalid length");\
s->bits_sent += (unsigned long)length;\
}
#else
#endif
/* If not enough room in bit_buf, use (valid) bits from bit_buf and
- * (16 - bit_valid) bits from value, leaving (width - (16-bit_valid))
+ * (32 - bit_valid) bits from value, leaving (width - (32-bit_valid))
* unused bits in value.
*/
#define send_bits(s, t_val, t_len, bit_buf, bits_valid) {\
- int val = t_val;\
- int len = t_len;\
+ uint32_t val = (uint32_t)t_val;\
+ uint32_t len = (uint32_t)t_len;\
send_debug_trace(s, val, len);\
- if (bits_valid > (int)Buf_size - len) {\
- bit_buf |= (uint16_t)val << bits_valid;\
- put_short(s, bit_buf);\
- bit_buf = (uint16_t)val >> (Buf_size - bits_valid);\
- bits_valid += len - Buf_size;\
+ if (bits_valid == BIT_BUF_SIZE) {\
+ put_uint32(s, bit_buf);\
+ bit_buf = val;\
+ bits_valid = len;\
+ } else if (bits_valid + len >= BIT_BUF_SIZE) {\
+ bit_buf |= val << bits_valid;\
+ put_uint32(s, bit_buf);\
+ bit_buf = val >> (BIT_BUF_SIZE - bits_valid);\
+ bits_valid += len - BIT_BUF_SIZE;\
} else {\
- bit_buf |= (uint16_t)(val) << bits_valid;\
+ bit_buf |= val << bits_valid;\
bits_valid += len;\
}\
}
header += 31 - (header % 31);
/* s is guaranteed to be longer than 2 bytes. */
- put_byte(s, 0, (unsigned char)(header >> 8));
- put_byte(s, 1, (unsigned char)(header & 0xff));
+ put_byte(s, 0, (header >> 8));
+ put_byte(s, 1, (header & 0xff));
}
static void check_decompress(uint8_t *compr, size_t comprLen) {
// Temp local variables
int filled = s->bi_valid;
- uint16_t bit_buf = s->bi_buf;
+ uint32_t bit_buf = s->bi_buf;
for (n = 0; n <= max_code; n++) {
curlen = nextlen;
// Temp local variables
int filled = s->bi_valid;
- uint16_t bit_buf = s->bi_buf;
+ uint32_t bit_buf = s->bi_buf;
Tracev((stderr, "\nbl counts: "));
send_bits(s, lcodes-257, 5, bit_buf, filled); /* not +255 as stated in appnote.txt */
// Temp local variables
int filled = s->bi_valid;
- uint16_t bit_buf = s->bi_buf;
+ uint32_t bit_buf = s->bi_buf;
if (s->sym_next != 0) {
do {
* Flush the bit buffer, keeping at most 7 bits in it.
*/
static void bi_flush(deflate_state *s) {
- if (s->bi_valid == 16) {
- put_short(s, s->bi_buf);
+ if (s->bi_valid == 32) {
+ put_uint32(s, s->bi_buf);
s->bi_buf = 0;
s->bi_valid = 0;
- } else if (s->bi_valid >= 8) {
- put_byte(s, (unsigned char)s->bi_buf);
- s->bi_buf >>= 8;
- s->bi_valid -= 8;
+ } else {
+ if (s->bi_valid >= 16) {
+ put_short(s, s->bi_buf);
+ s->bi_buf >>= 16;
+ s->bi_valid -= 16;
+ }
+ if (s->bi_valid >= 8) {
+ put_byte(s, s->bi_buf);
+ s->bi_buf >>= 8;
+ s->bi_valid -= 8;
+ }
}
}
* Flush the bit buffer and align the output on a byte boundary
*/
ZLIB_INTERNAL void bi_windup(deflate_state *s) {
- if (s->bi_valid > 8) {
- put_short(s, s->bi_buf);
- } else if (s->bi_valid > 0) {
- put_byte(s, (unsigned char)s->bi_buf);
+ if (s->bi_valid > 24) {
+ put_uint32(s, s->bi_buf);
+ } else {
+ if (s->bi_valid > 8) {
+ put_short(s, s->bi_buf);
+ s->bi_buf >>= 16;
+ s->bi_valid -= 16;
+ }
+ if (s->bi_valid > 0) {
+ put_byte(s, s->bi_buf);
+ }
}
s->bi_buf = 0;
s->bi_valid = 0;