80#define LENGTH_CODES 29
89#define L_CODES (LITERALS+1+LENGTH_CODES)
100= {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};
103= {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};
106= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
108#define STORED_BLOCK 0
109#define STATIC_TREES 1
115# define LIT_BUFSIZE 0x2000
118# define LIT_BUFSIZE 0x4000
120# define LIT_BUFSIZE 0x8000
124#define DIST_BUFSIZE LIT_BUFSIZE
152#define REPZ_11_138 18
176#define HEAP_SIZE (2*L_CODES+1)
180= {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
295 TTHREAD_TLS_INIT(
int,tree_state_isInit,0);
297 if (!TTHREAD_TLS_GET(
int,tree_state_isInit)) {
298 TTHREAD_TLS_SET(
int,tree_state_isInit,1);
330# define send_code(c, tree) R__send_bits(state,tree[c].Code, tree[c].Len)
334# define send_code(c, tree) \
335{ R__error("\ncd %3d ",(c)); \
336R__send_bits(state,tree[c].Code, tree[c].Len); }
339#define d_code(dist) \
340((dist) < 256 ? t_state->dist_code[dist] : t_state->dist_code[256+((dist)>>7)])
346#define MAX(a,b) (a >= b ? a : b)
352 int near *extra_bits,
359 tree_description->
dyn_tree = dyn_tree;
363 tree_description->
elems = elems;
365 tree_description->
max_code = max_code;
396 if (l_buf ==
NULL || d_buf ==
NULL) {
397 R__error(
"R__ct_init: out of memory");
410 Assert (length == 256,
"R__ct_init: length != 256");
419 for (code = 0 ; code < 16; code++) {
425 Assert (dist == 256,
"R__ct_init: dist != 256");
427 for ( ; code <
D_CODES; code++) {
433 Assert (dist == 256,
"R__ct_init: 256+dist != 512");
485#define pqremove(tree, top) \
487top = t_state->heap[SMALLEST]; \
488t_state->heap[SMALLEST] = t_state->heap[t_state->heap_len--]; \
489R__pqdownheap(t_state, tree, SMALLEST); \
496#define smaller(tree, n, m) \
497(tree[n].Freq < tree[m].Freq || \
498(tree[n].Freq == tree[m].Freq && t_state->depth[n] <= t_state->depth[m]))
510 int v = t_state->
heap[k];
514 while (j <= t_state->heap_len) {
519 htemp = t_state->
heap[j];
523 t_state->
heap[k] = htemp;
529 t_state->
heap[k] =
v;
546 int near *extra = desc->extra_bits;
547 int base = desc->extra_base;
548 int max_code = desc->max_code;
549 int max_length = desc->max_length;
568 if (bits > max_length) bits = max_length, overflow++;
572 if (
n > max_code)
continue;
576 if (
n >= base) xbits = extra[
n-base];
581 if (overflow == 0)
return;
583 Trace((stderr,
"\nbit length overflow\n"));
589 while (t_state->
bl_count[bits] == 0) bits--;
597 }
while (overflow > 0);
604 for (bits = max_length; bits != 0; bits--) {
608 if (
m > max_code)
continue;
609 if (
tree[
m].
Len != (
unsigned) bits) {
639 for (bits = 1; bits <=
MAX_BITS; bits++) {
640 next_code[bits] = code = (code + t_state->
bl_count[bits-1]) << 1;
646 "inconsistent bit counts");
647 Tracev((stderr,
"\nR__gen_codes: max_code %d ", max_code));
649 for (
n = 0;
n <= max_code;
n++) {
650 int len =
tree[
n].Len;
651 if (len == 0)
continue;
655 Tracec(
tree != static_ltree, (stderr,
"\nn %3d %c l %2d c %4x (%x) ",
656 n, (isgraph(
n) ?
n :
' '), len,
tree[
n].
Code, next_code[len]-1));
673 int elems = desc->elems;
684 for (
n = 0;
n < elems;
n++) {
699 int new1 = t_state->
heap[++t_state->
heap_len] = (max_code < 2 ? ++max_code : 0);
701 t_state->
depth[new1] = 0;
705 desc->max_code = max_code;
728 fprintf(stderr,
"\nnode %d(%d), sons %d(%d) %d(%d)",
762 int nextlen =
tree[0].Len;
767 if (nextlen == 0) max_count = 138, min_count = 3;
768 tree[max_code+1].Len = (
ush)-1;
770 for (
n = 0;
n <= max_code;
n++) {
771 curlen = nextlen; nextlen =
tree[
n+1].Len;
772 if (++count < max_count && curlen == nextlen) {
774 }
else if (count < min_count) {
775 t_state->
bl_tree[curlen].Freq += count;
776 }
else if (curlen != 0) {
777 if (curlen != prevlen) t_state->
bl_tree[curlen].Freq++;
779 }
else if (count <= 10) {
784 count = 0; prevlen = curlen;
786 max_count = 138, min_count = 3;
787 }
else if (curlen == nextlen) {
788 max_count = 6, min_count = 3;
790 max_count = 7, min_count = 4;
806 int nextlen =
tree[0].Len;
812 if (nextlen == 0) max_count = 138, min_count = 3;
814 for (
n = 0;
n <= max_code;
n++) {
815 curlen = nextlen; nextlen =
tree[
n+1].Len;
816 if (++count < max_count && curlen == nextlen) {
818 }
else if (count < min_count) {
821 }
else if (curlen != 0) {
822 if (curlen != prevlen) {
825 Assert(count >= 3 && count <= 6,
" 3_6?");
828 }
else if (count <= 10) {
834 count = 0; prevlen = curlen;
836 max_count = 138, min_count = 3;
837 }
else if (curlen == nextlen) {
838 max_count = 6, min_count = 3;
840 max_count = 7, min_count = 4;
867 for (max_blindex =
BL_CODES-1; max_blindex >= 3; max_blindex--) {
871 t_state->
opt_len += 3*(max_blindex+1) + 5+5+4;
887 Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4,
"not enough codes");
890 Tracev((stderr,
"\nbl counts: "));
895 for (rank = 0; rank < blcodes; rank++) {
899 Tracev((stderr,
"\nbl tree: sent %ld", R__bits_sent));
902 Tracev((stderr,
"\nlit tree: sent %ld", R__bits_sent));
905 Tracev((stderr,
"\ndist tree: sent %ld", R__bits_sent));
919 ulg opt_lenb, static_lenb;
932 Tracev((stderr,
"\ndist data: dyn %ld, stat %ld", opt_len, static_len));
943 opt_lenb = (t_state->
opt_len+3+7)>>3;
947 Trace((stderr,
"\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ",
948 opt_lenb, opt_len, static_lenb, static_len, stored_len,
949 last_lit, last_dist));
951 if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
961 if (stored_len <= opt_lenb && eof && t_state->compressed_len == 0L && 0) {
964 if (buf == (
char *)
NULL) {
R__error (
"block vanished"); *errorflag = 1; }
975 if (stored_len+4 <= opt_lenb && buf != (
char*)
NULL) {
993 }
else if (static_lenb == opt_lenb) {
1009#if defined(PGP) && !defined(MMAP)
1018 memset(R__window, 0, (
unsigned)(2*
WSIZE-1));
1020 Assert (input_len == R__isize,
"bad input size");
1060 if ((t_state->
last_lit & 7) == 0) {
1070 for (dcode = 0; dcode <
D_CODES; dcode++) {
1074 Trace((stderr,
"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ",
1076 100L - out_length*100L/in_length));
1077 if (t_state->
last_dist < t_state->
last_lit/2 && out_length < in_length/2)
return 1;
1103 if ((lx & 7) == 0) flag = t_state->
flag_buf[fx++];
1104 lc = t_state->
l_buf[lx++];
1105 if ((flag & 1) == 0) {
1107 Tracecv(isgraph(lc), (stderr,
" '%c' ", lc));
1117 dist = t_state->
d_buf[dx++];
1130 }
while (lx < t_state->last_lit);
1144 unsigned ascii_freq = 0;
1145 unsigned bin_freq = 0;
1146 while (
n < 7) bin_freq += t_state->
dyn_ltree[
n++].Freq;
1147 while (
n < 128) ascii_freq += t_state->
dyn_ltree[
n++].Freq;
1153 warn(
"-l used on binary file",
"");
unsigned R__bi_reverse(unsigned code, int len)
int R__copy_block(bits_internal_state *state, char *buf, unsigned len, int header)
int R__send_bits(bits_internal_state *state, int value, int length)
int gCompressionLevel
Copyright (C) 1990-1993 Mark Adler, Richard B.
int R__bi_windup(bits_internal_state *state)
#define fcalloc(items, size)
#define Assert(cond, msg)
static int R__build_bl_tree()
static int R__set_file_type()
int R__tree_desc_init(tree_desc *tree_description, ct_data *dyn_tree, ct_data *static_tree, int *extra_bits, int extra_base, int elems, int max_length, int max_code)
#define pqremove(tree, top)
static int R__gen_bitlen()
static int extra_blbits[19]
tree_internal_state * R__get_thread_tree_state()
#define smaller(tree, n, m)
static int R__gen_codes()
#define send_code(c, tree)
TTHREAD_TLS_DECLARE(int, tree_state_isInit)
static int R__send_all_trees()
static int extra_dbits[30]
static int R__scan_tree()
static int R__build_tree()
static int extra_lbits[29]
static int R__send_tree()
static int R__pqdownheap()
static int R__compress_block()
static int R__init_block()
subroutine node(ivo, nuserm, iposp)
tree_internal_state * t_state
union ct_data::@147027034057035375272017203014232062050335167353 dl
union ct_data::@315157103136215207363327301301344204111273034170 fc
uch depth[2 *(256+1+29)+1]
uch length_code[258 - 3+1]
ct_data dyn_dtree[2 *30+1]
ct_data dyn_ltree[(2 *(256+1+29)+1)]
int heap[2 *(256+1+29)+1]
ct_data static_ltree[(256+1+29)+2]