File indexing completed on 2025-05-11 08:24:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 #include "deflate.h"
0053
0054 const char deflate_copyright[] =
0055 " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 typedef enum {
0067 need_more,
0068 block_done,
0069 finish_started,
0070 finish_done
0071 } block_state;
0072
0073 typedef block_state (*compress_func) OF((deflate_state *s, int flush));
0074
0075
0076 local int deflateStateCheck OF((z_streamp strm));
0077 local void slide_hash OF((deflate_state *s));
0078 local void fill_window OF((deflate_state *s));
0079 local block_state deflate_stored OF((deflate_state *s, int flush));
0080 local block_state deflate_fast OF((deflate_state *s, int flush));
0081 #ifndef FASTEST
0082 local block_state deflate_slow OF((deflate_state *s, int flush));
0083 #endif
0084 local block_state deflate_rle OF((deflate_state *s, int flush));
0085 local block_state deflate_huff OF((deflate_state *s, int flush));
0086 local void lm_init OF((deflate_state *s));
0087 local void putShortMSB OF((deflate_state *s, uInt b));
0088 local void flush_pending OF((z_streamp strm));
0089 local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
0090 local uInt longest_match OF((deflate_state *s, IPos cur_match));
0091
0092 #ifdef ZLIB_DEBUG
0093 local void check_match OF((deflate_state *s, IPos start, IPos match,
0094 int length));
0095 #endif
0096
0097
0098
0099
0100
0101 #define NIL 0
0102
0103
0104 #ifndef TOO_FAR
0105 # define TOO_FAR 4096
0106 #endif
0107
0108
0109
0110
0111
0112
0113
0114 typedef struct config_s {
0115 ush good_length;
0116 ush max_lazy;
0117 ush nice_length;
0118 ush max_chain;
0119 compress_func func;
0120 } config;
0121
0122 #ifdef FASTEST
0123 local const config configuration_table[2] = {
0124
0125 {0, 0, 0, 0, deflate_stored},
0126 {4, 4, 8, 4, deflate_fast}};
0127 #else
0128 local const config configuration_table[10] = {
0129
0130 {0, 0, 0, 0, deflate_stored},
0131 {4, 4, 8, 4, deflate_fast},
0132 {4, 5, 16, 8, deflate_fast},
0133 {4, 6, 32, 32, deflate_fast},
0134
0135 {4, 4, 16, 16, deflate_slow},
0136 {8, 16, 32, 32, deflate_slow},
0137 {8, 16, 128, 128, deflate_slow},
0138 {8, 32, 128, 256, deflate_slow},
0139 {32, 128, 258, 1024, deflate_slow},
0140 {32, 258, 258, 4096, deflate_slow}};
0141 #endif
0142
0143
0144
0145
0146
0147
0148
0149 #define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0))
0150
0151
0152
0153
0154
0155
0156
0157 #define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask)
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170 #ifdef FASTEST
0171 #define INSERT_STRING(s, str, match_head) \
0172 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
0173 match_head = s->head[s->ins_h], \
0174 s->head[s->ins_h] = (Pos)(str))
0175 #else
0176 #define INSERT_STRING(s, str, match_head) \
0177 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
0178 match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
0179 s->head[s->ins_h] = (Pos)(str))
0180 #endif
0181
0182
0183
0184
0185
0186 #define CLEAR_HASH(s) \
0187 do { \
0188 s->head[s->hash_size - 1] = NIL; \
0189 zmemzero((Bytef *)s->head, \
0190 (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
0191 } while (0)
0192
0193
0194
0195
0196
0197
0198 local void slide_hash(s)
0199 deflate_state *s;
0200 {
0201 unsigned n, m;
0202 Posf *p;
0203 uInt wsize = s->w_size;
0204
0205 n = s->hash_size;
0206 p = &s->head[n];
0207 do {
0208 m = *--p;
0209 *p = (Pos)(m >= wsize ? m - wsize : NIL);
0210 } while (--n);
0211 n = wsize;
0212 #ifndef FASTEST
0213 p = &s->prev[n];
0214 do {
0215 m = *--p;
0216 *p = (Pos)(m >= wsize ? m - wsize : NIL);
0217
0218
0219
0220 } while (--n);
0221 #endif
0222 }
0223
0224
0225 int ZEXPORT deflateInit_(strm, level, version, stream_size)
0226 z_streamp strm;
0227 int level;
0228 const char *version;
0229 int stream_size;
0230 {
0231 return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
0232 Z_DEFAULT_STRATEGY, version, stream_size);
0233
0234 }
0235
0236
0237 int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
0238 version, stream_size)
0239 z_streamp strm;
0240 int level;
0241 int method;
0242 int windowBits;
0243 int memLevel;
0244 int strategy;
0245 const char *version;
0246 int stream_size;
0247 {
0248 deflate_state *s;
0249 int wrap = 1;
0250 static const char my_version[] = ZLIB_VERSION;
0251
0252 if (version == Z_NULL || version[0] != my_version[0] ||
0253 stream_size != sizeof(z_stream)) {
0254 return Z_VERSION_ERROR;
0255 }
0256 if (strm == Z_NULL) return Z_STREAM_ERROR;
0257
0258 strm->msg = Z_NULL;
0259 if (strm->zalloc == (alloc_func)0) {
0260 #ifdef Z_SOLO
0261 return Z_STREAM_ERROR;
0262 #else
0263 strm->zalloc = zcalloc;
0264 strm->opaque = (voidpf)0;
0265 #endif
0266 }
0267 if (strm->zfree == (free_func)0)
0268 #ifdef Z_SOLO
0269 return Z_STREAM_ERROR;
0270 #else
0271 strm->zfree = zcfree;
0272 #endif
0273
0274 #ifdef FASTEST
0275 if (level != 0) level = 1;
0276 #else
0277 if (level == Z_DEFAULT_COMPRESSION) level = 6;
0278 #endif
0279
0280 if (windowBits < 0) {
0281 wrap = 0;
0282 if (windowBits < -15)
0283 return Z_STREAM_ERROR;
0284 windowBits = -windowBits;
0285 }
0286 #ifdef GZIP
0287 else if (windowBits > 15) {
0288 wrap = 2;
0289 windowBits -= 16;
0290 }
0291 #endif
0292 if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
0293 windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
0294 strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) {
0295 return Z_STREAM_ERROR;
0296 }
0297 if (windowBits == 8) windowBits = 9;
0298 s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
0299 if (s == Z_NULL) return Z_MEM_ERROR;
0300 strm->state = (struct internal_state FAR *)s;
0301 s->strm = strm;
0302 s->status = INIT_STATE;
0303
0304 s->wrap = wrap;
0305 s->gzhead = Z_NULL;
0306 s->w_bits = (uInt)windowBits;
0307 s->w_size = 1 << s->w_bits;
0308 s->w_mask = s->w_size - 1;
0309
0310 s->hash_bits = (uInt)memLevel + 7;
0311 s->hash_size = 1 << s->hash_bits;
0312 s->hash_mask = s->hash_size - 1;
0313 s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH);
0314
0315 s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
0316 s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
0317 s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
0318
0319 s->high_water = 0;
0320
0321 s->lit_bufsize = 1 << (memLevel + 6);
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362 s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4);
0363 s->pending_buf_size = (ulg)s->lit_bufsize * 4;
0364
0365 if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
0366 s->pending_buf == Z_NULL) {
0367 s->status = FINISH_STATE;
0368 strm->msg = ERR_MSG(Z_MEM_ERROR);
0369 deflateEnd (strm);
0370 return Z_MEM_ERROR;
0371 }
0372 s->sym_buf = s->pending_buf + s->lit_bufsize;
0373 s->sym_end = (s->lit_bufsize - 1) * 3;
0374
0375
0376
0377
0378
0379 s->level = level;
0380 s->strategy = strategy;
0381 s->method = (Byte)method;
0382
0383 return deflateReset(strm);
0384 }
0385
0386
0387
0388
0389 local int deflateStateCheck(strm)
0390 z_streamp strm;
0391 {
0392 deflate_state *s;
0393 if (strm == Z_NULL ||
0394 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
0395 return 1;
0396 s = strm->state;
0397 if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE &&
0398 #ifdef GZIP
0399 s->status != GZIP_STATE &&
0400 #endif
0401 s->status != EXTRA_STATE &&
0402 s->status != NAME_STATE &&
0403 s->status != COMMENT_STATE &&
0404 s->status != HCRC_STATE &&
0405 s->status != BUSY_STATE &&
0406 s->status != FINISH_STATE))
0407 return 1;
0408 return 0;
0409 }
0410
0411
0412 int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
0413 z_streamp strm;
0414 const Bytef *dictionary;
0415 uInt dictLength;
0416 {
0417 deflate_state *s;
0418 uInt str, n;
0419 int wrap;
0420 unsigned avail;
0421 z_const unsigned char *next;
0422
0423 if (deflateStateCheck(strm) || dictionary == Z_NULL)
0424 return Z_STREAM_ERROR;
0425 s = strm->state;
0426 wrap = s->wrap;
0427 if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
0428 return Z_STREAM_ERROR;
0429
0430
0431 if (wrap == 1)
0432 strm->adler = adler32(strm->adler, dictionary, dictLength);
0433 s->wrap = 0;
0434
0435
0436 if (dictLength >= s->w_size) {
0437 if (wrap == 0) {
0438 CLEAR_HASH(s);
0439 s->strstart = 0;
0440 s->block_start = 0L;
0441 s->insert = 0;
0442 }
0443 dictionary += dictLength - s->w_size;
0444 dictLength = s->w_size;
0445 }
0446
0447
0448 avail = strm->avail_in;
0449 next = strm->next_in;
0450 strm->avail_in = dictLength;
0451 strm->next_in = (z_const Bytef *)dictionary;
0452 fill_window(s);
0453 while (s->lookahead >= MIN_MATCH) {
0454 str = s->strstart;
0455 n = s->lookahead - (MIN_MATCH-1);
0456 do {
0457 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
0458 #ifndef FASTEST
0459 s->prev[str & s->w_mask] = s->head[s->ins_h];
0460 #endif
0461 s->head[s->ins_h] = (Pos)str;
0462 str++;
0463 } while (--n);
0464 s->strstart = str;
0465 s->lookahead = MIN_MATCH-1;
0466 fill_window(s);
0467 }
0468 s->strstart += s->lookahead;
0469 s->block_start = (long)s->strstart;
0470 s->insert = s->lookahead;
0471 s->lookahead = 0;
0472 s->match_length = s->prev_length = MIN_MATCH-1;
0473 s->match_available = 0;
0474 strm->next_in = next;
0475 strm->avail_in = avail;
0476 s->wrap = wrap;
0477 return Z_OK;
0478 }
0479
0480
0481 int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
0482 z_streamp strm;
0483 Bytef *dictionary;
0484 uInt *dictLength;
0485 {
0486 deflate_state *s;
0487 uInt len;
0488
0489 if (deflateStateCheck(strm))
0490 return Z_STREAM_ERROR;
0491 s = strm->state;
0492 len = s->strstart + s->lookahead;
0493 if (len > s->w_size)
0494 len = s->w_size;
0495 if (dictionary != Z_NULL && len)
0496 zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len);
0497 if (dictLength != Z_NULL)
0498 *dictLength = len;
0499 return Z_OK;
0500 }
0501
0502
0503 int ZEXPORT deflateResetKeep(strm)
0504 z_streamp strm;
0505 {
0506 deflate_state *s;
0507
0508 if (deflateStateCheck(strm)) {
0509 return Z_STREAM_ERROR;
0510 }
0511
0512 strm->total_in = strm->total_out = 0;
0513 strm->msg = Z_NULL;
0514 strm->data_type = Z_UNKNOWN;
0515
0516 s = (deflate_state *)strm->state;
0517 s->pending = 0;
0518 s->pending_out = s->pending_buf;
0519
0520 if (s->wrap < 0) {
0521 s->wrap = -s->wrap;
0522 }
0523 s->status =
0524 #ifdef GZIP
0525 s->wrap == 2 ? GZIP_STATE :
0526 #endif
0527 INIT_STATE;
0528 strm->adler =
0529 #ifdef GZIP
0530 s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
0531 #endif
0532 adler32(0L, Z_NULL, 0);
0533 s->last_flush = -2;
0534
0535 _tr_init(s);
0536
0537 return Z_OK;
0538 }
0539
0540
0541 int ZEXPORT deflateReset(strm)
0542 z_streamp strm;
0543 {
0544 int ret;
0545
0546 ret = deflateResetKeep(strm);
0547 if (ret == Z_OK)
0548 lm_init(strm->state);
0549 return ret;
0550 }
0551
0552
0553 int ZEXPORT deflateSetHeader(strm, head)
0554 z_streamp strm;
0555 gz_headerp head;
0556 {
0557 if (deflateStateCheck(strm) || strm->state->wrap != 2)
0558 return Z_STREAM_ERROR;
0559 strm->state->gzhead = head;
0560 return Z_OK;
0561 }
0562
0563
0564 int ZEXPORT deflatePending(strm, pending, bits)
0565 unsigned *pending;
0566 int *bits;
0567 z_streamp strm;
0568 {
0569 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
0570 if (pending != Z_NULL)
0571 *pending = strm->state->pending;
0572 if (bits != Z_NULL)
0573 *bits = strm->state->bi_valid;
0574 return Z_OK;
0575 }
0576
0577
0578 int ZEXPORT deflatePrime(strm, bits, value)
0579 z_streamp strm;
0580 int bits;
0581 int value;
0582 {
0583 deflate_state *s;
0584 int put;
0585
0586 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
0587 s = strm->state;
0588 if (bits < 0 || bits > 16 ||
0589 s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
0590 return Z_BUF_ERROR;
0591 do {
0592 put = Buf_size - s->bi_valid;
0593 if (put > bits)
0594 put = bits;
0595 s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
0596 s->bi_valid += put;
0597 _tr_flush_bits(s);
0598 value >>= put;
0599 bits -= put;
0600 } while (bits);
0601 return Z_OK;
0602 }
0603
0604
0605 int ZEXPORT deflateParams(strm, level, strategy)
0606 z_streamp strm;
0607 int level;
0608 int strategy;
0609 {
0610 deflate_state *s;
0611 compress_func func;
0612
0613 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
0614 s = strm->state;
0615
0616 #ifdef FASTEST
0617 if (level != 0) level = 1;
0618 #else
0619 if (level == Z_DEFAULT_COMPRESSION) level = 6;
0620 #endif
0621 if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
0622 return Z_STREAM_ERROR;
0623 }
0624 func = configuration_table[s->level].func;
0625
0626 if ((strategy != s->strategy || func != configuration_table[level].func) &&
0627 s->last_flush != -2) {
0628
0629 int err = deflate(strm, Z_BLOCK);
0630 if (err == Z_STREAM_ERROR)
0631 return err;
0632 if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead)
0633 return Z_BUF_ERROR;
0634 }
0635 if (s->level != level) {
0636 if (s->level == 0 && s->matches != 0) {
0637 if (s->matches == 1)
0638 slide_hash(s);
0639 else
0640 CLEAR_HASH(s);
0641 s->matches = 0;
0642 }
0643 s->level = level;
0644 s->max_lazy_match = configuration_table[level].max_lazy;
0645 s->good_match = configuration_table[level].good_length;
0646 s->nice_match = configuration_table[level].nice_length;
0647 s->max_chain_length = configuration_table[level].max_chain;
0648 }
0649 s->strategy = strategy;
0650 return Z_OK;
0651 }
0652
0653
0654 int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
0655 z_streamp strm;
0656 int good_length;
0657 int max_lazy;
0658 int nice_length;
0659 int max_chain;
0660 {
0661 deflate_state *s;
0662
0663 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
0664 s = strm->state;
0665 s->good_match = (uInt)good_length;
0666 s->max_lazy_match = (uInt)max_lazy;
0667 s->nice_match = nice_length;
0668 s->max_chain_length = (uInt)max_chain;
0669 return Z_OK;
0670 }
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696 uLong ZEXPORT deflateBound(strm, sourceLen)
0697 z_streamp strm;
0698 uLong sourceLen;
0699 {
0700 deflate_state *s;
0701 uLong fixedlen, storelen, wraplen;
0702
0703
0704
0705
0706 fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) +
0707 (sourceLen >> 9) + 4;
0708
0709
0710
0711 storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) +
0712 (sourceLen >> 11) + 7;
0713
0714
0715 if (deflateStateCheck(strm))
0716 return (fixedlen > storelen ? fixedlen : storelen) + 6;
0717
0718
0719 s = strm->state;
0720 switch (s->wrap) {
0721 case 0:
0722 wraplen = 0;
0723 break;
0724 case 1:
0725 wraplen = 6 + (s->strstart ? 4 : 0);
0726 break;
0727 #ifdef GZIP
0728 case 2:
0729 wraplen = 18;
0730 if (s->gzhead != Z_NULL) {
0731 Bytef *str;
0732 if (s->gzhead->extra != Z_NULL)
0733 wraplen += 2 + s->gzhead->extra_len;
0734 str = s->gzhead->name;
0735 if (str != Z_NULL)
0736 do {
0737 wraplen++;
0738 } while (*str++);
0739 str = s->gzhead->comment;
0740 if (str != Z_NULL)
0741 do {
0742 wraplen++;
0743 } while (*str++);
0744 if (s->gzhead->hcrc)
0745 wraplen += 2;
0746 }
0747 break;
0748 #endif
0749 default:
0750 wraplen = 6;
0751 }
0752
0753
0754 if (s->w_bits != 15 || s->hash_bits != 8 + 7)
0755 return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen;
0756
0757
0758
0759 return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
0760 (sourceLen >> 25) + 13 - 6 + wraplen;
0761 }
0762
0763
0764
0765
0766
0767
0768 local void putShortMSB(s, b)
0769 deflate_state *s;
0770 uInt b;
0771 {
0772 put_byte(s, (Byte)(b >> 8));
0773 put_byte(s, (Byte)(b & 0xff));
0774 }
0775
0776
0777
0778
0779
0780
0781
0782 local void flush_pending(strm)
0783 z_streamp strm;
0784 {
0785 unsigned len;
0786 deflate_state *s = strm->state;
0787
0788 _tr_flush_bits(s);
0789 len = s->pending;
0790 if (len > strm->avail_out) len = strm->avail_out;
0791 if (len == 0) return;
0792
0793 zmemcpy(strm->next_out, s->pending_out, len);
0794 strm->next_out += len;
0795 s->pending_out += len;
0796 strm->total_out += len;
0797 strm->avail_out -= len;
0798 s->pending -= len;
0799 if (s->pending == 0) {
0800 s->pending_out = s->pending_buf;
0801 }
0802 }
0803
0804
0805
0806
0807 #define HCRC_UPDATE(beg) \
0808 do { \
0809 if (s->gzhead->hcrc && s->pending > (beg)) \
0810 strm->adler = crc32(strm->adler, s->pending_buf + (beg), \
0811 s->pending - (beg)); \
0812 } while (0)
0813
0814
0815 int ZEXPORT deflate(strm, flush)
0816 z_streamp strm;
0817 int flush;
0818 {
0819 int old_flush;
0820 deflate_state *s;
0821
0822 if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) {
0823 return Z_STREAM_ERROR;
0824 }
0825 s = strm->state;
0826
0827 if (strm->next_out == Z_NULL ||
0828 (strm->avail_in != 0 && strm->next_in == Z_NULL) ||
0829 (s->status == FINISH_STATE && flush != Z_FINISH)) {
0830 ERR_RETURN(strm, Z_STREAM_ERROR);
0831 }
0832 if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
0833
0834 old_flush = s->last_flush;
0835 s->last_flush = flush;
0836
0837
0838 if (s->pending != 0) {
0839 flush_pending(strm);
0840 if (strm->avail_out == 0) {
0841
0842
0843
0844
0845
0846
0847 s->last_flush = -1;
0848 return Z_OK;
0849 }
0850
0851
0852
0853
0854
0855 } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
0856 flush != Z_FINISH) {
0857 ERR_RETURN(strm, Z_BUF_ERROR);
0858 }
0859
0860
0861 if (s->status == FINISH_STATE && strm->avail_in != 0) {
0862 ERR_RETURN(strm, Z_BUF_ERROR);
0863 }
0864
0865
0866 if (s->status == INIT_STATE && s->wrap == 0)
0867 s->status = BUSY_STATE;
0868 if (s->status == INIT_STATE) {
0869
0870 uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8;
0871 uInt level_flags;
0872
0873 if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
0874 level_flags = 0;
0875 else if (s->level < 6)
0876 level_flags = 1;
0877 else if (s->level == 6)
0878 level_flags = 2;
0879 else
0880 level_flags = 3;
0881 header |= (level_flags << 6);
0882 if (s->strstart != 0) header |= PRESET_DICT;
0883 header += 31 - (header % 31);
0884
0885 putShortMSB(s, header);
0886
0887
0888 if (s->strstart != 0) {
0889 putShortMSB(s, (uInt)(strm->adler >> 16));
0890 putShortMSB(s, (uInt)(strm->adler & 0xffff));
0891 }
0892 strm->adler = adler32(0L, Z_NULL, 0);
0893 s->status = BUSY_STATE;
0894
0895
0896 flush_pending(strm);
0897 if (s->pending != 0) {
0898 s->last_flush = -1;
0899 return Z_OK;
0900 }
0901 }
0902 #ifdef GZIP
0903 if (s->status == GZIP_STATE) {
0904
0905 strm->adler = crc32(0L, Z_NULL, 0);
0906 put_byte(s, 31);
0907 put_byte(s, 139);
0908 put_byte(s, 8);
0909 if (s->gzhead == Z_NULL) {
0910 put_byte(s, 0);
0911 put_byte(s, 0);
0912 put_byte(s, 0);
0913 put_byte(s, 0);
0914 put_byte(s, 0);
0915 put_byte(s, s->level == 9 ? 2 :
0916 (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
0917 4 : 0));
0918 put_byte(s, OS_CODE);
0919 s->status = BUSY_STATE;
0920
0921
0922 flush_pending(strm);
0923 if (s->pending != 0) {
0924 s->last_flush = -1;
0925 return Z_OK;
0926 }
0927 }
0928 else {
0929 put_byte(s, (s->gzhead->text ? 1 : 0) +
0930 (s->gzhead->hcrc ? 2 : 0) +
0931 (s->gzhead->extra == Z_NULL ? 0 : 4) +
0932 (s->gzhead->name == Z_NULL ? 0 : 8) +
0933 (s->gzhead->comment == Z_NULL ? 0 : 16)
0934 );
0935 put_byte(s, (Byte)(s->gzhead->time & 0xff));
0936 put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
0937 put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
0938 put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
0939 put_byte(s, s->level == 9 ? 2 :
0940 (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
0941 4 : 0));
0942 put_byte(s, s->gzhead->os & 0xff);
0943 if (s->gzhead->extra != Z_NULL) {
0944 put_byte(s, s->gzhead->extra_len & 0xff);
0945 put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
0946 }
0947 if (s->gzhead->hcrc)
0948 strm->adler = crc32(strm->adler, s->pending_buf,
0949 s->pending);
0950 s->gzindex = 0;
0951 s->status = EXTRA_STATE;
0952 }
0953 }
0954 if (s->status == EXTRA_STATE) {
0955 if (s->gzhead->extra != Z_NULL) {
0956 ulg beg = s->pending;
0957 uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex;
0958 while (s->pending + left > s->pending_buf_size) {
0959 uInt copy = s->pending_buf_size - s->pending;
0960 zmemcpy(s->pending_buf + s->pending,
0961 s->gzhead->extra + s->gzindex, copy);
0962 s->pending = s->pending_buf_size;
0963 HCRC_UPDATE(beg);
0964 s->gzindex += copy;
0965 flush_pending(strm);
0966 if (s->pending != 0) {
0967 s->last_flush = -1;
0968 return Z_OK;
0969 }
0970 beg = 0;
0971 left -= copy;
0972 }
0973 zmemcpy(s->pending_buf + s->pending,
0974 s->gzhead->extra + s->gzindex, left);
0975 s->pending += left;
0976 HCRC_UPDATE(beg);
0977 s->gzindex = 0;
0978 }
0979 s->status = NAME_STATE;
0980 }
0981 if (s->status == NAME_STATE) {
0982 if (s->gzhead->name != Z_NULL) {
0983 ulg beg = s->pending;
0984 int val;
0985 do {
0986 if (s->pending == s->pending_buf_size) {
0987 HCRC_UPDATE(beg);
0988 flush_pending(strm);
0989 if (s->pending != 0) {
0990 s->last_flush = -1;
0991 return Z_OK;
0992 }
0993 beg = 0;
0994 }
0995 val = s->gzhead->name[s->gzindex++];
0996 put_byte(s, val);
0997 } while (val != 0);
0998 HCRC_UPDATE(beg);
0999 s->gzindex = 0;
1000 }
1001 s->status = COMMENT_STATE;
1002 }
1003 if (s->status == COMMENT_STATE) {
1004 if (s->gzhead->comment != Z_NULL) {
1005 ulg beg = s->pending;
1006 int val;
1007 do {
1008 if (s->pending == s->pending_buf_size) {
1009 HCRC_UPDATE(beg);
1010 flush_pending(strm);
1011 if (s->pending != 0) {
1012 s->last_flush = -1;
1013 return Z_OK;
1014 }
1015 beg = 0;
1016 }
1017 val = s->gzhead->comment[s->gzindex++];
1018 put_byte(s, val);
1019 } while (val != 0);
1020 HCRC_UPDATE(beg);
1021 }
1022 s->status = HCRC_STATE;
1023 }
1024 if (s->status == HCRC_STATE) {
1025 if (s->gzhead->hcrc) {
1026 if (s->pending + 2 > s->pending_buf_size) {
1027 flush_pending(strm);
1028 if (s->pending != 0) {
1029 s->last_flush = -1;
1030 return Z_OK;
1031 }
1032 }
1033 put_byte(s, (Byte)(strm->adler & 0xff));
1034 put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
1035 strm->adler = crc32(0L, Z_NULL, 0);
1036 }
1037 s->status = BUSY_STATE;
1038
1039
1040 flush_pending(strm);
1041 if (s->pending != 0) {
1042 s->last_flush = -1;
1043 return Z_OK;
1044 }
1045 }
1046 #endif
1047
1048
1049
1050 if (strm->avail_in != 0 || s->lookahead != 0 ||
1051 (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
1052 block_state bstate;
1053
1054 bstate = s->level == 0 ? deflate_stored(s, flush) :
1055 s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
1056 s->strategy == Z_RLE ? deflate_rle(s, flush) :
1057 (*(configuration_table[s->level].func))(s, flush);
1058
1059 if (bstate == finish_started || bstate == finish_done) {
1060 s->status = FINISH_STATE;
1061 }
1062 if (bstate == need_more || bstate == finish_started) {
1063 if (strm->avail_out == 0) {
1064 s->last_flush = -1;
1065 }
1066 return Z_OK;
1067
1068
1069
1070
1071
1072
1073
1074 }
1075 if (bstate == block_done) {
1076 if (flush == Z_PARTIAL_FLUSH) {
1077 _tr_align(s);
1078 } else if (flush != Z_BLOCK) {
1079 _tr_stored_block(s, (char*)0, 0L, 0);
1080
1081
1082
1083 if (flush == Z_FULL_FLUSH) {
1084 CLEAR_HASH(s);
1085 if (s->lookahead == 0) {
1086 s->strstart = 0;
1087 s->block_start = 0L;
1088 s->insert = 0;
1089 }
1090 }
1091 }
1092 flush_pending(strm);
1093 if (strm->avail_out == 0) {
1094 s->last_flush = -1;
1095 return Z_OK;
1096 }
1097 }
1098 }
1099
1100 if (flush != Z_FINISH) return Z_OK;
1101 if (s->wrap <= 0) return Z_STREAM_END;
1102
1103
1104 #ifdef GZIP
1105 if (s->wrap == 2) {
1106 put_byte(s, (Byte)(strm->adler & 0xff));
1107 put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
1108 put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
1109 put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
1110 put_byte(s, (Byte)(strm->total_in & 0xff));
1111 put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
1112 put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
1113 put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
1114 }
1115 else
1116 #endif
1117 {
1118 putShortMSB(s, (uInt)(strm->adler >> 16));
1119 putShortMSB(s, (uInt)(strm->adler & 0xffff));
1120 }
1121 flush_pending(strm);
1122
1123
1124
1125 if (s->wrap > 0) s->wrap = -s->wrap;
1126 return s->pending != 0 ? Z_OK : Z_STREAM_END;
1127 }
1128
1129
1130 int ZEXPORT deflateEnd(strm)
1131 z_streamp strm;
1132 {
1133 int status;
1134
1135 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
1136
1137 status = strm->state->status;
1138
1139
1140 TRY_FREE(strm, strm->state->pending_buf);
1141 TRY_FREE(strm, strm->state->head);
1142 TRY_FREE(strm, strm->state->prev);
1143 TRY_FREE(strm, strm->state->window);
1144
1145 ZFREE(strm, strm->state);
1146 strm->state = Z_NULL;
1147
1148 return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
1149 }
1150
1151
1152
1153
1154
1155
1156 int ZEXPORT deflateCopy(dest, source)
1157 z_streamp dest;
1158 z_streamp source;
1159 {
1160 #ifdef MAXSEG_64K
1161 return Z_STREAM_ERROR;
1162 #else
1163 deflate_state *ds;
1164 deflate_state *ss;
1165
1166
1167 if (deflateStateCheck(source) || dest == Z_NULL) {
1168 return Z_STREAM_ERROR;
1169 }
1170
1171 ss = source->state;
1172
1173 zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1174
1175 ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
1176 if (ds == Z_NULL) return Z_MEM_ERROR;
1177 dest->state = (struct internal_state FAR *) ds;
1178 zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
1179 ds->strm = dest;
1180
1181 ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
1182 ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
1183 ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
1184 ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4);
1185
1186 if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
1187 ds->pending_buf == Z_NULL) {
1188 deflateEnd (dest);
1189 return Z_MEM_ERROR;
1190 }
1191
1192 zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
1193 zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
1194 zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
1195 zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
1196
1197 ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
1198 ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
1199
1200 ds->l_desc.dyn_tree = ds->dyn_ltree;
1201 ds->d_desc.dyn_tree = ds->dyn_dtree;
1202 ds->bl_desc.dyn_tree = ds->bl_tree;
1203
1204 return Z_OK;
1205 #endif
1206 }
1207
1208
1209
1210
1211
1212
1213
1214
1215 local unsigned read_buf(strm, buf, size)
1216 z_streamp strm;
1217 Bytef *buf;
1218 unsigned size;
1219 {
1220 unsigned len = strm->avail_in;
1221
1222 if (len > size) len = size;
1223 if (len == 0) return 0;
1224
1225 strm->avail_in -= len;
1226
1227 zmemcpy(buf, strm->next_in, len);
1228 if (strm->state->wrap == 1) {
1229 strm->adler = adler32(strm->adler, buf, len);
1230 }
1231 #ifdef GZIP
1232 else if (strm->state->wrap == 2) {
1233 strm->adler = crc32(strm->adler, buf, len);
1234 }
1235 #endif
1236 strm->next_in += len;
1237 strm->total_in += len;
1238
1239 return len;
1240 }
1241
1242
1243
1244
1245 local void lm_init(s)
1246 deflate_state *s;
1247 {
1248 s->window_size = (ulg)2L*s->w_size;
1249
1250 CLEAR_HASH(s);
1251
1252
1253
1254 s->max_lazy_match = configuration_table[s->level].max_lazy;
1255 s->good_match = configuration_table[s->level].good_length;
1256 s->nice_match = configuration_table[s->level].nice_length;
1257 s->max_chain_length = configuration_table[s->level].max_chain;
1258
1259 s->strstart = 0;
1260 s->block_start = 0L;
1261 s->lookahead = 0;
1262 s->insert = 0;
1263 s->match_length = s->prev_length = MIN_MATCH-1;
1264 s->match_available = 0;
1265 s->ins_h = 0;
1266 }
1267
1268 #ifndef FASTEST
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278 local uInt longest_match(s, cur_match)
1279 deflate_state *s;
1280 IPos cur_match;
1281 {
1282 unsigned chain_length = s->max_chain_length;
1283 register Bytef *scan = s->window + s->strstart;
1284 register Bytef *match;
1285 register int len;
1286 int best_len = (int)s->prev_length;
1287 int nice_match = s->nice_match;
1288 IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
1289 s->strstart - (IPos)MAX_DIST(s) : NIL;
1290
1291
1292
1293 Posf *prev = s->prev;
1294 uInt wmask = s->w_mask;
1295
1296 #ifdef UNALIGNED_OK
1297
1298
1299
1300 register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
1301 register ush scan_start = *(ushf*)scan;
1302 register ush scan_end = *(ushf*)(scan + best_len - 1);
1303 #else
1304 register Bytef *strend = s->window + s->strstart + MAX_MATCH;
1305 register Byte scan_end1 = scan[best_len - 1];
1306 register Byte scan_end = scan[best_len];
1307 #endif
1308
1309
1310
1311
1312 Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
1313
1314
1315 if (s->prev_length >= s->good_match) {
1316 chain_length >>= 2;
1317 }
1318
1319
1320
1321 if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead;
1322
1323 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
1324 "need lookahead");
1325
1326 do {
1327 Assert(cur_match < s->strstart, "no future");
1328 match = s->window + cur_match;
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338 #if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
1339
1340
1341
1342 if (*(ushf*)(match + best_len - 1) != scan_end ||
1343 *(ushf*)match != scan_start) continue;
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354 Assert(scan[2] == match[2], "scan[2]?");
1355 scan++, match++;
1356 do {
1357 } while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
1358 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
1359 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
1360 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
1361 scan < strend);
1362
1363
1364
1365 Assert(scan <= s->window + (unsigned)(s->window_size - 1),
1366 "wild scan");
1367 if (*scan == *match) scan++;
1368
1369 len = (MAX_MATCH - 1) - (int)(strend - scan);
1370 scan = strend - (MAX_MATCH-1);
1371
1372 #else
1373
1374 if (match[best_len] != scan_end ||
1375 match[best_len - 1] != scan_end1 ||
1376 *match != *scan ||
1377 *++match != scan[1]) continue;
1378
1379
1380
1381
1382
1383
1384
1385 scan += 2, match++;
1386 Assert(*scan == *match, "match[2]?");
1387
1388
1389
1390
1391 do {
1392 } while (*++scan == *++match && *++scan == *++match &&
1393 *++scan == *++match && *++scan == *++match &&
1394 *++scan == *++match && *++scan == *++match &&
1395 *++scan == *++match && *++scan == *++match &&
1396 scan < strend);
1397
1398 Assert(scan <= s->window + (unsigned)(s->window_size - 1),
1399 "wild scan");
1400
1401 len = MAX_MATCH - (int)(strend - scan);
1402 scan = strend - MAX_MATCH;
1403
1404 #endif
1405
1406 if (len > best_len) {
1407 s->match_start = cur_match;
1408 best_len = len;
1409 if (len >= nice_match) break;
1410 #ifdef UNALIGNED_OK
1411 scan_end = *(ushf*)(scan + best_len - 1);
1412 #else
1413 scan_end1 = scan[best_len - 1];
1414 scan_end = scan[best_len];
1415 #endif
1416 }
1417 } while ((cur_match = prev[cur_match & wmask]) > limit
1418 && --chain_length != 0);
1419
1420 if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
1421 return s->lookahead;
1422 }
1423
1424 #else
1425
1426
1427
1428
1429 local uInt longest_match(s, cur_match)
1430 deflate_state *s;
1431 IPos cur_match;
1432 {
1433 register Bytef *scan = s->window + s->strstart;
1434 register Bytef *match;
1435 register int len;
1436 register Bytef *strend = s->window + s->strstart + MAX_MATCH;
1437
1438
1439
1440
1441 Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
1442
1443 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
1444 "need lookahead");
1445
1446 Assert(cur_match < s->strstart, "no future");
1447
1448 match = s->window + cur_match;
1449
1450
1451
1452 if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
1453
1454
1455
1456
1457
1458
1459
1460 scan += 2, match += 2;
1461 Assert(*scan == *match, "match[2]?");
1462
1463
1464
1465
1466 do {
1467 } while (*++scan == *++match && *++scan == *++match &&
1468 *++scan == *++match && *++scan == *++match &&
1469 *++scan == *++match && *++scan == *++match &&
1470 *++scan == *++match && *++scan == *++match &&
1471 scan < strend);
1472
1473 Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan");
1474
1475 len = MAX_MATCH - (int)(strend - scan);
1476
1477 if (len < MIN_MATCH) return MIN_MATCH - 1;
1478
1479 s->match_start = cur_match;
1480 return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
1481 }
1482
1483 #endif
1484
1485 #ifdef ZLIB_DEBUG
1486
1487 #define EQUAL 0
1488
1489
1490
1491
1492
1493 local void check_match(s, start, match, length)
1494 deflate_state *s;
1495 IPos start, match;
1496 int length;
1497 {
1498
1499 if (zmemcmp(s->window + match,
1500 s->window + start, length) != EQUAL) {
1501 fprintf(stderr, " start %u, match %u, length %d\n",
1502 start, match, length);
1503 do {
1504 fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
1505 } while (--length != 0);
1506 z_error("invalid match");
1507 }
1508 if (z_verbose > 1) {
1509 fprintf(stderr,"\\[%d,%d]", start - match, length);
1510 do { putc(s->window[start++], stderr); } while (--length != 0);
1511 }
1512 }
1513 #else
1514 # define check_match(s, start, match, length)
1515 #endif
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527 local void fill_window(s)
1528 deflate_state *s;
1529 {
1530 unsigned n;
1531 unsigned more;
1532 uInt wsize = s->w_size;
1533
1534 Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
1535
1536 do {
1537 more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
1538
1539
1540 if (sizeof(int) <= 2) {
1541 if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
1542 more = wsize;
1543
1544 } else if (more == (unsigned)(-1)) {
1545
1546
1547
1548 more--;
1549 }
1550 }
1551
1552
1553
1554
1555 if (s->strstart >= wsize + MAX_DIST(s)) {
1556
1557 zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
1558 s->match_start -= wsize;
1559 s->strstart -= wsize;
1560 s->block_start -= (long) wsize;
1561 if (s->insert > s->strstart)
1562 s->insert = s->strstart;
1563 slide_hash(s);
1564 more += wsize;
1565 }
1566 if (s->strm->avail_in == 0) break;
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579 Assert(more >= 2, "more < 2");
1580
1581 n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
1582 s->lookahead += n;
1583
1584
1585 if (s->lookahead + s->insert >= MIN_MATCH) {
1586 uInt str = s->strstart - s->insert;
1587 s->ins_h = s->window[str];
1588 UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
1589 #if MIN_MATCH != 3
1590 Call UPDATE_HASH() MIN_MATCH-3 more times
1591 #endif
1592 while (s->insert) {
1593 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
1594 #ifndef FASTEST
1595 s->prev[str & s->w_mask] = s->head[s->ins_h];
1596 #endif
1597 s->head[s->ins_h] = (Pos)str;
1598 str++;
1599 s->insert--;
1600 if (s->lookahead + s->insert < MIN_MATCH)
1601 break;
1602 }
1603 }
1604
1605
1606
1607
1608 } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
1609
1610
1611
1612
1613
1614
1615
1616
1617 if (s->high_water < s->window_size) {
1618 ulg curr = s->strstart + (ulg)(s->lookahead);
1619 ulg init;
1620
1621 if (s->high_water < curr) {
1622
1623
1624
1625 init = s->window_size - curr;
1626 if (init > WIN_INIT)
1627 init = WIN_INIT;
1628 zmemzero(s->window + curr, (unsigned)init);
1629 s->high_water = curr + init;
1630 }
1631 else if (s->high_water < (ulg)curr + WIN_INIT) {
1632
1633
1634
1635
1636 init = (ulg)curr + WIN_INIT - s->high_water;
1637 if (init > s->window_size - s->high_water)
1638 init = s->window_size - s->high_water;
1639 zmemzero(s->window + s->high_water, (unsigned)init);
1640 s->high_water += init;
1641 }
1642 }
1643
1644 Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
1645 "not enough room for search");
1646 }
1647
1648
1649
1650
1651
1652 #define FLUSH_BLOCK_ONLY(s, last) { \
1653 _tr_flush_block(s, (s->block_start >= 0L ? \
1654 (charf *)&s->window[(unsigned)s->block_start] : \
1655 (charf *)Z_NULL), \
1656 (ulg)((long)s->strstart - s->block_start), \
1657 (last)); \
1658 s->block_start = s->strstart; \
1659 flush_pending(s->strm); \
1660 Tracev((stderr,"[FLUSH]")); \
1661 }
1662
1663
1664 #define FLUSH_BLOCK(s, last) { \
1665 FLUSH_BLOCK_ONLY(s, last); \
1666 if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
1667 }
1668
1669
1670 #define MAX_STORED 65535
1671
1672
1673 #define MIN(a, b) ((a) > (b) ? (b) : (a))
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690 local block_state deflate_stored(s, flush)
1691 deflate_state *s;
1692 int flush;
1693 {
1694
1695
1696
1697
1698 unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size);
1699
1700
1701
1702
1703
1704 unsigned len, left, have, last = 0;
1705 unsigned used = s->strm->avail_in;
1706 do {
1707
1708
1709
1710
1711 len = MAX_STORED;
1712 have = (s->bi_valid + 42) >> 3;
1713 if (s->strm->avail_out < have)
1714 break;
1715
1716 have = s->strm->avail_out - have;
1717 left = s->strstart - s->block_start;
1718 if (len > (ulg)left + s->strm->avail_in)
1719 len = left + s->strm->avail_in;
1720 if (len > have)
1721 len = have;
1722
1723
1724
1725
1726
1727
1728 if (len < min_block && ((len == 0 && flush != Z_FINISH) ||
1729 flush == Z_NO_FLUSH ||
1730 len != left + s->strm->avail_in))
1731 break;
1732
1733
1734
1735
1736 last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0;
1737 _tr_stored_block(s, (char *)0, 0L, last);
1738
1739
1740 s->pending_buf[s->pending - 4] = len;
1741 s->pending_buf[s->pending - 3] = len >> 8;
1742 s->pending_buf[s->pending - 2] = ~len;
1743 s->pending_buf[s->pending - 1] = ~len >> 8;
1744
1745
1746 flush_pending(s->strm);
1747
1748 #ifdef ZLIB_DEBUG
1749
1750 s->compressed_len += len << 3;
1751 s->bits_sent += len << 3;
1752 #endif
1753
1754
1755 if (left) {
1756 if (left > len)
1757 left = len;
1758 zmemcpy(s->strm->next_out, s->window + s->block_start, left);
1759 s->strm->next_out += left;
1760 s->strm->avail_out -= left;
1761 s->strm->total_out += left;
1762 s->block_start += left;
1763 len -= left;
1764 }
1765
1766
1767
1768
1769 if (len) {
1770 read_buf(s->strm, s->strm->next_out, len);
1771 s->strm->next_out += len;
1772 s->strm->avail_out -= len;
1773 s->strm->total_out += len;
1774 }
1775 } while (last == 0);
1776
1777
1778
1779
1780
1781
1782
1783 used -= s->strm->avail_in;
1784 if (used) {
1785
1786
1787
1788 if (used >= s->w_size) {
1789 s->matches = 2;
1790 zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
1791 s->strstart = s->w_size;
1792 s->insert = s->strstart;
1793 }
1794 else {
1795 if (s->window_size - s->strstart <= used) {
1796
1797 s->strstart -= s->w_size;
1798 zmemcpy(s->window, s->window + s->w_size, s->strstart);
1799 if (s->matches < 2)
1800 s->matches++;
1801 if (s->insert > s->strstart)
1802 s->insert = s->strstart;
1803 }
1804 zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);
1805 s->strstart += used;
1806 s->insert += MIN(used, s->w_size - s->insert);
1807 }
1808 s->block_start = s->strstart;
1809 }
1810 if (s->high_water < s->strstart)
1811 s->high_water = s->strstart;
1812
1813
1814 if (last)
1815 return finish_done;
1816
1817
1818 if (flush != Z_NO_FLUSH && flush != Z_FINISH &&
1819 s->strm->avail_in == 0 && (long)s->strstart == s->block_start)
1820 return block_done;
1821
1822
1823 have = s->window_size - s->strstart;
1824 if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) {
1825
1826 s->block_start -= s->w_size;
1827 s->strstart -= s->w_size;
1828 zmemcpy(s->window, s->window + s->w_size, s->strstart);
1829 if (s->matches < 2)
1830 s->matches++;
1831 have += s->w_size;
1832 if (s->insert > s->strstart)
1833 s->insert = s->strstart;
1834 }
1835 if (have > s->strm->avail_in)
1836 have = s->strm->avail_in;
1837 if (have) {
1838 read_buf(s->strm, s->window + s->strstart, have);
1839 s->strstart += have;
1840 s->insert += MIN(have, s->w_size - s->insert);
1841 }
1842 if (s->high_water < s->strstart)
1843 s->high_water = s->strstart;
1844
1845
1846
1847
1848
1849
1850 have = (s->bi_valid + 42) >> 3;
1851
1852 have = MIN(s->pending_buf_size - have, MAX_STORED);
1853 min_block = MIN(have, s->w_size);
1854 left = s->strstart - s->block_start;
1855 if (left >= min_block ||
1856 ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH &&
1857 s->strm->avail_in == 0 && left <= have)) {
1858 len = MIN(left, have);
1859 last = flush == Z_FINISH && s->strm->avail_in == 0 &&
1860 len == left ? 1 : 0;
1861 _tr_stored_block(s, (charf *)s->window + s->block_start, len, last);
1862 s->block_start += len;
1863 flush_pending(s->strm);
1864 }
1865
1866
1867 return last ? finish_started : need_more;
1868 }
1869
1870
1871
1872
1873
1874
1875
1876
1877 local block_state deflate_fast(s, flush)
1878 deflate_state *s;
1879 int flush;
1880 {
1881 IPos hash_head;
1882 int bflush;
1883
1884 for (;;) {
1885
1886
1887
1888
1889
1890 if (s->lookahead < MIN_LOOKAHEAD) {
1891 fill_window(s);
1892 if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
1893 return need_more;
1894 }
1895 if (s->lookahead == 0) break;
1896 }
1897
1898
1899
1900
1901 hash_head = NIL;
1902 if (s->lookahead >= MIN_MATCH) {
1903 INSERT_STRING(s, s->strstart, hash_head);
1904 }
1905
1906
1907
1908
1909 if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
1910
1911
1912
1913
1914 s->match_length = longest_match (s, hash_head);
1915
1916 }
1917 if (s->match_length >= MIN_MATCH) {
1918 check_match(s, s->strstart, s->match_start, s->match_length);
1919
1920 _tr_tally_dist(s, s->strstart - s->match_start,
1921 s->match_length - MIN_MATCH, bflush);
1922
1923 s->lookahead -= s->match_length;
1924
1925
1926
1927
1928 #ifndef FASTEST
1929 if (s->match_length <= s->max_insert_length &&
1930 s->lookahead >= MIN_MATCH) {
1931 s->match_length--;
1932 do {
1933 s->strstart++;
1934 INSERT_STRING(s, s->strstart, hash_head);
1935
1936
1937
1938 } while (--s->match_length != 0);
1939 s->strstart++;
1940 } else
1941 #endif
1942 {
1943 s->strstart += s->match_length;
1944 s->match_length = 0;
1945 s->ins_h = s->window[s->strstart];
1946 UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]);
1947 #if MIN_MATCH != 3
1948 Call UPDATE_HASH() MIN_MATCH-3 more times
1949 #endif
1950
1951
1952
1953 }
1954 } else {
1955
1956 Tracevv((stderr,"%c", s->window[s->strstart]));
1957 _tr_tally_lit(s, s->window[s->strstart], bflush);
1958 s->lookahead--;
1959 s->strstart++;
1960 }
1961 if (bflush) FLUSH_BLOCK(s, 0);
1962 }
1963 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
1964 if (flush == Z_FINISH) {
1965 FLUSH_BLOCK(s, 1);
1966 return finish_done;
1967 }
1968 if (s->sym_next)
1969 FLUSH_BLOCK(s, 0);
1970 return block_done;
1971 }
1972
1973 #ifndef FASTEST
1974
1975
1976
1977
1978
1979 local block_state deflate_slow(s, flush)
1980 deflate_state *s;
1981 int flush;
1982 {
1983 IPos hash_head;
1984 int bflush;
1985
1986
1987 for (;;) {
1988
1989
1990
1991
1992
1993 if (s->lookahead < MIN_LOOKAHEAD) {
1994 fill_window(s);
1995 if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
1996 return need_more;
1997 }
1998 if (s->lookahead == 0) break;
1999 }
2000
2001
2002
2003
2004 hash_head = NIL;
2005 if (s->lookahead >= MIN_MATCH) {
2006 INSERT_STRING(s, s->strstart, hash_head);
2007 }
2008
2009
2010
2011 s->prev_length = s->match_length, s->prev_match = s->match_start;
2012 s->match_length = MIN_MATCH-1;
2013
2014 if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
2015 s->strstart - hash_head <= MAX_DIST(s)) {
2016
2017
2018
2019
2020 s->match_length = longest_match (s, hash_head);
2021
2022
2023 if (s->match_length <= 5 && (s->strategy == Z_FILTERED
2024 #if TOO_FAR <= 32767
2025 || (s->match_length == MIN_MATCH &&
2026 s->strstart - s->match_start > TOO_FAR)
2027 #endif
2028 )) {
2029
2030
2031
2032
2033 s->match_length = MIN_MATCH-1;
2034 }
2035 }
2036
2037
2038
2039 if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
2040 uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
2041
2042
2043 check_match(s, s->strstart - 1, s->prev_match, s->prev_length);
2044
2045 _tr_tally_dist(s, s->strstart - 1 - s->prev_match,
2046 s->prev_length - MIN_MATCH, bflush);
2047
2048
2049
2050
2051
2052
2053 s->lookahead -= s->prev_length - 1;
2054 s->prev_length -= 2;
2055 do {
2056 if (++s->strstart <= max_insert) {
2057 INSERT_STRING(s, s->strstart, hash_head);
2058 }
2059 } while (--s->prev_length != 0);
2060 s->match_available = 0;
2061 s->match_length = MIN_MATCH-1;
2062 s->strstart++;
2063
2064 if (bflush) FLUSH_BLOCK(s, 0);
2065
2066 } else if (s->match_available) {
2067
2068
2069
2070
2071 Tracevv((stderr,"%c", s->window[s->strstart - 1]));
2072 _tr_tally_lit(s, s->window[s->strstart - 1], bflush);
2073 if (bflush) {
2074 FLUSH_BLOCK_ONLY(s, 0);
2075 }
2076 s->strstart++;
2077 s->lookahead--;
2078 if (s->strm->avail_out == 0) return need_more;
2079 } else {
2080
2081
2082
2083 s->match_available = 1;
2084 s->strstart++;
2085 s->lookahead--;
2086 }
2087 }
2088 Assert (flush != Z_NO_FLUSH, "no flush?");
2089 if (s->match_available) {
2090 Tracevv((stderr,"%c", s->window[s->strstart - 1]));
2091 _tr_tally_lit(s, s->window[s->strstart - 1], bflush);
2092 s->match_available = 0;
2093 }
2094 s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
2095 if (flush == Z_FINISH) {
2096 FLUSH_BLOCK(s, 1);
2097 return finish_done;
2098 }
2099 if (s->sym_next)
2100 FLUSH_BLOCK(s, 0);
2101 return block_done;
2102 }
2103 #endif
2104
2105
2106
2107
2108
2109
2110 local block_state deflate_rle(s, flush)
2111 deflate_state *s;
2112 int flush;
2113 {
2114 int bflush;
2115 uInt prev;
2116 Bytef *scan, *strend;
2117
2118 for (;;) {
2119
2120
2121
2122
2123 if (s->lookahead <= MAX_MATCH) {
2124 fill_window(s);
2125 if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
2126 return need_more;
2127 }
2128 if (s->lookahead == 0) break;
2129 }
2130
2131
2132 s->match_length = 0;
2133 if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
2134 scan = s->window + s->strstart - 1;
2135 prev = *scan;
2136 if (prev == *++scan && prev == *++scan && prev == *++scan) {
2137 strend = s->window + s->strstart + MAX_MATCH;
2138 do {
2139 } while (prev == *++scan && prev == *++scan &&
2140 prev == *++scan && prev == *++scan &&
2141 prev == *++scan && prev == *++scan &&
2142 prev == *++scan && prev == *++scan &&
2143 scan < strend);
2144 s->match_length = MAX_MATCH - (uInt)(strend - scan);
2145 if (s->match_length > s->lookahead)
2146 s->match_length = s->lookahead;
2147 }
2148 Assert(scan <= s->window + (uInt)(s->window_size - 1),
2149 "wild scan");
2150 }
2151
2152
2153 if (s->match_length >= MIN_MATCH) {
2154 check_match(s, s->strstart, s->strstart - 1, s->match_length);
2155
2156 _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
2157
2158 s->lookahead -= s->match_length;
2159 s->strstart += s->match_length;
2160 s->match_length = 0;
2161 } else {
2162
2163 Tracevv((stderr,"%c", s->window[s->strstart]));
2164 _tr_tally_lit(s, s->window[s->strstart], bflush);
2165 s->lookahead--;
2166 s->strstart++;
2167 }
2168 if (bflush) FLUSH_BLOCK(s, 0);
2169 }
2170 s->insert = 0;
2171 if (flush == Z_FINISH) {
2172 FLUSH_BLOCK(s, 1);
2173 return finish_done;
2174 }
2175 if (s->sym_next)
2176 FLUSH_BLOCK(s, 0);
2177 return block_done;
2178 }
2179
2180
2181
2182
2183
2184 local block_state deflate_huff(s, flush)
2185 deflate_state *s;
2186 int flush;
2187 {
2188 int bflush;
2189
2190 for (;;) {
2191
2192 if (s->lookahead == 0) {
2193 fill_window(s);
2194 if (s->lookahead == 0) {
2195 if (flush == Z_NO_FLUSH)
2196 return need_more;
2197 break;
2198 }
2199 }
2200
2201
2202 s->match_length = 0;
2203 Tracevv((stderr,"%c", s->window[s->strstart]));
2204 _tr_tally_lit(s, s->window[s->strstart], bflush);
2205 s->lookahead--;
2206 s->strstart++;
2207 if (bflush) FLUSH_BLOCK(s, 0);
2208 }
2209 s->insert = 0;
2210 if (flush == Z_FINISH) {
2211 FLUSH_BLOCK(s, 1);
2212 return finish_done;
2213 }
2214 if (s->sym_next)
2215 FLUSH_BLOCK(s, 0);
2216 return block_done;
2217 }