00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #include <ctype.h>
00066
00067
00068
00069
00070
00071
00072
00073 #define MAX_BITS 15
00074
00075
00076 #define MAX_BL_BITS 7
00077
00078
00079 #define LENGTH_CODES 29
00080
00081
00082 #define LITERALS 256
00083
00084
00085 #define END_BLOCK 256
00086
00087
00088 #define L_CODES (LITERALS+1+LENGTH_CODES)
00089
00090
00091 #define D_CODES 30
00092
00093
00094 #define BL_CODES 19
00095
00096
00097
00098 local int near extra_lbits[LENGTH_CODES]
00099 = {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};
00100
00101 local int near extra_dbits[D_CODES]
00102 = {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};
00103
00104 local int near extra_blbits[BL_CODES]
00105 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
00106
00107 #define STORED_BLOCK 0
00108 #define STATIC_TREES 1
00109 #define DYN_TREES 2
00110
00111
00112 #ifndef LIT_BUFSIZE
00113 # ifdef SMALL_MEM
00114 # define LIT_BUFSIZE 0x2000
00115 # else
00116 # ifdef MEDIUM_MEM
00117 # define LIT_BUFSIZE 0x4000
00118 # else
00119 # define LIT_BUFSIZE 0x8000
00120 # endif
00121 # endif
00122 #endif
00123 #define DIST_BUFSIZE LIT_BUFSIZE
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 #define REP_3_6 16
00146
00147
00148 #define REPZ_3_10 17
00149
00150
00151 #define REPZ_11_138 18
00152
00153
00154
00155
00156
00157
00158
00159 typedef struct ct_data {
00160 union {
00161 ush freq;
00162 ush code;
00163 } fc;
00164 union {
00165 ush dad;
00166 ush len;
00167 } dl;
00168 } ct_data;
00169
00170 #define Freq fc.freq
00171 #define Code fc.code
00172 #define Dad dl.dad
00173 #define Len dl.len
00174
00175 #define HEAP_SIZE (2*L_CODES+1)
00176
00177
00178 local ct_data near dyn_ltree[HEAP_SIZE];
00179 local ct_data near dyn_dtree[2*D_CODES+1];
00180
00181 local ct_data near static_ltree[L_CODES+2];
00182
00183
00184
00185
00186
00187
00188 local ct_data near static_dtree[D_CODES];
00189
00190
00191
00192
00193 local ct_data near bl_tree[2*BL_CODES+1];
00194
00195
00196 typedef struct tree_desc {
00197 ct_data near *dyn_tree;
00198 ct_data near *static_tree;
00199 int near *extra_bits;
00200 int extra_base;
00201 int elems;
00202 int max_length;
00203 int max_code;
00204 } tree_desc;
00205
00206 local tree_desc near l_desc =
00207 {dyn_ltree, static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS, 0};
00208
00209 local tree_desc near d_desc =
00210 {dyn_dtree, static_dtree, extra_dbits, 0, D_CODES, MAX_BITS, 0};
00211
00212 local tree_desc near bl_desc =
00213 {bl_tree, NULL, extra_blbits, 0, BL_CODES, MAX_BL_BITS, 0};
00214
00215
00216 local ush near bl_count[MAX_BITS+1];
00217
00218
00219 local uch near bl_order[BL_CODES]
00220 = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
00221
00222
00223
00224
00225 local int near heap[2*L_CODES+1];
00226 local int heap_len;
00227 local int heap_max;
00228
00229
00230
00231
00232 local uch near depth[2*L_CODES+1];
00233
00234
00235 local uch length_code[MAX_MATCH-MIN_MATCH+1];
00236
00237
00238 local uch dist_code[512];
00239
00240
00241
00242
00243
00244 local int near base_length[LENGTH_CODES];
00245
00246
00247 local int near base_dist[D_CODES];
00248
00249
00250 #ifndef DYN_ALLOC
00251 local uch far l_buf[LIT_BUFSIZE];
00252 local ush far d_buf[DIST_BUFSIZE];
00253 #else
00254 local uch far *l_buf;
00255 local ush far *d_buf;
00256 #endif
00257
00258 local uch near flag_buf[(LIT_BUFSIZE/8)];
00259
00260
00261
00262
00263 local unsigned last_lit;
00264 local unsigned last_dist;
00265 local unsigned last_flags;
00266 local uch flags;
00267 local uch flag_bit;
00268
00269
00270
00271
00272
00273 local ulg opt_len;
00274 local ulg static_len;
00275
00276 local ulg compressed_len;
00277
00278 local ulg input_len;
00279
00280
00281 ush *R__file_type;
00282 int *R__file_method;
00283
00284 #ifdef DEBUG
00285
00286
00287 #endif
00288
00289
00290
00291
00292
00293
00294
00295
00296 local void R__init_block OF((void));
00297 local void R__pqdownheap OF((ct_data near *tree, int k));
00298 local void R__gen_bitlen OF((tree_desc near *desc));
00299 local void R__gen_codes OF((ct_data near *tree, int max_code));
00300 local void R__build_tree OF((tree_desc near *desc));
00301 local void R__scan_tree OF((ct_data near *tree, int max_code));
00302 local void R__send_tree OF((ct_data near *tree, int max_code));
00303 local int R__build_bl_tree OF((void));
00304 local void R__send_all_trees OF((int lcodes, int dcodes, int blcodes));
00305 local void R__compress_block OF((ct_data near *ltree, ct_data near *dtree));
00306 local void R__set_file_type OF((void));
00307
00308
00309 #ifndef DEBUG
00310 # define send_code(c, tree) R__send_bits(tree[c].Code, tree[c].Len)
00311
00312
00313 #else
00314 # define send_code(c, tree) \
00315 { if (verbose>1) fprintf(stderr,"\ncd %3d ",(c)); \
00316 R__send_bits(tree[c].Code, tree[c].Len); }
00317 #endif
00318
00319 #define d_code(dist) \
00320 ((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)])
00321
00322
00323
00324
00325
00326 #define MAX(a,b) (a >= b ? a : b)
00327
00328
00329
00330
00331
00332
00333
00334 void R__ct_init(ush *attr, int *method)
00335
00336
00337 {
00338 int n;
00339 int bits;
00340 int length;
00341 int code;
00342 int dist;
00343
00344 R__file_type = attr;
00345 R__file_method = method;
00346 compressed_len = input_len = 0L;
00347
00348 if (static_dtree[0].Len != 0) return;
00349
00350 #ifdef DYN_ALLOC
00351 d_buf = (ush far*) fcalloc(DIST_BUFSIZE, sizeof(ush));
00352 l_buf = (uch far*) fcalloc(LIT_BUFSIZE/2, 2);
00353
00354 if (l_buf == NULL || d_buf == NULL) R__error("R__ct_init: out of memory");
00355 #endif
00356
00357
00358 length = 0;
00359 for (code = 0; code < LENGTH_CODES-1; code++) {
00360 base_length[code] = length;
00361 for (n = 0; n < (1<<extra_lbits[code]); n++) {
00362 length_code[length++] = (uch)code;
00363 }
00364 }
00365 Assert (length == 256, "R__ct_init: length != 256");
00366
00367
00368
00369
00370 length_code[length-1] = (uch)code;
00371
00372
00373 dist = 0;
00374 for (code = 0 ; code < 16; code++) {
00375 base_dist[code] = dist;
00376 for (n = 0; n < (1<<extra_dbits[code]); n++) {
00377 dist_code[dist++] = (uch)code;
00378 }
00379 }
00380 Assert (dist == 256, "R__ct_init: dist != 256");
00381 dist >>= 7;
00382 for ( ; code < D_CODES; code++) {
00383 base_dist[code] = dist << 7;
00384 for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
00385 dist_code[256 + dist++] = (uch)code;
00386 }
00387 }
00388 Assert (dist == 256, "R__ct_init: 256+dist != 512");
00389
00390
00391 for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
00392 n = 0;
00393 while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
00394 while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
00395 while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
00396 while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
00397
00398
00399
00400
00401 R__gen_codes((ct_data near *)static_ltree, L_CODES+1);
00402
00403
00404 for (n = 0; n < D_CODES; n++) {
00405 static_dtree[n].Len = 5;
00406 static_dtree[n].Code = R__bi_reverse(n, 5);
00407 }
00408
00409
00410 R__init_block();
00411 }
00412
00413
00414
00415
00416 local void R__init_block()
00417 {
00418 int n;
00419
00420
00421 for (n = 0; n < L_CODES; n++) dyn_ltree[n].Freq = 0;
00422 for (n = 0; n < D_CODES; n++) dyn_dtree[n].Freq = 0;
00423 for (n = 0; n < BL_CODES; n++) bl_tree[n].Freq = 0;
00424
00425 dyn_ltree[END_BLOCK].Freq = 1;
00426 opt_len = static_len = 0L;
00427 last_lit = last_dist = last_flags = 0;
00428 flags = 0; flag_bit = 1;
00429 }
00430
00431 #define SMALLEST 1
00432
00433
00434
00435
00436
00437
00438
00439 #define pqremove(tree, top) \
00440 {\
00441 top = heap[SMALLEST]; \
00442 heap[SMALLEST] = heap[heap_len--]; \
00443 R__pqdownheap(tree, SMALLEST); \
00444 }
00445
00446
00447
00448
00449
00450 #define smaller(tree, n, m) \
00451 (tree[n].Freq < tree[m].Freq || \
00452 (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
00453
00454
00455
00456
00457
00458
00459
00460 local void R__pqdownheap(ct_data near *tree, int k)
00461
00462
00463 {
00464 int v = heap[k];
00465 int j = k << 1;
00466 int htemp;
00467
00468 while (j <= heap_len) {
00469
00470 if (j < heap_len && smaller(tree, heap[j+1], heap[j])) j++;
00471
00472
00473 htemp = heap[j];
00474 if (smaller(tree, v, htemp)) break;
00475
00476
00477 heap[k] = htemp;
00478 k = j;
00479
00480
00481 j <<= 1;
00482 }
00483 heap[k] = v;
00484 }
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496 local void R__gen_bitlen(tree_desc near *desc)
00497
00498 {
00499 ct_data near *tree = desc->dyn_tree;
00500 int near *extra = desc->extra_bits;
00501 int base = desc->extra_base;
00502 int max_code = desc->max_code;
00503 int max_length = desc->max_length;
00504 ct_data near *stree = desc->static_tree;
00505 int h;
00506 int n, m;
00507 int bits;
00508 int xbits;
00509 ush f;
00510 int overflow = 0;
00511
00512 for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
00513
00514
00515
00516
00517 tree[heap[heap_max]].Len = 0;
00518
00519 for (h = heap_max+1; h < HEAP_SIZE; h++) {
00520 n = heap[h];
00521 bits = tree[tree[n].Dad].Len + 1;
00522 if (bits > max_length) bits = max_length, overflow++;
00523 tree[n].Len = bits;
00524
00525
00526 if (n > max_code) continue;
00527
00528 bl_count[bits]++;
00529 xbits = 0;
00530 if (n >= base) xbits = extra[n-base];
00531 f = tree[n].Freq;
00532 opt_len += (ulg)f * (bits + xbits);
00533 if (stree) static_len += (ulg)f * (stree[n].Len + xbits);
00534 }
00535 if (overflow == 0) return;
00536
00537 Trace((stderr,"\nbit length overflow\n"));
00538
00539
00540
00541 do {
00542 bits = max_length-1;
00543 while (bl_count[bits] == 0) bits--;
00544 bl_count[bits]--;
00545 bl_count[bits+1] += 2;
00546 bl_count[max_length]--;
00547
00548
00549
00550 overflow -= 2;
00551 } while (overflow > 0);
00552
00553
00554
00555
00556
00557
00558 for (bits = max_length; bits != 0; bits--) {
00559 n = bl_count[bits];
00560 while (n != 0) {
00561 m = heap[--h];
00562 if (m > max_code) continue;
00563 if (tree[m].Len != (unsigned) bits) {
00564 Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
00565 opt_len += ((long)bits-(long)tree[m].Len)*(long)tree[m].Freq;
00566 tree[m].Len = bits;
00567 }
00568 n--;
00569 }
00570 }
00571 }
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581 local void R__gen_codes (ct_data near *tree, int max_code)
00582
00583
00584 {
00585 ush next_code[MAX_BITS+1];
00586 ush code = 0;
00587 int bits;
00588 int n;
00589
00590
00591
00592
00593 for (bits = 1; bits <= MAX_BITS; bits++) {
00594 next_code[bits] = code = (code + bl_count[bits-1]) << 1;
00595 }
00596
00597
00598
00599 Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
00600 "inconsistent bit counts");
00601 Tracev((stderr,"\nR__gen_codes: max_code %d ", max_code));
00602
00603 for (n = 0; n <= max_code; n++) {
00604 int len = tree[n].Len;
00605 if (len == 0) continue;
00606
00607 tree[n].Code = R__bi_reverse(next_code[len]++, len);
00608
00609 Tracec(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
00610 n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
00611 }
00612 }
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622 local void R__build_tree(tree_desc near *desc)
00623
00624 {
00625 ct_data near *tree = desc->dyn_tree;
00626 ct_data near *stree = desc->static_tree;
00627 int elems = desc->elems;
00628 int n, m;
00629 int max_code = -1;
00630 int node = elems;
00631
00632
00633
00634
00635
00636 heap_len = 0, heap_max = HEAP_SIZE;
00637
00638 for (n = 0; n < elems; n++) {
00639 if (tree[n].Freq != 0) {
00640 heap[++heap_len] = max_code = n;
00641 depth[n] = 0;
00642 } else {
00643 tree[n].Len = 0;
00644 }
00645 }
00646
00647
00648
00649
00650
00651
00652 while (heap_len < 2) {
00653 int new1 = heap[++heap_len] = (max_code < 2 ? ++max_code : 0);
00654 tree[new1].Freq = 1;
00655 depth[new1] = 0;
00656 opt_len--; if (stree) static_len -= stree[new1].Len;
00657
00658 }
00659 desc->max_code = max_code;
00660
00661
00662
00663
00664 for (n = heap_len/2; n >= 1; n--) R__pqdownheap(tree, n);
00665
00666
00667
00668
00669 do {
00670 pqremove(tree, n);
00671 m = heap[SMALLEST];
00672
00673 heap[--heap_max] = n;
00674 heap[--heap_max] = m;
00675
00676
00677 tree[node].Freq = tree[n].Freq + tree[m].Freq;
00678 depth[node] = (uch) (MAX(depth[n], depth[m]) + 1);
00679 tree[n].Dad = tree[m].Dad = node;
00680 #ifdef DUMP_BL_TREE
00681 if (tree == bl_tree) {
00682 fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
00683 node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
00684 }
00685 #endif
00686
00687 heap[SMALLEST] = node++;
00688 R__pqdownheap(tree, SMALLEST);
00689
00690 } while (heap_len >= 2);
00691
00692 heap[--heap_max] = heap[SMALLEST];
00693
00694
00695
00696
00697 R__gen_bitlen((tree_desc near *)desc);
00698
00699
00700 R__gen_codes ((ct_data near *)tree, max_code);
00701 }
00702
00703
00704
00705
00706
00707
00708
00709 local void R__scan_tree (ct_data near *tree, int max_code)
00710
00711
00712 {
00713 int n;
00714 int prevlen = -1;
00715 int curlen;
00716 int nextlen = tree[0].Len;
00717 int count = 0;
00718 int max_count = 7;
00719 int min_count = 4;
00720
00721 if (nextlen == 0) max_count = 138, min_count = 3;
00722 tree[max_code+1].Len = (ush)-1;
00723
00724 for (n = 0; n <= max_code; n++) {
00725 curlen = nextlen; nextlen = tree[n+1].Len;
00726 if (++count < max_count && curlen == nextlen) {
00727 continue;
00728 } else if (count < min_count) {
00729 bl_tree[curlen].Freq += count;
00730 } else if (curlen != 0) {
00731 if (curlen != prevlen) bl_tree[curlen].Freq++;
00732 bl_tree[REP_3_6].Freq++;
00733 } else if (count <= 10) {
00734 bl_tree[REPZ_3_10].Freq++;
00735 } else {
00736 bl_tree[REPZ_11_138].Freq++;
00737 }
00738 count = 0; prevlen = curlen;
00739 if (nextlen == 0) {
00740 max_count = 138, min_count = 3;
00741 } else if (curlen == nextlen) {
00742 max_count = 6, min_count = 3;
00743 } else {
00744 max_count = 7, min_count = 4;
00745 }
00746 }
00747 }
00748
00749
00750
00751
00752
00753 local void R__send_tree (ct_data near *tree, int max_code)
00754
00755
00756 {
00757 int n;
00758 int prevlen = -1;
00759 int curlen;
00760 int nextlen = tree[0].Len;
00761 int count = 0;
00762 int max_count = 7;
00763 int min_count = 4;
00764
00765
00766 if (nextlen == 0) max_count = 138, min_count = 3;
00767
00768 for (n = 0; n <= max_code; n++) {
00769 curlen = nextlen; nextlen = tree[n+1].Len;
00770 if (++count < max_count && curlen == nextlen) {
00771 continue;
00772 } else if (count < min_count) {
00773 do { send_code(curlen, bl_tree); } while (--count != 0);
00774
00775 } else if (curlen != 0) {
00776 if (curlen != prevlen) {
00777 send_code(curlen, bl_tree); count--;
00778 }
00779 Assert(count >= 3 && count <= 6, " 3_6?");
00780 send_code(REP_3_6, bl_tree); R__send_bits(count-3, 2);
00781
00782 } else if (count <= 10) {
00783 send_code(REPZ_3_10, bl_tree); R__send_bits(count-3, 3);
00784
00785 } else {
00786 send_code(REPZ_11_138, bl_tree); R__send_bits(count-11, 7);
00787 }
00788 count = 0; prevlen = curlen;
00789 if (nextlen == 0) {
00790 max_count = 138, min_count = 3;
00791 } else if (curlen == nextlen) {
00792 max_count = 6, min_count = 3;
00793 } else {
00794 max_count = 7, min_count = 4;
00795 }
00796 }
00797 }
00798
00799
00800
00801
00802
00803 local int R__build_bl_tree()
00804 {
00805 int max_blindex;
00806
00807
00808 R__scan_tree((ct_data near *)dyn_ltree, l_desc.max_code);
00809 R__scan_tree((ct_data near *)dyn_dtree, d_desc.max_code);
00810
00811
00812 R__build_tree((tree_desc near *)(&bl_desc));
00813
00814
00815
00816
00817
00818
00819
00820
00821 for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
00822 if (bl_tree[bl_order[max_blindex]].Len != 0) break;
00823 }
00824
00825 opt_len += 3*(max_blindex+1) + 5+5+4;
00826 Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", opt_len, static_len));
00827
00828 return max_blindex;
00829 }
00830
00831
00832
00833
00834
00835
00836 local void R__send_all_trees(int lcodes, int dcodes, int blcodes)
00837
00838 {
00839 int rank;
00840
00841 Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
00842 Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
00843 "too many codes");
00844 Tracev((stderr, "\nbl counts: "));
00845 R__send_bits(lcodes-257, 5);
00846
00847 R__send_bits(dcodes-1, 5);
00848 R__send_bits(blcodes-4, 4);
00849 for (rank = 0; rank < blcodes; rank++) {
00850 Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
00851 R__send_bits(bl_tree[bl_order[rank]].Len, 3);
00852 }
00853 Tracev((stderr, "\nbl tree: sent %ld", R__bits_sent));
00854
00855 R__send_tree((ct_data near *)dyn_ltree, lcodes-1);
00856 Tracev((stderr, "\nlit tree: sent %ld", R__bits_sent));
00857
00858 R__send_tree((ct_data near *)dyn_dtree, dcodes-1);
00859 Tracev((stderr, "\ndist tree: sent %ld", R__bits_sent));
00860 }
00861
00862
00863
00864
00865
00866
00867 ulg R__flush_block(char *buf, ulg stored_len, int eof)
00868
00869
00870
00871 {
00872 ulg opt_lenb, static_lenb;
00873 int max_blindex;
00874
00875 flag_buf[last_flags] = flags;
00876
00877
00878 if (*R__file_type == (ush)UNKNOWN) R__set_file_type();
00879
00880
00881 R__build_tree((tree_desc near *)(&l_desc));
00882 Tracev((stderr, "\nlit data: dyn %ld, stat %ld", opt_len, static_len));
00883
00884 R__build_tree((tree_desc near *)(&d_desc));
00885 Tracev((stderr, "\ndist data: dyn %ld, stat %ld", opt_len, static_len));
00886
00887
00888
00889
00890
00891
00892
00893 max_blindex = R__build_bl_tree();
00894
00895
00896 opt_lenb = (opt_len+3+7)>>3;
00897 static_lenb = (static_len+3+7)>>3;
00898 input_len += stored_len;
00899
00900 Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ",
00901 opt_lenb, opt_len, static_lenb, static_len, stored_len,
00902 last_lit, last_dist));
00903
00904 if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
00905
00906 #ifndef PGP
00907
00908
00909
00910
00911 #ifdef FORCE_METHOD
00912 if (level == 1 && eof && compressed_len == 0L) {
00913 #else
00914 if (stored_len <= opt_lenb && eof && compressed_len == 0L && R__seekable()) {
00915 #endif
00916
00917 if (buf == (char *) NULL) R__error ("block vanished");
00918
00919 R__copy_block(buf, (unsigned)stored_len, 0);
00920 compressed_len = stored_len << 3;
00921 *R__file_method = STORE;
00922 } else
00923 #endif
00924
00925 #ifdef FORCE_METHOD
00926 if (level == 2 && buf != (char*)NULL) {
00927 #else
00928 if (stored_len+4 <= opt_lenb && buf != (char*)NULL) {
00929
00930 #endif
00931
00932
00933
00934
00935
00936
00937 R__send_bits((STORED_BLOCK<<1)+eof, 3);
00938 compressed_len = (compressed_len + 3 + 7) & ~7L;
00939 compressed_len += (stored_len + 4) << 3;
00940
00941 R__copy_block(buf, (unsigned)stored_len, 1);
00942
00943 #ifdef FORCE_METHOD
00944 } else if (level == 3) {
00945 #else
00946 } else if (static_lenb == opt_lenb) {
00947 #endif
00948 R__send_bits((STATIC_TREES<<1)+eof, 3);
00949 R__compress_block( (ct_data near *)static_ltree,
00950 (ct_data near *)static_dtree );
00951 compressed_len += 3 + static_len;
00952 } else {
00953 R__send_bits((DYN_TREES<<1)+eof, 3);
00954 R__send_all_trees(l_desc.max_code+1, d_desc.max_code+1, max_blindex+1);
00955 R__compress_block((ct_data near *)dyn_ltree, (ct_data near *)dyn_dtree);
00956 compressed_len += 3 + opt_len;
00957 }
00958 Assert (compressed_len == R__bits_sent, "bad compressed size");
00959 R__init_block();
00960
00961 if (eof) {
00962 #if defined(PGP) && !defined(MMAP)
00963
00964
00965
00966
00967
00968
00969
00970
00971 memset(R__window, 0, (unsigned)(2*WSIZE-1));
00972 #else
00973 Assert (input_len == R__isize, "bad input size");
00974 #endif
00975 R__bi_windup();
00976 compressed_len += 7;
00977 }
00978 Tracev((stderr,"\ncomprlen %lu(%lu) ", compressed_len>>3,
00979 compressed_len-7*eof));
00980
00981 return compressed_len >> 3;
00982 }
00983
00984
00985
00986
00987
00988 int R__ct_tally (int dist, int lc)
00989
00990
00991 {
00992 l_buf[last_lit++] = (uch)lc;
00993 if (dist == 0) {
00994
00995 dyn_ltree[lc].Freq++;
00996 } else {
00997
00998 dist--;
00999 Assert((ush)dist < (ush)MAX_DIST &&
01000 (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
01001 (ush)d_code(dist) < (ush)D_CODES, "R__ct_tally: bad match");
01002
01003 dyn_ltree[length_code[lc]+LITERALS+1].Freq++;
01004 dyn_dtree[d_code(dist)].Freq++;
01005
01006 d_buf[last_dist++] = dist;
01007 flags |= flag_bit;
01008 }
01009 flag_bit <<= 1;
01010
01011
01012 if ((last_lit & 7) == 0) {
01013 flag_buf[last_flags++] = flags;
01014 flags = 0, flag_bit = 1;
01015 }
01016
01017 if (level > 2 && (last_lit & 0xfff) == 0) {
01018
01019 ulg out_length = (ulg)last_lit*8L;
01020 ulg in_length = (ulg)R__strstart-R__block_start;
01021 int dcode;
01022 for (dcode = 0; dcode < D_CODES; dcode++) {
01023 out_length += (ulg)dyn_dtree[dcode].Freq*(5L+extra_dbits[dcode]);
01024 }
01025 out_length >>= 3;
01026 Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ",
01027 last_lit, last_dist, in_length, out_length,
01028 100L - out_length*100L/in_length));
01029 if (last_dist < last_lit/2 && out_length < in_length/2) return 1;
01030 }
01031 return (last_lit == LIT_BUFSIZE-1 || last_dist == DIST_BUFSIZE);
01032
01033
01034
01035
01036 }
01037
01038
01039
01040
01041 local void R__compress_block(ct_data near *ltree, ct_data near *dtree)
01042
01043
01044 {
01045 unsigned dist;
01046 int lc;
01047 unsigned lx = 0;
01048 unsigned dx = 0;
01049 unsigned fx = 0;
01050 uch flag = 0;
01051 unsigned code;
01052 int extra;
01053
01054 if (last_lit != 0) do {
01055 if ((lx & 7) == 0) flag = flag_buf[fx++];
01056 lc = l_buf[lx++];
01057 if ((flag & 1) == 0) {
01058 send_code(lc, ltree);
01059 Tracecv(isgraph(lc), (stderr," '%c' ", lc));
01060 } else {
01061
01062 code = length_code[lc];
01063 send_code(code+LITERALS+1, ltree);
01064 extra = extra_lbits[code];
01065 if (extra != 0) {
01066 lc -= base_length[code];
01067 R__send_bits(lc, extra);
01068 }
01069 dist = d_buf[dx++];
01070
01071 code = d_code(dist);
01072 Assert (code < D_CODES, "bad d_code");
01073
01074 send_code(code, dtree);
01075 extra = extra_dbits[code];
01076 if (extra != 0) {
01077 dist -= base_dist[code];
01078 R__send_bits(dist, extra);
01079 }
01080 }
01081 flag >>= 1;
01082 } while (lx < last_lit);
01083
01084 send_code(END_BLOCK, ltree);
01085 }
01086
01087
01088
01089
01090
01091
01092
01093 local void R__set_file_type()
01094 {
01095 int n = 0;
01096 unsigned ascii_freq = 0;
01097 unsigned bin_freq = 0;
01098 while (n < 7) bin_freq += dyn_ltree[n++].Freq;
01099 while (n < 128) ascii_freq += dyn_ltree[n++].Freq;
01100 while (n < LITERALS) bin_freq += dyn_ltree[n++].Freq;
01101 *R__file_type = bin_freq > (ascii_freq >> 2) ? BINARY : ASCII;
01102 #ifndef PGP
01103 #if 0
01104 if (*R__file_type == BINARY && translate_eol) {
01105 warn("-l used on binary file", "");
01106 }
01107 #endif
01108 #endif
01109 if (verbose) { }
01110 }