modules/zlib/src/deflate.h

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

michael@0 1 /* deflate.h -- internal compression state
michael@0 2 * Copyright (C) 1995-2012 Jean-loup Gailly
michael@0 3 * For conditions of distribution and use, see copyright notice in zlib.h
michael@0 4 */
michael@0 5
michael@0 6 /* WARNING: this file should *not* be used by applications. It is
michael@0 7 part of the implementation of the compression library and is
michael@0 8 subject to change. Applications should only use zlib.h.
michael@0 9 */
michael@0 10
michael@0 11 /* @(#) $Id$ */
michael@0 12
michael@0 13 #ifndef DEFLATE_H
michael@0 14 #define DEFLATE_H
michael@0 15
michael@0 16 #include "zutil.h"
michael@0 17
michael@0 18 /* define NO_GZIP when compiling if you want to disable gzip header and
michael@0 19 trailer creation by deflate(). NO_GZIP would be used to avoid linking in
michael@0 20 the crc code when it is not needed. For shared libraries, gzip encoding
michael@0 21 should be left enabled. */
michael@0 22 #ifndef NO_GZIP
michael@0 23 # define GZIP
michael@0 24 #endif
michael@0 25
michael@0 26 /* ===========================================================================
michael@0 27 * Internal compression state.
michael@0 28 */
michael@0 29
michael@0 30 #define LENGTH_CODES 29
michael@0 31 /* number of length codes, not counting the special END_BLOCK code */
michael@0 32
michael@0 33 #define LITERALS 256
michael@0 34 /* number of literal bytes 0..255 */
michael@0 35
michael@0 36 #define L_CODES (LITERALS+1+LENGTH_CODES)
michael@0 37 /* number of Literal or Length codes, including the END_BLOCK code */
michael@0 38
michael@0 39 #define D_CODES 30
michael@0 40 /* number of distance codes */
michael@0 41
michael@0 42 #define BL_CODES 19
michael@0 43 /* number of codes used to transfer the bit lengths */
michael@0 44
michael@0 45 #define HEAP_SIZE (2*L_CODES+1)
michael@0 46 /* maximum heap size */
michael@0 47
michael@0 48 #define MAX_BITS 15
michael@0 49 /* All codes must not exceed MAX_BITS bits */
michael@0 50
michael@0 51 #define Buf_size 16
michael@0 52 /* size of bit buffer in bi_buf */
michael@0 53
michael@0 54 #define INIT_STATE 42
michael@0 55 #define EXTRA_STATE 69
michael@0 56 #define NAME_STATE 73
michael@0 57 #define COMMENT_STATE 91
michael@0 58 #define HCRC_STATE 103
michael@0 59 #define BUSY_STATE 113
michael@0 60 #define FINISH_STATE 666
michael@0 61 /* Stream status */
michael@0 62
michael@0 63
michael@0 64 /* Data structure describing a single value and its code string. */
michael@0 65 typedef struct ct_data_s {
michael@0 66 union {
michael@0 67 ush freq; /* frequency count */
michael@0 68 ush code; /* bit string */
michael@0 69 } fc;
michael@0 70 union {
michael@0 71 ush dad; /* father node in Huffman tree */
michael@0 72 ush len; /* length of bit string */
michael@0 73 } dl;
michael@0 74 } FAR ct_data;
michael@0 75
michael@0 76 #define Freq fc.freq
michael@0 77 #define Code fc.code
michael@0 78 #define Dad dl.dad
michael@0 79 #define Len dl.len
michael@0 80
michael@0 81 typedef struct static_tree_desc_s static_tree_desc;
michael@0 82
michael@0 83 typedef struct tree_desc_s {
michael@0 84 ct_data *dyn_tree; /* the dynamic tree */
michael@0 85 int max_code; /* largest code with non zero frequency */
michael@0 86 static_tree_desc *stat_desc; /* the corresponding static tree */
michael@0 87 } FAR tree_desc;
michael@0 88
michael@0 89 typedef ush Pos;
michael@0 90 typedef Pos FAR Posf;
michael@0 91 typedef unsigned IPos;
michael@0 92
michael@0 93 /* A Pos is an index in the character window. We use short instead of int to
michael@0 94 * save space in the various tables. IPos is used only for parameter passing.
michael@0 95 */
michael@0 96
michael@0 97 typedef struct internal_state {
michael@0 98 z_streamp strm; /* pointer back to this zlib stream */
michael@0 99 int status; /* as the name implies */
michael@0 100 Bytef *pending_buf; /* output still pending */
michael@0 101 ulg pending_buf_size; /* size of pending_buf */
michael@0 102 Bytef *pending_out; /* next pending byte to output to the stream */
michael@0 103 uInt pending; /* nb of bytes in the pending buffer */
michael@0 104 int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
michael@0 105 gz_headerp gzhead; /* gzip header information to write */
michael@0 106 uInt gzindex; /* where in extra, name, or comment */
michael@0 107 Byte method; /* can only be DEFLATED */
michael@0 108 int last_flush; /* value of flush param for previous deflate call */
michael@0 109
michael@0 110 /* used by deflate.c: */
michael@0 111
michael@0 112 uInt w_size; /* LZ77 window size (32K by default) */
michael@0 113 uInt w_bits; /* log2(w_size) (8..16) */
michael@0 114 uInt w_mask; /* w_size - 1 */
michael@0 115
michael@0 116 Bytef *window;
michael@0 117 /* Sliding window. Input bytes are read into the second half of the window,
michael@0 118 * and move to the first half later to keep a dictionary of at least wSize
michael@0 119 * bytes. With this organization, matches are limited to a distance of
michael@0 120 * wSize-MAX_MATCH bytes, but this ensures that IO is always
michael@0 121 * performed with a length multiple of the block size. Also, it limits
michael@0 122 * the window size to 64K, which is quite useful on MSDOS.
michael@0 123 * To do: use the user input buffer as sliding window.
michael@0 124 */
michael@0 125
michael@0 126 ulg window_size;
michael@0 127 /* Actual size of window: 2*wSize, except when the user input buffer
michael@0 128 * is directly used as sliding window.
michael@0 129 */
michael@0 130
michael@0 131 Posf *prev;
michael@0 132 /* Link to older string with same hash index. To limit the size of this
michael@0 133 * array to 64K, this link is maintained only for the last 32K strings.
michael@0 134 * An index in this array is thus a window index modulo 32K.
michael@0 135 */
michael@0 136
michael@0 137 Posf *head; /* Heads of the hash chains or NIL. */
michael@0 138
michael@0 139 uInt ins_h; /* hash index of string to be inserted */
michael@0 140 uInt hash_size; /* number of elements in hash table */
michael@0 141 uInt hash_bits; /* log2(hash_size) */
michael@0 142 uInt hash_mask; /* hash_size-1 */
michael@0 143
michael@0 144 uInt hash_shift;
michael@0 145 /* Number of bits by which ins_h must be shifted at each input
michael@0 146 * step. It must be such that after MIN_MATCH steps, the oldest
michael@0 147 * byte no longer takes part in the hash key, that is:
michael@0 148 * hash_shift * MIN_MATCH >= hash_bits
michael@0 149 */
michael@0 150
michael@0 151 long block_start;
michael@0 152 /* Window position at the beginning of the current output block. Gets
michael@0 153 * negative when the window is moved backwards.
michael@0 154 */
michael@0 155
michael@0 156 uInt match_length; /* length of best match */
michael@0 157 IPos prev_match; /* previous match */
michael@0 158 int match_available; /* set if previous match exists */
michael@0 159 uInt strstart; /* start of string to insert */
michael@0 160 uInt match_start; /* start of matching string */
michael@0 161 uInt lookahead; /* number of valid bytes ahead in window */
michael@0 162
michael@0 163 uInt prev_length;
michael@0 164 /* Length of the best match at previous step. Matches not greater than this
michael@0 165 * are discarded. This is used in the lazy match evaluation.
michael@0 166 */
michael@0 167
michael@0 168 uInt max_chain_length;
michael@0 169 /* To speed up deflation, hash chains are never searched beyond this
michael@0 170 * length. A higher limit improves compression ratio but degrades the
michael@0 171 * speed.
michael@0 172 */
michael@0 173
michael@0 174 uInt max_lazy_match;
michael@0 175 /* Attempt to find a better match only when the current match is strictly
michael@0 176 * smaller than this value. This mechanism is used only for compression
michael@0 177 * levels >= 4.
michael@0 178 */
michael@0 179 # define max_insert_length max_lazy_match
michael@0 180 /* Insert new strings in the hash table only if the match length is not
michael@0 181 * greater than this length. This saves time but degrades compression.
michael@0 182 * max_insert_length is used only for compression levels <= 3.
michael@0 183 */
michael@0 184
michael@0 185 int level; /* compression level (1..9) */
michael@0 186 int strategy; /* favor or force Huffman coding*/
michael@0 187
michael@0 188 uInt good_match;
michael@0 189 /* Use a faster search when the previous match is longer than this */
michael@0 190
michael@0 191 int nice_match; /* Stop searching when current match exceeds this */
michael@0 192
michael@0 193 /* used by trees.c: */
michael@0 194 /* Didn't use ct_data typedef below to suppress compiler warning */
michael@0 195 struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
michael@0 196 struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
michael@0 197 struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
michael@0 198
michael@0 199 struct tree_desc_s l_desc; /* desc. for literal tree */
michael@0 200 struct tree_desc_s d_desc; /* desc. for distance tree */
michael@0 201 struct tree_desc_s bl_desc; /* desc. for bit length tree */
michael@0 202
michael@0 203 ush bl_count[MAX_BITS+1];
michael@0 204 /* number of codes at each bit length for an optimal tree */
michael@0 205
michael@0 206 int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
michael@0 207 int heap_len; /* number of elements in the heap */
michael@0 208 int heap_max; /* element of largest frequency */
michael@0 209 /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
michael@0 210 * The same heap array is used to build all trees.
michael@0 211 */
michael@0 212
michael@0 213 uch depth[2*L_CODES+1];
michael@0 214 /* Depth of each subtree used as tie breaker for trees of equal frequency
michael@0 215 */
michael@0 216
michael@0 217 uchf *l_buf; /* buffer for literals or lengths */
michael@0 218
michael@0 219 uInt lit_bufsize;
michael@0 220 /* Size of match buffer for literals/lengths. There are 4 reasons for
michael@0 221 * limiting lit_bufsize to 64K:
michael@0 222 * - frequencies can be kept in 16 bit counters
michael@0 223 * - if compression is not successful for the first block, all input
michael@0 224 * data is still in the window so we can still emit a stored block even
michael@0 225 * when input comes from standard input. (This can also be done for
michael@0 226 * all blocks if lit_bufsize is not greater than 32K.)
michael@0 227 * - if compression is not successful for a file smaller than 64K, we can
michael@0 228 * even emit a stored file instead of a stored block (saving 5 bytes).
michael@0 229 * This is applicable only for zip (not gzip or zlib).
michael@0 230 * - creating new Huffman trees less frequently may not provide fast
michael@0 231 * adaptation to changes in the input data statistics. (Take for
michael@0 232 * example a binary file with poorly compressible code followed by
michael@0 233 * a highly compressible string table.) Smaller buffer sizes give
michael@0 234 * fast adaptation but have of course the overhead of transmitting
michael@0 235 * trees more frequently.
michael@0 236 * - I can't count above 4
michael@0 237 */
michael@0 238
michael@0 239 uInt last_lit; /* running index in l_buf */
michael@0 240
michael@0 241 ushf *d_buf;
michael@0 242 /* Buffer for distances. To simplify the code, d_buf and l_buf have
michael@0 243 * the same number of elements. To use different lengths, an extra flag
michael@0 244 * array would be necessary.
michael@0 245 */
michael@0 246
michael@0 247 ulg opt_len; /* bit length of current block with optimal trees */
michael@0 248 ulg static_len; /* bit length of current block with static trees */
michael@0 249 uInt matches; /* number of string matches in current block */
michael@0 250 uInt insert; /* bytes at end of window left to insert */
michael@0 251
michael@0 252 #ifdef DEBUG
michael@0 253 ulg compressed_len; /* total bit length of compressed file mod 2^32 */
michael@0 254 ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
michael@0 255 #endif
michael@0 256
michael@0 257 ush bi_buf;
michael@0 258 /* Output buffer. bits are inserted starting at the bottom (least
michael@0 259 * significant bits).
michael@0 260 */
michael@0 261 int bi_valid;
michael@0 262 /* Number of valid bits in bi_buf. All bits above the last valid bit
michael@0 263 * are always zero.
michael@0 264 */
michael@0 265
michael@0 266 ulg high_water;
michael@0 267 /* High water mark offset in window for initialized bytes -- bytes above
michael@0 268 * this are set to zero in order to avoid memory check warnings when
michael@0 269 * longest match routines access bytes past the input. This is then
michael@0 270 * updated to the new high water mark.
michael@0 271 */
michael@0 272
michael@0 273 } FAR deflate_state;
michael@0 274
michael@0 275 /* Output a byte on the stream.
michael@0 276 * IN assertion: there is enough room in pending_buf.
michael@0 277 */
michael@0 278 #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
michael@0 279
michael@0 280
michael@0 281 #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
michael@0 282 /* Minimum amount of lookahead, except at the end of the input file.
michael@0 283 * See deflate.c for comments about the MIN_MATCH+1.
michael@0 284 */
michael@0 285
michael@0 286 #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
michael@0 287 /* In order to simplify the code, particularly on 16 bit machines, match
michael@0 288 * distances are limited to MAX_DIST instead of WSIZE.
michael@0 289 */
michael@0 290
michael@0 291 #define WIN_INIT MAX_MATCH
michael@0 292 /* Number of bytes after end of data in window to initialize in order to avoid
michael@0 293 memory checker errors from longest match routines */
michael@0 294
michael@0 295 /* in trees.c */
michael@0 296 void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
michael@0 297 int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
michael@0 298 void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
michael@0 299 ulg stored_len, int last));
michael@0 300 void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
michael@0 301 void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
michael@0 302 void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
michael@0 303 ulg stored_len, int last));
michael@0 304
michael@0 305 #define d_code(dist) \
michael@0 306 ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
michael@0 307 /* Mapping from a distance to a distance code. dist is the distance - 1 and
michael@0 308 * must not have side effects. _dist_code[256] and _dist_code[257] are never
michael@0 309 * used.
michael@0 310 */
michael@0 311
michael@0 312 #ifndef DEBUG
michael@0 313 /* Inline versions of _tr_tally for speed: */
michael@0 314
michael@0 315 #if defined(GEN_TREES_H) || !defined(STDC)
michael@0 316 extern uch ZLIB_INTERNAL _length_code[];
michael@0 317 extern uch ZLIB_INTERNAL _dist_code[];
michael@0 318 #else
michael@0 319 extern const uch ZLIB_INTERNAL _length_code[];
michael@0 320 extern const uch ZLIB_INTERNAL _dist_code[];
michael@0 321 #endif
michael@0 322
michael@0 323 # define _tr_tally_lit(s, c, flush) \
michael@0 324 { uch cc = (c); \
michael@0 325 s->d_buf[s->last_lit] = 0; \
michael@0 326 s->l_buf[s->last_lit++] = cc; \
michael@0 327 s->dyn_ltree[cc].Freq++; \
michael@0 328 flush = (s->last_lit == s->lit_bufsize-1); \
michael@0 329 }
michael@0 330 # define _tr_tally_dist(s, distance, length, flush) \
michael@0 331 { uch len = (length); \
michael@0 332 ush dist = (distance); \
michael@0 333 s->d_buf[s->last_lit] = dist; \
michael@0 334 s->l_buf[s->last_lit++] = len; \
michael@0 335 dist--; \
michael@0 336 s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
michael@0 337 s->dyn_dtree[d_code(dist)].Freq++; \
michael@0 338 flush = (s->last_lit == s->lit_bufsize-1); \
michael@0 339 }
michael@0 340 #else
michael@0 341 # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
michael@0 342 # define _tr_tally_dist(s, distance, length, flush) \
michael@0 343 flush = _tr_tally(s, distance, length)
michael@0 344 #endif
michael@0 345
michael@0 346 #endif /* DEFLATE_H */

mercurial