1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42#include "libbb.h"
43#include "unarchive.h"
44
45
46
47
48
49
50#ifdef DEBUG
51# define Assert(cond,msg) { if (!(cond)) bb_error_msg(msg); }
52# define Trace(x) fprintf x
53# define Tracev(x) {if (verbose) fprintf x; }
54# define Tracevv(x) {if (verbose > 1) fprintf x; }
55# define Tracec(c,x) {if (verbose && (c)) fprintf x; }
56# define Tracecv(c,x) {if (verbose > 1 && (c)) fprintf x; }
57#else
58# define Assert(cond,msg)
59# define Trace(x)
60# define Tracev(x)
61# define Tracevv(x)
62# define Tracec(c,x)
63# define Tracecv(c,x)
64#endif
65
66
67
68
69#define SMALL_MEM
70
71#ifndef INBUFSIZ
72# ifdef SMALL_MEM
73# define INBUFSIZ 0x2000
74# else
75# define INBUFSIZ 0x8000
76# endif
77#endif
78
79#ifndef OUTBUFSIZ
80# ifdef SMALL_MEM
81# define OUTBUFSIZ 8192
82# else
83# define OUTBUFSIZ 16384
84# endif
85#endif
86
87#ifndef DIST_BUFSIZE
88# ifdef SMALL_MEM
89# define DIST_BUFSIZE 0x2000
90# else
91# define DIST_BUFSIZE 0x8000
92# endif
93#endif
94
95
96#define ASCII_FLAG 0x01
97#define CONTINUATION 0x02
98#define EXTRA_FIELD 0x04
99#define ORIG_NAME 0x08
100#define COMMENT 0x10
101#define RESERVED 0xC0
102
103
104#define UNKNOWN 0xffff
105#define BINARY 0
106#define ASCII 1
107
108#ifndef WSIZE
109# define WSIZE 0x8000
110#endif
111
112#define MIN_MATCH 3
113#define MAX_MATCH 258
114
115
116#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
117
118
119
120
121#define MAX_DIST (WSIZE-MIN_LOOKAHEAD)
122
123
124
125
126#ifndef MAX_PATH_LEN
127# define MAX_PATH_LEN 1024
128#endif
129
130#define seekable() 0
131#define translate_eol 0
132
133#ifndef BITS
134# define BITS 16
135#endif
136#define INIT_BITS 9
137
138#define BIT_MASK 0x1f
139
140
141
142
143
144
145
146
147
148#ifdef MAX_EXT_CHARS
149# define MAX_SUFFIX MAX_EXT_CHARS
150#else
151# define MAX_SUFFIX 30
152#endif
153
154
155
156
157
158
159
160
161
162
163
164#ifdef SMALL_MEM
165# define HASH_BITS 13
166#endif
167#ifdef MEDIUM_MEM
168# define HASH_BITS 14
169#endif
170#ifndef HASH_BITS
171# define HASH_BITS 15
172
173#endif
174
175#define HASH_SIZE (unsigned)(1<<HASH_BITS)
176#define HASH_MASK (HASH_SIZE-1)
177#define WMASK (WSIZE-1)
178
179#ifndef TOO_FAR
180# define TOO_FAR 4096
181#endif
182
183
184
185
186
187
188typedef uint8_t uch;
189typedef uint16_t ush;
190typedef uint32_t ulg;
191typedef int32_t lng;
192
193typedef ush Pos;
194typedef unsigned IPos;
195
196
197
198
199enum {
200 WINDOW_SIZE = 2 * WSIZE,
201
202
203
204
205 max_chain_length = 4096,
206
207
208
209
210 max_lazy_match = 258,
211
212
213
214
215
216 max_insert_length = max_lazy_match,
217
218
219
220
221
222 good_match = 32,
223
224
225
226
227
228
229
230
231 nice_match = 258,
232
233
234
235
236};
237
238
239struct globals {
240
241 lng block_start;
242
243
244
245
246 unsigned ins_h;
247
248#define H_SHIFT ((HASH_BITS+MIN_MATCH-1) / MIN_MATCH)
249
250
251
252
253
254
255 unsigned prev_length;
256
257
258
259
260
261 unsigned strstart;
262 unsigned match_start;
263 unsigned lookahead;
264
265
266
267#define DECLARE(type, array, size) \
268 type * array
269#define ALLOC(type, array, size) \
270 array = xzalloc((size_t)(((size)+1L)/2) * 2*sizeof(type));
271#define FREE(array) \
272 do { free(array); array = NULL; } while (0)
273
274
275
276
277
278 DECLARE(uch, l_buf, INBUFSIZ);
279
280 DECLARE(ush, d_buf, DIST_BUFSIZE);
281 DECLARE(uch, outbuf, OUTBUFSIZ);
282
283
284
285
286
287
288
289
290
291
292 DECLARE(uch, window, 2L * WSIZE);
293
294
295
296
297
298
299 DECLARE(ush, prev, 1L << BITS);
300
301
302
303#define head (G1.prev + WSIZE)
304
305
306 ulg isize;
307
308
309#define ifd STDIN_FILENO
310#define ofd STDOUT_FILENO
311
312#ifdef DEBUG
313 unsigned insize;
314#endif
315 unsigned outcnt;
316
317 smallint eofile;
318
319
320
321
322
323 unsigned short bi_buf;
324
325
326
327
328
329#undef BUF_SIZE
330#define BUF_SIZE (8 * sizeof(G1.bi_buf))
331
332
333
334
335 int bi_valid;
336
337
338
339#ifdef DEBUG
340 ulg bits_sent;
341#endif
342
343 uint32_t *crc_32_tab;
344 uint32_t crc;
345};
346
347#define G1 (*(ptr_to_globals - 1))
348
349
350
351
352
353
354static void flush_outbuf(void)
355{
356 if (G1.outcnt == 0)
357 return;
358
359 xwrite(ofd, (char *) G1.outbuf, G1.outcnt);
360 G1.outcnt = 0;
361}
362
363
364
365
366
367#define put_8bit(c) \
368do { \
369 G1.outbuf[G1.outcnt++] = (c); \
370 if (G1.outcnt == OUTBUFSIZ) flush_outbuf(); \
371} while (0)
372
373
374static void put_16bit(ush w)
375{
376 if (G1.outcnt < OUTBUFSIZ - 2) {
377 G1.outbuf[G1.outcnt++] = w;
378 G1.outbuf[G1.outcnt++] = w >> 8;
379 } else {
380 put_8bit(w);
381 put_8bit(w >> 8);
382 }
383}
384
385static void put_32bit(ulg n)
386{
387 put_16bit(n);
388 put_16bit(n >> 16);
389}
390
391
392
393
394static void clear_bufs(void)
395{
396 G1.outcnt = 0;
397#ifdef DEBUG
398 G1.insize = 0;
399#endif
400 G1.isize = 0;
401}
402
403
404
405
406
407
408
409static uint32_t updcrc(uch * s, unsigned n)
410{
411 uint32_t c = G1.crc;
412 while (n) {
413 c = G1.crc_32_tab[(uch)(c ^ *s++)] ^ (c >> 8);
414 n--;
415 }
416 G1.crc = c;
417 return c;
418}
419
420
421
422
423
424
425
426static unsigned file_read(void *buf, unsigned size)
427{
428 unsigned len;
429
430 Assert(G1.insize == 0, "l_buf not empty");
431
432 len = safe_read(ifd, buf, size);
433 if (len == (unsigned)(-1) || len == 0)
434 return len;
435
436 updcrc(buf, len);
437 G1.isize += len;
438 return len;
439}
440
441
442
443
444
445
446static void send_bits(int value, int length)
447{
448#ifdef DEBUG
449 Tracev((stderr, " l %2d v %4x ", length, value));
450 Assert(length > 0 && length <= 15, "invalid length");
451 G1.bits_sent += length;
452#endif
453
454
455
456
457 if (G1.bi_valid > (int) BUF_SIZE - length) {
458 G1.bi_buf |= (value << G1.bi_valid);
459 put_16bit(G1.bi_buf);
460 G1.bi_buf = (ush) value >> (BUF_SIZE - G1.bi_valid);
461 G1.bi_valid += length - BUF_SIZE;
462 } else {
463 G1.bi_buf |= value << G1.bi_valid;
464 G1.bi_valid += length;
465 }
466}
467
468
469
470
471
472
473
474static unsigned bi_reverse(unsigned code, int len)
475{
476 unsigned res = 0;
477
478 while (1) {
479 res |= code & 1;
480 if (--len <= 0) return res;
481 code >>= 1;
482 res <<= 1;
483 }
484}
485
486
487
488
489
490static void bi_windup(void)
491{
492 if (G1.bi_valid > 8) {
493 put_16bit(G1.bi_buf);
494 } else if (G1.bi_valid > 0) {
495 put_8bit(G1.bi_buf);
496 }
497 G1.bi_buf = 0;
498 G1.bi_valid = 0;
499#ifdef DEBUG
500 G1.bits_sent = (G1.bits_sent + 7) & ~7;
501#endif
502}
503
504
505
506
507
508
509static void copy_block(char *buf, unsigned len, int header)
510{
511 bi_windup();
512
513 if (header) {
514 put_16bit(len);
515 put_16bit(~len);
516#ifdef DEBUG
517 G1.bits_sent += 2 * 16;
518#endif
519 }
520#ifdef DEBUG
521 G1.bits_sent += (ulg) len << 3;
522#endif
523 while (len--) {
524 put_8bit(*buf++);
525 }
526}
527
528
529
530
531
532
533
534
535
536
537static void fill_window(void)
538{
539 unsigned n, m;
540 unsigned more = WINDOW_SIZE - G1.lookahead - G1.strstart;
541
542
543
544
545
546 if (more == (unsigned) -1) {
547
548
549
550 more--;
551 } else if (G1.strstart >= WSIZE + MAX_DIST) {
552
553
554
555 Assert(WINDOW_SIZE == 2 * WSIZE, "no sliding with BIG_MEM");
556
557 memcpy(G1.window, G1.window + WSIZE, WSIZE);
558 G1.match_start -= WSIZE;
559 G1.strstart -= WSIZE;
560
561 G1.block_start -= WSIZE;
562
563 for (n = 0; n < HASH_SIZE; n++) {
564 m = head[n];
565 head[n] = (Pos) (m >= WSIZE ? m - WSIZE : 0);
566 }
567 for (n = 0; n < WSIZE; n++) {
568 m = G1.prev[n];
569 G1.prev[n] = (Pos) (m >= WSIZE ? m - WSIZE : 0);
570
571
572
573 }
574 more += WSIZE;
575 }
576
577 if (!G1.eofile) {
578 n = file_read(G1.window + G1.strstart + G1.lookahead, more);
579 if (n == 0 || n == (unsigned) -1) {
580 G1.eofile = 1;
581 } else {
582 G1.lookahead += n;
583 }
584 }
585}
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601static int longest_match(IPos cur_match)
602{
603 unsigned chain_length = max_chain_length;
604 uch *scan = G1.window + G1.strstart;
605 uch *match;
606 int len;
607 int best_len = G1.prev_length;
608 IPos limit = G1.strstart > (IPos) MAX_DIST ? G1.strstart - (IPos) MAX_DIST : 0;
609
610
611
612
613
614
615
616#if HASH_BITS < 8 || MAX_MATCH != 258
617# error Code too clever
618#endif
619 uch *strend = G1.window + G1.strstart + MAX_MATCH;
620 uch scan_end1 = scan[best_len - 1];
621 uch scan_end = scan[best_len];
622
623
624 if (G1.prev_length >= good_match) {
625 chain_length >>= 2;
626 }
627 Assert(G1.strstart <= WINDOW_SIZE - MIN_LOOKAHEAD, "insufficient lookahead");
628
629 do {
630 Assert(cur_match < G1.strstart, "no future");
631 match = G1.window + cur_match;
632
633
634
635
636 if (match[best_len] != scan_end ||
637 match[best_len - 1] != scan_end1 ||
638 *match != *scan || *++match != scan[1])
639 continue;
640
641
642
643
644
645
646
647 scan += 2, match++;
648
649
650
651
652 do {
653 } while (*++scan == *++match && *++scan == *++match &&
654 *++scan == *++match && *++scan == *++match &&
655 *++scan == *++match && *++scan == *++match &&
656 *++scan == *++match && *++scan == *++match && scan < strend);
657
658 len = MAX_MATCH - (int) (strend - scan);
659 scan = strend - MAX_MATCH;
660
661 if (len > best_len) {
662 G1.match_start = cur_match;
663 best_len = len;
664 if (len >= nice_match)
665 break;
666 scan_end1 = scan[best_len - 1];
667 scan_end = scan[best_len];
668 }
669 } while ((cur_match = G1.prev[cur_match & WMASK]) > limit
670 && --chain_length != 0);
671
672 return best_len;
673}
674
675
676#ifdef DEBUG
677
678
679
680static void check_match(IPos start, IPos match, int length)
681{
682
683 if (memcmp(G1.window + match, G1.window + start, length) != 0) {
684 bb_error_msg(" start %d, match %d, length %d", start, match, length);
685 bb_error_msg("invalid match");
686 }
687 if (verbose > 1) {
688 bb_error_msg("\\[%d,%d]", start - match, length);
689 do {
690 fputc(G1.window[start++], stderr);
691 } while (--length != 0);
692 }
693}
694#else
695# define check_match(start, match, length) ((void)0)
696#endif
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748#define MAX_BITS 15
749
750
751#define MAX_BL_BITS 7
752
753
754#define LENGTH_CODES 29
755
756
757#define LITERALS 256
758
759
760#define END_BLOCK 256
761
762
763#define L_CODES (LITERALS+1+LENGTH_CODES)
764
765
766#define D_CODES 30
767
768
769#define BL_CODES 19
770
771
772
773static const uint8_t extra_lbits[LENGTH_CODES] ALIGN1 = {
774 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4,
775 4, 4, 5, 5, 5, 5, 0
776};
777
778
779static const uint8_t extra_dbits[D_CODES] ALIGN1 = {
780 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,
781 10, 10, 11, 11, 12, 12, 13, 13
782};
783
784
785static const uint8_t extra_blbits[BL_CODES] ALIGN1 = {
786 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7 };
787
788
789static const uint8_t bl_order[BL_CODES] ALIGN1 = {
790 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
791
792#define STORED_BLOCK 0
793#define STATIC_TREES 1
794#define DYN_TREES 2
795
796
797#ifndef LIT_BUFSIZE
798# ifdef SMALL_MEM
799# define LIT_BUFSIZE 0x2000
800# else
801# ifdef MEDIUM_MEM
802# define LIT_BUFSIZE 0x4000
803# else
804# define LIT_BUFSIZE 0x8000
805# endif
806# endif
807#endif
808#ifndef DIST_BUFSIZE
809# define DIST_BUFSIZE LIT_BUFSIZE
810#endif
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831#define REP_3_6 16
832
833#define REPZ_3_10 17
834
835#define REPZ_11_138 18
836
837
838
839
840
841typedef struct ct_data {
842 union {
843 ush freq;
844 ush code;
845 } fc;
846 union {
847 ush dad;
848 ush len;
849 } dl;
850} ct_data;
851
852#define Freq fc.freq
853#define Code fc.code
854#define Dad dl.dad
855#define Len dl.len
856
857#define HEAP_SIZE (2*L_CODES + 1)
858
859
860typedef struct tree_desc {
861 ct_data *dyn_tree;
862 ct_data *static_tree;
863 const uint8_t *extra_bits;
864 int extra_base;
865 int elems;
866 int max_length;
867 int max_code;
868} tree_desc;
869
870struct globals2 {
871
872 ush heap[HEAP_SIZE];
873 int heap_len;
874 int heap_max;
875
876
877
878
879
880 ct_data dyn_ltree[HEAP_SIZE];
881 ct_data dyn_dtree[2 * D_CODES + 1];
882
883 ct_data static_ltree[L_CODES + 2];
884
885
886
887
888
889
890
891 ct_data static_dtree[D_CODES];
892
893
894
895
896
897 ct_data bl_tree[2 * BL_CODES + 1];
898
899
900
901 tree_desc l_desc;
902 tree_desc d_desc;
903 tree_desc bl_desc;
904
905 ush bl_count[MAX_BITS + 1];
906
907
908
909
910
911 uch depth[2 * L_CODES + 1];
912
913
914
915 uch length_code[MAX_MATCH - MIN_MATCH + 1];
916
917
918
919 uch dist_code[512];
920
921
922
923
924
925
926 int base_length[LENGTH_CODES];
927
928
929
930 int base_dist[D_CODES];
931
932
933
934 uch flag_buf[LIT_BUFSIZE / 8];
935
936
937
938
939
940 unsigned last_lit;
941 unsigned last_dist;
942 unsigned last_flags;
943 uch flags;
944 uch flag_bit;
945
946
947
948
949
950
951 ulg opt_len;
952 ulg static_len;
953
954 ulg compressed_len;
955};
956
957#define G2ptr ((struct globals2*)(ptr_to_globals))
958#define G2 (*G2ptr)
959
960
961
962
963static void gen_codes(ct_data * tree, int max_code);
964static void build_tree(tree_desc * desc);
965static void scan_tree(ct_data * tree, int max_code);
966static void send_tree(ct_data * tree, int max_code);
967static int build_bl_tree(void);
968static void send_all_trees(int lcodes, int dcodes, int blcodes);
969static void compress_block(ct_data * ltree, ct_data * dtree);
970
971
972#ifndef DEBUG
973
974# define SEND_CODE(c, tree) send_bits(tree[c].Code, tree[c].Len)
975#else
976# define SEND_CODE(c, tree) \
977{ \
978 if (verbose > 1) bb_error_msg("\ncd %3d ",(c)); \
979 send_bits(tree[c].Code, tree[c].Len); \
980}
981#endif
982
983#define D_CODE(dist) \
984 ((dist) < 256 ? G2.dist_code[dist] : G2.dist_code[256 + ((dist)>>7)])
985
986
987
988
989
990
991
992
993
994
995static void init_block(void)
996{
997 int n;
998
999
1000 for (n = 0; n < L_CODES; n++)
1001 G2.dyn_ltree[n].Freq = 0;
1002 for (n = 0; n < D_CODES; n++)
1003 G2.dyn_dtree[n].Freq = 0;
1004 for (n = 0; n < BL_CODES; n++)
1005 G2.bl_tree[n].Freq = 0;
1006
1007 G2.dyn_ltree[END_BLOCK].Freq = 1;
1008 G2.opt_len = G2.static_len = 0;
1009 G2.last_lit = G2.last_dist = G2.last_flags = 0;
1010 G2.flags = 0;
1011 G2.flag_bit = 1;
1012}
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024#define SMALLER(tree, n, m) \
1025 (tree[n].Freq < tree[m].Freq \
1026 || (tree[n].Freq == tree[m].Freq && G2.depth[n] <= G2.depth[m]))
1027
1028static void pqdownheap(ct_data * tree, int k)
1029{
1030 int v = G2.heap[k];
1031 int j = k << 1;
1032
1033 while (j <= G2.heap_len) {
1034
1035 if (j < G2.heap_len && SMALLER(tree, G2.heap[j + 1], G2.heap[j]))
1036 j++;
1037
1038
1039 if (SMALLER(tree, v, G2.heap[j]))
1040 break;
1041
1042
1043 G2.heap[k] = G2.heap[j];
1044 k = j;
1045
1046
1047 j <<= 1;
1048 }
1049 G2.heap[k] = v;
1050}
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063static void gen_bitlen(tree_desc * desc)
1064{
1065 ct_data *tree = desc->dyn_tree;
1066 const uint8_t *extra = desc->extra_bits;
1067 int base = desc->extra_base;
1068 int max_code = desc->max_code;
1069 int max_length = desc->max_length;
1070 ct_data *stree = desc->static_tree;
1071 int h;
1072 int n, m;
1073 int bits;
1074 int xbits;
1075 ush f;
1076 int overflow = 0;
1077
1078 for (bits = 0; bits <= MAX_BITS; bits++)
1079 G2.bl_count[bits] = 0;
1080
1081
1082
1083
1084 tree[G2.heap[G2.heap_max]].Len = 0;
1085
1086 for (h = G2.heap_max + 1; h < HEAP_SIZE; h++) {
1087 n = G2.heap[h];
1088 bits = tree[tree[n].Dad].Len + 1;
1089 if (bits > max_length) {
1090 bits = max_length;
1091 overflow++;
1092 }
1093 tree[n].Len = (ush) bits;
1094
1095
1096 if (n > max_code)
1097 continue;
1098
1099 G2.bl_count[bits]++;
1100 xbits = 0;
1101 if (n >= base)
1102 xbits = extra[n - base];
1103 f = tree[n].Freq;
1104 G2.opt_len += (ulg) f *(bits + xbits);
1105
1106 if (stree)
1107 G2.static_len += (ulg) f * (stree[n].Len + xbits);
1108 }
1109 if (overflow == 0)
1110 return;
1111
1112 Trace((stderr, "\nbit length overflow\n"));
1113
1114
1115
1116 do {
1117 bits = max_length - 1;
1118 while (G2.bl_count[bits] == 0)
1119 bits--;
1120 G2.bl_count[bits]--;
1121 G2.bl_count[bits + 1] += 2;
1122 G2.bl_count[max_length]--;
1123
1124
1125
1126 overflow -= 2;
1127 } while (overflow > 0);
1128
1129
1130
1131
1132
1133
1134 for (bits = max_length; bits != 0; bits--) {
1135 n = G2.bl_count[bits];
1136 while (n != 0) {
1137 m = G2.heap[--h];
1138 if (m > max_code)
1139 continue;
1140 if (tree[m].Len != (unsigned) bits) {
1141 Trace((stderr, "code %d bits %d->%d\n", m, tree[m].Len, bits));
1142 G2.opt_len += ((int32_t) bits - tree[m].Len) * tree[m].Freq;
1143 tree[m].Len = bits;
1144 }
1145 n--;
1146 }
1147 }
1148}
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159static void gen_codes(ct_data * tree, int max_code)
1160{
1161 ush next_code[MAX_BITS + 1];
1162 ush code = 0;
1163 int bits;
1164 int n;
1165
1166
1167
1168
1169 for (bits = 1; bits <= MAX_BITS; bits++) {
1170 next_code[bits] = code = (code + G2.bl_count[bits - 1]) << 1;
1171 }
1172
1173
1174
1175 Assert(code + G2.bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
1176 "inconsistent bit counts");
1177 Tracev((stderr, "\ngen_codes: max_code %d ", max_code));
1178
1179 for (n = 0; n <= max_code; n++) {
1180 int len = tree[n].Len;
1181
1182 if (len == 0)
1183 continue;
1184
1185 tree[n].Code = bi_reverse(next_code[len]++, len);
1186
1187 Tracec(tree != G2.static_ltree,
1188 (stderr, "\nn %3d %c l %2d c %4x (%x) ", n,
1189 (isgraph(n) ? n : ' '), len, tree[n].Code,
1190 next_code[len] - 1));
1191 }
1192}
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207#define SMALLEST 1
1208
1209
1210#define PQREMOVE(tree, top) \
1211do { \
1212 top = G2.heap[SMALLEST]; \
1213 G2.heap[SMALLEST] = G2.heap[G2.heap_len--]; \
1214 pqdownheap(tree, SMALLEST); \
1215} while (0)
1216
1217static void build_tree(tree_desc * desc)
1218{
1219 ct_data *tree = desc->dyn_tree;
1220 ct_data *stree = desc->static_tree;
1221 int elems = desc->elems;
1222 int n, m;
1223 int max_code = -1;
1224 int node = elems;
1225
1226
1227
1228
1229
1230 G2.heap_len = 0;
1231 G2.heap_max = HEAP_SIZE;
1232
1233 for (n = 0; n < elems; n++) {
1234 if (tree[n].Freq != 0) {
1235 G2.heap[++G2.heap_len] = max_code = n;
1236 G2.depth[n] = 0;
1237 } else {
1238 tree[n].Len = 0;
1239 }
1240 }
1241
1242
1243
1244
1245
1246
1247 while (G2.heap_len < 2) {
1248 int new = G2.heap[++G2.heap_len] = (max_code < 2 ? ++max_code : 0);
1249
1250 tree[new].Freq = 1;
1251 G2.depth[new] = 0;
1252 G2.opt_len--;
1253 if (stree)
1254 G2.static_len -= stree[new].Len;
1255
1256 }
1257 desc->max_code = max_code;
1258
1259
1260
1261
1262 for (n = G2.heap_len / 2; n >= 1; n--)
1263 pqdownheap(tree, n);
1264
1265
1266
1267
1268 do {
1269 PQREMOVE(tree, n);
1270 m = G2.heap[SMALLEST];
1271
1272 G2.heap[--G2.heap_max] = n;
1273 G2.heap[--G2.heap_max] = m;
1274
1275
1276 tree[node].Freq = tree[n].Freq + tree[m].Freq;
1277 G2.depth[node] = MAX(G2.depth[n], G2.depth[m]) + 1;
1278 tree[n].Dad = tree[m].Dad = (ush) node;
1279#ifdef DUMP_BL_TREE
1280 if (tree == G2.bl_tree) {
1281 bb_error_msg("\nnode %d(%d), sons %d(%d) %d(%d)",
1282 node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
1283 }
1284#endif
1285
1286 G2.heap[SMALLEST] = node++;
1287 pqdownheap(tree, SMALLEST);
1288
1289 } while (G2.heap_len >= 2);
1290
1291 G2.heap[--G2.heap_max] = G2.heap[SMALLEST];
1292
1293
1294
1295
1296 gen_bitlen((tree_desc *) desc);
1297
1298
1299 gen_codes((ct_data *) tree, max_code);
1300}
1301
1302
1303
1304
1305
1306
1307
1308
1309static void scan_tree(ct_data * tree, int max_code)
1310{
1311 int n;
1312 int prevlen = -1;
1313 int curlen;
1314 int nextlen = tree[0].Len;
1315 int count = 0;
1316 int max_count = 7;
1317 int min_count = 4;
1318
1319 if (nextlen == 0) {
1320 max_count = 138;
1321 min_count = 3;
1322 }
1323 tree[max_code + 1].Len = 0xffff;
1324
1325 for (n = 0; n <= max_code; n++) {
1326 curlen = nextlen;
1327 nextlen = tree[n + 1].Len;
1328 if (++count < max_count && curlen == nextlen)
1329 continue;
1330
1331 if (count < min_count) {
1332 G2.bl_tree[curlen].Freq += count;
1333 } else if (curlen != 0) {
1334 if (curlen != prevlen)
1335 G2.bl_tree[curlen].Freq++;
1336 G2.bl_tree[REP_3_6].Freq++;
1337 } else if (count <= 10) {
1338 G2.bl_tree[REPZ_3_10].Freq++;
1339 } else {
1340 G2.bl_tree[REPZ_11_138].Freq++;
1341 }
1342 count = 0;
1343 prevlen = curlen;
1344
1345 max_count = 7;
1346 min_count = 4;
1347 if (nextlen == 0) {
1348 max_count = 138;
1349 min_count = 3;
1350 } else if (curlen == nextlen) {
1351 max_count = 6;
1352 min_count = 3;
1353 }
1354 }
1355}
1356
1357
1358
1359
1360
1361
1362static void send_tree(ct_data * tree, int max_code)
1363{
1364 int n;
1365 int prevlen = -1;
1366 int curlen;
1367 int nextlen = tree[0].Len;
1368 int count = 0;
1369 int max_count = 7;
1370 int min_count = 4;
1371
1372
1373 if (nextlen == 0)
1374 max_count = 138, min_count = 3;
1375
1376 for (n = 0; n <= max_code; n++) {
1377 curlen = nextlen;
1378 nextlen = tree[n + 1].Len;
1379 if (++count < max_count && curlen == nextlen) {
1380 continue;
1381 } else if (count < min_count) {
1382 do {
1383 SEND_CODE(curlen, G2.bl_tree);
1384 } while (--count);
1385 } else if (curlen != 0) {
1386 if (curlen != prevlen) {
1387 SEND_CODE(curlen, G2.bl_tree);
1388 count--;
1389 }
1390 Assert(count >= 3 && count <= 6, " 3_6?");
1391 SEND_CODE(REP_3_6, G2.bl_tree);
1392 send_bits(count - 3, 2);
1393 } else if (count <= 10) {
1394 SEND_CODE(REPZ_3_10, G2.bl_tree);
1395 send_bits(count - 3, 3);
1396 } else {
1397 SEND_CODE(REPZ_11_138, G2.bl_tree);
1398 send_bits(count - 11, 7);
1399 }
1400 count = 0;
1401 prevlen = curlen;
1402 if (nextlen == 0) {
1403 max_count = 138;
1404 min_count = 3;
1405 } else if (curlen == nextlen) {
1406 max_count = 6;
1407 min_count = 3;
1408 } else {
1409 max_count = 7;
1410 min_count = 4;
1411 }
1412 }
1413}
1414
1415
1416
1417
1418
1419
1420static int build_bl_tree(void)
1421{
1422 int max_blindex;
1423
1424
1425 scan_tree(G2.dyn_ltree, G2.l_desc.max_code);
1426 scan_tree(G2.dyn_dtree, G2.d_desc.max_code);
1427
1428
1429 build_tree(&G2.bl_desc);
1430
1431
1432
1433
1434
1435
1436
1437
1438 for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
1439 if (G2.bl_tree[bl_order[max_blindex]].Len != 0)
1440 break;
1441 }
1442
1443 G2.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
1444 Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", G2.opt_len, G2.static_len));
1445
1446 return max_blindex;
1447}
1448
1449
1450
1451
1452
1453
1454
1455static void send_all_trees(int lcodes, int dcodes, int blcodes)
1456{
1457 int rank;
1458
1459 Assert(lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
1460 Assert(lcodes <= L_CODES && dcodes <= D_CODES
1461 && blcodes <= BL_CODES, "too many codes");
1462 Tracev((stderr, "\nbl counts: "));
1463 send_bits(lcodes - 257, 5);
1464 send_bits(dcodes - 1, 5);
1465 send_bits(blcodes - 4, 4);
1466 for (rank = 0; rank < blcodes; rank++) {
1467 Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
1468 send_bits(G2.bl_tree[bl_order[rank]].Len, 3);
1469 }
1470 Tracev((stderr, "\nbl tree: sent %ld", G1.bits_sent));
1471
1472 send_tree((ct_data *) G2.dyn_ltree, lcodes - 1);
1473 Tracev((stderr, "\nlit tree: sent %ld", G1.bits_sent));
1474
1475 send_tree((ct_data *) G2.dyn_dtree, dcodes - 1);
1476 Tracev((stderr, "\ndist tree: sent %ld", G1.bits_sent));
1477}
1478
1479
1480
1481
1482
1483
1484static int ct_tally(int dist, int lc)
1485{
1486 G1.l_buf[G2.last_lit++] = lc;
1487 if (dist == 0) {
1488
1489 G2.dyn_ltree[lc].Freq++;
1490 } else {
1491
1492 dist--;
1493 Assert((ush) dist < (ush) MAX_DIST
1494 && (ush) lc <= (ush) (MAX_MATCH - MIN_MATCH)
1495 && (ush) D_CODE(dist) < (ush) D_CODES, "ct_tally: bad match"
1496 );
1497
1498 G2.dyn_ltree[G2.length_code[lc] + LITERALS + 1].Freq++;
1499 G2.dyn_dtree[D_CODE(dist)].Freq++;
1500
1501 G1.d_buf[G2.last_dist++] = dist;
1502 G2.flags |= G2.flag_bit;
1503 }
1504 G2.flag_bit <<= 1;
1505
1506
1507 if ((G2.last_lit & 7) == 0) {
1508 G2.flag_buf[G2.last_flags++] = G2.flags;
1509 G2.flags = 0;
1510 G2.flag_bit = 1;
1511 }
1512
1513 if ((G2.last_lit & 0xfff) == 0) {
1514
1515 ulg out_length = G2.last_lit * 8L;
1516 ulg in_length = (ulg) G1.strstart - G1.block_start;
1517 int dcode;
1518
1519 for (dcode = 0; dcode < D_CODES; dcode++) {
1520 out_length += G2.dyn_dtree[dcode].Freq * (5L + extra_dbits[dcode]);
1521 }
1522 out_length >>= 3;
1523 Trace((stderr,
1524 "\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ",
1525 G2.last_lit, G2.last_dist, in_length, out_length,
1526 100L - out_length * 100L / in_length));
1527 if (G2.last_dist < G2.last_lit / 2 && out_length < in_length / 2)
1528 return 1;
1529 }
1530 return (G2.last_lit == LIT_BUFSIZE - 1 || G2.last_dist == DIST_BUFSIZE);
1531
1532
1533
1534
1535}
1536
1537
1538
1539
1540static void compress_block(ct_data * ltree, ct_data * dtree)
1541{
1542 unsigned dist;
1543 int lc;
1544 unsigned lx = 0;
1545 unsigned dx = 0;
1546 unsigned fx = 0;
1547 uch flag = 0;
1548 unsigned code;
1549 int extra;
1550
1551 if (G2.last_lit != 0) do {
1552 if ((lx & 7) == 0)
1553 flag = G2.flag_buf[fx++];
1554 lc = G1.l_buf[lx++];
1555 if ((flag & 1) == 0) {
1556 SEND_CODE(lc, ltree);
1557 Tracecv(isgraph(lc), (stderr, " '%c' ", lc));
1558 } else {
1559
1560 code = G2.length_code[lc];
1561 SEND_CODE(code + LITERALS + 1, ltree);
1562 extra = extra_lbits[code];
1563 if (extra != 0) {
1564 lc -= G2.base_length[code];
1565 send_bits(lc, extra);
1566 }
1567 dist = G1.d_buf[dx++];
1568
1569 code = D_CODE(dist);
1570 Assert(code < D_CODES, "bad d_code");
1571
1572 SEND_CODE(code, dtree);
1573 extra = extra_dbits[code];
1574 if (extra != 0) {
1575 dist -= G2.base_dist[code];
1576 send_bits(dist, extra);
1577 }
1578 }
1579 flag >>= 1;
1580 } while (lx < G2.last_lit);
1581
1582 SEND_CODE(END_BLOCK, ltree);
1583}
1584
1585
1586
1587
1588
1589
1590
1591static ulg flush_block(char *buf, ulg stored_len, int eof)
1592{
1593 ulg opt_lenb, static_lenb;
1594 int max_blindex;
1595
1596 G2.flag_buf[G2.last_flags] = G2.flags;
1597
1598
1599 build_tree(&G2.l_desc);
1600 Tracev((stderr, "\nlit data: dyn %ld, stat %ld", G2.opt_len, G2.static_len));
1601
1602 build_tree(&G2.d_desc);
1603 Tracev((stderr, "\ndist data: dyn %ld, stat %ld", G2.opt_len, G2.static_len));
1604
1605
1606
1607
1608
1609
1610
1611 max_blindex = build_bl_tree();
1612
1613
1614 opt_lenb = (G2.opt_len + 3 + 7) >> 3;
1615 static_lenb = (G2.static_len + 3 + 7) >> 3;
1616
1617 Trace((stderr,
1618 "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ",
1619 opt_lenb, G2.opt_len, static_lenb, G2.static_len, stored_len,
1620 G2.last_lit, G2.last_dist));
1621
1622 if (static_lenb <= opt_lenb)
1623 opt_lenb = static_lenb;
1624
1625
1626
1627
1628
1629 if (stored_len <= opt_lenb && eof && G2.compressed_len == 0L && seekable()) {
1630
1631 if (buf == NULL)
1632 bb_error_msg("block vanished");
1633
1634 copy_block(buf, (unsigned) stored_len, 0);
1635 G2.compressed_len = stored_len << 3;
1636
1637 } else if (stored_len + 4 <= opt_lenb && buf != NULL) {
1638
1639
1640
1641
1642
1643
1644
1645 send_bits((STORED_BLOCK << 1) + eof, 3);
1646 G2.compressed_len = (G2.compressed_len + 3 + 7) & ~7L;
1647 G2.compressed_len += (stored_len + 4) << 3;
1648
1649 copy_block(buf, (unsigned) stored_len, 1);
1650
1651 } else if (static_lenb == opt_lenb) {
1652 send_bits((STATIC_TREES << 1) + eof, 3);
1653 compress_block((ct_data *) G2.static_ltree, (ct_data *) G2.static_dtree);
1654 G2.compressed_len += 3 + G2.static_len;
1655 } else {
1656 send_bits((DYN_TREES << 1) + eof, 3);
1657 send_all_trees(G2.l_desc.max_code + 1, G2.d_desc.max_code + 1,
1658 max_blindex + 1);
1659 compress_block((ct_data *) G2.dyn_ltree, (ct_data *) G2.dyn_dtree);
1660 G2.compressed_len += 3 + G2.opt_len;
1661 }
1662 Assert(G2.compressed_len == G1.bits_sent, "bad compressed size");
1663 init_block();
1664
1665 if (eof) {
1666 bi_windup();
1667 G2.compressed_len += 7;
1668 }
1669 Tracev((stderr, "\ncomprlen %lu(%lu) ", G2.compressed_len >> 3,
1670 G2.compressed_len - 7 * eof));
1671
1672 return G2.compressed_len >> 3;
1673}
1674
1675
1676
1677
1678
1679
1680
1681
1682#define UPDATE_HASH(h, c) (h = (((h)<<H_SHIFT) ^ (c)) & HASH_MASK)
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697#define FLUSH_BLOCK(eof) \
1698 flush_block( \
1699 G1.block_start >= 0L \
1700 ? (char*)&G1.window[(unsigned)G1.block_start] \
1701 : (char*)NULL, \
1702 (ulg)G1.strstart - G1.block_start, \
1703 (eof) \
1704 )
1705
1706
1707
1708
1709
1710
1711
1712#define INSERT_STRING(s, match_head) \
1713do { \
1714 UPDATE_HASH(G1.ins_h, G1.window[(s) + MIN_MATCH-1]); \
1715 G1.prev[(s) & WMASK] = match_head = head[G1.ins_h]; \
1716 head[G1.ins_h] = (s); \
1717} while (0)
1718
1719static ulg deflate(void)
1720{
1721 IPos hash_head;
1722 IPos prev_match;
1723 int flush;
1724 int match_available = 0;
1725 unsigned match_length = MIN_MATCH - 1;
1726
1727
1728 while (G1.lookahead != 0) {
1729
1730
1731
1732 INSERT_STRING(G1.strstart, hash_head);
1733
1734
1735
1736 G1.prev_length = match_length;
1737 prev_match = G1.match_start;
1738 match_length = MIN_MATCH - 1;
1739
1740 if (hash_head != 0 && G1.prev_length < max_lazy_match
1741 && G1.strstart - hash_head <= MAX_DIST
1742 ) {
1743
1744
1745
1746
1747 match_length = longest_match(hash_head);
1748
1749 if (match_length > G1.lookahead)
1750 match_length = G1.lookahead;
1751
1752
1753 if (match_length == MIN_MATCH && G1.strstart - G1.match_start > TOO_FAR) {
1754
1755
1756
1757 match_length--;
1758 }
1759 }
1760
1761
1762
1763 if (G1.prev_length >= MIN_MATCH && match_length <= G1.prev_length) {
1764 check_match(G1.strstart - 1, prev_match, G1.prev_length);
1765 flush = ct_tally(G1.strstart - 1 - prev_match, G1.prev_length - MIN_MATCH);
1766
1767
1768
1769
1770 G1.lookahead -= G1.prev_length - 1;
1771 G1.prev_length -= 2;
1772 do {
1773 G1.strstart++;
1774 INSERT_STRING(G1.strstart, hash_head);
1775
1776
1777
1778
1779
1780 } while (--G1.prev_length != 0);
1781 match_available = 0;
1782 match_length = MIN_MATCH - 1;
1783 G1.strstart++;
1784 if (flush) {
1785 FLUSH_BLOCK(0);
1786 G1.block_start = G1.strstart;
1787 }
1788 } else if (match_available) {
1789
1790
1791
1792
1793 Tracevv((stderr, "%c", G1.window[G1.strstart - 1]));
1794 if (ct_tally(0, G1.window[G1.strstart - 1])) {
1795 FLUSH_BLOCK(0);
1796 G1.block_start = G1.strstart;
1797 }
1798 G1.strstart++;
1799 G1.lookahead--;
1800 } else {
1801
1802
1803
1804 match_available = 1;
1805 G1.strstart++;
1806 G1.lookahead--;
1807 }
1808 Assert(G1.strstart <= G1.isize && lookahead <= G1.isize, "a bit too far");
1809
1810
1811
1812
1813
1814
1815 while (G1.lookahead < MIN_LOOKAHEAD && !G1.eofile)
1816 fill_window();
1817 }
1818 if (match_available)
1819 ct_tally(0, G1.window[G1.strstart - 1]);
1820
1821 return FLUSH_BLOCK(1);
1822}
1823
1824
1825
1826
1827
1828static void bi_init(void)
1829{
1830 G1.bi_buf = 0;
1831 G1.bi_valid = 0;
1832#ifdef DEBUG
1833 G1.bits_sent = 0L;
1834#endif
1835}
1836
1837
1838
1839
1840
1841static void lm_init(ush * flagsp)
1842{
1843 unsigned j;
1844
1845
1846 memset(head, 0, HASH_SIZE * sizeof(*head));
1847
1848
1849
1850 *flagsp |= 2;
1851
1852
1853 G1.strstart = 0;
1854 G1.block_start = 0L;
1855
1856 G1.lookahead = file_read(G1.window,
1857 sizeof(int) <= 2 ? (unsigned) WSIZE : 2 * WSIZE);
1858
1859 if (G1.lookahead == 0 || G1.lookahead == (unsigned) -1) {
1860 G1.eofile = 1;
1861 G1.lookahead = 0;
1862 return;
1863 }
1864 G1.eofile = 0;
1865
1866
1867
1868 while (G1.lookahead < MIN_LOOKAHEAD && !G1.eofile)
1869 fill_window();
1870
1871 G1.ins_h = 0;
1872 for (j = 0; j < MIN_MATCH - 1; j++)
1873 UPDATE_HASH(G1.ins_h, G1.window[j]);
1874
1875
1876
1877}
1878
1879
1880
1881
1882
1883
1884
1885
1886static void ct_init(void)
1887{
1888 int n;
1889 int length;
1890 int code;
1891 int dist;
1892
1893 G2.compressed_len = 0L;
1894
1895#ifdef NOT_NEEDED
1896 if (G2.static_dtree[0].Len != 0)
1897 return;
1898#endif
1899
1900
1901 length = 0;
1902 for (code = 0; code < LENGTH_CODES - 1; code++) {
1903 G2.base_length[code] = length;
1904 for (n = 0; n < (1 << extra_lbits[code]); n++) {
1905 G2.length_code[length++] = code;
1906 }
1907 }
1908 Assert(length == 256, "ct_init: length != 256");
1909
1910
1911
1912
1913 G2.length_code[length - 1] = code;
1914
1915
1916 dist = 0;
1917 for (code = 0; code < 16; code++) {
1918 G2.base_dist[code] = dist;
1919 for (n = 0; n < (1 << extra_dbits[code]); n++) {
1920 G2.dist_code[dist++] = code;
1921 }
1922 }
1923 Assert(dist == 256, "ct_init: dist != 256");
1924 dist >>= 7;
1925 for (; code < D_CODES; code++) {
1926 G2.base_dist[code] = dist << 7;
1927 for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
1928 G2.dist_code[256 + dist++] = code;
1929 }
1930 }
1931 Assert(dist == 256, "ct_init: 256+dist != 512");
1932
1933
1934
1935
1936
1937
1938 n = 0;
1939 while (n <= 143) {
1940 G2.static_ltree[n++].Len = 8;
1941 G2.bl_count[8]++;
1942 }
1943 while (n <= 255) {
1944 G2.static_ltree[n++].Len = 9;
1945 G2.bl_count[9]++;
1946 }
1947 while (n <= 279) {
1948 G2.static_ltree[n++].Len = 7;
1949 G2.bl_count[7]++;
1950 }
1951 while (n <= 287) {
1952 G2.static_ltree[n++].Len = 8;
1953 G2.bl_count[8]++;
1954 }
1955
1956
1957
1958
1959 gen_codes((ct_data *) G2.static_ltree, L_CODES + 1);
1960
1961
1962 for (n = 0; n < D_CODES; n++) {
1963 G2.static_dtree[n].Len = 5;
1964 G2.static_dtree[n].Code = bi_reverse(n, 5);
1965 }
1966
1967
1968 init_block();
1969}
1970
1971
1972
1973
1974
1975
1976
1977static void zip(ulg time_stamp)
1978{
1979 ush deflate_flags = 0;
1980
1981 G1.outcnt = 0;
1982
1983
1984
1985
1986
1987 put_32bit(0x00088b1f);
1988 put_32bit(time_stamp);
1989
1990
1991 G1.crc = ~0;
1992
1993 bi_init();
1994 ct_init();
1995 lm_init(&deflate_flags);
1996
1997 put_8bit(deflate_flags);
1998 put_8bit(3);
1999
2000 deflate();
2001
2002
2003 put_32bit(~G1.crc);
2004 put_32bit(G1.isize);
2005
2006 flush_outbuf();
2007}
2008
2009
2010
2011static
2012char* make_new_name_gzip(char *filename)
2013{
2014 return xasprintf("%s.gz", filename);
2015}
2016
2017static
2018USE_DESKTOP(long long) int pack_gzip(unpack_info_t *info UNUSED_PARAM)
2019{
2020 struct stat s;
2021
2022 clear_bufs();
2023 s.st_ctime = 0;
2024 fstat(STDIN_FILENO, &s);
2025 zip(s.st_ctime);
2026 return 0;
2027}
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043int gzip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
2044#if ENABLE_GUNZIP
2045int gzip_main(int argc, char **argv)
2046#else
2047int gzip_main(int argc UNUSED_PARAM, char **argv)
2048#endif
2049{
2050 unsigned opt;
2051
2052
2053 opt = getopt32(argv, "cfv" USE_GUNZIP("dt") "q123456789n");
2054#if ENABLE_GUNZIP
2055 if (opt & 0x18)
2056 return gunzip_main(argc, argv);
2057#endif
2058 option_mask32 &= 0x7;
2059
2060
2061
2062 argv += optind;
2063
2064 SET_PTR_TO_GLOBALS(xzalloc(sizeof(struct globals) + sizeof(struct globals2))
2065 + sizeof(struct globals));
2066 barrier();
2067 G2.l_desc.dyn_tree = G2.dyn_ltree;
2068 G2.l_desc.static_tree = G2.static_ltree;
2069 G2.l_desc.extra_bits = extra_lbits;
2070 G2.l_desc.extra_base = LITERALS + 1;
2071 G2.l_desc.elems = L_CODES;
2072 G2.l_desc.max_length = MAX_BITS;
2073
2074
2075 G2.d_desc.dyn_tree = G2.dyn_dtree;
2076 G2.d_desc.static_tree = G2.static_dtree;
2077 G2.d_desc.extra_bits = extra_dbits;
2078
2079 G2.d_desc.elems = D_CODES;
2080 G2.d_desc.max_length = MAX_BITS;
2081
2082
2083 G2.bl_desc.dyn_tree = G2.bl_tree;
2084
2085 G2.bl_desc.extra_bits = extra_blbits,
2086
2087 G2.bl_desc.elems = BL_CODES;
2088 G2.bl_desc.max_length = MAX_BL_BITS;
2089
2090
2091
2092 ALLOC(uch, G1.l_buf, INBUFSIZ);
2093 ALLOC(uch, G1.outbuf, OUTBUFSIZ);
2094 ALLOC(ush, G1.d_buf, DIST_BUFSIZE);
2095 ALLOC(uch, G1.window, 2L * WSIZE);
2096 ALLOC(ush, G1.prev, 1L << BITS);
2097
2098
2099 G1.crc_32_tab = crc32_filltable(NULL, 0);
2100
2101 return bbunpack(argv, make_new_name_gzip, pack_gzip);
2102}
2103