File indexing completed on 2025-05-11 08:24:11
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 #include "deflate.h"
0038
0039 #ifdef ZLIB_DEBUG
0040 # include <ctype.h>
0041 #endif
0042
0043
0044
0045
0046
0047 #define MAX_BL_BITS 7
0048
0049
0050 #define END_BLOCK 256
0051
0052
0053 #define REP_3_6 16
0054
0055
0056 #define REPZ_3_10 17
0057
0058
0059 #define REPZ_11_138 18
0060
0061
0062 local const int extra_lbits[LENGTH_CODES]
0063 = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
0064
0065 local const int extra_dbits[D_CODES]
0066 = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
0067
0068 local const int extra_blbits[BL_CODES]
0069 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
0070
0071 local const uch bl_order[BL_CODES]
0072 = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
0073
0074
0075
0076
0077
0078
0079
0080
0081 #define DIST_CODE_LEN 512
0082
0083 #if defined(GEN_TREES_H) || !defined(STDC)
0084
0085
0086 local ct_data static_ltree[L_CODES+2];
0087
0088
0089
0090
0091
0092
0093 local ct_data static_dtree[D_CODES];
0094
0095
0096
0097
0098 uch _dist_code[DIST_CODE_LEN];
0099
0100
0101
0102
0103
0104 uch _length_code[MAX_MATCH-MIN_MATCH+1];
0105
0106
0107 local int base_length[LENGTH_CODES];
0108
0109
0110 local int base_dist[D_CODES];
0111
0112
0113 #else
0114 # include "trees.h"
0115 #endif
0116
0117 struct static_tree_desc_s {
0118 const ct_data *static_tree;
0119 const intf *extra_bits;
0120 int extra_base;
0121 int elems;
0122 int max_length;
0123 };
0124
0125 local const static_tree_desc static_l_desc =
0126 {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
0127
0128 local const static_tree_desc static_d_desc =
0129 {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
0130
0131 local const static_tree_desc static_bl_desc =
0132 {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
0133
0134
0135
0136
0137
0138 local void tr_static_init OF((void));
0139 local void init_block OF((deflate_state *s));
0140 local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
0141 local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
0142 local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
0143 local void build_tree OF((deflate_state *s, tree_desc *desc));
0144 local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
0145 local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
0146 local int build_bl_tree OF((deflate_state *s));
0147 local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
0148 int blcodes));
0149 local void compress_block OF((deflate_state *s, const ct_data *ltree,
0150 const ct_data *dtree));
0151 local int detect_data_type OF((deflate_state *s));
0152 local unsigned bi_reverse OF((unsigned code, int len));
0153 local void bi_windup OF((deflate_state *s));
0154 local void bi_flush OF((deflate_state *s));
0155
0156 #ifdef GEN_TREES_H
0157 local void gen_trees_header OF((void));
0158 #endif
0159
0160 #ifndef ZLIB_DEBUG
0161 # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
0162
0163
0164 #else
0165 # define send_code(s, c, tree) \
0166 { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
0167 send_bits(s, tree[c].Code, tree[c].Len); }
0168 #endif
0169
0170
0171
0172
0173
0174 #define put_short(s, w) { \
0175 put_byte(s, (uch)((w) & 0xff)); \
0176 put_byte(s, (uch)((ush)(w) >> 8)); \
0177 }
0178
0179
0180
0181
0182
0183 #ifdef ZLIB_DEBUG
0184 local void send_bits OF((deflate_state *s, int value, int length));
0185
0186 local void send_bits(s, value, length)
0187 deflate_state *s;
0188 int value;
0189 int length;
0190 {
0191 Tracevv((stderr," l %2d v %4x ", length, value));
0192 Assert(length > 0 && length <= 15, "invalid length");
0193 s->bits_sent += (ulg)length;
0194
0195
0196
0197
0198
0199 if (s->bi_valid > (int)Buf_size - length) {
0200 s->bi_buf |= (ush)value << s->bi_valid;
0201 put_short(s, s->bi_buf);
0202 s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
0203 s->bi_valid += length - Buf_size;
0204 } else {
0205 s->bi_buf |= (ush)value << s->bi_valid;
0206 s->bi_valid += length;
0207 }
0208 }
0209 #else
0210
0211 #define send_bits(s, value, length) \
0212 { int len = length;\
0213 if (s->bi_valid > (int)Buf_size - len) {\
0214 int val = (int)value;\
0215 s->bi_buf |= (ush)val << s->bi_valid;\
0216 put_short(s, s->bi_buf);\
0217 s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
0218 s->bi_valid += len - Buf_size;\
0219 } else {\
0220 s->bi_buf |= (ush)(value) << s->bi_valid;\
0221 s->bi_valid += len;\
0222 }\
0223 }
0224 #endif
0225
0226
0227
0228
0229
0230
0231
0232 local void tr_static_init()
0233 {
0234 #if defined(GEN_TREES_H) || !defined(STDC)
0235 static int static_init_done = 0;
0236 int n;
0237 int bits;
0238 int length;
0239 int code;
0240 int dist;
0241 ush bl_count[MAX_BITS+1];
0242
0243
0244 if (static_init_done) return;
0245
0246
0247 #ifdef NO_INIT_GLOBAL_POINTERS
0248 static_l_desc.static_tree = static_ltree;
0249 static_l_desc.extra_bits = extra_lbits;
0250 static_d_desc.static_tree = static_dtree;
0251 static_d_desc.extra_bits = extra_dbits;
0252 static_bl_desc.extra_bits = extra_blbits;
0253 #endif
0254
0255
0256 length = 0;
0257 for (code = 0; code < LENGTH_CODES-1; code++) {
0258 base_length[code] = length;
0259 for (n = 0; n < (1 << extra_lbits[code]); n++) {
0260 _length_code[length++] = (uch)code;
0261 }
0262 }
0263 Assert (length == 256, "tr_static_init: length != 256");
0264
0265
0266
0267
0268 _length_code[length - 1] = (uch)code;
0269
0270
0271 dist = 0;
0272 for (code = 0 ; code < 16; code++) {
0273 base_dist[code] = dist;
0274 for (n = 0; n < (1 << extra_dbits[code]); n++) {
0275 _dist_code[dist++] = (uch)code;
0276 }
0277 }
0278 Assert (dist == 256, "tr_static_init: dist != 256");
0279 dist >>= 7;
0280 for ( ; code < D_CODES; code++) {
0281 base_dist[code] = dist << 7;
0282 for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
0283 _dist_code[256 + dist++] = (uch)code;
0284 }
0285 }
0286 Assert (dist == 256, "tr_static_init: 256 + dist != 512");
0287
0288
0289 for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
0290 n = 0;
0291 while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
0292 while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
0293 while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
0294 while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
0295
0296
0297
0298
0299 gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
0300
0301
0302 for (n = 0; n < D_CODES; n++) {
0303 static_dtree[n].Len = 5;
0304 static_dtree[n].Code = bi_reverse((unsigned)n, 5);
0305 }
0306 static_init_done = 1;
0307
0308 # ifdef GEN_TREES_H
0309 gen_trees_header();
0310 # endif
0311 #endif
0312 }
0313
0314
0315
0316
0317 #ifdef GEN_TREES_H
0318 # ifndef ZLIB_DEBUG
0319 # include <stdio.h>
0320 # endif
0321
0322 # define SEPARATOR(i, last, width) \
0323 ((i) == (last)? "\n};\n\n" : \
0324 ((i) % (width) == (width) - 1 ? ",\n" : ", "))
0325
0326 void gen_trees_header()
0327 {
0328 FILE *header = fopen("trees.h", "w");
0329 int i;
0330
0331 Assert (header != NULL, "Can't open trees.h");
0332 fprintf(header,
0333 "/* header created automatically with -DGEN_TREES_H */\n\n");
0334
0335 fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
0336 for (i = 0; i < L_CODES+2; i++) {
0337 fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
0338 static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
0339 }
0340
0341 fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
0342 for (i = 0; i < D_CODES; i++) {
0343 fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
0344 static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
0345 }
0346
0347 fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n");
0348 for (i = 0; i < DIST_CODE_LEN; i++) {
0349 fprintf(header, "%2u%s", _dist_code[i],
0350 SEPARATOR(i, DIST_CODE_LEN-1, 20));
0351 }
0352
0353 fprintf(header,
0354 "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
0355 for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
0356 fprintf(header, "%2u%s", _length_code[i],
0357 SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
0358 }
0359
0360 fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
0361 for (i = 0; i < LENGTH_CODES; i++) {
0362 fprintf(header, "%1u%s", base_length[i],
0363 SEPARATOR(i, LENGTH_CODES-1, 20));
0364 }
0365
0366 fprintf(header, "local const int base_dist[D_CODES] = {\n");
0367 for (i = 0; i < D_CODES; i++) {
0368 fprintf(header, "%5u%s", base_dist[i],
0369 SEPARATOR(i, D_CODES-1, 10));
0370 }
0371
0372 fclose(header);
0373 }
0374 #endif
0375
0376
0377
0378
0379 void ZLIB_INTERNAL _tr_init(s)
0380 deflate_state *s;
0381 {
0382 tr_static_init();
0383
0384 s->l_desc.dyn_tree = s->dyn_ltree;
0385 s->l_desc.stat_desc = &static_l_desc;
0386
0387 s->d_desc.dyn_tree = s->dyn_dtree;
0388 s->d_desc.stat_desc = &static_d_desc;
0389
0390 s->bl_desc.dyn_tree = s->bl_tree;
0391 s->bl_desc.stat_desc = &static_bl_desc;
0392
0393 s->bi_buf = 0;
0394 s->bi_valid = 0;
0395 #ifdef ZLIB_DEBUG
0396 s->compressed_len = 0L;
0397 s->bits_sent = 0L;
0398 #endif
0399
0400
0401 init_block(s);
0402 }
0403
0404
0405
0406
0407 local void init_block(s)
0408 deflate_state *s;
0409 {
0410 int n;
0411
0412
0413 for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
0414 for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
0415 for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
0416
0417 s->dyn_ltree[END_BLOCK].Freq = 1;
0418 s->opt_len = s->static_len = 0L;
0419 s->sym_next = s->matches = 0;
0420 }
0421
0422 #define SMALLEST 1
0423
0424
0425
0426
0427
0428
0429
0430 #define pqremove(s, tree, top) \
0431 {\
0432 top = s->heap[SMALLEST]; \
0433 s->heap[SMALLEST] = s->heap[s->heap_len--]; \
0434 pqdownheap(s, tree, SMALLEST); \
0435 }
0436
0437
0438
0439
0440
0441 #define smaller(tree, n, m, depth) \
0442 (tree[n].Freq < tree[m].Freq || \
0443 (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
0444
0445
0446
0447
0448
0449
0450
0451 local void pqdownheap(s, tree, k)
0452 deflate_state *s;
0453 ct_data *tree;
0454 int k;
0455 {
0456 int v = s->heap[k];
0457 int j = k << 1;
0458 while (j <= s->heap_len) {
0459
0460 if (j < s->heap_len &&
0461 smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) {
0462 j++;
0463 }
0464
0465 if (smaller(tree, v, s->heap[j], s->depth)) break;
0466
0467
0468 s->heap[k] = s->heap[j]; k = j;
0469
0470
0471 j <<= 1;
0472 }
0473 s->heap[k] = v;
0474 }
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486 local void gen_bitlen(s, desc)
0487 deflate_state *s;
0488 tree_desc *desc;
0489 {
0490 ct_data *tree = desc->dyn_tree;
0491 int max_code = desc->max_code;
0492 const ct_data *stree = desc->stat_desc->static_tree;
0493 const intf *extra = desc->stat_desc->extra_bits;
0494 int base = desc->stat_desc->extra_base;
0495 int max_length = desc->stat_desc->max_length;
0496 int h;
0497 int n, m;
0498 int bits;
0499 int xbits;
0500 ush f;
0501 int overflow = 0;
0502
0503 for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
0504
0505
0506
0507
0508 tree[s->heap[s->heap_max]].Len = 0;
0509
0510 for (h = s->heap_max + 1; h < HEAP_SIZE; h++) {
0511 n = s->heap[h];
0512 bits = tree[tree[n].Dad].Len + 1;
0513 if (bits > max_length) bits = max_length, overflow++;
0514 tree[n].Len = (ush)bits;
0515
0516
0517 if (n > max_code) continue;
0518
0519 s->bl_count[bits]++;
0520 xbits = 0;
0521 if (n >= base) xbits = extra[n - base];
0522 f = tree[n].Freq;
0523 s->opt_len += (ulg)f * (unsigned)(bits + xbits);
0524 if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits);
0525 }
0526 if (overflow == 0) return;
0527
0528 Tracev((stderr,"\nbit length overflow\n"));
0529
0530
0531
0532 do {
0533 bits = max_length - 1;
0534 while (s->bl_count[bits] == 0) bits--;
0535 s->bl_count[bits]--;
0536 s->bl_count[bits + 1] += 2;
0537 s->bl_count[max_length]--;
0538
0539
0540
0541 overflow -= 2;
0542 } while (overflow > 0);
0543
0544
0545
0546
0547
0548
0549 for (bits = max_length; bits != 0; bits--) {
0550 n = s->bl_count[bits];
0551 while (n != 0) {
0552 m = s->heap[--h];
0553 if (m > max_code) continue;
0554 if ((unsigned) tree[m].Len != (unsigned) bits) {
0555 Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
0556 s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq;
0557 tree[m].Len = (ush)bits;
0558 }
0559 n--;
0560 }
0561 }
0562 }
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572 local void gen_codes(tree, max_code, bl_count)
0573 ct_data *tree;
0574 int max_code;
0575 ushf *bl_count;
0576 {
0577 ush next_code[MAX_BITS+1];
0578 unsigned code = 0;
0579 int bits;
0580 int n;
0581
0582
0583
0584
0585 for (bits = 1; bits <= MAX_BITS; bits++) {
0586 code = (code + bl_count[bits - 1]) << 1;
0587 next_code[bits] = (ush)code;
0588 }
0589
0590
0591
0592 Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
0593 "inconsistent bit counts");
0594 Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
0595
0596 for (n = 0; n <= max_code; n++) {
0597 int len = tree[n].Len;
0598 if (len == 0) continue;
0599
0600 tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
0601
0602 Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
0603 n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
0604 }
0605 }
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615 local void build_tree(s, desc)
0616 deflate_state *s;
0617 tree_desc *desc;
0618 {
0619 ct_data *tree = desc->dyn_tree;
0620 const ct_data *stree = desc->stat_desc->static_tree;
0621 int elems = desc->stat_desc->elems;
0622 int n, m;
0623 int max_code = -1;
0624 int node;
0625
0626
0627
0628
0629
0630 s->heap_len = 0, s->heap_max = HEAP_SIZE;
0631
0632 for (n = 0; n < elems; n++) {
0633 if (tree[n].Freq != 0) {
0634 s->heap[++(s->heap_len)] = max_code = n;
0635 s->depth[n] = 0;
0636 } else {
0637 tree[n].Len = 0;
0638 }
0639 }
0640
0641
0642
0643
0644
0645
0646 while (s->heap_len < 2) {
0647 node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
0648 tree[node].Freq = 1;
0649 s->depth[node] = 0;
0650 s->opt_len--; if (stree) s->static_len -= stree[node].Len;
0651
0652 }
0653 desc->max_code = max_code;
0654
0655
0656
0657
0658 for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
0659
0660
0661
0662
0663 node = elems;
0664 do {
0665 pqremove(s, tree, n);
0666 m = s->heap[SMALLEST];
0667
0668 s->heap[--(s->heap_max)] = n;
0669 s->heap[--(s->heap_max)] = m;
0670
0671
0672 tree[node].Freq = tree[n].Freq + tree[m].Freq;
0673 s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?
0674 s->depth[n] : s->depth[m]) + 1);
0675 tree[n].Dad = tree[m].Dad = (ush)node;
0676 #ifdef DUMP_BL_TREE
0677 if (tree == s->bl_tree) {
0678 fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
0679 node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
0680 }
0681 #endif
0682
0683 s->heap[SMALLEST] = node++;
0684 pqdownheap(s, tree, SMALLEST);
0685
0686 } while (s->heap_len >= 2);
0687
0688 s->heap[--(s->heap_max)] = s->heap[SMALLEST];
0689
0690
0691
0692
0693 gen_bitlen(s, (tree_desc *)desc);
0694
0695
0696 gen_codes ((ct_data *)tree, max_code, s->bl_count);
0697 }
0698
0699
0700
0701
0702
0703 local void scan_tree(s, tree, max_code)
0704 deflate_state *s;
0705 ct_data *tree;
0706 int max_code;
0707 {
0708 int n;
0709 int prevlen = -1;
0710 int curlen;
0711 int nextlen = tree[0].Len;
0712 int count = 0;
0713 int max_count = 7;
0714 int min_count = 4;
0715
0716 if (nextlen == 0) max_count = 138, min_count = 3;
0717 tree[max_code + 1].Len = (ush)0xffff;
0718
0719 for (n = 0; n <= max_code; n++) {
0720 curlen = nextlen; nextlen = tree[n + 1].Len;
0721 if (++count < max_count && curlen == nextlen) {
0722 continue;
0723 } else if (count < min_count) {
0724 s->bl_tree[curlen].Freq += count;
0725 } else if (curlen != 0) {
0726 if (curlen != prevlen) s->bl_tree[curlen].Freq++;
0727 s->bl_tree[REP_3_6].Freq++;
0728 } else if (count <= 10) {
0729 s->bl_tree[REPZ_3_10].Freq++;
0730 } else {
0731 s->bl_tree[REPZ_11_138].Freq++;
0732 }
0733 count = 0; prevlen = curlen;
0734 if (nextlen == 0) {
0735 max_count = 138, min_count = 3;
0736 } else if (curlen == nextlen) {
0737 max_count = 6, min_count = 3;
0738 } else {
0739 max_count = 7, min_count = 4;
0740 }
0741 }
0742 }
0743
0744
0745
0746
0747
0748 local void send_tree(s, tree, max_code)
0749 deflate_state *s;
0750 ct_data *tree;
0751 int max_code;
0752 {
0753 int n;
0754 int prevlen = -1;
0755 int curlen;
0756 int nextlen = tree[0].Len;
0757 int count = 0;
0758 int max_count = 7;
0759 int min_count = 4;
0760
0761
0762 if (nextlen == 0) max_count = 138, min_count = 3;
0763
0764 for (n = 0; n <= max_code; n++) {
0765 curlen = nextlen; nextlen = tree[n + 1].Len;
0766 if (++count < max_count && curlen == nextlen) {
0767 continue;
0768 } else if (count < min_count) {
0769 do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
0770
0771 } else if (curlen != 0) {
0772 if (curlen != prevlen) {
0773 send_code(s, curlen, s->bl_tree); count--;
0774 }
0775 Assert(count >= 3 && count <= 6, " 3_6?");
0776 send_code(s, REP_3_6, s->bl_tree); send_bits(s, count - 3, 2);
0777
0778 } else if (count <= 10) {
0779 send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count - 3, 3);
0780
0781 } else {
0782 send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7);
0783 }
0784 count = 0; prevlen = curlen;
0785 if (nextlen == 0) {
0786 max_count = 138, min_count = 3;
0787 } else if (curlen == nextlen) {
0788 max_count = 6, min_count = 3;
0789 } else {
0790 max_count = 7, min_count = 4;
0791 }
0792 }
0793 }
0794
0795
0796
0797
0798
0799 local int build_bl_tree(s)
0800 deflate_state *s;
0801 {
0802 int max_blindex;
0803
0804
0805 scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
0806 scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
0807
0808
0809 build_tree(s, (tree_desc *)(&(s->bl_desc)));
0810
0811
0812
0813
0814
0815
0816
0817
0818 for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
0819 if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
0820 }
0821
0822 s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4;
0823 Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
0824 s->opt_len, s->static_len));
0825
0826 return max_blindex;
0827 }
0828
0829
0830
0831
0832
0833
0834 local void send_all_trees(s, lcodes, dcodes, blcodes)
0835 deflate_state *s;
0836 int lcodes, dcodes, blcodes;
0837 {
0838 int rank;
0839
0840 Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
0841 Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
0842 "too many codes");
0843 Tracev((stderr, "\nbl counts: "));
0844 send_bits(s, lcodes - 257, 5);
0845 send_bits(s, dcodes - 1, 5);
0846 send_bits(s, blcodes - 4, 4);
0847 for (rank = 0; rank < blcodes; rank++) {
0848 Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
0849 send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
0850 }
0851 Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
0852
0853 send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1);
0854 Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
0855
0856 send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1);
0857 Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
0858 }
0859
0860
0861
0862
0863 void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
0864 deflate_state *s;
0865 charf *buf;
0866 ulg stored_len;
0867 int last;
0868 {
0869 send_bits(s, (STORED_BLOCK<<1) + last, 3);
0870 bi_windup(s);
0871 put_short(s, (ush)stored_len);
0872 put_short(s, (ush)~stored_len);
0873 if (stored_len)
0874 zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
0875 s->pending += stored_len;
0876 #ifdef ZLIB_DEBUG
0877 s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
0878 s->compressed_len += (stored_len + 4) << 3;
0879 s->bits_sent += 2*16;
0880 s->bits_sent += stored_len << 3;
0881 #endif
0882 }
0883
0884
0885
0886
0887 void ZLIB_INTERNAL _tr_flush_bits(s)
0888 deflate_state *s;
0889 {
0890 bi_flush(s);
0891 }
0892
0893
0894
0895
0896
0897 void ZLIB_INTERNAL _tr_align(s)
0898 deflate_state *s;
0899 {
0900 send_bits(s, STATIC_TREES<<1, 3);
0901 send_code(s, END_BLOCK, static_ltree);
0902 #ifdef ZLIB_DEBUG
0903 s->compressed_len += 10L;
0904 #endif
0905 bi_flush(s);
0906 }
0907
0908
0909
0910
0911
0912 void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
0913 deflate_state *s;
0914 charf *buf;
0915 ulg stored_len;
0916 int last;
0917 {
0918 ulg opt_lenb, static_lenb;
0919 int max_blindex = 0;
0920
0921
0922 if (s->level > 0) {
0923
0924
0925 if (s->strm->data_type == Z_UNKNOWN)
0926 s->strm->data_type = detect_data_type(s);
0927
0928
0929 build_tree(s, (tree_desc *)(&(s->l_desc)));
0930 Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
0931 s->static_len));
0932
0933 build_tree(s, (tree_desc *)(&(s->d_desc)));
0934 Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
0935 s->static_len));
0936
0937
0938
0939
0940
0941
0942
0943 max_blindex = build_bl_tree(s);
0944
0945
0946 opt_lenb = (s->opt_len + 3 + 7) >> 3;
0947 static_lenb = (s->static_len + 3 + 7) >> 3;
0948
0949 Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
0950 opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
0951 s->sym_next / 3));
0952
0953 #ifndef FORCE_STATIC
0954 if (static_lenb <= opt_lenb || s->strategy == Z_FIXED)
0955 #endif
0956 opt_lenb = static_lenb;
0957
0958 } else {
0959 Assert(buf != (char*)0, "lost buf");
0960 opt_lenb = static_lenb = stored_len + 5;
0961 }
0962
0963 #ifdef FORCE_STORED
0964 if (buf != (char*)0) {
0965 #else
0966 if (stored_len + 4 <= opt_lenb && buf != (char*)0) {
0967
0968 #endif
0969
0970
0971
0972
0973
0974
0975 _tr_stored_block(s, buf, stored_len, last);
0976
0977 } else if (static_lenb == opt_lenb) {
0978 send_bits(s, (STATIC_TREES<<1) + last, 3);
0979 compress_block(s, (const ct_data *)static_ltree,
0980 (const ct_data *)static_dtree);
0981 #ifdef ZLIB_DEBUG
0982 s->compressed_len += 3 + s->static_len;
0983 #endif
0984 } else {
0985 send_bits(s, (DYN_TREES<<1) + last, 3);
0986 send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1,
0987 max_blindex + 1);
0988 compress_block(s, (const ct_data *)s->dyn_ltree,
0989 (const ct_data *)s->dyn_dtree);
0990 #ifdef ZLIB_DEBUG
0991 s->compressed_len += 3 + s->opt_len;
0992 #endif
0993 }
0994 Assert (s->compressed_len == s->bits_sent, "bad compressed size");
0995
0996
0997
0998 init_block(s);
0999
1000 if (last) {
1001 bi_windup(s);
1002 #ifdef ZLIB_DEBUG
1003 s->compressed_len += 7;
1004 #endif
1005 }
1006 Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3,
1007 s->compressed_len - 7*last));
1008 }
1009
1010
1011
1012
1013
1014 int ZLIB_INTERNAL _tr_tally(s, dist, lc)
1015 deflate_state *s;
1016 unsigned dist;
1017 unsigned lc;
1018 {
1019 s->sym_buf[s->sym_next++] = (uch)dist;
1020 s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
1021 s->sym_buf[s->sym_next++] = (uch)lc;
1022 if (dist == 0) {
1023
1024 s->dyn_ltree[lc].Freq++;
1025 } else {
1026 s->matches++;
1027
1028 dist--;
1029 Assert((ush)dist < (ush)MAX_DIST(s) &&
1030 (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
1031 (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
1032
1033 s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++;
1034 s->dyn_dtree[d_code(dist)].Freq++;
1035 }
1036 return (s->sym_next == s->sym_end);
1037 }
1038
1039
1040
1041
1042 local void compress_block(s, ltree, dtree)
1043 deflate_state *s;
1044 const ct_data *ltree;
1045 const ct_data *dtree;
1046 {
1047 unsigned dist;
1048 int lc;
1049 unsigned sx = 0;
1050 unsigned code;
1051 int extra;
1052
1053 if (s->sym_next != 0) do {
1054 dist = s->sym_buf[sx++] & 0xff;
1055 dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
1056 lc = s->sym_buf[sx++];
1057 if (dist == 0) {
1058 send_code(s, lc, ltree);
1059 Tracecv(isgraph(lc), (stderr," '%c' ", lc));
1060 } else {
1061
1062 code = _length_code[lc];
1063 send_code(s, code + LITERALS + 1, ltree);
1064 extra = extra_lbits[code];
1065 if (extra != 0) {
1066 lc -= base_length[code];
1067 send_bits(s, lc, extra);
1068 }
1069 dist--;
1070 code = d_code(dist);
1071 Assert (code < D_CODES, "bad d_code");
1072
1073 send_code(s, code, dtree);
1074 extra = extra_dbits[code];
1075 if (extra != 0) {
1076 dist -= (unsigned)base_dist[code];
1077 send_bits(s, dist, extra);
1078 }
1079 }
1080
1081
1082 Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
1083
1084 } while (sx < s->sym_next);
1085
1086 send_code(s, END_BLOCK, ltree);
1087 }
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102 local int detect_data_type(s)
1103 deflate_state *s;
1104 {
1105
1106
1107
1108
1109 unsigned long block_mask = 0xf3ffc07fUL;
1110 int n;
1111
1112
1113 for (n = 0; n <= 31; n++, block_mask >>= 1)
1114 if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
1115 return Z_BINARY;
1116
1117
1118 if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
1119 || s->dyn_ltree[13].Freq != 0)
1120 return Z_TEXT;
1121 for (n = 32; n < LITERALS; n++)
1122 if (s->dyn_ltree[n].Freq != 0)
1123 return Z_TEXT;
1124
1125
1126
1127
1128 return Z_BINARY;
1129 }
1130
1131
1132
1133
1134
1135
1136 local unsigned bi_reverse(code, len)
1137 unsigned code;
1138 int len;
1139 {
1140 register unsigned res = 0;
1141 do {
1142 res |= code & 1;
1143 code >>= 1, res <<= 1;
1144 } while (--len > 0);
1145 return res >> 1;
1146 }
1147
1148
1149
1150
1151 local void bi_flush(s)
1152 deflate_state *s;
1153 {
1154 if (s->bi_valid == 16) {
1155 put_short(s, s->bi_buf);
1156 s->bi_buf = 0;
1157 s->bi_valid = 0;
1158 } else if (s->bi_valid >= 8) {
1159 put_byte(s, (Byte)s->bi_buf);
1160 s->bi_buf >>= 8;
1161 s->bi_valid -= 8;
1162 }
1163 }
1164
1165
1166
1167
1168 local void bi_windup(s)
1169 deflate_state *s;
1170 {
1171 if (s->bi_valid > 8) {
1172 put_short(s, s->bi_buf);
1173 } else if (s->bi_valid > 0) {
1174 put_byte(s, (Byte)s->bi_buf);
1175 }
1176 s->bi_buf = 0;
1177 s->bi_valid = 0;
1178 #ifdef ZLIB_DEBUG
1179 s->bits_sent = (s->bits_sent + 7) & ~7;
1180 #endif
1181 }