annotate src/zlib-1.2.7/deflate.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents e13257ea84a4
children
rev   line source
Chris@4 1 /* deflate.c -- compress data using the deflation algorithm
Chris@4 2 * Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
Chris@4 3 * For conditions of distribution and use, see copyright notice in zlib.h
Chris@4 4 */
Chris@4 5
Chris@4 6 /*
Chris@4 7 * ALGORITHM
Chris@4 8 *
Chris@4 9 * The "deflation" process depends on being able to identify portions
Chris@4 10 * of the input text which are identical to earlier input (within a
Chris@4 11 * sliding window trailing behind the input currently being processed).
Chris@4 12 *
Chris@4 13 * The most straightforward technique turns out to be the fastest for
Chris@4 14 * most input files: try all possible matches and select the longest.
Chris@4 15 * The key feature of this algorithm is that insertions into the string
Chris@4 16 * dictionary are very simple and thus fast, and deletions are avoided
Chris@4 17 * completely. Insertions are performed at each input character, whereas
Chris@4 18 * string matches are performed only when the previous match ends. So it
Chris@4 19 * is preferable to spend more time in matches to allow very fast string
Chris@4 20 * insertions and avoid deletions. The matching algorithm for small
Chris@4 21 * strings is inspired from that of Rabin & Karp. A brute force approach
Chris@4 22 * is used to find longer strings when a small match has been found.
Chris@4 23 * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
Chris@4 24 * (by Leonid Broukhis).
Chris@4 25 * A previous version of this file used a more sophisticated algorithm
Chris@4 26 * (by Fiala and Greene) which is guaranteed to run in linear amortized
Chris@4 27 * time, but has a larger average cost, uses more memory and is patented.
Chris@4 28 * However the F&G algorithm may be faster for some highly redundant
Chris@4 29 * files if the parameter max_chain_length (described below) is too large.
Chris@4 30 *
Chris@4 31 * ACKNOWLEDGEMENTS
Chris@4 32 *
Chris@4 33 * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
Chris@4 34 * I found it in 'freeze' written by Leonid Broukhis.
Chris@4 35 * Thanks to many people for bug reports and testing.
Chris@4 36 *
Chris@4 37 * REFERENCES
Chris@4 38 *
Chris@4 39 * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
Chris@4 40 * Available in http://tools.ietf.org/html/rfc1951
Chris@4 41 *
Chris@4 42 * A description of the Rabin and Karp algorithm is given in the book
Chris@4 43 * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
Chris@4 44 *
Chris@4 45 * Fiala,E.R., and Greene,D.H.
Chris@4 46 * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
Chris@4 47 *
Chris@4 48 */
Chris@4 49
Chris@4 50 /* @(#) $Id$ */
Chris@4 51
Chris@4 52 #include "deflate.h"
Chris@4 53
Chris@4 54 const char deflate_copyright[] =
Chris@4 55 " deflate 1.2.7 Copyright 1995-2012 Jean-loup Gailly and Mark Adler ";
Chris@4 56 /*
Chris@4 57 If you use the zlib library in a product, an acknowledgment is welcome
Chris@4 58 in the documentation of your product. If for some reason you cannot
Chris@4 59 include such an acknowledgment, I would appreciate that you keep this
Chris@4 60 copyright string in the executable of your product.
Chris@4 61 */
Chris@4 62
Chris@4 63 /* ===========================================================================
Chris@4 64 * Function prototypes.
Chris@4 65 */
Chris@4 66 typedef enum {
Chris@4 67 need_more, /* block not completed, need more input or more output */
Chris@4 68 block_done, /* block flush performed */
Chris@4 69 finish_started, /* finish started, need only more output at next deflate */
Chris@4 70 finish_done /* finish done, accept no more input or output */
Chris@4 71 } block_state;
Chris@4 72
Chris@4 73 typedef block_state (*compress_func) OF((deflate_state *s, int flush));
Chris@4 74 /* Compression function. Returns the block state after the call. */
Chris@4 75
Chris@4 76 local void fill_window OF((deflate_state *s));
Chris@4 77 local block_state deflate_stored OF((deflate_state *s, int flush));
Chris@4 78 local block_state deflate_fast OF((deflate_state *s, int flush));
Chris@4 79 #ifndef FASTEST
Chris@4 80 local block_state deflate_slow OF((deflate_state *s, int flush));
Chris@4 81 #endif
Chris@4 82 local block_state deflate_rle OF((deflate_state *s, int flush));
Chris@4 83 local block_state deflate_huff OF((deflate_state *s, int flush));
Chris@4 84 local void lm_init OF((deflate_state *s));
Chris@4 85 local void putShortMSB OF((deflate_state *s, uInt b));
Chris@4 86 local void flush_pending OF((z_streamp strm));
Chris@4 87 local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
Chris@4 88 #ifdef ASMV
Chris@4 89 void match_init OF((void)); /* asm code initialization */
Chris@4 90 uInt longest_match OF((deflate_state *s, IPos cur_match));
Chris@4 91 #else
Chris@4 92 local uInt longest_match OF((deflate_state *s, IPos cur_match));
Chris@4 93 #endif
Chris@4 94
Chris@4 95 #ifdef DEBUG
Chris@4 96 local void check_match OF((deflate_state *s, IPos start, IPos match,
Chris@4 97 int length));
Chris@4 98 #endif
Chris@4 99
Chris@4 100 /* ===========================================================================
Chris@4 101 * Local data
Chris@4 102 */
Chris@4 103
Chris@4 104 #define NIL 0
Chris@4 105 /* Tail of hash chains */
Chris@4 106
Chris@4 107 #ifndef TOO_FAR
Chris@4 108 # define TOO_FAR 4096
Chris@4 109 #endif
Chris@4 110 /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
Chris@4 111
Chris@4 112 /* Values for max_lazy_match, good_match and max_chain_length, depending on
Chris@4 113 * the desired pack level (0..9). The values given below have been tuned to
Chris@4 114 * exclude worst case performance for pathological files. Better values may be
Chris@4 115 * found for specific files.
Chris@4 116 */
Chris@4 117 typedef struct config_s {
Chris@4 118 ush good_length; /* reduce lazy search above this match length */
Chris@4 119 ush max_lazy; /* do not perform lazy search above this match length */
Chris@4 120 ush nice_length; /* quit search above this match length */
Chris@4 121 ush max_chain;
Chris@4 122 compress_func func;
Chris@4 123 } config;
Chris@4 124
Chris@4 125 #ifdef FASTEST
Chris@4 126 local const config configuration_table[2] = {
Chris@4 127 /* good lazy nice chain */
Chris@4 128 /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
Chris@4 129 /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */
Chris@4 130 #else
Chris@4 131 local const config configuration_table[10] = {
Chris@4 132 /* good lazy nice chain */
Chris@4 133 /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
Chris@4 134 /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */
Chris@4 135 /* 2 */ {4, 5, 16, 8, deflate_fast},
Chris@4 136 /* 3 */ {4, 6, 32, 32, deflate_fast},
Chris@4 137
Chris@4 138 /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
Chris@4 139 /* 5 */ {8, 16, 32, 32, deflate_slow},
Chris@4 140 /* 6 */ {8, 16, 128, 128, deflate_slow},
Chris@4 141 /* 7 */ {8, 32, 128, 256, deflate_slow},
Chris@4 142 /* 8 */ {32, 128, 258, 1024, deflate_slow},
Chris@4 143 /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
Chris@4 144 #endif
Chris@4 145
Chris@4 146 /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
Chris@4 147 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
Chris@4 148 * meaning.
Chris@4 149 */
Chris@4 150
Chris@4 151 #define EQUAL 0
Chris@4 152 /* result of memcmp for equal strings */
Chris@4 153
Chris@4 154 #ifndef NO_DUMMY_DECL
Chris@4 155 struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
Chris@4 156 #endif
Chris@4 157
Chris@4 158 /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
Chris@4 159 #define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
Chris@4 160
Chris@4 161 /* ===========================================================================
Chris@4 162 * Update a hash value with the given input byte
Chris@4 163 * IN assertion: all calls to to UPDATE_HASH are made with consecutive
Chris@4 164 * input characters, so that a running hash key can be computed from the
Chris@4 165 * previous key instead of complete recalculation each time.
Chris@4 166 */
Chris@4 167 #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
Chris@4 168
Chris@4 169
Chris@4 170 /* ===========================================================================
Chris@4 171 * Insert string str in the dictionary and set match_head to the previous head
Chris@4 172 * of the hash chain (the most recent string with same hash key). Return
Chris@4 173 * the previous length of the hash chain.
Chris@4 174 * If this file is compiled with -DFASTEST, the compression level is forced
Chris@4 175 * to 1, and no hash chains are maintained.
Chris@4 176 * IN assertion: all calls to to INSERT_STRING are made with consecutive
Chris@4 177 * input characters and the first MIN_MATCH bytes of str are valid
Chris@4 178 * (except for the last MIN_MATCH-1 bytes of the input file).
Chris@4 179 */
Chris@4 180 #ifdef FASTEST
Chris@4 181 #define INSERT_STRING(s, str, match_head) \
Chris@4 182 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
Chris@4 183 match_head = s->head[s->ins_h], \
Chris@4 184 s->head[s->ins_h] = (Pos)(str))
Chris@4 185 #else
Chris@4 186 #define INSERT_STRING(s, str, match_head) \
Chris@4 187 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
Chris@4 188 match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
Chris@4 189 s->head[s->ins_h] = (Pos)(str))
Chris@4 190 #endif
Chris@4 191
Chris@4 192 /* ===========================================================================
Chris@4 193 * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
Chris@4 194 * prev[] will be initialized on the fly.
Chris@4 195 */
Chris@4 196 #define CLEAR_HASH(s) \
Chris@4 197 s->head[s->hash_size-1] = NIL; \
Chris@4 198 zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
Chris@4 199
Chris@4 200 /* ========================================================================= */
Chris@4 201 int ZEXPORT deflateInit_(strm, level, version, stream_size)
Chris@4 202 z_streamp strm;
Chris@4 203 int level;
Chris@4 204 const char *version;
Chris@4 205 int stream_size;
Chris@4 206 {
Chris@4 207 return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
Chris@4 208 Z_DEFAULT_STRATEGY, version, stream_size);
Chris@4 209 /* To do: ignore strm->next_in if we use it as window */
Chris@4 210 }
Chris@4 211
Chris@4 212 /* ========================================================================= */
Chris@4 213 int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
Chris@4 214 version, stream_size)
Chris@4 215 z_streamp strm;
Chris@4 216 int level;
Chris@4 217 int method;
Chris@4 218 int windowBits;
Chris@4 219 int memLevel;
Chris@4 220 int strategy;
Chris@4 221 const char *version;
Chris@4 222 int stream_size;
Chris@4 223 {
Chris@4 224 deflate_state *s;
Chris@4 225 int wrap = 1;
Chris@4 226 static const char my_version[] = ZLIB_VERSION;
Chris@4 227
Chris@4 228 ushf *overlay;
Chris@4 229 /* We overlay pending_buf and d_buf+l_buf. This works since the average
Chris@4 230 * output size for (length,distance) codes is <= 24 bits.
Chris@4 231 */
Chris@4 232
Chris@4 233 if (version == Z_NULL || version[0] != my_version[0] ||
Chris@4 234 stream_size != sizeof(z_stream)) {
Chris@4 235 return Z_VERSION_ERROR;
Chris@4 236 }
Chris@4 237 if (strm == Z_NULL) return Z_STREAM_ERROR;
Chris@4 238
Chris@4 239 strm->msg = Z_NULL;
Chris@4 240 if (strm->zalloc == (alloc_func)0) {
Chris@4 241 #ifdef Z_SOLO
Chris@4 242 return Z_STREAM_ERROR;
Chris@4 243 #else
Chris@4 244 strm->zalloc = zcalloc;
Chris@4 245 strm->opaque = (voidpf)0;
Chris@4 246 #endif
Chris@4 247 }
Chris@4 248 if (strm->zfree == (free_func)0)
Chris@4 249 #ifdef Z_SOLO
Chris@4 250 return Z_STREAM_ERROR;
Chris@4 251 #else
Chris@4 252 strm->zfree = zcfree;
Chris@4 253 #endif
Chris@4 254
Chris@4 255 #ifdef FASTEST
Chris@4 256 if (level != 0) level = 1;
Chris@4 257 #else
Chris@4 258 if (level == Z_DEFAULT_COMPRESSION) level = 6;
Chris@4 259 #endif
Chris@4 260
Chris@4 261 if (windowBits < 0) { /* suppress zlib wrapper */
Chris@4 262 wrap = 0;
Chris@4 263 windowBits = -windowBits;
Chris@4 264 }
Chris@4 265 #ifdef GZIP
Chris@4 266 else if (windowBits > 15) {
Chris@4 267 wrap = 2; /* write gzip wrapper instead */
Chris@4 268 windowBits -= 16;
Chris@4 269 }
Chris@4 270 #endif
Chris@4 271 if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
Chris@4 272 windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
Chris@4 273 strategy < 0 || strategy > Z_FIXED) {
Chris@4 274 return Z_STREAM_ERROR;
Chris@4 275 }
Chris@4 276 if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
Chris@4 277 s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
Chris@4 278 if (s == Z_NULL) return Z_MEM_ERROR;
Chris@4 279 strm->state = (struct internal_state FAR *)s;
Chris@4 280 s->strm = strm;
Chris@4 281
Chris@4 282 s->wrap = wrap;
Chris@4 283 s->gzhead = Z_NULL;
Chris@4 284 s->w_bits = windowBits;
Chris@4 285 s->w_size = 1 << s->w_bits;
Chris@4 286 s->w_mask = s->w_size - 1;
Chris@4 287
Chris@4 288 s->hash_bits = memLevel + 7;
Chris@4 289 s->hash_size = 1 << s->hash_bits;
Chris@4 290 s->hash_mask = s->hash_size - 1;
Chris@4 291 s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
Chris@4 292
Chris@4 293 s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
Chris@4 294 s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
Chris@4 295 s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
Chris@4 296
Chris@4 297 s->high_water = 0; /* nothing written to s->window yet */
Chris@4 298
Chris@4 299 s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
Chris@4 300
Chris@4 301 overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
Chris@4 302 s->pending_buf = (uchf *) overlay;
Chris@4 303 s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
Chris@4 304
Chris@4 305 if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
Chris@4 306 s->pending_buf == Z_NULL) {
Chris@4 307 s->status = FINISH_STATE;
Chris@4 308 strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
Chris@4 309 deflateEnd (strm);
Chris@4 310 return Z_MEM_ERROR;
Chris@4 311 }
Chris@4 312 s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
Chris@4 313 s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
Chris@4 314
Chris@4 315 s->level = level;
Chris@4 316 s->strategy = strategy;
Chris@4 317 s->method = (Byte)method;
Chris@4 318
Chris@4 319 return deflateReset(strm);
Chris@4 320 }
Chris@4 321
Chris@4 322 /* ========================================================================= */
Chris@4 323 int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
Chris@4 324 z_streamp strm;
Chris@4 325 const Bytef *dictionary;
Chris@4 326 uInt dictLength;
Chris@4 327 {
Chris@4 328 deflate_state *s;
Chris@4 329 uInt str, n;
Chris@4 330 int wrap;
Chris@4 331 unsigned avail;
Chris@4 332 unsigned char *next;
Chris@4 333
Chris@4 334 if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
Chris@4 335 return Z_STREAM_ERROR;
Chris@4 336 s = strm->state;
Chris@4 337 wrap = s->wrap;
Chris@4 338 if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
Chris@4 339 return Z_STREAM_ERROR;
Chris@4 340
Chris@4 341 /* when using zlib wrappers, compute Adler-32 for provided dictionary */
Chris@4 342 if (wrap == 1)
Chris@4 343 strm->adler = adler32(strm->adler, dictionary, dictLength);
Chris@4 344 s->wrap = 0; /* avoid computing Adler-32 in read_buf */
Chris@4 345
Chris@4 346 /* if dictionary would fill window, just replace the history */
Chris@4 347 if (dictLength >= s->w_size) {
Chris@4 348 if (wrap == 0) { /* already empty otherwise */
Chris@4 349 CLEAR_HASH(s);
Chris@4 350 s->strstart = 0;
Chris@4 351 s->block_start = 0L;
Chris@4 352 s->insert = 0;
Chris@4 353 }
Chris@4 354 dictionary += dictLength - s->w_size; /* use the tail */
Chris@4 355 dictLength = s->w_size;
Chris@4 356 }
Chris@4 357
Chris@4 358 /* insert dictionary into window and hash */
Chris@4 359 avail = strm->avail_in;
Chris@4 360 next = strm->next_in;
Chris@4 361 strm->avail_in = dictLength;
Chris@4 362 strm->next_in = (Bytef *)dictionary;
Chris@4 363 fill_window(s);
Chris@4 364 while (s->lookahead >= MIN_MATCH) {
Chris@4 365 str = s->strstart;
Chris@4 366 n = s->lookahead - (MIN_MATCH-1);
Chris@4 367 do {
Chris@4 368 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
Chris@4 369 #ifndef FASTEST
Chris@4 370 s->prev[str & s->w_mask] = s->head[s->ins_h];
Chris@4 371 #endif
Chris@4 372 s->head[s->ins_h] = (Pos)str;
Chris@4 373 str++;
Chris@4 374 } while (--n);
Chris@4 375 s->strstart = str;
Chris@4 376 s->lookahead = MIN_MATCH-1;
Chris@4 377 fill_window(s);
Chris@4 378 }
Chris@4 379 s->strstart += s->lookahead;
Chris@4 380 s->block_start = (long)s->strstart;
Chris@4 381 s->insert = s->lookahead;
Chris@4 382 s->lookahead = 0;
Chris@4 383 s->match_length = s->prev_length = MIN_MATCH-1;
Chris@4 384 s->match_available = 0;
Chris@4 385 strm->next_in = next;
Chris@4 386 strm->avail_in = avail;
Chris@4 387 s->wrap = wrap;
Chris@4 388 return Z_OK;
Chris@4 389 }
Chris@4 390
Chris@4 391 /* ========================================================================= */
Chris@4 392 int ZEXPORT deflateResetKeep (strm)
Chris@4 393 z_streamp strm;
Chris@4 394 {
Chris@4 395 deflate_state *s;
Chris@4 396
Chris@4 397 if (strm == Z_NULL || strm->state == Z_NULL ||
Chris@4 398 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
Chris@4 399 return Z_STREAM_ERROR;
Chris@4 400 }
Chris@4 401
Chris@4 402 strm->total_in = strm->total_out = 0;
Chris@4 403 strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
Chris@4 404 strm->data_type = Z_UNKNOWN;
Chris@4 405
Chris@4 406 s = (deflate_state *)strm->state;
Chris@4 407 s->pending = 0;
Chris@4 408 s->pending_out = s->pending_buf;
Chris@4 409
Chris@4 410 if (s->wrap < 0) {
Chris@4 411 s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
Chris@4 412 }
Chris@4 413 s->status = s->wrap ? INIT_STATE : BUSY_STATE;
Chris@4 414 strm->adler =
Chris@4 415 #ifdef GZIP
Chris@4 416 s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
Chris@4 417 #endif
Chris@4 418 adler32(0L, Z_NULL, 0);
Chris@4 419 s->last_flush = Z_NO_FLUSH;
Chris@4 420
Chris@4 421 _tr_init(s);
Chris@4 422
Chris@4 423 return Z_OK;
Chris@4 424 }
Chris@4 425
Chris@4 426 /* ========================================================================= */
Chris@4 427 int ZEXPORT deflateReset (strm)
Chris@4 428 z_streamp strm;
Chris@4 429 {
Chris@4 430 int ret;
Chris@4 431
Chris@4 432 ret = deflateResetKeep(strm);
Chris@4 433 if (ret == Z_OK)
Chris@4 434 lm_init(strm->state);
Chris@4 435 return ret;
Chris@4 436 }
Chris@4 437
Chris@4 438 /* ========================================================================= */
Chris@4 439 int ZEXPORT deflateSetHeader (strm, head)
Chris@4 440 z_streamp strm;
Chris@4 441 gz_headerp head;
Chris@4 442 {
Chris@4 443 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
Chris@4 444 if (strm->state->wrap != 2) return Z_STREAM_ERROR;
Chris@4 445 strm->state->gzhead = head;
Chris@4 446 return Z_OK;
Chris@4 447 }
Chris@4 448
Chris@4 449 /* ========================================================================= */
Chris@4 450 int ZEXPORT deflatePending (strm, pending, bits)
Chris@4 451 unsigned *pending;
Chris@4 452 int *bits;
Chris@4 453 z_streamp strm;
Chris@4 454 {
Chris@4 455 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
Chris@4 456 if (pending != Z_NULL)
Chris@4 457 *pending = strm->state->pending;
Chris@4 458 if (bits != Z_NULL)
Chris@4 459 *bits = strm->state->bi_valid;
Chris@4 460 return Z_OK;
Chris@4 461 }
Chris@4 462
Chris@4 463 /* ========================================================================= */
Chris@4 464 int ZEXPORT deflatePrime (strm, bits, value)
Chris@4 465 z_streamp strm;
Chris@4 466 int bits;
Chris@4 467 int value;
Chris@4 468 {
Chris@4 469 deflate_state *s;
Chris@4 470 int put;
Chris@4 471
Chris@4 472 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
Chris@4 473 s = strm->state;
Chris@4 474 if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
Chris@4 475 return Z_BUF_ERROR;
Chris@4 476 do {
Chris@4 477 put = Buf_size - s->bi_valid;
Chris@4 478 if (put > bits)
Chris@4 479 put = bits;
Chris@4 480 s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
Chris@4 481 s->bi_valid += put;
Chris@4 482 _tr_flush_bits(s);
Chris@4 483 value >>= put;
Chris@4 484 bits -= put;
Chris@4 485 } while (bits);
Chris@4 486 return Z_OK;
Chris@4 487 }
Chris@4 488
Chris@4 489 /* ========================================================================= */
Chris@4 490 int ZEXPORT deflateParams(strm, level, strategy)
Chris@4 491 z_streamp strm;
Chris@4 492 int level;
Chris@4 493 int strategy;
Chris@4 494 {
Chris@4 495 deflate_state *s;
Chris@4 496 compress_func func;
Chris@4 497 int err = Z_OK;
Chris@4 498
Chris@4 499 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
Chris@4 500 s = strm->state;
Chris@4 501
Chris@4 502 #ifdef FASTEST
Chris@4 503 if (level != 0) level = 1;
Chris@4 504 #else
Chris@4 505 if (level == Z_DEFAULT_COMPRESSION) level = 6;
Chris@4 506 #endif
Chris@4 507 if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
Chris@4 508 return Z_STREAM_ERROR;
Chris@4 509 }
Chris@4 510 func = configuration_table[s->level].func;
Chris@4 511
Chris@4 512 if ((strategy != s->strategy || func != configuration_table[level].func) &&
Chris@4 513 strm->total_in != 0) {
Chris@4 514 /* Flush the last buffer: */
Chris@4 515 err = deflate(strm, Z_BLOCK);
Chris@4 516 }
Chris@4 517 if (s->level != level) {
Chris@4 518 s->level = level;
Chris@4 519 s->max_lazy_match = configuration_table[level].max_lazy;
Chris@4 520 s->good_match = configuration_table[level].good_length;
Chris@4 521 s->nice_match = configuration_table[level].nice_length;
Chris@4 522 s->max_chain_length = configuration_table[level].max_chain;
Chris@4 523 }
Chris@4 524 s->strategy = strategy;
Chris@4 525 return err;
Chris@4 526 }
Chris@4 527
Chris@4 528 /* ========================================================================= */
Chris@4 529 int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
Chris@4 530 z_streamp strm;
Chris@4 531 int good_length;
Chris@4 532 int max_lazy;
Chris@4 533 int nice_length;
Chris@4 534 int max_chain;
Chris@4 535 {
Chris@4 536 deflate_state *s;
Chris@4 537
Chris@4 538 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
Chris@4 539 s = strm->state;
Chris@4 540 s->good_match = good_length;
Chris@4 541 s->max_lazy_match = max_lazy;
Chris@4 542 s->nice_match = nice_length;
Chris@4 543 s->max_chain_length = max_chain;
Chris@4 544 return Z_OK;
Chris@4 545 }
Chris@4 546
Chris@4 547 /* =========================================================================
Chris@4 548 * For the default windowBits of 15 and memLevel of 8, this function returns
Chris@4 549 * a close to exact, as well as small, upper bound on the compressed size.
Chris@4 550 * They are coded as constants here for a reason--if the #define's are
Chris@4 551 * changed, then this function needs to be changed as well. The return
Chris@4 552 * value for 15 and 8 only works for those exact settings.
Chris@4 553 *
Chris@4 554 * For any setting other than those defaults for windowBits and memLevel,
Chris@4 555 * the value returned is a conservative worst case for the maximum expansion
Chris@4 556 * resulting from using fixed blocks instead of stored blocks, which deflate
Chris@4 557 * can emit on compressed data for some combinations of the parameters.
Chris@4 558 *
Chris@4 559 * This function could be more sophisticated to provide closer upper bounds for
Chris@4 560 * every combination of windowBits and memLevel. But even the conservative
Chris@4 561 * upper bound of about 14% expansion does not seem onerous for output buffer
Chris@4 562 * allocation.
Chris@4 563 */
Chris@4 564 uLong ZEXPORT deflateBound(strm, sourceLen)
Chris@4 565 z_streamp strm;
Chris@4 566 uLong sourceLen;
Chris@4 567 {
Chris@4 568 deflate_state *s;
Chris@4 569 uLong complen, wraplen;
Chris@4 570 Bytef *str;
Chris@4 571
Chris@4 572 /* conservative upper bound for compressed data */
Chris@4 573 complen = sourceLen +
Chris@4 574 ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
Chris@4 575
Chris@4 576 /* if can't get parameters, return conservative bound plus zlib wrapper */
Chris@4 577 if (strm == Z_NULL || strm->state == Z_NULL)
Chris@4 578 return complen + 6;
Chris@4 579
Chris@4 580 /* compute wrapper length */
Chris@4 581 s = strm->state;
Chris@4 582 switch (s->wrap) {
Chris@4 583 case 0: /* raw deflate */
Chris@4 584 wraplen = 0;
Chris@4 585 break;
Chris@4 586 case 1: /* zlib wrapper */
Chris@4 587 wraplen = 6 + (s->strstart ? 4 : 0);
Chris@4 588 break;
Chris@4 589 case 2: /* gzip wrapper */
Chris@4 590 wraplen = 18;
Chris@4 591 if (s->gzhead != Z_NULL) { /* user-supplied gzip header */
Chris@4 592 if (s->gzhead->extra != Z_NULL)
Chris@4 593 wraplen += 2 + s->gzhead->extra_len;
Chris@4 594 str = s->gzhead->name;
Chris@4 595 if (str != Z_NULL)
Chris@4 596 do {
Chris@4 597 wraplen++;
Chris@4 598 } while (*str++);
Chris@4 599 str = s->gzhead->comment;
Chris@4 600 if (str != Z_NULL)
Chris@4 601 do {
Chris@4 602 wraplen++;
Chris@4 603 } while (*str++);
Chris@4 604 if (s->gzhead->hcrc)
Chris@4 605 wraplen += 2;
Chris@4 606 }
Chris@4 607 break;
Chris@4 608 default: /* for compiler happiness */
Chris@4 609 wraplen = 6;
Chris@4 610 }
Chris@4 611
Chris@4 612 /* if not default parameters, return conservative bound */
Chris@4 613 if (s->w_bits != 15 || s->hash_bits != 8 + 7)
Chris@4 614 return complen + wraplen;
Chris@4 615
Chris@4 616 /* default settings: return tight bound for that case */
Chris@4 617 return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
Chris@4 618 (sourceLen >> 25) + 13 - 6 + wraplen;
Chris@4 619 }
Chris@4 620
Chris@4 621 /* =========================================================================
Chris@4 622 * Put a short in the pending buffer. The 16-bit value is put in MSB order.
Chris@4 623 * IN assertion: the stream state is correct and there is enough room in
Chris@4 624 * pending_buf.
Chris@4 625 */
Chris@4 626 local void putShortMSB (s, b)
Chris@4 627 deflate_state *s;
Chris@4 628 uInt b;
Chris@4 629 {
Chris@4 630 put_byte(s, (Byte)(b >> 8));
Chris@4 631 put_byte(s, (Byte)(b & 0xff));
Chris@4 632 }
Chris@4 633
Chris@4 634 /* =========================================================================
Chris@4 635 * Flush as much pending output as possible. All deflate() output goes
Chris@4 636 * through this function so some applications may wish to modify it
Chris@4 637 * to avoid allocating a large strm->next_out buffer and copying into it.
Chris@4 638 * (See also read_buf()).
Chris@4 639 */
Chris@4 640 local void flush_pending(strm)
Chris@4 641 z_streamp strm;
Chris@4 642 {
Chris@4 643 unsigned len;
Chris@4 644 deflate_state *s = strm->state;
Chris@4 645
Chris@4 646 _tr_flush_bits(s);
Chris@4 647 len = s->pending;
Chris@4 648 if (len > strm->avail_out) len = strm->avail_out;
Chris@4 649 if (len == 0) return;
Chris@4 650
Chris@4 651 zmemcpy(strm->next_out, s->pending_out, len);
Chris@4 652 strm->next_out += len;
Chris@4 653 s->pending_out += len;
Chris@4 654 strm->total_out += len;
Chris@4 655 strm->avail_out -= len;
Chris@4 656 s->pending -= len;
Chris@4 657 if (s->pending == 0) {
Chris@4 658 s->pending_out = s->pending_buf;
Chris@4 659 }
Chris@4 660 }
Chris@4 661
Chris@4 662 /* ========================================================================= */
Chris@4 663 int ZEXPORT deflate (strm, flush)
Chris@4 664 z_streamp strm;
Chris@4 665 int flush;
Chris@4 666 {
Chris@4 667 int old_flush; /* value of flush param for previous deflate call */
Chris@4 668 deflate_state *s;
Chris@4 669
Chris@4 670 if (strm == Z_NULL || strm->state == Z_NULL ||
Chris@4 671 flush > Z_BLOCK || flush < 0) {
Chris@4 672 return Z_STREAM_ERROR;
Chris@4 673 }
Chris@4 674 s = strm->state;
Chris@4 675
Chris@4 676 if (strm->next_out == Z_NULL ||
Chris@4 677 (strm->next_in == Z_NULL && strm->avail_in != 0) ||
Chris@4 678 (s->status == FINISH_STATE && flush != Z_FINISH)) {
Chris@4 679 ERR_RETURN(strm, Z_STREAM_ERROR);
Chris@4 680 }
Chris@4 681 if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
Chris@4 682
Chris@4 683 s->strm = strm; /* just in case */
Chris@4 684 old_flush = s->last_flush;
Chris@4 685 s->last_flush = flush;
Chris@4 686
Chris@4 687 /* Write the header */
Chris@4 688 if (s->status == INIT_STATE) {
Chris@4 689 #ifdef GZIP
Chris@4 690 if (s->wrap == 2) {
Chris@4 691 strm->adler = crc32(0L, Z_NULL, 0);
Chris@4 692 put_byte(s, 31);
Chris@4 693 put_byte(s, 139);
Chris@4 694 put_byte(s, 8);
Chris@4 695 if (s->gzhead == Z_NULL) {
Chris@4 696 put_byte(s, 0);
Chris@4 697 put_byte(s, 0);
Chris@4 698 put_byte(s, 0);
Chris@4 699 put_byte(s, 0);
Chris@4 700 put_byte(s, 0);
Chris@4 701 put_byte(s, s->level == 9 ? 2 :
Chris@4 702 (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
Chris@4 703 4 : 0));
Chris@4 704 put_byte(s, OS_CODE);
Chris@4 705 s->status = BUSY_STATE;
Chris@4 706 }
Chris@4 707 else {
Chris@4 708 put_byte(s, (s->gzhead->text ? 1 : 0) +
Chris@4 709 (s->gzhead->hcrc ? 2 : 0) +
Chris@4 710 (s->gzhead->extra == Z_NULL ? 0 : 4) +
Chris@4 711 (s->gzhead->name == Z_NULL ? 0 : 8) +
Chris@4 712 (s->gzhead->comment == Z_NULL ? 0 : 16)
Chris@4 713 );
Chris@4 714 put_byte(s, (Byte)(s->gzhead->time & 0xff));
Chris@4 715 put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
Chris@4 716 put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
Chris@4 717 put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
Chris@4 718 put_byte(s, s->level == 9 ? 2 :
Chris@4 719 (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
Chris@4 720 4 : 0));
Chris@4 721 put_byte(s, s->gzhead->os & 0xff);
Chris@4 722 if (s->gzhead->extra != Z_NULL) {
Chris@4 723 put_byte(s, s->gzhead->extra_len & 0xff);
Chris@4 724 put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
Chris@4 725 }
Chris@4 726 if (s->gzhead->hcrc)
Chris@4 727 strm->adler = crc32(strm->adler, s->pending_buf,
Chris@4 728 s->pending);
Chris@4 729 s->gzindex = 0;
Chris@4 730 s->status = EXTRA_STATE;
Chris@4 731 }
Chris@4 732 }
Chris@4 733 else
Chris@4 734 #endif
Chris@4 735 {
Chris@4 736 uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
Chris@4 737 uInt level_flags;
Chris@4 738
Chris@4 739 if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
Chris@4 740 level_flags = 0;
Chris@4 741 else if (s->level < 6)
Chris@4 742 level_flags = 1;
Chris@4 743 else if (s->level == 6)
Chris@4 744 level_flags = 2;
Chris@4 745 else
Chris@4 746 level_flags = 3;
Chris@4 747 header |= (level_flags << 6);
Chris@4 748 if (s->strstart != 0) header |= PRESET_DICT;
Chris@4 749 header += 31 - (header % 31);
Chris@4 750
Chris@4 751 s->status = BUSY_STATE;
Chris@4 752 putShortMSB(s, header);
Chris@4 753
Chris@4 754 /* Save the adler32 of the preset dictionary: */
Chris@4 755 if (s->strstart != 0) {
Chris@4 756 putShortMSB(s, (uInt)(strm->adler >> 16));
Chris@4 757 putShortMSB(s, (uInt)(strm->adler & 0xffff));
Chris@4 758 }
Chris@4 759 strm->adler = adler32(0L, Z_NULL, 0);
Chris@4 760 }
Chris@4 761 }
Chris@4 762 #ifdef GZIP
Chris@4 763 if (s->status == EXTRA_STATE) {
Chris@4 764 if (s->gzhead->extra != Z_NULL) {
Chris@4 765 uInt beg = s->pending; /* start of bytes to update crc */
Chris@4 766
Chris@4 767 while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {
Chris@4 768 if (s->pending == s->pending_buf_size) {
Chris@4 769 if (s->gzhead->hcrc && s->pending > beg)
Chris@4 770 strm->adler = crc32(strm->adler, s->pending_buf + beg,
Chris@4 771 s->pending - beg);
Chris@4 772 flush_pending(strm);
Chris@4 773 beg = s->pending;
Chris@4 774 if (s->pending == s->pending_buf_size)
Chris@4 775 break;
Chris@4 776 }
Chris@4 777 put_byte(s, s->gzhead->extra[s->gzindex]);
Chris@4 778 s->gzindex++;
Chris@4 779 }
Chris@4 780 if (s->gzhead->hcrc && s->pending > beg)
Chris@4 781 strm->adler = crc32(strm->adler, s->pending_buf + beg,
Chris@4 782 s->pending - beg);
Chris@4 783 if (s->gzindex == s->gzhead->extra_len) {
Chris@4 784 s->gzindex = 0;
Chris@4 785 s->status = NAME_STATE;
Chris@4 786 }
Chris@4 787 }
Chris@4 788 else
Chris@4 789 s->status = NAME_STATE;
Chris@4 790 }
Chris@4 791 if (s->status == NAME_STATE) {
Chris@4 792 if (s->gzhead->name != Z_NULL) {
Chris@4 793 uInt beg = s->pending; /* start of bytes to update crc */
Chris@4 794 int val;
Chris@4 795
Chris@4 796 do {
Chris@4 797 if (s->pending == s->pending_buf_size) {
Chris@4 798 if (s->gzhead->hcrc && s->pending > beg)
Chris@4 799 strm->adler = crc32(strm->adler, s->pending_buf + beg,
Chris@4 800 s->pending - beg);
Chris@4 801 flush_pending(strm);
Chris@4 802 beg = s->pending;
Chris@4 803 if (s->pending == s->pending_buf_size) {
Chris@4 804 val = 1;
Chris@4 805 break;
Chris@4 806 }
Chris@4 807 }
Chris@4 808 val = s->gzhead->name[s->gzindex++];
Chris@4 809 put_byte(s, val);
Chris@4 810 } while (val != 0);
Chris@4 811 if (s->gzhead->hcrc && s->pending > beg)
Chris@4 812 strm->adler = crc32(strm->adler, s->pending_buf + beg,
Chris@4 813 s->pending - beg);
Chris@4 814 if (val == 0) {
Chris@4 815 s->gzindex = 0;
Chris@4 816 s->status = COMMENT_STATE;
Chris@4 817 }
Chris@4 818 }
Chris@4 819 else
Chris@4 820 s->status = COMMENT_STATE;
Chris@4 821 }
Chris@4 822 if (s->status == COMMENT_STATE) {
Chris@4 823 if (s->gzhead->comment != Z_NULL) {
Chris@4 824 uInt beg = s->pending; /* start of bytes to update crc */
Chris@4 825 int val;
Chris@4 826
Chris@4 827 do {
Chris@4 828 if (s->pending == s->pending_buf_size) {
Chris@4 829 if (s->gzhead->hcrc && s->pending > beg)
Chris@4 830 strm->adler = crc32(strm->adler, s->pending_buf + beg,
Chris@4 831 s->pending - beg);
Chris@4 832 flush_pending(strm);
Chris@4 833 beg = s->pending;
Chris@4 834 if (s->pending == s->pending_buf_size) {
Chris@4 835 val = 1;
Chris@4 836 break;
Chris@4 837 }
Chris@4 838 }
Chris@4 839 val = s->gzhead->comment[s->gzindex++];
Chris@4 840 put_byte(s, val);
Chris@4 841 } while (val != 0);
Chris@4 842 if (s->gzhead->hcrc && s->pending > beg)
Chris@4 843 strm->adler = crc32(strm->adler, s->pending_buf + beg,
Chris@4 844 s->pending - beg);
Chris@4 845 if (val == 0)
Chris@4 846 s->status = HCRC_STATE;
Chris@4 847 }
Chris@4 848 else
Chris@4 849 s->status = HCRC_STATE;
Chris@4 850 }
Chris@4 851 if (s->status == HCRC_STATE) {
Chris@4 852 if (s->gzhead->hcrc) {
Chris@4 853 if (s->pending + 2 > s->pending_buf_size)
Chris@4 854 flush_pending(strm);
Chris@4 855 if (s->pending + 2 <= s->pending_buf_size) {
Chris@4 856 put_byte(s, (Byte)(strm->adler & 0xff));
Chris@4 857 put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
Chris@4 858 strm->adler = crc32(0L, Z_NULL, 0);
Chris@4 859 s->status = BUSY_STATE;
Chris@4 860 }
Chris@4 861 }
Chris@4 862 else
Chris@4 863 s->status = BUSY_STATE;
Chris@4 864 }
Chris@4 865 #endif
Chris@4 866
Chris@4 867 /* Flush as much pending output as possible */
Chris@4 868 if (s->pending != 0) {
Chris@4 869 flush_pending(strm);
Chris@4 870 if (strm->avail_out == 0) {
Chris@4 871 /* Since avail_out is 0, deflate will be called again with
Chris@4 872 * more output space, but possibly with both pending and
Chris@4 873 * avail_in equal to zero. There won't be anything to do,
Chris@4 874 * but this is not an error situation so make sure we
Chris@4 875 * return OK instead of BUF_ERROR at next call of deflate:
Chris@4 876 */
Chris@4 877 s->last_flush = -1;
Chris@4 878 return Z_OK;
Chris@4 879 }
Chris@4 880
Chris@4 881 /* Make sure there is something to do and avoid duplicate consecutive
Chris@4 882 * flushes. For repeated and useless calls with Z_FINISH, we keep
Chris@4 883 * returning Z_STREAM_END instead of Z_BUF_ERROR.
Chris@4 884 */
Chris@4 885 } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
Chris@4 886 flush != Z_FINISH) {
Chris@4 887 ERR_RETURN(strm, Z_BUF_ERROR);
Chris@4 888 }
Chris@4 889
Chris@4 890 /* User must not provide more input after the first FINISH: */
Chris@4 891 if (s->status == FINISH_STATE && strm->avail_in != 0) {
Chris@4 892 ERR_RETURN(strm, Z_BUF_ERROR);
Chris@4 893 }
Chris@4 894
Chris@4 895 /* Start a new block or continue the current one.
Chris@4 896 */
Chris@4 897 if (strm->avail_in != 0 || s->lookahead != 0 ||
Chris@4 898 (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
Chris@4 899 block_state bstate;
Chris@4 900
Chris@4 901 bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
Chris@4 902 (s->strategy == Z_RLE ? deflate_rle(s, flush) :
Chris@4 903 (*(configuration_table[s->level].func))(s, flush));
Chris@4 904
Chris@4 905 if (bstate == finish_started || bstate == finish_done) {
Chris@4 906 s->status = FINISH_STATE;
Chris@4 907 }
Chris@4 908 if (bstate == need_more || bstate == finish_started) {
Chris@4 909 if (strm->avail_out == 0) {
Chris@4 910 s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
Chris@4 911 }
Chris@4 912 return Z_OK;
Chris@4 913 /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
Chris@4 914 * of deflate should use the same flush parameter to make sure
Chris@4 915 * that the flush is complete. So we don't have to output an
Chris@4 916 * empty block here, this will be done at next call. This also
Chris@4 917 * ensures that for a very small output buffer, we emit at most
Chris@4 918 * one empty block.
Chris@4 919 */
Chris@4 920 }
Chris@4 921 if (bstate == block_done) {
Chris@4 922 if (flush == Z_PARTIAL_FLUSH) {
Chris@4 923 _tr_align(s);
Chris@4 924 } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
Chris@4 925 _tr_stored_block(s, (char*)0, 0L, 0);
Chris@4 926 /* For a full flush, this empty block will be recognized
Chris@4 927 * as a special marker by inflate_sync().
Chris@4 928 */
Chris@4 929 if (flush == Z_FULL_FLUSH) {
Chris@4 930 CLEAR_HASH(s); /* forget history */
Chris@4 931 if (s->lookahead == 0) {
Chris@4 932 s->strstart = 0;
Chris@4 933 s->block_start = 0L;
Chris@4 934 s->insert = 0;
Chris@4 935 }
Chris@4 936 }
Chris@4 937 }
Chris@4 938 flush_pending(strm);
Chris@4 939 if (strm->avail_out == 0) {
Chris@4 940 s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
Chris@4 941 return Z_OK;
Chris@4 942 }
Chris@4 943 }
Chris@4 944 }
Chris@4 945 Assert(strm->avail_out > 0, "bug2");
Chris@4 946
Chris@4 947 if (flush != Z_FINISH) return Z_OK;
Chris@4 948 if (s->wrap <= 0) return Z_STREAM_END;
Chris@4 949
Chris@4 950 /* Write the trailer */
Chris@4 951 #ifdef GZIP
Chris@4 952 if (s->wrap == 2) {
Chris@4 953 put_byte(s, (Byte)(strm->adler & 0xff));
Chris@4 954 put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
Chris@4 955 put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
Chris@4 956 put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
Chris@4 957 put_byte(s, (Byte)(strm->total_in & 0xff));
Chris@4 958 put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
Chris@4 959 put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
Chris@4 960 put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
Chris@4 961 }
Chris@4 962 else
Chris@4 963 #endif
Chris@4 964 {
Chris@4 965 putShortMSB(s, (uInt)(strm->adler >> 16));
Chris@4 966 putShortMSB(s, (uInt)(strm->adler & 0xffff));
Chris@4 967 }
Chris@4 968 flush_pending(strm);
Chris@4 969 /* If avail_out is zero, the application will call deflate again
Chris@4 970 * to flush the rest.
Chris@4 971 */
Chris@4 972 if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
Chris@4 973 return s->pending != 0 ? Z_OK : Z_STREAM_END;
Chris@4 974 }
Chris@4 975
Chris@4 976 /* ========================================================================= */
Chris@4 977 int ZEXPORT deflateEnd (strm)
Chris@4 978 z_streamp strm;
Chris@4 979 {
Chris@4 980 int status;
Chris@4 981
Chris@4 982 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
Chris@4 983
Chris@4 984 status = strm->state->status;
Chris@4 985 if (status != INIT_STATE &&
Chris@4 986 status != EXTRA_STATE &&
Chris@4 987 status != NAME_STATE &&
Chris@4 988 status != COMMENT_STATE &&
Chris@4 989 status != HCRC_STATE &&
Chris@4 990 status != BUSY_STATE &&
Chris@4 991 status != FINISH_STATE) {
Chris@4 992 return Z_STREAM_ERROR;
Chris@4 993 }
Chris@4 994
Chris@4 995 /* Deallocate in reverse order of allocations: */
Chris@4 996 TRY_FREE(strm, strm->state->pending_buf);
Chris@4 997 TRY_FREE(strm, strm->state->head);
Chris@4 998 TRY_FREE(strm, strm->state->prev);
Chris@4 999 TRY_FREE(strm, strm->state->window);
Chris@4 1000
Chris@4 1001 ZFREE(strm, strm->state);
Chris@4 1002 strm->state = Z_NULL;
Chris@4 1003
Chris@4 1004 return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
Chris@4 1005 }
Chris@4 1006
Chris@4 1007 /* =========================================================================
Chris@4 1008 * Copy the source state to the destination state.
Chris@4 1009 * To simplify the source, this is not supported for 16-bit MSDOS (which
Chris@4 1010 * doesn't have enough memory anyway to duplicate compression states).
Chris@4 1011 */
Chris@4 1012 int ZEXPORT deflateCopy (dest, source)
Chris@4 1013 z_streamp dest;
Chris@4 1014 z_streamp source;
Chris@4 1015 {
Chris@4 1016 #ifdef MAXSEG_64K
Chris@4 1017 return Z_STREAM_ERROR;
Chris@4 1018 #else
Chris@4 1019 deflate_state *ds;
Chris@4 1020 deflate_state *ss;
Chris@4 1021 ushf *overlay;
Chris@4 1022
Chris@4 1023
Chris@4 1024 if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
Chris@4 1025 return Z_STREAM_ERROR;
Chris@4 1026 }
Chris@4 1027
Chris@4 1028 ss = source->state;
Chris@4 1029
Chris@4 1030 zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
Chris@4 1031
Chris@4 1032 ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
Chris@4 1033 if (ds == Z_NULL) return Z_MEM_ERROR;
Chris@4 1034 dest->state = (struct internal_state FAR *) ds;
Chris@4 1035 zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
Chris@4 1036 ds->strm = dest;
Chris@4 1037
Chris@4 1038 ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
Chris@4 1039 ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
Chris@4 1040 ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
Chris@4 1041 overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
Chris@4 1042 ds->pending_buf = (uchf *) overlay;
Chris@4 1043
Chris@4 1044 if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
Chris@4 1045 ds->pending_buf == Z_NULL) {
Chris@4 1046 deflateEnd (dest);
Chris@4 1047 return Z_MEM_ERROR;
Chris@4 1048 }
Chris@4 1049 /* following zmemcpy do not work for 16-bit MSDOS */
Chris@4 1050 zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
Chris@4 1051 zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
Chris@4 1052 zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
Chris@4 1053 zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
Chris@4 1054
Chris@4 1055 ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
Chris@4 1056 ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
Chris@4 1057 ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
Chris@4 1058
Chris@4 1059 ds->l_desc.dyn_tree = ds->dyn_ltree;
Chris@4 1060 ds->d_desc.dyn_tree = ds->dyn_dtree;
Chris@4 1061 ds->bl_desc.dyn_tree = ds->bl_tree;
Chris@4 1062
Chris@4 1063 return Z_OK;
Chris@4 1064 #endif /* MAXSEG_64K */
Chris@4 1065 }
Chris@4 1066
Chris@4 1067 /* ===========================================================================
Chris@4 1068 * Read a new buffer from the current input stream, update the adler32
Chris@4 1069 * and total number of bytes read. All deflate() input goes through
Chris@4 1070 * this function so some applications may wish to modify it to avoid
Chris@4 1071 * allocating a large strm->next_in buffer and copying from it.
Chris@4 1072 * (See also flush_pending()).
Chris@4 1073 */
Chris@4 1074 local int read_buf(strm, buf, size)
Chris@4 1075 z_streamp strm;
Chris@4 1076 Bytef *buf;
Chris@4 1077 unsigned size;
Chris@4 1078 {
Chris@4 1079 unsigned len = strm->avail_in;
Chris@4 1080
Chris@4 1081 if (len > size) len = size;
Chris@4 1082 if (len == 0) return 0;
Chris@4 1083
Chris@4 1084 strm->avail_in -= len;
Chris@4 1085
Chris@4 1086 zmemcpy(buf, strm->next_in, len);
Chris@4 1087 if (strm->state->wrap == 1) {
Chris@4 1088 strm->adler = adler32(strm->adler, buf, len);
Chris@4 1089 }
Chris@4 1090 #ifdef GZIP
Chris@4 1091 else if (strm->state->wrap == 2) {
Chris@4 1092 strm->adler = crc32(strm->adler, buf, len);
Chris@4 1093 }
Chris@4 1094 #endif
Chris@4 1095 strm->next_in += len;
Chris@4 1096 strm->total_in += len;
Chris@4 1097
Chris@4 1098 return (int)len;
Chris@4 1099 }
Chris@4 1100
Chris@4 1101 /* ===========================================================================
Chris@4 1102 * Initialize the "longest match" routines for a new zlib stream
Chris@4 1103 */
Chris@4 1104 local void lm_init (s)
Chris@4 1105 deflate_state *s;
Chris@4 1106 {
Chris@4 1107 s->window_size = (ulg)2L*s->w_size;
Chris@4 1108
Chris@4 1109 CLEAR_HASH(s);
Chris@4 1110
Chris@4 1111 /* Set the default configuration parameters:
Chris@4 1112 */
Chris@4 1113 s->max_lazy_match = configuration_table[s->level].max_lazy;
Chris@4 1114 s->good_match = configuration_table[s->level].good_length;
Chris@4 1115 s->nice_match = configuration_table[s->level].nice_length;
Chris@4 1116 s->max_chain_length = configuration_table[s->level].max_chain;
Chris@4 1117
Chris@4 1118 s->strstart = 0;
Chris@4 1119 s->block_start = 0L;
Chris@4 1120 s->lookahead = 0;
Chris@4 1121 s->insert = 0;
Chris@4 1122 s->match_length = s->prev_length = MIN_MATCH-1;
Chris@4 1123 s->match_available = 0;
Chris@4 1124 s->ins_h = 0;
Chris@4 1125 #ifndef FASTEST
Chris@4 1126 #ifdef ASMV
Chris@4 1127 match_init(); /* initialize the asm code */
Chris@4 1128 #endif
Chris@4 1129 #endif
Chris@4 1130 }
Chris@4 1131
Chris@4 1132 #ifndef FASTEST
Chris@4 1133 /* ===========================================================================
Chris@4 1134 * Set match_start to the longest match starting at the given string and
Chris@4 1135 * return its length. Matches shorter or equal to prev_length are discarded,
Chris@4 1136 * in which case the result is equal to prev_length and match_start is
Chris@4 1137 * garbage.
Chris@4 1138 * IN assertions: cur_match is the head of the hash chain for the current
Chris@4 1139 * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
Chris@4 1140 * OUT assertion: the match length is not greater than s->lookahead.
Chris@4 1141 */
Chris@4 1142 #ifndef ASMV
Chris@4 1143 /* For 80x86 and 680x0, an optimized version will be provided in match.asm or
Chris@4 1144 * match.S. The code will be functionally equivalent.
Chris@4 1145 */
Chris@4 1146 local uInt longest_match(s, cur_match)
Chris@4 1147 deflate_state *s;
Chris@4 1148 IPos cur_match; /* current match */
Chris@4 1149 {
Chris@4 1150 unsigned chain_length = s->max_chain_length;/* max hash chain length */
Chris@4 1151 register Bytef *scan = s->window + s->strstart; /* current string */
Chris@4 1152 register Bytef *match; /* matched string */
Chris@4 1153 register int len; /* length of current match */
Chris@4 1154 int best_len = s->prev_length; /* best match length so far */
Chris@4 1155 int nice_match = s->nice_match; /* stop if match long enough */
Chris@4 1156 IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
Chris@4 1157 s->strstart - (IPos)MAX_DIST(s) : NIL;
Chris@4 1158 /* Stop when cur_match becomes <= limit. To simplify the code,
Chris@4 1159 * we prevent matches with the string of window index 0.
Chris@4 1160 */
Chris@4 1161 Posf *prev = s->prev;
Chris@4 1162 uInt wmask = s->w_mask;
Chris@4 1163
Chris@4 1164 #ifdef UNALIGNED_OK
Chris@4 1165 /* Compare two bytes at a time. Note: this is not always beneficial.
Chris@4 1166 * Try with and without -DUNALIGNED_OK to check.
Chris@4 1167 */
Chris@4 1168 register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
Chris@4 1169 register ush scan_start = *(ushf*)scan;
Chris@4 1170 register ush scan_end = *(ushf*)(scan+best_len-1);
Chris@4 1171 #else
Chris@4 1172 register Bytef *strend = s->window + s->strstart + MAX_MATCH;
Chris@4 1173 register Byte scan_end1 = scan[best_len-1];
Chris@4 1174 register Byte scan_end = scan[best_len];
Chris@4 1175 #endif
Chris@4 1176
Chris@4 1177 /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
Chris@4 1178 * It is easy to get rid of this optimization if necessary.
Chris@4 1179 */
Chris@4 1180 Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
Chris@4 1181
Chris@4 1182 /* Do not waste too much time if we already have a good match: */
Chris@4 1183 if (s->prev_length >= s->good_match) {
Chris@4 1184 chain_length >>= 2;
Chris@4 1185 }
Chris@4 1186 /* Do not look for matches beyond the end of the input. This is necessary
Chris@4 1187 * to make deflate deterministic.
Chris@4 1188 */
Chris@4 1189 if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
Chris@4 1190
Chris@4 1191 Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
Chris@4 1192
Chris@4 1193 do {
Chris@4 1194 Assert(cur_match < s->strstart, "no future");
Chris@4 1195 match = s->window + cur_match;
Chris@4 1196
Chris@4 1197 /* Skip to next match if the match length cannot increase
Chris@4 1198 * or if the match length is less than 2. Note that the checks below
Chris@4 1199 * for insufficient lookahead only occur occasionally for performance
Chris@4 1200 * reasons. Therefore uninitialized memory will be accessed, and
Chris@4 1201 * conditional jumps will be made that depend on those values.
Chris@4 1202 * However the length of the match is limited to the lookahead, so
Chris@4 1203 * the output of deflate is not affected by the uninitialized values.
Chris@4 1204 */
Chris@4 1205 #if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
Chris@4 1206 /* This code assumes sizeof(unsigned short) == 2. Do not use
Chris@4 1207 * UNALIGNED_OK if your compiler uses a different size.
Chris@4 1208 */
Chris@4 1209 if (*(ushf*)(match+best_len-1) != scan_end ||
Chris@4 1210 *(ushf*)match != scan_start) continue;
Chris@4 1211
Chris@4 1212 /* It is not necessary to compare scan[2] and match[2] since they are
Chris@4 1213 * always equal when the other bytes match, given that the hash keys
Chris@4 1214 * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
Chris@4 1215 * strstart+3, +5, ... up to strstart+257. We check for insufficient
Chris@4 1216 * lookahead only every 4th comparison; the 128th check will be made
Chris@4 1217 * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
Chris@4 1218 * necessary to put more guard bytes at the end of the window, or
Chris@4 1219 * to check more often for insufficient lookahead.
Chris@4 1220 */
Chris@4 1221 Assert(scan[2] == match[2], "scan[2]?");
Chris@4 1222 scan++, match++;
Chris@4 1223 do {
Chris@4 1224 } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
Chris@4 1225 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
Chris@4 1226 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
Chris@4 1227 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
Chris@4 1228 scan < strend);
Chris@4 1229 /* The funny "do {}" generates better code on most compilers */
Chris@4 1230
Chris@4 1231 /* Here, scan <= window+strstart+257 */
Chris@4 1232 Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
Chris@4 1233 if (*scan == *match) scan++;
Chris@4 1234
Chris@4 1235 len = (MAX_MATCH - 1) - (int)(strend-scan);
Chris@4 1236 scan = strend - (MAX_MATCH-1);
Chris@4 1237
Chris@4 1238 #else /* UNALIGNED_OK */
Chris@4 1239
Chris@4 1240 if (match[best_len] != scan_end ||
Chris@4 1241 match[best_len-1] != scan_end1 ||
Chris@4 1242 *match != *scan ||
Chris@4 1243 *++match != scan[1]) continue;
Chris@4 1244
Chris@4 1245 /* The check at best_len-1 can be removed because it will be made
Chris@4 1246 * again later. (This heuristic is not always a win.)
Chris@4 1247 * It is not necessary to compare scan[2] and match[2] since they
Chris@4 1248 * are always equal when the other bytes match, given that
Chris@4 1249 * the hash keys are equal and that HASH_BITS >= 8.
Chris@4 1250 */
Chris@4 1251 scan += 2, match++;
Chris@4 1252 Assert(*scan == *match, "match[2]?");
Chris@4 1253
Chris@4 1254 /* We check for insufficient lookahead only every 8th comparison;
Chris@4 1255 * the 256th check will be made at strstart+258.
Chris@4 1256 */
Chris@4 1257 do {
Chris@4 1258 } while (*++scan == *++match && *++scan == *++match &&
Chris@4 1259 *++scan == *++match && *++scan == *++match &&
Chris@4 1260 *++scan == *++match && *++scan == *++match &&
Chris@4 1261 *++scan == *++match && *++scan == *++match &&
Chris@4 1262 scan < strend);
Chris@4 1263
Chris@4 1264 Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
Chris@4 1265
Chris@4 1266 len = MAX_MATCH - (int)(strend - scan);
Chris@4 1267 scan = strend - MAX_MATCH;
Chris@4 1268
Chris@4 1269 #endif /* UNALIGNED_OK */
Chris@4 1270
Chris@4 1271 if (len > best_len) {
Chris@4 1272 s->match_start = cur_match;
Chris@4 1273 best_len = len;
Chris@4 1274 if (len >= nice_match) break;
Chris@4 1275 #ifdef UNALIGNED_OK
Chris@4 1276 scan_end = *(ushf*)(scan+best_len-1);
Chris@4 1277 #else
Chris@4 1278 scan_end1 = scan[best_len-1];
Chris@4 1279 scan_end = scan[best_len];
Chris@4 1280 #endif
Chris@4 1281 }
Chris@4 1282 } while ((cur_match = prev[cur_match & wmask]) > limit
Chris@4 1283 && --chain_length != 0);
Chris@4 1284
Chris@4 1285 if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
Chris@4 1286 return s->lookahead;
Chris@4 1287 }
Chris@4 1288 #endif /* ASMV */
Chris@4 1289
Chris@4 1290 #else /* FASTEST */
Chris@4 1291
Chris@4 1292 /* ---------------------------------------------------------------------------
Chris@4 1293 * Optimized version for FASTEST only
Chris@4 1294 */
Chris@4 1295 local uInt longest_match(s, cur_match)
Chris@4 1296 deflate_state *s;
Chris@4 1297 IPos cur_match; /* current match */
Chris@4 1298 {
Chris@4 1299 register Bytef *scan = s->window + s->strstart; /* current string */
Chris@4 1300 register Bytef *match; /* matched string */
Chris@4 1301 register int len; /* length of current match */
Chris@4 1302 register Bytef *strend = s->window + s->strstart + MAX_MATCH;
Chris@4 1303
Chris@4 1304 /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
Chris@4 1305 * It is easy to get rid of this optimization if necessary.
Chris@4 1306 */
Chris@4 1307 Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
Chris@4 1308
Chris@4 1309 Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
Chris@4 1310
Chris@4 1311 Assert(cur_match < s->strstart, "no future");
Chris@4 1312
Chris@4 1313 match = s->window + cur_match;
Chris@4 1314
Chris@4 1315 /* Return failure if the match length is less than 2:
Chris@4 1316 */
Chris@4 1317 if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
Chris@4 1318
Chris@4 1319 /* The check at best_len-1 can be removed because it will be made
Chris@4 1320 * again later. (This heuristic is not always a win.)
Chris@4 1321 * It is not necessary to compare scan[2] and match[2] since they
Chris@4 1322 * are always equal when the other bytes match, given that
Chris@4 1323 * the hash keys are equal and that HASH_BITS >= 8.
Chris@4 1324 */
Chris@4 1325 scan += 2, match += 2;
Chris@4 1326 Assert(*scan == *match, "match[2]?");
Chris@4 1327
Chris@4 1328 /* We check for insufficient lookahead only every 8th comparison;
Chris@4 1329 * the 256th check will be made at strstart+258.
Chris@4 1330 */
Chris@4 1331 do {
Chris@4 1332 } while (*++scan == *++match && *++scan == *++match &&
Chris@4 1333 *++scan == *++match && *++scan == *++match &&
Chris@4 1334 *++scan == *++match && *++scan == *++match &&
Chris@4 1335 *++scan == *++match && *++scan == *++match &&
Chris@4 1336 scan < strend);
Chris@4 1337
Chris@4 1338 Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
Chris@4 1339
Chris@4 1340 len = MAX_MATCH - (int)(strend - scan);
Chris@4 1341
Chris@4 1342 if (len < MIN_MATCH) return MIN_MATCH - 1;
Chris@4 1343
Chris@4 1344 s->match_start = cur_match;
Chris@4 1345 return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
Chris@4 1346 }
Chris@4 1347
Chris@4 1348 #endif /* FASTEST */
Chris@4 1349
Chris@4 1350 #ifdef DEBUG
Chris@4 1351 /* ===========================================================================
Chris@4 1352 * Check that the match at match_start is indeed a match.
Chris@4 1353 */
Chris@4 1354 local void check_match(s, start, match, length)
Chris@4 1355 deflate_state *s;
Chris@4 1356 IPos start, match;
Chris@4 1357 int length;
Chris@4 1358 {
Chris@4 1359 /* check that the match is indeed a match */
Chris@4 1360 if (zmemcmp(s->window + match,
Chris@4 1361 s->window + start, length) != EQUAL) {
Chris@4 1362 fprintf(stderr, " start %u, match %u, length %d\n",
Chris@4 1363 start, match, length);
Chris@4 1364 do {
Chris@4 1365 fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
Chris@4 1366 } while (--length != 0);
Chris@4 1367 z_error("invalid match");
Chris@4 1368 }
Chris@4 1369 if (z_verbose > 1) {
Chris@4 1370 fprintf(stderr,"\\[%d,%d]", start-match, length);
Chris@4 1371 do { putc(s->window[start++], stderr); } while (--length != 0);
Chris@4 1372 }
Chris@4 1373 }
Chris@4 1374 #else
Chris@4 1375 # define check_match(s, start, match, length)
Chris@4 1376 #endif /* DEBUG */
Chris@4 1377
Chris@4 1378 /* ===========================================================================
Chris@4 1379 * Fill the window when the lookahead becomes insufficient.
Chris@4 1380 * Updates strstart and lookahead.
Chris@4 1381 *
Chris@4 1382 * IN assertion: lookahead < MIN_LOOKAHEAD
Chris@4 1383 * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
Chris@4 1384 * At least one byte has been read, or avail_in == 0; reads are
Chris@4 1385 * performed for at least two bytes (required for the zip translate_eol
Chris@4 1386 * option -- not supported here).
Chris@4 1387 */
Chris@4 1388 local void fill_window(s)
Chris@4 1389 deflate_state *s;
Chris@4 1390 {
Chris@4 1391 register unsigned n, m;
Chris@4 1392 register Posf *p;
Chris@4 1393 unsigned more; /* Amount of free space at the end of the window. */
Chris@4 1394 uInt wsize = s->w_size;
Chris@4 1395
Chris@4 1396 Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
Chris@4 1397
Chris@4 1398 do {
Chris@4 1399 more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
Chris@4 1400
Chris@4 1401 /* Deal with !@#$% 64K limit: */
Chris@4 1402 if (sizeof(int) <= 2) {
Chris@4 1403 if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
Chris@4 1404 more = wsize;
Chris@4 1405
Chris@4 1406 } else if (more == (unsigned)(-1)) {
Chris@4 1407 /* Very unlikely, but possible on 16 bit machine if
Chris@4 1408 * strstart == 0 && lookahead == 1 (input done a byte at time)
Chris@4 1409 */
Chris@4 1410 more--;
Chris@4 1411 }
Chris@4 1412 }
Chris@4 1413
Chris@4 1414 /* If the window is almost full and there is insufficient lookahead,
Chris@4 1415 * move the upper half to the lower one to make room in the upper half.
Chris@4 1416 */
Chris@4 1417 if (s->strstart >= wsize+MAX_DIST(s)) {
Chris@4 1418
Chris@4 1419 zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
Chris@4 1420 s->match_start -= wsize;
Chris@4 1421 s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
Chris@4 1422 s->block_start -= (long) wsize;
Chris@4 1423
Chris@4 1424 /* Slide the hash table (could be avoided with 32 bit values
Chris@4 1425 at the expense of memory usage). We slide even when level == 0
Chris@4 1426 to keep the hash table consistent if we switch back to level > 0
Chris@4 1427 later. (Using level 0 permanently is not an optimal usage of
Chris@4 1428 zlib, so we don't care about this pathological case.)
Chris@4 1429 */
Chris@4 1430 n = s->hash_size;
Chris@4 1431 p = &s->head[n];
Chris@4 1432 do {
Chris@4 1433 m = *--p;
Chris@4 1434 *p = (Pos)(m >= wsize ? m-wsize : NIL);
Chris@4 1435 } while (--n);
Chris@4 1436
Chris@4 1437 n = wsize;
Chris@4 1438 #ifndef FASTEST
Chris@4 1439 p = &s->prev[n];
Chris@4 1440 do {
Chris@4 1441 m = *--p;
Chris@4 1442 *p = (Pos)(m >= wsize ? m-wsize : NIL);
Chris@4 1443 /* If n is not on any hash chain, prev[n] is garbage but
Chris@4 1444 * its value will never be used.
Chris@4 1445 */
Chris@4 1446 } while (--n);
Chris@4 1447 #endif
Chris@4 1448 more += wsize;
Chris@4 1449 }
Chris@4 1450 if (s->strm->avail_in == 0) break;
Chris@4 1451
Chris@4 1452 /* If there was no sliding:
Chris@4 1453 * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
Chris@4 1454 * more == window_size - lookahead - strstart
Chris@4 1455 * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
Chris@4 1456 * => more >= window_size - 2*WSIZE + 2
Chris@4 1457 * In the BIG_MEM or MMAP case (not yet supported),
Chris@4 1458 * window_size == input_size + MIN_LOOKAHEAD &&
Chris@4 1459 * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
Chris@4 1460 * Otherwise, window_size == 2*WSIZE so more >= 2.
Chris@4 1461 * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
Chris@4 1462 */
Chris@4 1463 Assert(more >= 2, "more < 2");
Chris@4 1464
Chris@4 1465 n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
Chris@4 1466 s->lookahead += n;
Chris@4 1467
Chris@4 1468 /* Initialize the hash value now that we have some input: */
Chris@4 1469 if (s->lookahead + s->insert >= MIN_MATCH) {
Chris@4 1470 uInt str = s->strstart - s->insert;
Chris@4 1471 s->ins_h = s->window[str];
Chris@4 1472 UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
Chris@4 1473 #if MIN_MATCH != 3
Chris@4 1474 Call UPDATE_HASH() MIN_MATCH-3 more times
Chris@4 1475 #endif
Chris@4 1476 while (s->insert) {
Chris@4 1477 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
Chris@4 1478 #ifndef FASTEST
Chris@4 1479 s->prev[str & s->w_mask] = s->head[s->ins_h];
Chris@4 1480 #endif
Chris@4 1481 s->head[s->ins_h] = (Pos)str;
Chris@4 1482 str++;
Chris@4 1483 s->insert--;
Chris@4 1484 if (s->lookahead + s->insert < MIN_MATCH)
Chris@4 1485 break;
Chris@4 1486 }
Chris@4 1487 }
Chris@4 1488 /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
Chris@4 1489 * but this is not important since only literal bytes will be emitted.
Chris@4 1490 */
Chris@4 1491
Chris@4 1492 } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
Chris@4 1493
Chris@4 1494 /* If the WIN_INIT bytes after the end of the current data have never been
Chris@4 1495 * written, then zero those bytes in order to avoid memory check reports of
Chris@4 1496 * the use of uninitialized (or uninitialised as Julian writes) bytes by
Chris@4 1497 * the longest match routines. Update the high water mark for the next
Chris@4 1498 * time through here. WIN_INIT is set to MAX_MATCH since the longest match
Chris@4 1499 * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
Chris@4 1500 */
Chris@4 1501 if (s->high_water < s->window_size) {
Chris@4 1502 ulg curr = s->strstart + (ulg)(s->lookahead);
Chris@4 1503 ulg init;
Chris@4 1504
Chris@4 1505 if (s->high_water < curr) {
Chris@4 1506 /* Previous high water mark below current data -- zero WIN_INIT
Chris@4 1507 * bytes or up to end of window, whichever is less.
Chris@4 1508 */
Chris@4 1509 init = s->window_size - curr;
Chris@4 1510 if (init > WIN_INIT)
Chris@4 1511 init = WIN_INIT;
Chris@4 1512 zmemzero(s->window + curr, (unsigned)init);
Chris@4 1513 s->high_water = curr + init;
Chris@4 1514 }
Chris@4 1515 else if (s->high_water < (ulg)curr + WIN_INIT) {
Chris@4 1516 /* High water mark at or above current data, but below current data
Chris@4 1517 * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
Chris@4 1518 * to end of window, whichever is less.
Chris@4 1519 */
Chris@4 1520 init = (ulg)curr + WIN_INIT - s->high_water;
Chris@4 1521 if (init > s->window_size - s->high_water)
Chris@4 1522 init = s->window_size - s->high_water;
Chris@4 1523 zmemzero(s->window + s->high_water, (unsigned)init);
Chris@4 1524 s->high_water += init;
Chris@4 1525 }
Chris@4 1526 }
Chris@4 1527
Chris@4 1528 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
Chris@4 1529 "not enough room for search");
Chris@4 1530 }
Chris@4 1531
Chris@4 1532 /* ===========================================================================
Chris@4 1533 * Flush the current block, with given end-of-file flag.
Chris@4 1534 * IN assertion: strstart is set to the end of the current match.
Chris@4 1535 */
Chris@4 1536 #define FLUSH_BLOCK_ONLY(s, last) { \
Chris@4 1537 _tr_flush_block(s, (s->block_start >= 0L ? \
Chris@4 1538 (charf *)&s->window[(unsigned)s->block_start] : \
Chris@4 1539 (charf *)Z_NULL), \
Chris@4 1540 (ulg)((long)s->strstart - s->block_start), \
Chris@4 1541 (last)); \
Chris@4 1542 s->block_start = s->strstart; \
Chris@4 1543 flush_pending(s->strm); \
Chris@4 1544 Tracev((stderr,"[FLUSH]")); \
Chris@4 1545 }
Chris@4 1546
Chris@4 1547 /* Same but force premature exit if necessary. */
Chris@4 1548 #define FLUSH_BLOCK(s, last) { \
Chris@4 1549 FLUSH_BLOCK_ONLY(s, last); \
Chris@4 1550 if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
Chris@4 1551 }
Chris@4 1552
Chris@4 1553 /* ===========================================================================
Chris@4 1554 * Copy without compression as much as possible from the input stream, return
Chris@4 1555 * the current block state.
Chris@4 1556 * This function does not insert new strings in the dictionary since
Chris@4 1557 * uncompressible data is probably not useful. This function is used
Chris@4 1558 * only for the level=0 compression option.
Chris@4 1559 * NOTE: this function should be optimized to avoid extra copying from
Chris@4 1560 * window to pending_buf.
Chris@4 1561 */
Chris@4 1562 local block_state deflate_stored(s, flush)
Chris@4 1563 deflate_state *s;
Chris@4 1564 int flush;
Chris@4 1565 {
Chris@4 1566 /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
Chris@4 1567 * to pending_buf_size, and each stored block has a 5 byte header:
Chris@4 1568 */
Chris@4 1569 ulg max_block_size = 0xffff;
Chris@4 1570 ulg max_start;
Chris@4 1571
Chris@4 1572 if (max_block_size > s->pending_buf_size - 5) {
Chris@4 1573 max_block_size = s->pending_buf_size - 5;
Chris@4 1574 }
Chris@4 1575
Chris@4 1576 /* Copy as much as possible from input to output: */
Chris@4 1577 for (;;) {
Chris@4 1578 /* Fill the window as much as possible: */
Chris@4 1579 if (s->lookahead <= 1) {
Chris@4 1580
Chris@4 1581 Assert(s->strstart < s->w_size+MAX_DIST(s) ||
Chris@4 1582 s->block_start >= (long)s->w_size, "slide too late");
Chris@4 1583
Chris@4 1584 fill_window(s);
Chris@4 1585 if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
Chris@4 1586
Chris@4 1587 if (s->lookahead == 0) break; /* flush the current block */
Chris@4 1588 }
Chris@4 1589 Assert(s->block_start >= 0L, "block gone");
Chris@4 1590
Chris@4 1591 s->strstart += s->lookahead;
Chris@4 1592 s->lookahead = 0;
Chris@4 1593
Chris@4 1594 /* Emit a stored block if pending_buf will be full: */
Chris@4 1595 max_start = s->block_start + max_block_size;
Chris@4 1596 if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
Chris@4 1597 /* strstart == 0 is possible when wraparound on 16-bit machine */
Chris@4 1598 s->lookahead = (uInt)(s->strstart - max_start);
Chris@4 1599 s->strstart = (uInt)max_start;
Chris@4 1600 FLUSH_BLOCK(s, 0);
Chris@4 1601 }
Chris@4 1602 /* Flush if we may have to slide, otherwise block_start may become
Chris@4 1603 * negative and the data will be gone:
Chris@4 1604 */
Chris@4 1605 if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
Chris@4 1606 FLUSH_BLOCK(s, 0);
Chris@4 1607 }
Chris@4 1608 }
Chris@4 1609 s->insert = 0;
Chris@4 1610 if (flush == Z_FINISH) {
Chris@4 1611 FLUSH_BLOCK(s, 1);
Chris@4 1612 return finish_done;
Chris@4 1613 }
Chris@4 1614 if ((long)s->strstart > s->block_start)
Chris@4 1615 FLUSH_BLOCK(s, 0);
Chris@4 1616 return block_done;
Chris@4 1617 }
Chris@4 1618
Chris@4 1619 /* ===========================================================================
Chris@4 1620 * Compress as much as possible from the input stream, return the current
Chris@4 1621 * block state.
Chris@4 1622 * This function does not perform lazy evaluation of matches and inserts
Chris@4 1623 * new strings in the dictionary only for unmatched strings or for short
Chris@4 1624 * matches. It is used only for the fast compression options.
Chris@4 1625 */
Chris@4 1626 local block_state deflate_fast(s, flush)
Chris@4 1627 deflate_state *s;
Chris@4 1628 int flush;
Chris@4 1629 {
Chris@4 1630 IPos hash_head; /* head of the hash chain */
Chris@4 1631 int bflush; /* set if current block must be flushed */
Chris@4 1632
Chris@4 1633 for (;;) {
Chris@4 1634 /* Make sure that we always have enough lookahead, except
Chris@4 1635 * at the end of the input file. We need MAX_MATCH bytes
Chris@4 1636 * for the next match, plus MIN_MATCH bytes to insert the
Chris@4 1637 * string following the next match.
Chris@4 1638 */
Chris@4 1639 if (s->lookahead < MIN_LOOKAHEAD) {
Chris@4 1640 fill_window(s);
Chris@4 1641 if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
Chris@4 1642 return need_more;
Chris@4 1643 }
Chris@4 1644 if (s->lookahead == 0) break; /* flush the current block */
Chris@4 1645 }
Chris@4 1646
Chris@4 1647 /* Insert the string window[strstart .. strstart+2] in the
Chris@4 1648 * dictionary, and set hash_head to the head of the hash chain:
Chris@4 1649 */
Chris@4 1650 hash_head = NIL;
Chris@4 1651 if (s->lookahead >= MIN_MATCH) {
Chris@4 1652 INSERT_STRING(s, s->strstart, hash_head);
Chris@4 1653 }
Chris@4 1654
Chris@4 1655 /* Find the longest match, discarding those <= prev_length.
Chris@4 1656 * At this point we have always match_length < MIN_MATCH
Chris@4 1657 */
Chris@4 1658 if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
Chris@4 1659 /* To simplify the code, we prevent matches with the string
Chris@4 1660 * of window index 0 (in particular we have to avoid a match
Chris@4 1661 * of the string with itself at the start of the input file).
Chris@4 1662 */
Chris@4 1663 s->match_length = longest_match (s, hash_head);
Chris@4 1664 /* longest_match() sets match_start */
Chris@4 1665 }
Chris@4 1666 if (s->match_length >= MIN_MATCH) {
Chris@4 1667 check_match(s, s->strstart, s->match_start, s->match_length);
Chris@4 1668
Chris@4 1669 _tr_tally_dist(s, s->strstart - s->match_start,
Chris@4 1670 s->match_length - MIN_MATCH, bflush);
Chris@4 1671
Chris@4 1672 s->lookahead -= s->match_length;
Chris@4 1673
Chris@4 1674 /* Insert new strings in the hash table only if the match length
Chris@4 1675 * is not too large. This saves time but degrades compression.
Chris@4 1676 */
Chris@4 1677 #ifndef FASTEST
Chris@4 1678 if (s->match_length <= s->max_insert_length &&
Chris@4 1679 s->lookahead >= MIN_MATCH) {
Chris@4 1680 s->match_length--; /* string at strstart already in table */
Chris@4 1681 do {
Chris@4 1682 s->strstart++;
Chris@4 1683 INSERT_STRING(s, s->strstart, hash_head);
Chris@4 1684 /* strstart never exceeds WSIZE-MAX_MATCH, so there are
Chris@4 1685 * always MIN_MATCH bytes ahead.
Chris@4 1686 */
Chris@4 1687 } while (--s->match_length != 0);
Chris@4 1688 s->strstart++;
Chris@4 1689 } else
Chris@4 1690 #endif
Chris@4 1691 {
Chris@4 1692 s->strstart += s->match_length;
Chris@4 1693 s->match_length = 0;
Chris@4 1694 s->ins_h = s->window[s->strstart];
Chris@4 1695 UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
Chris@4 1696 #if MIN_MATCH != 3
Chris@4 1697 Call UPDATE_HASH() MIN_MATCH-3 more times
Chris@4 1698 #endif
Chris@4 1699 /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
Chris@4 1700 * matter since it will be recomputed at next deflate call.
Chris@4 1701 */
Chris@4 1702 }
Chris@4 1703 } else {
Chris@4 1704 /* No match, output a literal byte */
Chris@4 1705 Tracevv((stderr,"%c", s->window[s->strstart]));
Chris@4 1706 _tr_tally_lit (s, s->window[s->strstart], bflush);
Chris@4 1707 s->lookahead--;
Chris@4 1708 s->strstart++;
Chris@4 1709 }
Chris@4 1710 if (bflush) FLUSH_BLOCK(s, 0);
Chris@4 1711 }
Chris@4 1712 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
Chris@4 1713 if (flush == Z_FINISH) {
Chris@4 1714 FLUSH_BLOCK(s, 1);
Chris@4 1715 return finish_done;
Chris@4 1716 }
Chris@4 1717 if (s->last_lit)
Chris@4 1718 FLUSH_BLOCK(s, 0);
Chris@4 1719 return block_done;
Chris@4 1720 }
Chris@4 1721
Chris@4 1722 #ifndef FASTEST
Chris@4 1723 /* ===========================================================================
Chris@4 1724 * Same as above, but achieves better compression. We use a lazy
Chris@4 1725 * evaluation for matches: a match is finally adopted only if there is
Chris@4 1726 * no better match at the next window position.
Chris@4 1727 */
Chris@4 1728 local block_state deflate_slow(s, flush)
Chris@4 1729 deflate_state *s;
Chris@4 1730 int flush;
Chris@4 1731 {
Chris@4 1732 IPos hash_head; /* head of hash chain */
Chris@4 1733 int bflush; /* set if current block must be flushed */
Chris@4 1734
Chris@4 1735 /* Process the input block. */
Chris@4 1736 for (;;) {
Chris@4 1737 /* Make sure that we always have enough lookahead, except
Chris@4 1738 * at the end of the input file. We need MAX_MATCH bytes
Chris@4 1739 * for the next match, plus MIN_MATCH bytes to insert the
Chris@4 1740 * string following the next match.
Chris@4 1741 */
Chris@4 1742 if (s->lookahead < MIN_LOOKAHEAD) {
Chris@4 1743 fill_window(s);
Chris@4 1744 if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
Chris@4 1745 return need_more;
Chris@4 1746 }
Chris@4 1747 if (s->lookahead == 0) break; /* flush the current block */
Chris@4 1748 }
Chris@4 1749
Chris@4 1750 /* Insert the string window[strstart .. strstart+2] in the
Chris@4 1751 * dictionary, and set hash_head to the head of the hash chain:
Chris@4 1752 */
Chris@4 1753 hash_head = NIL;
Chris@4 1754 if (s->lookahead >= MIN_MATCH) {
Chris@4 1755 INSERT_STRING(s, s->strstart, hash_head);
Chris@4 1756 }
Chris@4 1757
Chris@4 1758 /* Find the longest match, discarding those <= prev_length.
Chris@4 1759 */
Chris@4 1760 s->prev_length = s->match_length, s->prev_match = s->match_start;
Chris@4 1761 s->match_length = MIN_MATCH-1;
Chris@4 1762
Chris@4 1763 if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
Chris@4 1764 s->strstart - hash_head <= MAX_DIST(s)) {
Chris@4 1765 /* To simplify the code, we prevent matches with the string
Chris@4 1766 * of window index 0 (in particular we have to avoid a match
Chris@4 1767 * of the string with itself at the start of the input file).
Chris@4 1768 */
Chris@4 1769 s->match_length = longest_match (s, hash_head);
Chris@4 1770 /* longest_match() sets match_start */
Chris@4 1771
Chris@4 1772 if (s->match_length <= 5 && (s->strategy == Z_FILTERED
Chris@4 1773 #if TOO_FAR <= 32767
Chris@4 1774 || (s->match_length == MIN_MATCH &&
Chris@4 1775 s->strstart - s->match_start > TOO_FAR)
Chris@4 1776 #endif
Chris@4 1777 )) {
Chris@4 1778
Chris@4 1779 /* If prev_match is also MIN_MATCH, match_start is garbage
Chris@4 1780 * but we will ignore the current match anyway.
Chris@4 1781 */
Chris@4 1782 s->match_length = MIN_MATCH-1;
Chris@4 1783 }
Chris@4 1784 }
Chris@4 1785 /* If there was a match at the previous step and the current
Chris@4 1786 * match is not better, output the previous match:
Chris@4 1787 */
Chris@4 1788 if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
Chris@4 1789 uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
Chris@4 1790 /* Do not insert strings in hash table beyond this. */
Chris@4 1791
Chris@4 1792 check_match(s, s->strstart-1, s->prev_match, s->prev_length);
Chris@4 1793
Chris@4 1794 _tr_tally_dist(s, s->strstart -1 - s->prev_match,
Chris@4 1795 s->prev_length - MIN_MATCH, bflush);
Chris@4 1796
Chris@4 1797 /* Insert in hash table all strings up to the end of the match.
Chris@4 1798 * strstart-1 and strstart are already inserted. If there is not
Chris@4 1799 * enough lookahead, the last two strings are not inserted in
Chris@4 1800 * the hash table.
Chris@4 1801 */
Chris@4 1802 s->lookahead -= s->prev_length-1;
Chris@4 1803 s->prev_length -= 2;
Chris@4 1804 do {
Chris@4 1805 if (++s->strstart <= max_insert) {
Chris@4 1806 INSERT_STRING(s, s->strstart, hash_head);
Chris@4 1807 }
Chris@4 1808 } while (--s->prev_length != 0);
Chris@4 1809 s->match_available = 0;
Chris@4 1810 s->match_length = MIN_MATCH-1;
Chris@4 1811 s->strstart++;
Chris@4 1812
Chris@4 1813 if (bflush) FLUSH_BLOCK(s, 0);
Chris@4 1814
Chris@4 1815 } else if (s->match_available) {
Chris@4 1816 /* If there was no match at the previous position, output a
Chris@4 1817 * single literal. If there was a match but the current match
Chris@4 1818 * is longer, truncate the previous match to a single literal.
Chris@4 1819 */
Chris@4 1820 Tracevv((stderr,"%c", s->window[s->strstart-1]));
Chris@4 1821 _tr_tally_lit(s, s->window[s->strstart-1], bflush);
Chris@4 1822 if (bflush) {
Chris@4 1823 FLUSH_BLOCK_ONLY(s, 0);
Chris@4 1824 }
Chris@4 1825 s->strstart++;
Chris@4 1826 s->lookahead--;
Chris@4 1827 if (s->strm->avail_out == 0) return need_more;
Chris@4 1828 } else {
Chris@4 1829 /* There is no previous match to compare with, wait for
Chris@4 1830 * the next step to decide.
Chris@4 1831 */
Chris@4 1832 s->match_available = 1;
Chris@4 1833 s->strstart++;
Chris@4 1834 s->lookahead--;
Chris@4 1835 }
Chris@4 1836 }
Chris@4 1837 Assert (flush != Z_NO_FLUSH, "no flush?");
Chris@4 1838 if (s->match_available) {
Chris@4 1839 Tracevv((stderr,"%c", s->window[s->strstart-1]));
Chris@4 1840 _tr_tally_lit(s, s->window[s->strstart-1], bflush);
Chris@4 1841 s->match_available = 0;
Chris@4 1842 }
Chris@4 1843 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
Chris@4 1844 if (flush == Z_FINISH) {
Chris@4 1845 FLUSH_BLOCK(s, 1);
Chris@4 1846 return finish_done;
Chris@4 1847 }
Chris@4 1848 if (s->last_lit)
Chris@4 1849 FLUSH_BLOCK(s, 0);
Chris@4 1850 return block_done;
Chris@4 1851 }
Chris@4 1852 #endif /* FASTEST */
Chris@4 1853
Chris@4 1854 /* ===========================================================================
Chris@4 1855 * For Z_RLE, simply look for runs of bytes, generate matches only of distance
Chris@4 1856 * one. Do not maintain a hash table. (It will be regenerated if this run of
Chris@4 1857 * deflate switches away from Z_RLE.)
Chris@4 1858 */
Chris@4 1859 local block_state deflate_rle(s, flush)
Chris@4 1860 deflate_state *s;
Chris@4 1861 int flush;
Chris@4 1862 {
Chris@4 1863 int bflush; /* set if current block must be flushed */
Chris@4 1864 uInt prev; /* byte at distance one to match */
Chris@4 1865 Bytef *scan, *strend; /* scan goes up to strend for length of run */
Chris@4 1866
Chris@4 1867 for (;;) {
Chris@4 1868 /* Make sure that we always have enough lookahead, except
Chris@4 1869 * at the end of the input file. We need MAX_MATCH bytes
Chris@4 1870 * for the longest run, plus one for the unrolled loop.
Chris@4 1871 */
Chris@4 1872 if (s->lookahead <= MAX_MATCH) {
Chris@4 1873 fill_window(s);
Chris@4 1874 if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
Chris@4 1875 return need_more;
Chris@4 1876 }
Chris@4 1877 if (s->lookahead == 0) break; /* flush the current block */
Chris@4 1878 }
Chris@4 1879
Chris@4 1880 /* See how many times the previous byte repeats */
Chris@4 1881 s->match_length = 0;
Chris@4 1882 if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
Chris@4 1883 scan = s->window + s->strstart - 1;
Chris@4 1884 prev = *scan;
Chris@4 1885 if (prev == *++scan && prev == *++scan && prev == *++scan) {
Chris@4 1886 strend = s->window + s->strstart + MAX_MATCH;
Chris@4 1887 do {
Chris@4 1888 } while (prev == *++scan && prev == *++scan &&
Chris@4 1889 prev == *++scan && prev == *++scan &&
Chris@4 1890 prev == *++scan && prev == *++scan &&
Chris@4 1891 prev == *++scan && prev == *++scan &&
Chris@4 1892 scan < strend);
Chris@4 1893 s->match_length = MAX_MATCH - (int)(strend - scan);
Chris@4 1894 if (s->match_length > s->lookahead)
Chris@4 1895 s->match_length = s->lookahead;
Chris@4 1896 }
Chris@4 1897 Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
Chris@4 1898 }
Chris@4 1899
Chris@4 1900 /* Emit match if have run of MIN_MATCH or longer, else emit literal */
Chris@4 1901 if (s->match_length >= MIN_MATCH) {
Chris@4 1902 check_match(s, s->strstart, s->strstart - 1, s->match_length);
Chris@4 1903
Chris@4 1904 _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
Chris@4 1905
Chris@4 1906 s->lookahead -= s->match_length;
Chris@4 1907 s->strstart += s->match_length;
Chris@4 1908 s->match_length = 0;
Chris@4 1909 } else {
Chris@4 1910 /* No match, output a literal byte */
Chris@4 1911 Tracevv((stderr,"%c", s->window[s->strstart]));
Chris@4 1912 _tr_tally_lit (s, s->window[s->strstart], bflush);
Chris@4 1913 s->lookahead--;
Chris@4 1914 s->strstart++;
Chris@4 1915 }
Chris@4 1916 if (bflush) FLUSH_BLOCK(s, 0);
Chris@4 1917 }
Chris@4 1918 s->insert = 0;
Chris@4 1919 if (flush == Z_FINISH) {
Chris@4 1920 FLUSH_BLOCK(s, 1);
Chris@4 1921 return finish_done;
Chris@4 1922 }
Chris@4 1923 if (s->last_lit)
Chris@4 1924 FLUSH_BLOCK(s, 0);
Chris@4 1925 return block_done;
Chris@4 1926 }
Chris@4 1927
Chris@4 1928 /* ===========================================================================
Chris@4 1929 * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
Chris@4 1930 * (It will be regenerated if this run of deflate switches away from Huffman.)
Chris@4 1931 */
Chris@4 1932 local block_state deflate_huff(s, flush)
Chris@4 1933 deflate_state *s;
Chris@4 1934 int flush;
Chris@4 1935 {
Chris@4 1936 int bflush; /* set if current block must be flushed */
Chris@4 1937
Chris@4 1938 for (;;) {
Chris@4 1939 /* Make sure that we have a literal to write. */
Chris@4 1940 if (s->lookahead == 0) {
Chris@4 1941 fill_window(s);
Chris@4 1942 if (s->lookahead == 0) {
Chris@4 1943 if (flush == Z_NO_FLUSH)
Chris@4 1944 return need_more;
Chris@4 1945 break; /* flush the current block */
Chris@4 1946 }
Chris@4 1947 }
Chris@4 1948
Chris@4 1949 /* Output a literal byte */
Chris@4 1950 s->match_length = 0;
Chris@4 1951 Tracevv((stderr,"%c", s->window[s->strstart]));
Chris@4 1952 _tr_tally_lit (s, s->window[s->strstart], bflush);
Chris@4 1953 s->lookahead--;
Chris@4 1954 s->strstart++;
Chris@4 1955 if (bflush) FLUSH_BLOCK(s, 0);
Chris@4 1956 }
Chris@4 1957 s->insert = 0;
Chris@4 1958 if (flush == Z_FINISH) {
Chris@4 1959 FLUSH_BLOCK(s, 1);
Chris@4 1960 return finish_done;
Chris@4 1961 }
Chris@4 1962 if (s->last_lit)
Chris@4 1963 FLUSH_BLOCK(s, 0);
Chris@4 1964 return block_done;
Chris@4 1965 }