Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(533)

Side by Side Diff: third_party/zlib/deflate.c

Issue 1955383002: Update Zlib to version 1.2.8 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix mozzdefs issue Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/zlib/deflate.h ('k') | third_party/zlib/google.patch » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* deflate.c -- compress data using the deflation algorithm 1 /* deflate.c -- compress data using the deflation algorithm
2 * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler 2 * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h 3 * For conditions of distribution and use, see copyright notice in zlib.h
4 */ 4 */
5 5
6 /* 6 /*
7 * ALGORITHM 7 * ALGORITHM
8 * 8 *
9 * The "deflation" process depends on being able to identify portions 9 * The "deflation" process depends on being able to identify portions
10 * of the input text which are identical to earlier input (within a 10 * of the input text which are identical to earlier input (within a
11 * sliding window trailing behind the input currently being processed). 11 * sliding window trailing behind the input currently being processed).
12 * 12 *
(...skipping 17 matching lines...) Expand all
30 * 30 *
31 * ACKNOWLEDGEMENTS 31 * ACKNOWLEDGEMENTS
32 * 32 *
33 * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and 33 * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
34 * I found it in 'freeze' written by Leonid Broukhis. 34 * I found it in 'freeze' written by Leonid Broukhis.
35 * Thanks to many people for bug reports and testing. 35 * Thanks to many people for bug reports and testing.
36 * 36 *
37 * REFERENCES 37 * REFERENCES
38 * 38 *
39 * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". 39 * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
40 * Available in http://www.ietf.org/rfc/rfc1951.txt 40 * Available in http://tools.ietf.org/html/rfc1951
41 * 41 *
42 * A description of the Rabin and Karp algorithm is given in the book 42 * A description of the Rabin and Karp algorithm is given in the book
43 * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. 43 * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
44 * 44 *
45 * Fiala,E.R., and Greene,D.H. 45 * Fiala,E.R., and Greene,D.H.
46 * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 46 * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
47 * 47 *
48 */ 48 */
49 49
50 /* @(#) $Id$ */ 50 /* @(#) $Id$ */
51
52 #include <assert.h> 51 #include <assert.h>
53
54 #include "deflate.h" 52 #include "deflate.h"
55 #include "x86.h" 53 #include "x86.h"
56 54
57 const char deflate_copyright[] = 55 const char deflate_copyright[] =
58 " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; 56 " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";
59 /* 57 /*
60 If you use the zlib library in a product, an acknowledgment is welcome 58 If you use the zlib library in a product, an acknowledgment is welcome
61 in the documentation of your product. If for some reason you cannot 59 in the documentation of your product. If for some reason you cannot
62 include such an acknowledgment, I would appreciate that you keep this 60 include such an acknowledgment, I would appreciate that you keep this
63 copyright string in the executable of your product. 61 copyright string in the executable of your product.
64 */ 62 */
65 63
66 /* =========================================================================== 64 /* ===========================================================================
67 * Function prototypes. 65 * Function prototypes.
68 */ 66 */
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 * meaning. 167 * meaning.
170 */ 168 */
171 169
172 #define EQUAL 0 170 #define EQUAL 0
173 /* result of memcmp for equal strings */ 171 /* result of memcmp for equal strings */
174 172
175 #ifndef NO_DUMMY_DECL 173 #ifndef NO_DUMMY_DECL
176 struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ 174 struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
177 #endif 175 #endif
178 176
177 /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
178 #define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
179
179 /* =========================================================================== 180 /* ===========================================================================
180 * Update a hash value with the given input byte 181 * Update a hash value with the given input byte
181 * IN assertion: all calls to to UPDATE_HASH are made with consecutive 182 * IN assertion: all calls to to UPDATE_HASH are made with consecutive
182 * input characters, so that a running hash key can be computed from the 183 * input characters, so that a running hash key can be computed from the
183 * previous key instead of complete recalculation each time. 184 * previous key instead of complete recalculation each time.
184 */ 185 */
185 #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) 186 #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
186 187
187 /* =========================================================================== 188 /* ===========================================================================
188 * Insert string str in the dictionary and set match_head to the previous head 189 * Insert string str in the dictionary and set match_head to the previous head
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 x86_check_features(); 263 x86_check_features();
263 264
264 if (version == Z_NULL || version[0] != my_version[0] || 265 if (version == Z_NULL || version[0] != my_version[0] ||
265 stream_size != sizeof(z_stream)) { 266 stream_size != sizeof(z_stream)) {
266 return Z_VERSION_ERROR; 267 return Z_VERSION_ERROR;
267 } 268 }
268 if (strm == Z_NULL) return Z_STREAM_ERROR; 269 if (strm == Z_NULL) return Z_STREAM_ERROR;
269 270
270 strm->msg = Z_NULL; 271 strm->msg = Z_NULL;
271 if (strm->zalloc == (alloc_func)0) { 272 if (strm->zalloc == (alloc_func)0) {
273 #ifdef Z_SOLO
274 return Z_STREAM_ERROR;
275 #else
272 strm->zalloc = zcalloc; 276 strm->zalloc = zcalloc;
273 strm->opaque = (voidpf)0; 277 strm->opaque = (voidpf)0;
278 #endif
274 } 279 }
275 if (strm->zfree == (free_func)0) strm->zfree = zcfree; 280 if (strm->zfree == (free_func)0)
281 #ifdef Z_SOLO
282 return Z_STREAM_ERROR;
283 #else
284 strm->zfree = zcfree;
285 #endif
276 286
277 #ifdef FASTEST 287 #ifdef FASTEST
278 if (level != 0) level = 1; 288 if (level != 0) level = 1;
279 #else 289 #else
280 if (level == Z_DEFAULT_COMPRESSION) level = 6; 290 if (level == Z_DEFAULT_COMPRESSION) level = 6;
281 #endif 291 #endif
282 292
283 if (windowBits < 0) { /* suppress zlib wrapper */ 293 if (windowBits < 0) { /* suppress zlib wrapper */
284 wrap = 0; 294 wrap = 0;
285 windowBits = -windowBits; 295 windowBits = -windowBits;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 338
329 s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ 339 s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
330 340
331 overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); 341 overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
332 s->pending_buf = (uchf *) overlay; 342 s->pending_buf = (uchf *) overlay;
333 s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); 343 s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
334 344
335 if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || 345 if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
336 s->pending_buf == Z_NULL) { 346 s->pending_buf == Z_NULL) {
337 s->status = FINISH_STATE; 347 s->status = FINISH_STATE;
338 strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); 348 strm->msg = ERR_MSG(Z_MEM_ERROR);
339 deflateEnd (strm); 349 deflateEnd (strm);
340 return Z_MEM_ERROR; 350 return Z_MEM_ERROR;
341 } 351 }
342 s->d_buf = overlay + s->lit_bufsize/sizeof(ush); 352 s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
343 s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; 353 s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
344 354
345 s->level = level; 355 s->level = level;
346 s->strategy = strategy; 356 s->strategy = strategy;
347 s->method = (Byte)method; 357 s->method = (Byte)method;
348 358
349 return deflateReset(strm); 359 return deflateReset(strm);
350 } 360 }
351 361
352 /* ========================================================================= */ 362 /* ========================================================================= */
353 int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) 363 int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
jiadong.zhu 2016/05/27 09:19:56 From debug, I found this chunk of code caused spdy
354 z_streamp strm; 364 z_streamp strm;
355 const Bytef *dictionary; 365 const Bytef *dictionary;
356 uInt dictLength; 366 uInt dictLength;
357 { 367 {
358 deflate_state *s; 368 deflate_state *s;
359 uInt length = dictLength; 369 uInt str, n;
360 uInt n; 370 int wrap;
361 IPos hash_head = 0; 371 unsigned avail;
372 z_const unsigned char *next;
362 373
363 if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || 374 if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
364 strm->state->wrap == 2 || 375 return Z_STREAM_ERROR;
365 (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) 376 s = strm->state;
377 wrap = s->wrap;
378 if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
366 return Z_STREAM_ERROR; 379 return Z_STREAM_ERROR;
367 380
368 s = strm->state; 381 /* when using zlib wrappers, compute Adler-32 for provided dictionary */
369 if (s->wrap) 382 if (wrap == 1)
370 strm->adler = adler32(strm->adler, dictionary, dictLength); 383 strm->adler = adler32(strm->adler, dictionary, dictLength);
384 s->wrap = 0; /* avoid computing Adler-32 in read_buf */
371 385
372 if (length < MIN_MATCH) return Z_OK; 386 /* if dictionary would fill window, just replace the history */
373 if (length > s->w_size) { 387 if (dictLength >= s->w_size) {
374 length = s->w_size; 388 if (wrap == 0) { /* already empty otherwise */
375 dictionary += dictLength - length; /* use the tail of the dictionary */ 389 CLEAR_HASH(s);
390 s->strstart = 0;
391 s->block_start = 0L;
392 s->insert = 0;
393 }
394 dictionary += dictLength - s->w_size; /* use the tail */
395 dictLength = s->w_size;
376 } 396 }
377 zmemcpy(s->window, dictionary, length);
378 s->strstart = length;
379 s->block_start = (long)length;
380 397
381 /* Insert all strings in the hash table (except for the last two bytes). 398 /* insert dictionary into window and hash */
382 * s->lookahead stays null, so s->ins_h will be recomputed at the next 399 avail = strm->avail_in;
383 * call of fill_window. 400 next = strm->next_in;
384 */ 401 strm->avail_in = dictLength;
385 s->ins_h = s->window[0]; 402 strm->next_in = (z_const Bytef *)dictionary;
386 UPDATE_HASH(s, s->ins_h, s->window[1]); 403 fill_window(s);
387 for (n = 0; n <= length - MIN_MATCH; n++) { 404 while (s->lookahead >= MIN_MATCH) {
388 insert_string(s, n); 405 str = s->strstart;
jiadong.zhu 2016/05/31 11:48:01 When simd is enabled, 'insert_string' makes differ
406 n = s->lookahead - (MIN_MATCH-1);
407 do {
408 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
409 #ifndef FASTEST
410 s->prev[str & s->w_mask] = s->head[s->ins_h];
411 #endif
412 s->head[s->ins_h] = (Pos)str;
413 str++;
414 } while (--n);
415 s->strstart = str;
416 s->lookahead = MIN_MATCH-1;
417 fill_window(s);
389 } 418 }
390 if (hash_head) hash_head = 0; /* to make compiler happy */ 419 s->strstart += s->lookahead;
420 s->block_start = (long)s->strstart;
421 s->insert = s->lookahead;
422 s->lookahead = 0;
423 s->match_length = s->prev_length = MIN_MATCH-1;
424 s->match_available = 0;
425 strm->next_in = next;
426 strm->avail_in = avail;
427 s->wrap = wrap;
391 return Z_OK; 428 return Z_OK;
392 } 429 }
393 430
394 /* ========================================================================= */ 431 /* ========================================================================= */
395 int ZEXPORT deflateReset (strm) 432 int ZEXPORT deflateResetKeep (strm)
396 z_streamp strm; 433 z_streamp strm;
397 { 434 {
398 deflate_state *s; 435 deflate_state *s;
399 436
400 if (strm == Z_NULL || strm->state == Z_NULL || 437 if (strm == Z_NULL || strm->state == Z_NULL ||
401 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { 438 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
402 return Z_STREAM_ERROR; 439 return Z_STREAM_ERROR;
403 } 440 }
404 441
405 strm->total_in = strm->total_out = 0; 442 strm->total_in = strm->total_out = 0;
(...skipping 11 matching lines...) Expand all
417 } 454 }
418 s->status = s->wrap ? INIT_STATE : BUSY_STATE; 455 s->status = s->wrap ? INIT_STATE : BUSY_STATE;
419 strm->adler = 456 strm->adler =
420 #ifdef GZIP 457 #ifdef GZIP
421 s->wrap == 2 ? crc32(0L, Z_NULL, 0) : 458 s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
422 #endif 459 #endif
423 adler32(0L, Z_NULL, 0); 460 adler32(0L, Z_NULL, 0);
424 s->last_flush = Z_NO_FLUSH; 461 s->last_flush = Z_NO_FLUSH;
425 462
426 _tr_init(s); 463 _tr_init(s);
427 lm_init(s);
428 464
429 return Z_OK; 465 return Z_OK;
430 } 466 }
431 467
432 /* ========================================================================= */ 468 /* ========================================================================= */
469 int ZEXPORT deflateReset (strm)
470 z_streamp strm;
471 {
472 int ret;
473
474 ret = deflateResetKeep(strm);
475 if (ret == Z_OK)
476 lm_init(strm->state);
477 return ret;
478 }
479
480 /* ========================================================================= */
433 int ZEXPORT deflateSetHeader (strm, head) 481 int ZEXPORT deflateSetHeader (strm, head)
434 z_streamp strm; 482 z_streamp strm;
435 gz_headerp head; 483 gz_headerp head;
436 { 484 {
437 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 485 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
438 if (strm->state->wrap != 2) return Z_STREAM_ERROR; 486 if (strm->state->wrap != 2) return Z_STREAM_ERROR;
439 strm->state->gzhead = head; 487 strm->state->gzhead = head;
440 return Z_OK; 488 return Z_OK;
441 } 489 }
442 490
443 /* ========================================================================= */ 491 /* ========================================================================= */
492 int ZEXPORT deflatePending (strm, pending, bits)
493 unsigned *pending;
494 int *bits;
495 z_streamp strm;
496 {
497 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
498 if (pending != Z_NULL)
499 *pending = strm->state->pending;
500 if (bits != Z_NULL)
501 *bits = strm->state->bi_valid;
502 return Z_OK;
503 }
504
505 /* ========================================================================= */
444 int ZEXPORT deflatePrime (strm, bits, value) 506 int ZEXPORT deflatePrime (strm, bits, value)
445 z_streamp strm; 507 z_streamp strm;
446 int bits; 508 int bits;
447 int value; 509 int value;
448 { 510 {
511 deflate_state *s;
512 int put;
513
449 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 514 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
450 strm->state->bi_valid = bits; 515 s = strm->state;
451 strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); 516 if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
517 return Z_BUF_ERROR;
518 do {
519 put = Buf_size - s->bi_valid;
520 if (put > bits)
521 put = bits;
522 s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
523 s->bi_valid += put;
524 _tr_flush_bits(s);
525 value >>= put;
526 bits -= put;
527 } while (bits);
452 return Z_OK; 528 return Z_OK;
453 } 529 }
454 530
455 /* ========================================================================= */ 531 /* ========================================================================= */
456 int ZEXPORT deflateParams(strm, level, strategy) 532 int ZEXPORT deflateParams(strm, level, strategy)
457 z_streamp strm; 533 z_streamp strm;
458 int level; 534 int level;
459 int strategy; 535 int strategy;
460 { 536 {
461 deflate_state *s; 537 deflate_state *s;
(...skipping 10 matching lines...) Expand all
472 #endif 548 #endif
473 if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { 549 if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
474 return Z_STREAM_ERROR; 550 return Z_STREAM_ERROR;
475 } 551 }
476 func = configuration_table[s->level].func; 552 func = configuration_table[s->level].func;
477 553
478 if ((strategy != s->strategy || func != configuration_table[level].func) && 554 if ((strategy != s->strategy || func != configuration_table[level].func) &&
479 strm->total_in != 0) { 555 strm->total_in != 0) {
480 /* Flush the last buffer: */ 556 /* Flush the last buffer: */
481 err = deflate(strm, Z_BLOCK); 557 err = deflate(strm, Z_BLOCK);
558 if (err == Z_BUF_ERROR && s->pending == 0)
559 err = Z_OK;
482 } 560 }
483 if (s->level != level) { 561 if (s->level != level) {
484 s->level = level; 562 s->level = level;
485 s->max_lazy_match = configuration_table[level].max_lazy; 563 s->max_lazy_match = configuration_table[level].max_lazy;
486 s->good_match = configuration_table[level].good_length; 564 s->good_match = configuration_table[level].good_length;
487 s->nice_match = configuration_table[level].nice_length; 565 s->nice_match = configuration_table[level].nice_length;
488 s->max_chain_length = configuration_table[level].max_chain; 566 s->max_chain_length = configuration_table[level].max_chain;
489 } 567 }
490 s->strategy = strategy; 568 s->strategy = strategy;
491 return err; 569 return err;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 677
600 /* ========================================================================= 678 /* =========================================================================
601 * Flush as much pending output as possible. All deflate() output goes 679 * Flush as much pending output as possible. All deflate() output goes
602 * through this function so some applications may wish to modify it 680 * through this function so some applications may wish to modify it
603 * to avoid allocating a large strm->next_out buffer and copying into it. 681 * to avoid allocating a large strm->next_out buffer and copying into it.
604 * (See also read_buf()). 682 * (See also read_buf()).
605 */ 683 */
606 local void flush_pending(strm) 684 local void flush_pending(strm)
607 z_streamp strm; 685 z_streamp strm;
608 { 686 {
609 unsigned len = strm->state->pending; 687 unsigned len;
688 deflate_state *s = strm->state;
610 689
690 _tr_flush_bits(s);
691 len = s->pending;
611 if (len > strm->avail_out) len = strm->avail_out; 692 if (len > strm->avail_out) len = strm->avail_out;
612 if (len == 0) return; 693 if (len == 0) return;
613 694
614 zmemcpy(strm->next_out, strm->state->pending_out, len); 695 zmemcpy(strm->next_out, s->pending_out, len);
615 strm->next_out += len; 696 strm->next_out += len;
616 strm->state->pending_out += len; 697 s->pending_out += len;
617 strm->total_out += len; 698 strm->total_out += len;
618 strm->avail_out -= len; 699 strm->avail_out -= len;
619 strm->state->pending -= len; 700 s->pending -= len;
620 if (strm->state->pending == 0) { 701 if (s->pending == 0) {
621 strm->state->pending_out = strm->state->pending_buf; 702 s->pending_out = s->pending_buf;
622 } 703 }
623 } 704 }
624 705
625 /* ========================================================================= */ 706 /* ========================================================================= */
626 int ZEXPORT deflate (strm, flush) 707 int ZEXPORT deflate (strm, flush)
627 z_streamp strm; 708 z_streamp strm;
628 int flush; 709 int flush;
629 { 710 {
630 int old_flush; /* value of flush param for previous deflate call */ 711 int old_flush; /* value of flush param for previous deflate call */
631 deflate_state *s; 712 deflate_state *s;
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 * return OK instead of BUF_ERROR at next call of deflate: 919 * return OK instead of BUF_ERROR at next call of deflate:
839 */ 920 */
840 s->last_flush = -1; 921 s->last_flush = -1;
841 return Z_OK; 922 return Z_OK;
842 } 923 }
843 924
844 /* Make sure there is something to do and avoid duplicate consecutive 925 /* Make sure there is something to do and avoid duplicate consecutive
845 * flushes. For repeated and useless calls with Z_FINISH, we keep 926 * flushes. For repeated and useless calls with Z_FINISH, we keep
846 * returning Z_STREAM_END instead of Z_BUF_ERROR. 927 * returning Z_STREAM_END instead of Z_BUF_ERROR.
847 */ 928 */
848 } else if (strm->avail_in == 0 && flush <= old_flush && 929 } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
849 flush != Z_FINISH) { 930 flush != Z_FINISH) {
850 ERR_RETURN(strm, Z_BUF_ERROR); 931 ERR_RETURN(strm, Z_BUF_ERROR);
851 } 932 }
852 933
853 /* User must not provide more input after the first FINISH: */ 934 /* User must not provide more input after the first FINISH: */
854 if (s->status == FINISH_STATE && strm->avail_in != 0) { 935 if (s->status == FINISH_STATE && strm->avail_in != 0) {
855 ERR_RETURN(strm, Z_BUF_ERROR); 936 ERR_RETURN(strm, Z_BUF_ERROR);
856 } 937 }
857 938
858 /* Start a new block or continue the current one. 939 /* Start a new block or continue the current one.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
904 } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ 985 } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
905 _tr_stored_block(s, (char*)0, 0L, 0); 986 _tr_stored_block(s, (char*)0, 0L, 0);
906 /* For a full flush, this empty block will be recognized 987 /* For a full flush, this empty block will be recognized
907 * as a special marker by inflate_sync(). 988 * as a special marker by inflate_sync().
908 */ 989 */
909 if (flush == Z_FULL_FLUSH) { 990 if (flush == Z_FULL_FLUSH) {
910 CLEAR_HASH(s); /* forget history */ 991 CLEAR_HASH(s); /* forget history */
911 if (s->lookahead == 0) { 992 if (s->lookahead == 0) {
912 s->strstart = 0; 993 s->strstart = 0;
913 s->block_start = 0L; 994 s->block_start = 0L;
995 s->insert = 0;
914 } 996 }
915 } 997 }
916 } 998 }
917 flush_pending(strm); 999 flush_pending(strm);
918 if (strm->avail_out == 0) { 1000 if (strm->avail_out == 0) {
919 s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ 1001 s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
920 return Z_OK; 1002 return Z_OK;
921 } 1003 }
922 } 1004 }
923 } 1005 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 deflate_state *ss; 1083 deflate_state *ss;
1002 ushf *overlay; 1084 ushf *overlay;
1003 1085
1004 1086
1005 if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { 1087 if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
1006 return Z_STREAM_ERROR; 1088 return Z_STREAM_ERROR;
1007 } 1089 }
1008 1090
1009 ss = source->state; 1091 ss = source->state;
1010 1092
1011 zmemcpy(dest, source, sizeof(z_stream)); 1093 zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1012 1094
1013 ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); 1095 ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
1014 if (ds == Z_NULL) return Z_MEM_ERROR; 1096 if (ds == Z_NULL) return Z_MEM_ERROR;
1015 dest->state = (struct internal_state FAR *) ds; 1097 dest->state = (struct internal_state FAR *) ds;
1016 zmemcpy(ds, ss, sizeof(deflate_state)); 1098 zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
1017 ds->strm = dest; 1099 ds->strm = dest;
1018 1100
1019 ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); 1101 ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
1020 ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); 1102 ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
1021 ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); 1103 ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
1022 overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); 1104 overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
1023 ds->pending_buf = (uchf *) overlay; 1105 ds->pending_buf = (uchf *) overlay;
1024 1106
1025 if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || 1107 if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
1026 ds->pending_buf == Z_NULL) { 1108 ds->pending_buf == Z_NULL) {
1027 deflateEnd (dest); 1109 deflateEnd (dest);
1028 return Z_MEM_ERROR; 1110 return Z_MEM_ERROR;
1029 } 1111 }
1030 /* following zmemcpy do not work for 16-bit MSDOS */ 1112 /* following zmemcpy do not work for 16-bit MSDOS */
1031 zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); 1113 zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
1032 zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); 1114 zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
1033 zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); 1115 zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
1034 zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); 1116 zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
1035 1117
1036 ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); 1118 ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
1037 ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); 1119 ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
1038 ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; 1120 ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
1039 1121
1040 ds->l_desc.dyn_tree = ds->dyn_ltree; 1122 ds->l_desc.dyn_tree = ds->dyn_ltree;
1041 ds->d_desc.dyn_tree = ds->dyn_dtree; 1123 ds->d_desc.dyn_tree = ds->dyn_dtree;
1042 ds->bl_desc.dyn_tree = ds->bl_tree; 1124 ds->bl_desc.dyn_tree = ds->bl_tree;
1043 1125
(...skipping 14 matching lines...) Expand all
1058 unsigned size; 1140 unsigned size;
1059 { 1141 {
1060 unsigned len = strm->avail_in; 1142 unsigned len = strm->avail_in;
1061 1143
1062 if (len > size) len = size; 1144 if (len > size) len = size;
1063 if (len == 0) return 0; 1145 if (len == 0) return 0;
1064 1146
1065 strm->avail_in -= len; 1147 strm->avail_in -= len;
1066 1148
1067 #ifdef GZIP 1149 #ifdef GZIP
1068 if (strm->state->wrap == 2) { 1150 if (strm->state->wrap == 2)
1069 copy_with_crc(strm, buf, len); 1151 copy_with_crc(strm, buf, len);
1070 } 1152 else
1071 else
1072 #endif 1153 #endif
1073 { 1154 {
1074 zmemcpy(buf, strm->next_in, len); 1155 zmemcpy(buf, strm->next_in, len);
1075 if (strm->state->wrap == 1) 1156 if (strm->state->wrap == 1)
1076 strm->adler = adler32(strm->adler, buf, len); 1157 strm->adler = adler32(strm->adler, buf, len);
1077 } 1158 }
1078 strm->next_in += len; 1159 strm->next_in += len;
1079 strm->total_in += len; 1160 strm->total_in += len;
1080 1161
1081 return (int)len; 1162 return (int)len;
(...skipping 12 matching lines...) Expand all
1094 /* Set the default configuration parameters: 1175 /* Set the default configuration parameters:
1095 */ 1176 */
1096 s->max_lazy_match = configuration_table[s->level].max_lazy; 1177 s->max_lazy_match = configuration_table[s->level].max_lazy;
1097 s->good_match = configuration_table[s->level].good_length; 1178 s->good_match = configuration_table[s->level].good_length;
1098 s->nice_match = configuration_table[s->level].nice_length; 1179 s->nice_match = configuration_table[s->level].nice_length;
1099 s->max_chain_length = configuration_table[s->level].max_chain; 1180 s->max_chain_length = configuration_table[s->level].max_chain;
1100 1181
1101 s->strstart = 0; 1182 s->strstart = 0;
1102 s->block_start = 0L; 1183 s->block_start = 0L;
1103 s->lookahead = 0; 1184 s->lookahead = 0;
1185 s->insert = 0;
1104 s->match_length = s->prev_length = MIN_MATCH-1; 1186 s->match_length = s->prev_length = MIN_MATCH-1;
1105 s->match_available = 0; 1187 s->match_available = 0;
1106 s->ins_h = 0; 1188 s->ins_h = 0;
1107 #ifndef FASTEST 1189 #ifndef FASTEST
1108 #ifdef ASMV 1190 #ifdef ASMV
1109 match_init(); /* initialize the asm code */ 1191 match_init(); /* initialize the asm code */
1110 #endif 1192 #endif
1111 #endif 1193 #endif
1112 } 1194 }
1113 1195
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 (start - cookie_location) < MAX_DIST(s) && 1447 (start - cookie_location) < MAX_DIST(s) &&
1366 len <= s->lookahead) { 1448 len <= s->lookahead) {
1367 for (i = 0; i < len; i++) { 1449 for (i = 0; i < len; i++) {
1368 if (s->window[start+i] != s->window[cookie_location+i] || 1450 if (s->window[start+i] != s->window[cookie_location+i] ||
1369 class_at(s, cookie_location+i) != 1) { 1451 class_at(s, cookie_location+i) != 1) {
1370 return 0; 1452 return 0;
1371 } 1453 }
1372 } 1454 }
1373 /* Check that we aren't matching a prefix of another cookie by ensuring 1455 /* Check that we aren't matching a prefix of another cookie by ensuring
1374 * that the final byte is either a semicolon (which cannot appear in a 1456 * that the final byte is either a semicolon (which cannot appear in a
1375 * cookie value), or the match is followed by non-cookie data. */ 1457 * cookie value), or non-cookie data. */
1376 if (s->window[cookie_location+len-1] != ';' && 1458 if (s->window[cookie_location+len-1] != ';' &&
1377 class_at(s, cookie_location+len) != 0) { 1459 class_at(s, cookie_location+len) != 0) {
1378 return 0; 1460 return 0;
1379 } 1461 }
1380 s->match_start = cookie_location; 1462 s->match_start = cookie_location;
1381 return len; 1463 return len;
1382 } 1464 }
1383 1465
1384 return 0; 1466 return 0;
1385 } 1467 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1499 } 1581 }
1500 1582
1501 local void fill_window_c(s) 1583 local void fill_window_c(s)
1502 deflate_state *s; 1584 deflate_state *s;
1503 { 1585 {
1504 register unsigned n, m; 1586 register unsigned n, m;
1505 register Posf *p; 1587 register Posf *p;
1506 unsigned more; /* Amount of free space at the end of the window. */ 1588 unsigned more; /* Amount of free space at the end of the window. */
1507 uInt wsize = s->w_size; 1589 uInt wsize = s->w_size;
1508 1590
1591 Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
1592
1509 do { 1593 do {
1510 more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); 1594 more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
1511 1595
1512 /* Deal with !@#$% 64K limit: */ 1596 /* Deal with !@#$% 64K limit: */
1513 if (sizeof(int) <= 2) { 1597 if (sizeof(int) <= 2) {
1514 if (more == 0 && s->strstart == 0 && s->lookahead == 0) { 1598 if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
1515 more = wsize; 1599 more = wsize;
1516 1600
1517 } else if (more == (unsigned)(-1)) { 1601 } else if (more == (unsigned)(-1)) {
1518 /* Very unlikely, but possible on 16 bit machine if 1602 /* Very unlikely, but possible on 16 bit machine if
(...skipping 30 matching lines...) Expand all
1549 #ifndef FASTEST 1633 #ifndef FASTEST
1550 p = &s->prev[n]; 1634 p = &s->prev[n];
1551 do { 1635 do {
1552 m = *--p; 1636 m = *--p;
1553 *p = (Pos)(m >= wsize ? m-wsize : NIL); 1637 *p = (Pos)(m >= wsize ? m-wsize : NIL);
1554 /* If n is not on any hash chain, prev[n] is garbage but 1638 /* If n is not on any hash chain, prev[n] is garbage but
1555 * its value will never be used. 1639 * its value will never be used.
1556 */ 1640 */
1557 } while (--n); 1641 } while (--n);
1558 #endif 1642 #endif
1559
1560 for (n = 0; n < Z_COOKIE_HASH_SIZE; n++) { 1643 for (n = 0; n < Z_COOKIE_HASH_SIZE; n++) {
1561 if (s->cookie_locations[n] > wsize) { 1644 if (s->cookie_locations[n] > wsize) {
1562 s->cookie_locations[n] -= wsize; 1645 s->cookie_locations[n] -= wsize;
1563 } else { 1646 } else {
1564 s->cookie_locations[n] = 0; 1647 s->cookie_locations[n] = 0;
1565 } 1648 }
1566 } 1649 }
1567 1650
1568 if (s->class_bitmap) { 1651 if (s->class_bitmap) {
1569 zmemcpy(s->class_bitmap, s->class_bitmap + s->w_size/8, 1652 zmemcpy(s->class_bitmap, s->class_bitmap + s->w_size/8,
1570 s->w_size/8); 1653 s->w_size/8);
1571 zmemzero(s->class_bitmap + s->w_size/8, s->w_size/8); 1654 zmemzero(s->class_bitmap + s->w_size/8, s->w_size/8);
1572 } 1655 }
1573 1656
1574 more += wsize; 1657 more += wsize;
1575 } 1658 }
1576 if (s->strm->avail_in == 0) return; 1659 if (s->strm->avail_in == 0) break;
1577 1660
1578 /* If there was no sliding: 1661 /* If there was no sliding:
1579 * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && 1662 * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
1580 * more == window_size - lookahead - strstart 1663 * more == window_size - lookahead - strstart
1581 * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) 1664 * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
1582 * => more >= window_size - 2*WSIZE + 2 1665 * => more >= window_size - 2*WSIZE + 2
1583 * In the BIG_MEM or MMAP case (not yet supported), 1666 * In the BIG_MEM or MMAP case (not yet supported),
1584 * window_size == input_size + MIN_LOOKAHEAD && 1667 * window_size == input_size + MIN_LOOKAHEAD &&
1585 * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. 1668 * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
1586 * Otherwise, window_size == 2*WSIZE so more >= 2. 1669 * Otherwise, window_size == 2*WSIZE so more >= 2.
1587 * If there was sliding, more >= WSIZE. So in all cases, more >= 2. 1670 * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
1588 */ 1671 */
1589 Assert(more >= 2, "more < 2"); 1672 Assert(more >= 2, "more < 2");
1590 1673
1591 n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); 1674 n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
1592 if (s->class_bitmap != NULL) { 1675 if (s->class_bitmap != NULL) {
1593 class_set(s, s->strstart + s->lookahead, n, s->strm->clas); 1676 class_set(s, s->strstart + s->lookahead, n, s->strm->clas);
1594 } 1677 }
1595 s->lookahead += n; 1678 s->lookahead += n;
1596 1679
1597 /* Initialize the hash value now that we have some input: */ 1680 /* Initialize the hash value now that we have some input: */
1598 if (s->lookahead >= MIN_MATCH) { 1681 if (s->lookahead + s->insert >= MIN_MATCH) {
1599 s->ins_h = s->window[s->strstart]; 1682 uInt str = s->strstart - s->insert;
1600 UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); 1683 s->ins_h = s->window[str];
1684 UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
1601 #if MIN_MATCH != 3 1685 #if MIN_MATCH != 3
1602 Call UPDATE_HASH() MIN_MATCH-3 more times 1686 Call UPDATE_HASH() MIN_MATCH-3 more times
1603 #endif 1687 #endif
1688 while (s->insert) {
1689 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
1690 #ifndef FASTEST
1691 s->prev[str & s->w_mask] = s->head[s->ins_h];
1692 #endif
1693 s->head[s->ins_h] = (Pos)str;
1694 str++;
1695 s->insert--;
1696 if (s->lookahead + s->insert < MIN_MATCH)
1697 break;
1698 }
1604 } 1699 }
1605 /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, 1700 /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
1606 * but this is not important since only literal bytes will be emitted. 1701 * but this is not important since only literal bytes will be emitted.
1607 */ 1702 */
1608 1703
1609 } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); 1704 } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
1610 1705
1611 /* If the WIN_INIT bytes after the end of the current data have never been 1706 /* If the WIN_INIT bytes after the end of the current data have never been
1612 * written, then zero those bytes in order to avoid memory check reports of 1707 * written, then zero those bytes in order to avoid memory check reports of
1613 * the use of uninitialized (or uninitialised as Julian writes) bytes by 1708 * the use of uninitialized (or uninitialised as Julian writes) bytes by
(...skipping 20 matching lines...) Expand all
1634 * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up 1729 * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
1635 * to end of window, whichever is less. 1730 * to end of window, whichever is less.
1636 */ 1731 */
1637 init = (ulg)curr + WIN_INIT - s->high_water; 1732 init = (ulg)curr + WIN_INIT - s->high_water;
1638 if (init > s->window_size - s->high_water) 1733 if (init > s->window_size - s->high_water)
1639 init = s->window_size - s->high_water; 1734 init = s->window_size - s->high_water;
1640 zmemzero(s->window + s->high_water, (unsigned)init); 1735 zmemzero(s->window + s->high_water, (unsigned)init);
1641 s->high_water += init; 1736 s->high_water += init;
1642 } 1737 }
1643 } 1738 }
1739
1740 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
1741 "not enough room for search");
1644 } 1742 }
1645 1743
1646 /* =========================================================================== 1744 /* ===========================================================================
1647 * Flush the current block, with given end-of-file flag. 1745 * Flush the current block, with given end-of-file flag.
1648 * IN assertion: strstart is set to the end of the current match. 1746 * IN assertion: strstart is set to the end of the current match.
1649 */ 1747 */
1650 #define FLUSH_BLOCK_ONLY(s, last) { \ 1748 #define FLUSH_BLOCK_ONLY(s, last) { \
1651 _tr_flush_block(s, (s->block_start >= 0L ? \ 1749 _tr_flush_block(s, (s->block_start >= 0L ? \
1652 (charf *)&s->window[(unsigned)s->block_start] : \ 1750 (charf *)&s->window[(unsigned)s->block_start] : \
1653 (charf *)Z_NULL), \ 1751 (charf *)Z_NULL), \
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 s->strstart = (uInt)max_start; 1812 s->strstart = (uInt)max_start;
1715 FLUSH_BLOCK(s, 0); 1813 FLUSH_BLOCK(s, 0);
1716 } 1814 }
1717 /* Flush if we may have to slide, otherwise block_start may become 1815 /* Flush if we may have to slide, otherwise block_start may become
1718 * negative and the data will be gone: 1816 * negative and the data will be gone:
1719 */ 1817 */
1720 if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { 1818 if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
1721 FLUSH_BLOCK(s, 0); 1819 FLUSH_BLOCK(s, 0);
1722 } 1820 }
1723 } 1821 }
1724 FLUSH_BLOCK(s, flush == Z_FINISH); 1822 s->insert = 0;
1725 return flush == Z_FINISH ? finish_done : block_done; 1823 if (flush == Z_FINISH) {
1824 FLUSH_BLOCK(s, 1);
1825 return finish_done;
1826 }
1827 if ((long)s->strstart > s->block_start)
1828 FLUSH_BLOCK(s, 0);
1829 return block_done;
1726 } 1830 }
1727 1831
1728 /* =========================================================================== 1832 /* ===========================================================================
1729 * Compress as much as possible from the input stream, return the current 1833 * Compress as much as possible from the input stream, return the current
1730 * block state. 1834 * block state.
1731 * This function does not perform lazy evaluation of matches and inserts 1835 * This function does not perform lazy evaluation of matches and inserts
1732 * new strings in the dictionary only for unmatched strings or for short 1836 * new strings in the dictionary only for unmatched strings or for short
1733 * matches. It is used only for the fast compression options. 1837 * matches. It is used only for the fast compression options.
1734 */ 1838 */
1735 local block_state deflate_fast(s, flush, clas) 1839 local block_state deflate_fast(s, flush, clas)
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1817 } 1921 }
1818 } else { 1922 } else {
1819 /* No match, output a literal byte */ 1923 /* No match, output a literal byte */
1820 Tracevv((stderr,"%c", s->window[s->strstart])); 1924 Tracevv((stderr,"%c", s->window[s->strstart]));
1821 _tr_tally_lit (s, s->window[s->strstart], bflush); 1925 _tr_tally_lit (s, s->window[s->strstart], bflush);
1822 s->lookahead--; 1926 s->lookahead--;
1823 s->strstart++; 1927 s->strstart++;
1824 } 1928 }
1825 if (bflush) FLUSH_BLOCK(s, 0); 1929 if (bflush) FLUSH_BLOCK(s, 0);
1826 } 1930 }
1827 FLUSH_BLOCK(s, flush == Z_FINISH); 1931 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
1828 return flush == Z_FINISH ? finish_done : block_done; 1932 if (flush == Z_FINISH) {
1933 FLUSH_BLOCK(s, 1);
1934 return finish_done;
1935 }
1936 if (s->last_lit)
1937 FLUSH_BLOCK(s, 0);
1938 return block_done;
1829 } 1939 }
1830 1940
1831 #ifndef FASTEST 1941 #ifndef FASTEST
1832 /* =========================================================================== 1942 /* ===========================================================================
1833 * Same as above, but achieves better compression. We use a lazy 1943 * Same as above, but achieves better compression. We use a lazy
1834 * evaluation for matches: a match is finally adopted only if there is 1944 * evaluation for matches: a match is finally adopted only if there is
1835 * no better match at the next window position. 1945 * no better match at the next window position.
1836 */ 1946 */
1837 local block_state deflate_slow(s, flush, clas) 1947 local block_state deflate_slow(s, flush, clas)
1838 deflate_state *s; 1948 deflate_state *s;
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1973 s->strstart++; 2083 s->strstart++;
1974 s->lookahead--; 2084 s->lookahead--;
1975 } 2085 }
1976 } 2086 }
1977 Assert (flush != Z_NO_FLUSH, "no flush?"); 2087 Assert (flush != Z_NO_FLUSH, "no flush?");
1978 if (s->match_available) { 2088 if (s->match_available) {
1979 Tracevv((stderr,"%c", s->window[s->strstart-1])); 2089 Tracevv((stderr,"%c", s->window[s->strstart-1]));
1980 _tr_tally_lit(s, s->window[s->strstart-1], bflush); 2090 _tr_tally_lit(s, s->window[s->strstart-1], bflush);
1981 s->match_available = 0; 2091 s->match_available = 0;
1982 } 2092 }
1983 FLUSH_BLOCK(s, flush == Z_FINISH); 2093 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
1984 return flush == Z_FINISH ? finish_done : block_done; 2094 if (flush == Z_FINISH) {
2095 FLUSH_BLOCK(s, 1);
2096 return finish_done;
2097 }
2098 if (s->last_lit)
2099 FLUSH_BLOCK(s, 0);
2100 return block_done;
1985 } 2101 }
1986 #endif /* FASTEST */ 2102 #endif /* FASTEST */
1987 2103
1988 /* =========================================================================== 2104 /* ===========================================================================
1989 * For Z_RLE, simply look for runs of bytes, generate matches only of distance 2105 * For Z_RLE, simply look for runs of bytes, generate matches only of distance
1990 * one. Do not maintain a hash table. (It will be regenerated if this run of 2106 * one. Do not maintain a hash table. (It will be regenerated if this run of
1991 * deflate switches away from Z_RLE.) 2107 * deflate switches away from Z_RLE.)
1992 */ 2108 */
1993 local block_state deflate_rle(s, flush) 2109 local block_state deflate_rle(s, flush)
1994 deflate_state *s; 2110 deflate_state *s;
1995 int flush; 2111 int flush;
1996 { 2112 {
1997 int bflush; /* set if current block must be flushed */ 2113 int bflush; /* set if current block must be flushed */
1998 uInt prev; /* byte at distance one to match */ 2114 uInt prev; /* byte at distance one to match */
1999 Bytef *scan, *strend; /* scan goes up to strend for length of run */ 2115 Bytef *scan, *strend; /* scan goes up to strend for length of run */
2000 2116
2001 for (;;) { 2117 for (;;) {
2002 /* Make sure that we always have enough lookahead, except 2118 /* Make sure that we always have enough lookahead, except
2003 * at the end of the input file. We need MAX_MATCH bytes 2119 * at the end of the input file. We need MAX_MATCH bytes
2004 * for the longest encodable run. 2120 * for the longest run, plus one for the unrolled loop.
2005 */ 2121 */
2006 if (s->lookahead < MAX_MATCH) { 2122 if (s->lookahead <= MAX_MATCH) {
2007 fill_window(s); 2123 fill_window(s);
2008 if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { 2124 if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
2009 return need_more; 2125 return need_more;
2010 } 2126 }
2011 if (s->lookahead == 0) break; /* flush the current block */ 2127 if (s->lookahead == 0) break; /* flush the current block */
2012 } 2128 }
2013 2129
2014 /* See how many times the previous byte repeats */ 2130 /* See how many times the previous byte repeats */
2015 s->match_length = 0; 2131 s->match_length = 0;
2016 if (s->lookahead >= MIN_MATCH && s->strstart > 0) { 2132 if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
2017 scan = s->window + s->strstart - 1; 2133 scan = s->window + s->strstart - 1;
2018 prev = *scan; 2134 prev = *scan;
2019 if (prev == *++scan && prev == *++scan && prev == *++scan) { 2135 if (prev == *++scan && prev == *++scan && prev == *++scan) {
2020 strend = s->window + s->strstart + MAX_MATCH; 2136 strend = s->window + s->strstart + MAX_MATCH;
2021 do { 2137 do {
2022 } while (prev == *++scan && prev == *++scan && 2138 } while (prev == *++scan && prev == *++scan &&
2023 prev == *++scan && prev == *++scan && 2139 prev == *++scan && prev == *++scan &&
2024 prev == *++scan && prev == *++scan && 2140 prev == *++scan && prev == *++scan &&
2025 prev == *++scan && prev == *++scan && 2141 prev == *++scan && prev == *++scan &&
2026 scan < strend); 2142 scan < strend);
2027 s->match_length = MAX_MATCH - (int)(strend - scan); 2143 s->match_length = MAX_MATCH - (int)(strend - scan);
2028 if (s->match_length > s->lookahead) 2144 if (s->match_length > s->lookahead)
2029 s->match_length = s->lookahead; 2145 s->match_length = s->lookahead;
2030 } 2146 }
2147 Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
2031 } 2148 }
2032 2149
2033 /* Emit match if have run of MIN_MATCH or longer, else emit literal */ 2150 /* Emit match if have run of MIN_MATCH or longer, else emit literal */
2034 if (s->match_length >= MIN_MATCH) { 2151 if (s->match_length >= MIN_MATCH) {
2035 check_match(s, s->strstart, s->strstart - 1, s->match_length); 2152 check_match(s, s->strstart, s->strstart - 1, s->match_length);
2036 2153
2037 _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); 2154 _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
2038 2155
2039 s->lookahead -= s->match_length; 2156 s->lookahead -= s->match_length;
2040 s->strstart += s->match_length; 2157 s->strstart += s->match_length;
2041 s->match_length = 0; 2158 s->match_length = 0;
2042 } else { 2159 } else {
2043 /* No match, output a literal byte */ 2160 /* No match, output a literal byte */
2044 Tracevv((stderr,"%c", s->window[s->strstart])); 2161 Tracevv((stderr,"%c", s->window[s->strstart]));
2045 _tr_tally_lit (s, s->window[s->strstart], bflush); 2162 _tr_tally_lit (s, s->window[s->strstart], bflush);
2046 s->lookahead--; 2163 s->lookahead--;
2047 s->strstart++; 2164 s->strstart++;
2048 } 2165 }
2049 if (bflush) FLUSH_BLOCK(s, 0); 2166 if (bflush) FLUSH_BLOCK(s, 0);
2050 } 2167 }
2051 FLUSH_BLOCK(s, flush == Z_FINISH); 2168 s->insert = 0;
2052 return flush == Z_FINISH ? finish_done : block_done; 2169 if (flush == Z_FINISH) {
2170 FLUSH_BLOCK(s, 1);
2171 return finish_done;
2172 }
2173 if (s->last_lit)
2174 FLUSH_BLOCK(s, 0);
2175 return block_done;
2053 } 2176 }
2054 2177
2055 /* =========================================================================== 2178 /* ===========================================================================
2056 * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. 2179 * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
2057 * (It will be regenerated if this run of deflate switches away from Huffman.) 2180 * (It will be regenerated if this run of deflate switches away from Huffman.)
2058 */ 2181 */
2059 local block_state deflate_huff(s, flush) 2182 local block_state deflate_huff(s, flush)
2060 deflate_state *s; 2183 deflate_state *s;
2061 int flush; 2184 int flush;
2062 { 2185 {
(...skipping 11 matching lines...) Expand all
2074 } 2197 }
2075 2198
2076 /* Output a literal byte */ 2199 /* Output a literal byte */
2077 s->match_length = 0; 2200 s->match_length = 0;
2078 Tracevv((stderr,"%c", s->window[s->strstart])); 2201 Tracevv((stderr,"%c", s->window[s->strstart]));
2079 _tr_tally_lit (s, s->window[s->strstart], bflush); 2202 _tr_tally_lit (s, s->window[s->strstart], bflush);
2080 s->lookahead--; 2203 s->lookahead--;
2081 s->strstart++; 2204 s->strstart++;
2082 if (bflush) FLUSH_BLOCK(s, 0); 2205 if (bflush) FLUSH_BLOCK(s, 0);
2083 } 2206 }
2084 FLUSH_BLOCK(s, flush == Z_FINISH); 2207 s->insert = 0;
2085 return flush == Z_FINISH ? finish_done : block_done; 2208 if (flush == Z_FINISH) {
2209 FLUSH_BLOCK(s, 1);
2210 return finish_done;
2211 }
2212 if (s->last_lit)
2213 FLUSH_BLOCK(s, 0);
2214 return block_done;
2086 } 2215 }
2087 2216
2088 /* Safe to inline this as GCC/clang will use inline asm and Visual Studio will 2217 /* Safe to inline this as GCC/clang will use inline asm and Visual Studio will
2089 * use intrinsic without extra params 2218 * use intrinsic without extra params
2090 */ 2219 */
2091 local INLINE Pos insert_string_sse(deflate_state *const s, const Pos str) 2220 local INLINE Pos insert_string_sse(deflate_state *const s, const Pos str)
2092 { 2221 {
2093 Pos ret; 2222 Pos ret;
2094 unsigned *ip, val, h = 0; 2223 unsigned *ip, val, h = 0;
2095 2224
(...skipping 15 matching lines...) Expand all
2111 #else 2240 #else
2112 /* This should never happen */ 2241 /* This should never happen */
2113 assert(0); 2242 assert(0);
2114 #endif 2243 #endif
2115 2244
2116 ret = s->head[h & s->hash_mask]; 2245 ret = s->head[h & s->hash_mask];
2117 s->head[h & s->hash_mask] = str; 2246 s->head[h & s->hash_mask] = str;
2118 s->prev[str & s->w_mask] = ret; 2247 s->prev[str & s->w_mask] = ret;
2119 return ret; 2248 return ret;
2120 } 2249 }
OLDNEW
« no previous file with comments | « third_party/zlib/deflate.h ('k') | third_party/zlib/google.patch » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698