#ifndef DEFLATE_H_
#define DEFLATE_H_
#include "zutil.h"
#include "zendian.h"
#include "zmemory.h"
#include "crc32.h"
#ifdef S390_DFLTCC_DEFLATE
# include "arch/s390/dfltcc_common.h"
# define HAVE_ARCH_DEFLATE_STATE
#endif
#ifndef NO_GZIP
# define GZIP
#endif
#ifndef NO_LIT_MEM
# define LIT_MEM
#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 BIT_BUF_SIZE 64
#define END_BLOCK 256
#define INIT_STATE 1
#ifdef GZIP
# define GZIP_STATE 4
# define EXTRA_STATE 5
# define NAME_STATE 6
# define COMMENT_STATE 7
# define HCRC_STATE 8
#endif
#define BUSY_STATE 2
#define FINISH_STATE 3
#ifdef GZIP
# define MAX_STATE HCRC_STATE
#else
# define MAX_STATE FINISH_STATE
#endif
#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) (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);
uint32_t update_hash (uint32_t h, uint32_t val);
void insert_string (deflate_state *const s, uint32_t str, uint32_t count);
Pos quick_insert_string (deflate_state *const s, uint32_t str);
uint32_t update_hash_roll (uint32_t h, uint32_t val);
void insert_string_roll (deflate_state *const s, uint32_t str, uint32_t count);
Pos quick_insert_string_roll(deflate_state *const s, uint32_t str);
typedef struct deflate_allocs_s {
char *buf_start;
free_func zfree;
deflate_state *state;
unsigned char *window;
unsigned char *pending_buf;
Pos *prev;
Pos *head;
} deflate_allocs;
struct ALIGNED_(64) 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;
#if defined(_M_IX86) || defined(_M_ARM)
int padding[2];
#endif
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;
#ifdef LIT_MEM
# define LIT_BUFS 5
uint16_t *d_buf;
unsigned char *l_buf;
#else
# define LIT_BUFS 4
unsigned char *sym_buf;
#endif
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;
deflate_allocs *alloc_bufs;
#ifdef HAVE_ARCH_DEFLATE_STATE
arch_deflate_state arch;
#endif
uint64_t bi_buf;
int32_t bi_valid;
int32_t reserved[19];
#if defined(_M_IX86) || defined(_M_ARM)
int32_t padding2[4];
#endif
};
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
zng_memwrite_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
zng_memwrite_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
zng_memwrite_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
zng_memwrite_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
zng_memwrite_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 PREFIX(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);
void Z_INTERNAL PREFIX(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
#ifdef S390_DFLTCC_DEFLATE
# include "arch/s390/dfltcc_deflate.h"
# define PAD_WINDOW PAD_4096
# define WINDOW_PAD_SIZE 4096
# define HINT_ALIGNED_WINDOW HINT_ALIGNED_4096
#else
# define PAD_WINDOW PAD_64
# define WINDOW_PAD_SIZE 64
# define HINT_ALIGNED_WINDOW HINT_ALIGNED_64
# define DEFLATE_ADJUST_WINDOW_SIZE(n) (n)
# define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0)
# define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0)
# define DEFLATE_RESET_KEEP_HOOK(strm) do {} while (0)
# define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) do {} while (0)
# define DEFLATE_DONE(strm, flush) 1
# define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen) do {} while (0)
# define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) 0
# define DEFLATE_HOOK(strm, flush, bstate) 0
# define DEFLATE_NEED_CHECKSUM(strm) 1
# define DEFLATE_CAN_SET_REPRODUCIBLE(strm, reproducible) 1
#endif
#endif