#ifndef DEFLATE_H_
#define DEFLATE_H_
#include "zutil.h"
#include "zendian.h"
#include "crc32_fold.h"
#ifndef NO_GZIP
# define GZIP
#endif
#define LENGTH_CODES 29
#define LITERALS 256
#define L_CODES (LITERALS+1+LENGTH_CODES)
#define D_CODES 30
#define BL_CODES 19
#define HEAP_SIZE (2*L_CODES+1)
#define MAX_BITS 15
#define BIT_BUF_SIZE 64
#define END_BLOCK 256
#define INIT_STATE 42
#ifdef GZIP
# define GZIP_STATE 57
#endif
#define EXTRA_STATE 69
#define NAME_STATE 73
#define COMMENT_STATE 91
#define HCRC_STATE 103
#define BUSY_STATE 113
#define FINISH_STATE 666
#define HASH_BITS 16u
#ifndef HASH_SIZE
# define HASH_SIZE 65536u
#endif
#define HASH_MASK (HASH_SIZE - 1u)
typedef struct ct_data_s {
union {
uint16_t freq;
uint16_t code;
} fc;
union {
uint16_t dad;
uint16_t len;
} dl;
} ct_data;
#define Freq fc.freq
#define Code fc.code
#define Dad dl.dad
#define Len dl.len
typedef struct static_tree_desc_s static_tree_desc;
typedef struct tree_desc_s {
ct_data *dyn_tree;
int max_code;
const static_tree_desc *stat_desc;
} tree_desc;
typedef uint16_t Pos;
typedef struct internal_state deflate_state;
typedef uint32_t (* update_hash_cb) (deflate_state *const s, uint32_t h, uint32_t val);
typedef void (* insert_string_cb) (deflate_state *const s, uint32_t str, uint32_t count);
typedef Pos (* quick_insert_string_cb)(deflate_state *const s, uint32_t str);
struct internal_state {
PREFIX3(stream) *strm;
unsigned char *pending_buf;
unsigned char *pending_out;
uint32_t pending_buf_size;
uint32_t pending;
int wrap;
uint32_t gzindex;
PREFIX(gz_headerp) gzhead;
int status;
int last_flush;
int reproducible;
int block_open;
unsigned int w_size;
unsigned int w_bits;
unsigned int w_mask;
unsigned int lookahead;
unsigned int high_water;
unsigned int window_size;
unsigned char *window;
Pos *prev;
Pos *head;
uint32_t ins_h;
int block_start;
unsigned int match_length;
Pos prev_match;
int match_available;
unsigned int strstart;
unsigned int match_start;
unsigned int prev_length;
unsigned int max_chain_length;
unsigned int max_lazy_match;
# define max_insert_length max_lazy_match
update_hash_cb update_hash;
insert_string_cb insert_string;
quick_insert_string_cb quick_insert_string;
int level;
int strategy;
unsigned int good_match;
int nice_match;
struct crc32_fold_s ALIGNED_(16) crc_fold;
struct ct_data_s dyn_ltree[HEAP_SIZE];
struct ct_data_s dyn_dtree[2*D_CODES+1];
struct ct_data_s bl_tree[2*BL_CODES+1];
struct tree_desc_s l_desc;
struct tree_desc_s d_desc;
struct tree_desc_s bl_desc;
uint16_t bl_count[MAX_BITS+1];
int heap[2*L_CODES+1];
int heap_len;
int heap_max;
unsigned char depth[2*L_CODES+1];
unsigned int lit_bufsize;
unsigned char *sym_buf;
unsigned int sym_next;
unsigned int sym_end;
unsigned long opt_len;
unsigned long static_len;
unsigned int matches;
unsigned int insert;
unsigned long compressed_len;
unsigned long bits_sent;
char *reserved_p;
uint64_t bi_buf;
int32_t bi_valid;
int32_t reserved[11];
} ALIGNED_(8);
typedef enum {
need_more,
block_done,
finish_started,
finish_done
} block_state;
#define put_byte(s, c) { \
s->pending_buf[s->pending++] = (unsigned char)(c); \
}
static inline void put_short(deflate_state *s, uint16_t w) {
#if BYTE_ORDER == BIG_ENDIAN
w = ZSWAP16(w);
#endif
zmemcpy_2(&s->pending_buf[s->pending], &w);
s->pending += 2;
}
static inline void put_short_msb(deflate_state *s, uint16_t w) {
#if BYTE_ORDER == LITTLE_ENDIAN
w = ZSWAP16(w);
#endif
zmemcpy_2(&s->pending_buf[s->pending], &w);
s->pending += 2;
}
static inline void put_uint32(deflate_state *s, uint32_t dw) {
#if BYTE_ORDER == BIG_ENDIAN
dw = ZSWAP32(dw);
#endif
zmemcpy_4(&s->pending_buf[s->pending], &dw);
s->pending += 4;
}
static inline void put_uint32_msb(deflate_state *s, uint32_t dw) {
#if BYTE_ORDER == LITTLE_ENDIAN
dw = ZSWAP32(dw);
#endif
zmemcpy_4(&s->pending_buf[s->pending], &dw);
s->pending += 4;
}
static inline void put_uint64(deflate_state *s, uint64_t lld) {
#if BYTE_ORDER == BIG_ENDIAN
lld = ZSWAP64(lld);
#endif
zmemcpy_8(&s->pending_buf[s->pending], &lld);
s->pending += 8;
}
#define MIN_LOOKAHEAD (STD_MAX_MATCH + STD_MIN_MATCH + 1)
#define MAX_DIST(s) ((s)->w_size - MIN_LOOKAHEAD)
#define WIN_INIT STD_MAX_MATCH
void Z_INTERNAL fill_window(deflate_state *s);
void Z_INTERNAL slide_hash_c(deflate_state *s);
void Z_INTERNAL zng_tr_init(deflate_state *s);
void Z_INTERNAL zng_tr_flush_block(deflate_state *s, char *buf, uint32_t stored_len, int last);
void Z_INTERNAL zng_tr_flush_bits(deflate_state *s);
void Z_INTERNAL zng_tr_align(deflate_state *s);
void Z_INTERNAL zng_tr_stored_block(deflate_state *s, char *buf, uint32_t stored_len, int last);
uint16_t Z_INTERNAL bi_reverse(unsigned code, int len);
void Z_INTERNAL flush_pending(PREFIX3(streamp) strm);
#define d_code(dist) ((dist) < 256 ? zng_dist_code[dist] : zng_dist_code[256+((dist)>>7)])
#ifdef ZLIB_DEBUG
# define cmpr_bits_add(s, len) s->compressed_len += (len)
# define cmpr_bits_align(s) s->compressed_len = (s->compressed_len + 7) & ~7L
# define sent_bits_add(s, bits) s->bits_sent += (bits)
# define sent_bits_align(s) s->bits_sent = (s->bits_sent + 7) & ~7L
#else
# define cmpr_bits_add(s, len) Z_UNUSED(len)
# define cmpr_bits_align(s)
# define sent_bits_add(s, bits) Z_UNUSED(bits)
# define sent_bits_align(s)
#endif
#endif