diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-03-14 00:06:10 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-03-14 00:06:10 +0000 |
commit | e930fe14413e0171d623010c4f7ff1152d58e8ab (patch) | |
tree | 8c8ae08627d727a47ba72dd3481fb7fda5103819 | |
parent | fad03bc3bb3ca5efcc94bcb561d0e541430600d8 (diff) | |
download | busybox-w32-e930fe14413e0171d623010c4f7ff1152d58e8ab.tar.gz busybox-w32-e930fe14413e0171d623010c4f7ff1152d58e8ab.tar.bz2 busybox-w32-e930fe14413e0171d623010c4f7ff1152d58e8ab.zip |
gzip: reduce global data footprint, part 1
-rw-r--r-- | archival/gzip.c | 909 |
1 files changed, 463 insertions, 446 deletions
diff --git a/archival/gzip.c b/archival/gzip.c index 48d1652bc..aa88fd7e5 100644 --- a/archival/gzip.c +++ b/archival/gzip.c | |||
@@ -67,11 +67,11 @@ aa: 85.1% -- replaced with aa.gz | |||
67 | */ | 67 | */ |
68 | #define SMALL_MEM | 68 | #define SMALL_MEM |
69 | 69 | ||
70 | /* Compression methods (see algorithm.doc) */ | 70 | //// /* Compression methods (see algorithm.doc) */ |
71 | /* Only STORED and DEFLATED are supported by this BusyBox module */ | 71 | //// /* Only STORED and DEFLATED are supported by this BusyBox module */ |
72 | #define STORED 0 | 72 | //// #define STORED 0 |
73 | /* methods 4 to 7 reserved */ | 73 | //// /* methods 4 to 7 reserved */ |
74 | #define DEFLATED 8 | 74 | //// #define DEFLATED 8 |
75 | 75 | ||
76 | #ifndef INBUFSIZ | 76 | #ifndef INBUFSIZ |
77 | # ifdef SMALL_MEM | 77 | # ifdef SMALL_MEM |
@@ -195,42 +195,9 @@ typedef uint16_t ush; | |||
195 | typedef uint32_t ulg; | 195 | typedef uint32_t ulg; |
196 | typedef int32_t lng; | 196 | typedef int32_t lng; |
197 | 197 | ||
198 | |||
199 | /* =========================================================================== | ||
200 | */ | ||
201 | typedef ush Pos; | 198 | typedef ush Pos; |
202 | typedef unsigned IPos; | 199 | typedef unsigned IPos; |
203 | 200 | ||
204 | /* A Pos is an index in the character window. We use short instead of int to | ||
205 | * save space in the various tables. IPos is used only for parameter passing. | ||
206 | */ | ||
207 | |||
208 | static lng block_start; | ||
209 | |||
210 | /* window position at the beginning of the current output block. Gets | ||
211 | * negative when the window is moved backwards. | ||
212 | */ | ||
213 | |||
214 | static unsigned ins_h; /* hash index of string to be inserted */ | ||
215 | |||
216 | #define H_SHIFT ((HASH_BITS+MIN_MATCH-1) / MIN_MATCH) | ||
217 | /* Number of bits by which ins_h and del_h must be shifted at each | ||
218 | * input step. It must be such that after MIN_MATCH steps, the oldest | ||
219 | * byte no longer takes part in the hash key, that is: | ||
220 | * H_SHIFT * MIN_MATCH >= HASH_BITS | ||
221 | */ | ||
222 | |||
223 | static unsigned int prev_length; | ||
224 | |||
225 | /* Length of the best match at previous step. Matches not greater than this | ||
226 | * are discarded. This is used in the lazy match evaluation. | ||
227 | */ | ||
228 | |||
229 | static unsigned strstart; /* start of string to insert */ | ||
230 | static unsigned match_start; /* start of matching string */ | ||
231 | static int eofile; /* flag set at end of input file */ | ||
232 | static unsigned lookahead; /* number of valid bytes ahead in window */ | ||
233 | |||
234 | enum { | 201 | enum { |
235 | WINDOW_SIZE = 2 * WSIZE, | 202 | WINDOW_SIZE = 2 * WSIZE, |
236 | /* window size, 2*WSIZE except for MMAP or BIG_MEM, where it is the | 203 | /* window size, 2*WSIZE except for MMAP or BIG_MEM, where it is the |
@@ -271,30 +238,53 @@ enum { | |||
271 | }; | 238 | }; |
272 | 239 | ||
273 | 240 | ||
241 | struct G1 { | ||
242 | |||
243 | /* A Pos is an index in the character window. We use short instead of int to | ||
244 | * save space in the various tables. IPos is used only for parameter passing. | ||
245 | */ | ||
246 | lng block_start; | ||
247 | |||
248 | /* window position at the beginning of the current output block. Gets | ||
249 | * negative when the window is moved backwards. | ||
250 | */ | ||
251 | unsigned ins_h; /* hash index of string to be inserted */ | ||
252 | |||
253 | #define H_SHIFT ((HASH_BITS+MIN_MATCH-1) / MIN_MATCH) | ||
254 | /* Number of bits by which ins_h and del_h must be shifted at each | ||
255 | * input step. It must be such that after MIN_MATCH steps, the oldest | ||
256 | * byte no longer takes part in the hash key, that is: | ||
257 | * H_SHIFT * MIN_MATCH >= HASH_BITS | ||
258 | */ | ||
259 | |||
260 | unsigned prev_length; | ||
261 | |||
262 | /* Length of the best match at previous step. Matches not greater than this | ||
263 | * are discarded. This is used in the lazy match evaluation. | ||
264 | */ | ||
265 | |||
266 | unsigned strstart; /* start of string to insert */ | ||
267 | unsigned match_start; /* start of matching string */ | ||
268 | unsigned lookahead; /* number of valid bytes ahead in window */ | ||
269 | smallint eofile; /* flag set at end of input file */ | ||
270 | |||
274 | /* =========================================================================== | 271 | /* =========================================================================== |
275 | */ | 272 | */ |
276 | #define DECLARE(type, array, size) \ | 273 | #define DECLARE(type, array, size) \ |
277 | static type * array | 274 | type * array |
278 | |||
279 | #define ALLOC(type, array, size) \ | 275 | #define ALLOC(type, array, size) \ |
280 | { \ | 276 | array = xzalloc((size_t)(((size)+1L)/2) * 2*sizeof(type)); |
281 | array = xzalloc((size_t)(((size)+1L)/2) * 2*sizeof(type)); \ | ||
282 | } | ||
283 | |||
284 | #define FREE(array) \ | 277 | #define FREE(array) \ |
285 | { \ | 278 | do { free(array); array = NULL; } while (0) |
286 | free(array); \ | ||
287 | array = NULL; \ | ||
288 | } | ||
289 | 279 | ||
290 | /* global buffers */ | 280 | /* global buffers */ |
291 | 281 | ||
292 | /* buffer for literals or lengths */ | 282 | /* buffer for literals or lengths */ |
293 | /* DECLARE(uch, l_buf, LIT_BUFSIZE); */ | 283 | /* DECLARE(uch, l_buf, LIT_BUFSIZE); */ |
294 | DECLARE(uch, l_buf, INBUFSIZ); | 284 | DECLARE(uch, l_buf, INBUFSIZ); |
295 | 285 | ||
296 | DECLARE(ush, d_buf, DIST_BUFSIZE); | 286 | DECLARE(ush, d_buf, DIST_BUFSIZE); |
297 | DECLARE(uch, outbuf, OUTBUFSIZ); | 287 | DECLARE(uch, outbuf, OUTBUFSIZ); |
298 | 288 | ||
299 | /* Sliding window. Input bytes are read into the second half of the window, | 289 | /* Sliding window. Input bytes are read into the second half of the window, |
300 | * and move to the first half later to keep a dictionary of at least WSIZE | 290 | * and move to the first half later to keep a dictionary of at least WSIZE |
@@ -305,66 +295,68 @@ DECLARE(uch, outbuf, OUTBUFSIZ); | |||
305 | * To do: limit the window size to WSIZE+BSZ if SMALL_MEM (the code would | 295 | * To do: limit the window size to WSIZE+BSZ if SMALL_MEM (the code would |
306 | * be less efficient). | 296 | * be less efficient). |
307 | */ | 297 | */ |
308 | DECLARE(uch, window, 2L * WSIZE); | 298 | DECLARE(uch, window, 2L * WSIZE); |
309 | 299 | ||
310 | /* Link to older string with same hash index. To limit the size of this | 300 | /* Link to older string with same hash index. To limit the size of this |
311 | * array to 64K, this link is maintained only for the last 32K strings. | 301 | * array to 64K, this link is maintained only for the last 32K strings. |
312 | * An index in this array is thus a window index modulo 32K. | 302 | * An index in this array is thus a window index modulo 32K. |
313 | */ | 303 | */ |
314 | /* DECLARE(Pos, prev, WSIZE); */ | 304 | /* DECLARE(Pos, prev, WSIZE); */ |
315 | DECLARE(ush, prev, 1L << BITS); | 305 | DECLARE(ush, prev, 1L << BITS); |
316 | 306 | ||
317 | /* Heads of the hash chains or 0. */ | 307 | /* Heads of the hash chains or 0. */ |
318 | /* DECLARE(Pos, head, 1<<HASH_BITS); */ | 308 | /* DECLARE(Pos, head, 1<<HASH_BITS); */ |
319 | #define head (prev+WSIZE) /* hash head (see deflate.c) */ | 309 | #define head (G1.prev + WSIZE) /* hash head (see deflate.c) */ |
320 | 310 | ||
321 | 311 | ||
322 | /* number of input bytes */ | 312 | /* number of input bytes */ |
323 | static ulg isize; /* only 32 bits stored in .gz file */ | 313 | ulg isize; /* only 32 bits stored in .gz file */ |
324 | 314 | ||
325 | static int foreground; /* set if program run in foreground */ | 315 | //// int method = DEFLATED; /* compression method */ |
326 | static int method = DEFLATED; /* compression method */ | 316 | //## int exit_code; /* program exit code */ |
327 | static int exit_code; /* program exit code */ | ||
328 | 317 | ||
329 | /* original time stamp (modification time) */ | 318 | /* original time stamp (modification time) */ |
330 | static ulg time_stamp; /* only 32 bits stored in .gz file */ | 319 | ulg time_stamp; /* only 32 bits stored in .gz file */ |
331 | 320 | ||
332 | static int ifd; /* input file descriptor */ | 321 | int ifd; /* input file descriptor */ |
333 | static int ofd; /* output file descriptor */ | 322 | int ofd; /* output file descriptor */ |
334 | #ifdef DEBUG | 323 | #ifdef DEBUG |
335 | static unsigned insize; /* valid bytes in l_buf */ | 324 | unsigned insize; /* valid bytes in l_buf */ |
336 | #endif | 325 | #endif |
337 | static unsigned outcnt; /* bytes in output buffer */ | 326 | unsigned outcnt; /* bytes in output buffer */ |
338 | 327 | ||
339 | static uint32_t *crc_32_tab; | 328 | uint32_t *crc_32_tab; |
340 | 329 | ||
341 | 330 | ||
342 | /* =========================================================================== | 331 | /* =========================================================================== |
343 | * Local data used by the "bit string" routines. | 332 | * Local data used by the "bit string" routines. |
344 | */ | 333 | */ |
345 | 334 | ||
346 | //// static int zfile; /* output gzip file */ | 335 | unsigned short bi_buf; |
347 | |||
348 | static unsigned short bi_buf; | ||
349 | 336 | ||
350 | /* Output buffer. bits are inserted starting at the bottom (least significant | 337 | /* Output buffer. bits are inserted starting at the bottom (least significant |
351 | * bits). | 338 | * bits). |
352 | */ | 339 | */ |
353 | 340 | ||
354 | #undef BUF_SIZE | 341 | #undef BUF_SIZE |
355 | #define BUF_SIZE (8 * sizeof(bi_buf)) | 342 | #define BUF_SIZE (8 * sizeof(G1.bi_buf)) |
356 | /* Number of bits used within bi_buf. (bi_buf might be implemented on | 343 | /* Number of bits used within bi_buf. (bi_buf might be implemented on |
357 | * more than 16 bits on some systems.) | 344 | * more than 16 bits on some systems.) |
358 | */ | 345 | */ |
359 | 346 | ||
360 | static int bi_valid; | 347 | int bi_valid; |
361 | 348 | ||
362 | /* Current input function. Set to mem_read for in-memory compression */ | 349 | /* Current input function. Set to mem_read for in-memory compression */ |
363 | 350 | ||
364 | #ifdef DEBUG | 351 | #ifdef DEBUG |
365 | static ulg bits_sent; /* bit length of the compressed data */ | 352 | ulg bits_sent; /* bit length of the compressed data */ |
366 | #endif | 353 | #endif |
367 | 354 | ||
355 | uint32_t crc; /* shift register contents */ | ||
356 | }; | ||
357 | |||
358 | static struct G1 G1; | ||
359 | |||
368 | 360 | ||
369 | /* =========================================================================== | 361 | /* =========================================================================== |
370 | * Write the output buffer outbuf[0..outcnt-1] and update bytes_out. | 362 | * Write the output buffer outbuf[0..outcnt-1] and update bytes_out. |
@@ -372,11 +364,11 @@ static ulg bits_sent; /* bit length of the compressed data */ | |||
372 | */ | 364 | */ |
373 | static void flush_outbuf(void) | 365 | static void flush_outbuf(void) |
374 | { | 366 | { |
375 | if (outcnt == 0) | 367 | if (G1.outcnt == 0) |
376 | return; | 368 | return; |
377 | 369 | ||
378 | xwrite(ofd, (char *) outbuf, outcnt); | 370 | xwrite(G1.ofd, (char *) G1.outbuf, G1.outcnt); |
379 | outcnt = 0; | 371 | G1.outcnt = 0; |
380 | } | 372 | } |
381 | 373 | ||
382 | 374 | ||
@@ -384,17 +376,17 @@ static void flush_outbuf(void) | |||
384 | */ | 376 | */ |
385 | /* put_8bit is used for the compressed output */ | 377 | /* put_8bit is used for the compressed output */ |
386 | #define put_8bit(c) \ | 378 | #define put_8bit(c) \ |
387 | { \ | 379 | do { \ |
388 | outbuf[outcnt++] = (c); \ | 380 | G1.outbuf[G1.outcnt++] = (c); \ |
389 | if (outcnt == OUTBUFSIZ) flush_outbuf(); \ | 381 | if (G1.outcnt == OUTBUFSIZ) flush_outbuf(); \ |
390 | } | 382 | } while (0) |
391 | 383 | ||
392 | /* Output a 16 bit value, lsb first */ | 384 | /* Output a 16 bit value, lsb first */ |
393 | static void put_16bit(ush w) | 385 | static void put_16bit(ush w) |
394 | { | 386 | { |
395 | if (outcnt < OUTBUFSIZ - 2) { | 387 | if (G1.outcnt < OUTBUFSIZ - 2) { |
396 | outbuf[outcnt++] = w; | 388 | G1.outbuf[G1.outcnt++] = w; |
397 | outbuf[outcnt++] = w >> 8; | 389 | G1.outbuf[G1.outcnt++] = w >> 8; |
398 | } else { | 390 | } else { |
399 | put_8bit(w); | 391 | put_8bit(w); |
400 | put_8bit(w >> 8); | 392 | put_8bit(w >> 8); |
@@ -412,11 +404,11 @@ static void put_32bit(ulg n) | |||
412 | */ | 404 | */ |
413 | static void clear_bufs(void) | 405 | static void clear_bufs(void) |
414 | { | 406 | { |
415 | outcnt = 0; | 407 | G1.outcnt = 0; |
416 | #ifdef DEBUG | 408 | #ifdef DEBUG |
417 | insize = 0; | 409 | G1.insize = 0; |
418 | #endif | 410 | #endif |
419 | isize = 0; | 411 | G1.isize = 0; |
420 | } | 412 | } |
421 | 413 | ||
422 | 414 | ||
@@ -425,15 +417,14 @@ static void clear_bufs(void) | |||
425 | * pointer, then initialize the crc shift register contents instead. | 417 | * pointer, then initialize the crc shift register contents instead. |
426 | * Return the current crc in either case. | 418 | * Return the current crc in either case. |
427 | */ | 419 | */ |
428 | static uint32_t crc; /* shift register contents */ | ||
429 | static uint32_t updcrc(uch * s, unsigned n) | 420 | static uint32_t updcrc(uch * s, unsigned n) |
430 | { | 421 | { |
431 | uint32_t c = crc; | 422 | uint32_t c = G1.crc; |
432 | while (n) { | 423 | while (n) { |
433 | c = crc_32_tab[(uch)(c ^ *s++)] ^ (c >> 8); | 424 | c = G1.crc_32_tab[(uch)(c ^ *s++)] ^ (c >> 8); |
434 | n--; | 425 | n--; |
435 | } | 426 | } |
436 | crc = c; | 427 | G1.crc = c; |
437 | return c; | 428 | return c; |
438 | } | 429 | } |
439 | 430 | ||
@@ -447,14 +438,14 @@ static unsigned file_read(void *buf, unsigned size) | |||
447 | { | 438 | { |
448 | unsigned len; | 439 | unsigned len; |
449 | 440 | ||
450 | Assert(insize == 0, "l_buf not empty"); | 441 | Assert(G1.insize == 0, "l_buf not empty"); |
451 | 442 | ||
452 | len = safe_read(ifd, buf, size); | 443 | len = safe_read(G1.ifd, buf, size); |
453 | if (len == (unsigned)(-1) || len == 0) | 444 | if (len == (unsigned)(-1) || len == 0) |
454 | return len; | 445 | return len; |
455 | 446 | ||
456 | updcrc(buf, len); | 447 | updcrc(buf, len); |
457 | isize += len; | 448 | G1.isize += len; |
458 | return len; | 449 | return len; |
459 | } | 450 | } |
460 | 451 | ||
@@ -468,20 +459,20 @@ static void send_bits(int value, int length) | |||
468 | #ifdef DEBUG | 459 | #ifdef DEBUG |
469 | Tracev((stderr, " l %2d v %4x ", length, value)); | 460 | Tracev((stderr, " l %2d v %4x ", length, value)); |
470 | Assert(length > 0 && length <= 15, "invalid length"); | 461 | Assert(length > 0 && length <= 15, "invalid length"); |
471 | bits_sent += length; | 462 | G1.bits_sent += length; |
472 | #endif | 463 | #endif |
473 | /* If not enough room in bi_buf, use (valid) bits from bi_buf and | 464 | /* If not enough room in bi_buf, use (valid) bits from bi_buf and |
474 | * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) | 465 | * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) |
475 | * unused bits in value. | 466 | * unused bits in value. |
476 | */ | 467 | */ |
477 | if (bi_valid > (int) BUF_SIZE - length) { | 468 | if (G1.bi_valid > (int) BUF_SIZE - length) { |
478 | bi_buf |= (value << bi_valid); | 469 | G1.bi_buf |= (value << G1.bi_valid); |
479 | put_16bit(bi_buf); | 470 | put_16bit(G1.bi_buf); |
480 | bi_buf = (ush) value >> (BUF_SIZE - bi_valid); | 471 | G1.bi_buf = (ush) value >> (BUF_SIZE - G1.bi_valid); |
481 | bi_valid += length - BUF_SIZE; | 472 | G1.bi_valid += length - BUF_SIZE; |
482 | } else { | 473 | } else { |
483 | bi_buf |= value << bi_valid; | 474 | G1.bi_buf |= value << G1.bi_valid; |
484 | bi_valid += length; | 475 | G1.bi_valid += length; |
485 | } | 476 | } |
486 | } | 477 | } |
487 | 478 | ||
@@ -509,15 +500,15 @@ static unsigned bi_reverse(unsigned code, int len) | |||
509 | */ | 500 | */ |
510 | static void bi_windup(void) | 501 | static void bi_windup(void) |
511 | { | 502 | { |
512 | if (bi_valid > 8) { | 503 | if (G1.bi_valid > 8) { |
513 | put_16bit(bi_buf); | 504 | put_16bit(G1.bi_buf); |
514 | } else if (bi_valid > 0) { | 505 | } else if (G1.bi_valid > 0) { |
515 | put_8bit(bi_buf); | 506 | put_8bit(G1.bi_buf); |
516 | } | 507 | } |
517 | bi_buf = 0; | 508 | G1.bi_buf = 0; |
518 | bi_valid = 0; | 509 | G1.bi_valid = 0; |
519 | #ifdef DEBUG | 510 | #ifdef DEBUG |
520 | bits_sent = (bits_sent + 7) & ~7; | 511 | G1.bits_sent = (G1.bits_sent + 7) & ~7; |
521 | #endif | 512 | #endif |
522 | } | 513 | } |
523 | 514 | ||
@@ -534,11 +525,11 @@ static void copy_block(char *buf, unsigned len, int header) | |||
534 | put_16bit(len); | 525 | put_16bit(len); |
535 | put_16bit(~len); | 526 | put_16bit(~len); |
536 | #ifdef DEBUG | 527 | #ifdef DEBUG |
537 | bits_sent += 2 * 16; | 528 | G1.bits_sent += 2 * 16; |
538 | #endif | 529 | #endif |
539 | } | 530 | } |
540 | #ifdef DEBUG | 531 | #ifdef DEBUG |
541 | bits_sent += (ulg) len << 3; | 532 | G1.bits_sent += (ulg) len << 3; |
542 | #endif | 533 | #endif |
543 | while (len--) { | 534 | while (len--) { |
544 | put_8bit(*buf++); | 535 | put_8bit(*buf++); |
@@ -557,7 +548,7 @@ static void copy_block(char *buf, unsigned len, int header) | |||
557 | static void fill_window(void) | 548 | static void fill_window(void) |
558 | { | 549 | { |
559 | unsigned n, m; | 550 | unsigned n, m; |
560 | unsigned more = WINDOW_SIZE - lookahead - strstart; | 551 | unsigned more = WINDOW_SIZE - G1.lookahead - G1.strstart; |
561 | /* Amount of free space at the end of the window. */ | 552 | /* Amount of free space at the end of the window. */ |
562 | 553 | ||
563 | /* If the window is almost full and there is insufficient lookahead, | 554 | /* If the window is almost full and there is insufficient lookahead, |
@@ -568,25 +559,25 @@ static void fill_window(void) | |||
568 | * and lookahead == 1 (input done one byte at time) | 559 | * and lookahead == 1 (input done one byte at time) |
569 | */ | 560 | */ |
570 | more--; | 561 | more--; |
571 | } else if (strstart >= WSIZE + MAX_DIST) { | 562 | } else if (G1.strstart >= WSIZE + MAX_DIST) { |
572 | /* By the IN assertion, the window is not empty so we can't confuse | 563 | /* By the IN assertion, the window is not empty so we can't confuse |
573 | * more == 0 with more == 64K on a 16 bit machine. | 564 | * more == 0 with more == 64K on a 16 bit machine. |
574 | */ | 565 | */ |
575 | Assert(WINDOW_SIZE == 2 * WSIZE, "no sliding with BIG_MEM"); | 566 | Assert(WINDOW_SIZE == 2 * WSIZE, "no sliding with BIG_MEM"); |
576 | 567 | ||
577 | memcpy(window, window + WSIZE, WSIZE); | 568 | memcpy(G1.window, G1.window + WSIZE, WSIZE); |
578 | match_start -= WSIZE; | 569 | G1.match_start -= WSIZE; |
579 | strstart -= WSIZE; /* we now have strstart >= MAX_DIST: */ | 570 | G1.strstart -= WSIZE; /* we now have strstart >= MAX_DIST: */ |
580 | 571 | ||
581 | block_start -= WSIZE; | 572 | G1.block_start -= WSIZE; |
582 | 573 | ||
583 | for (n = 0; n < HASH_SIZE; n++) { | 574 | for (n = 0; n < HASH_SIZE; n++) { |
584 | m = head[n]; | 575 | m = head[n]; |
585 | head[n] = (Pos) (m >= WSIZE ? m - WSIZE : 0); | 576 | head[n] = (Pos) (m >= WSIZE ? m - WSIZE : 0); |
586 | } | 577 | } |
587 | for (n = 0; n < WSIZE; n++) { | 578 | for (n = 0; n < WSIZE; n++) { |
588 | m = prev[n]; | 579 | m = G1.prev[n]; |
589 | prev[n] = (Pos) (m >= WSIZE ? m - WSIZE : 0); | 580 | G1.prev[n] = (Pos) (m >= WSIZE ? m - WSIZE : 0); |
590 | /* If n is not on any hash chain, prev[n] is garbage but | 581 | /* If n is not on any hash chain, prev[n] is garbage but |
591 | * its value will never be used. | 582 | * its value will never be used. |
592 | */ | 583 | */ |
@@ -594,12 +585,12 @@ static void fill_window(void) | |||
594 | more += WSIZE; | 585 | more += WSIZE; |
595 | } | 586 | } |
596 | /* At this point, more >= 2 */ | 587 | /* At this point, more >= 2 */ |
597 | if (!eofile) { | 588 | if (!G1.eofile) { |
598 | n = file_read(window + strstart + lookahead, more); | 589 | n = file_read(G1.window + G1.strstart + G1.lookahead, more); |
599 | if (n == 0 || n == (unsigned) -1) { | 590 | if (n == 0 || n == (unsigned) -1) { |
600 | eofile = 1; | 591 | G1.eofile = 1; |
601 | } else { | 592 | } else { |
602 | lookahead += n; | 593 | G1.lookahead += n; |
603 | } | 594 | } |
604 | } | 595 | } |
605 | } | 596 | } |
@@ -621,11 +612,11 @@ static void fill_window(void) | |||
621 | static int longest_match(IPos cur_match) | 612 | static int longest_match(IPos cur_match) |
622 | { | 613 | { |
623 | unsigned chain_length = max_chain_length; /* max hash chain length */ | 614 | unsigned chain_length = max_chain_length; /* max hash chain length */ |
624 | uch *scan = window + strstart; /* current string */ | 615 | uch *scan = G1.window + G1.strstart; /* current string */ |
625 | uch *match; /* matched string */ | 616 | uch *match; /* matched string */ |
626 | int len; /* length of current match */ | 617 | int len; /* length of current match */ |
627 | int best_len = prev_length; /* best match length so far */ | 618 | int best_len = G1.prev_length; /* best match length so far */ |
628 | IPos limit = strstart > (IPos) MAX_DIST ? strstart - (IPos) MAX_DIST : 0; | 619 | IPos limit = G1.strstart > (IPos) MAX_DIST ? G1.strstart - (IPos) MAX_DIST : 0; |
629 | /* Stop when cur_match becomes <= limit. To simplify the code, | 620 | /* Stop when cur_match becomes <= limit. To simplify the code, |
630 | * we prevent matches with the string of window index 0. | 621 | * we prevent matches with the string of window index 0. |
631 | */ | 622 | */ |
@@ -636,19 +627,19 @@ static int longest_match(IPos cur_match) | |||
636 | #if HASH_BITS < 8 || MAX_MATCH != 258 | 627 | #if HASH_BITS < 8 || MAX_MATCH != 258 |
637 | # error Code too clever | 628 | # error Code too clever |
638 | #endif | 629 | #endif |
639 | uch *strend = window + strstart + MAX_MATCH; | 630 | uch *strend = G1.window + G1.strstart + MAX_MATCH; |
640 | uch scan_end1 = scan[best_len - 1]; | 631 | uch scan_end1 = scan[best_len - 1]; |
641 | uch scan_end = scan[best_len]; | 632 | uch scan_end = scan[best_len]; |
642 | 633 | ||
643 | /* Do not waste too much time if we already have a good match: */ | 634 | /* Do not waste too much time if we already have a good match: */ |
644 | if (prev_length >= good_match) { | 635 | if (G1.prev_length >= good_match) { |
645 | chain_length >>= 2; | 636 | chain_length >>= 2; |
646 | } | 637 | } |
647 | Assert(strstart <= WINDOW_SIZE - MIN_LOOKAHEAD, "insufficient lookahead"); | 638 | Assert(G1.strstart <= WINDOW_SIZE - MIN_LOOKAHEAD, "insufficient lookahead"); |
648 | 639 | ||
649 | do { | 640 | do { |
650 | Assert(cur_match < strstart, "no future"); | 641 | Assert(cur_match < G1.strstart, "no future"); |
651 | match = window + cur_match; | 642 | match = G1.window + cur_match; |
652 | 643 | ||
653 | /* Skip to next match if the match length cannot increase | 644 | /* Skip to next match if the match length cannot increase |
654 | * or if the match length is less than 2: | 645 | * or if the match length is less than 2: |
@@ -679,14 +670,14 @@ static int longest_match(IPos cur_match) | |||
679 | scan = strend - MAX_MATCH; | 670 | scan = strend - MAX_MATCH; |
680 | 671 | ||
681 | if (len > best_len) { | 672 | if (len > best_len) { |
682 | match_start = cur_match; | 673 | G1.match_start = cur_match; |
683 | best_len = len; | 674 | best_len = len; |
684 | if (len >= nice_match) | 675 | if (len >= nice_match) |
685 | break; | 676 | break; |
686 | scan_end1 = scan[best_len - 1]; | 677 | scan_end1 = scan[best_len - 1]; |
687 | scan_end = scan[best_len]; | 678 | scan_end = scan[best_len]; |
688 | } | 679 | } |
689 | } while ((cur_match = prev[cur_match & WMASK]) > limit | 680 | } while ((cur_match = G1.prev[cur_match & WMASK]) > limit |
690 | && --chain_length != 0); | 681 | && --chain_length != 0); |
691 | 682 | ||
692 | return best_len; | 683 | return best_len; |
@@ -700,14 +691,14 @@ static int longest_match(IPos cur_match) | |||
700 | static void check_match(IPos start, IPos match, int length) | 691 | static void check_match(IPos start, IPos match, int length) |
701 | { | 692 | { |
702 | /* check that the match is indeed a match */ | 693 | /* check that the match is indeed a match */ |
703 | if (memcmp(window + match, window + start, length) != 0) { | 694 | if (memcmp(G1.window + match, G1.window + start, length) != 0) { |
704 | bb_error_msg(" start %d, match %d, length %d", start, match, length); | 695 | bb_error_msg(" start %d, match %d, length %d", start, match, length); |
705 | bb_error_msg("invalid match"); | 696 | bb_error_msg("invalid match"); |
706 | } | 697 | } |
707 | if (verbose > 1) { | 698 | if (verbose > 1) { |
708 | bb_error_msg("\\[%d,%d]", start - match, length); | 699 | bb_error_msg("\\[%d,%d]", start - match, length); |
709 | do { | 700 | do { |
710 | putc(window[start++], stderr); | 701 | putc(G1.window[start++], stderr); |
711 | } while (--length != 0); | 702 | } while (--length != 0); |
712 | } | 703 | } |
713 | } | 704 | } |
@@ -751,7 +742,7 @@ static void check_match(IPos start, IPos match, int length) | |||
751 | * Addison-Wesley, 1983. ISBN 0-201-06672-6. | 742 | * Addison-Wesley, 1983. ISBN 0-201-06672-6. |
752 | * | 743 | * |
753 | * INTERFACE | 744 | * INTERFACE |
754 | * void ct_init(ush *attr, int *methodp) | 745 | * void ct_init() //// ush *attr, int *methodp) |
755 | * Allocate the match buffer, initialize the various tables and save | 746 | * Allocate the match buffer, initialize the various tables and save |
756 | * the location of the internal file attribute (ascii/binary) and | 747 | * the location of the internal file attribute (ascii/binary) and |
757 | * method (DEFLATE/STORE) | 748 | * method (DEFLATE/STORE) |
@@ -807,6 +798,10 @@ static const extra_bits_t extra_dbits[D_CODES] = { | |||
807 | static const extra_bits_t extra_blbits[BL_CODES] = { | 798 | static const extra_bits_t extra_blbits[BL_CODES] = { |
808 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7 }; | 799 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7 }; |
809 | 800 | ||
801 | /* number of codes at each bit length for an optimal tree */ | ||
802 | static const uch bl_order[BL_CODES] = { | ||
803 | 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; | ||
804 | |||
810 | #define STORED_BLOCK 0 | 805 | #define STORED_BLOCK 0 |
811 | #define STATIC_TREES 1 | 806 | #define STATIC_TREES 1 |
812 | #define DYN_TREES 2 | 807 | #define DYN_TREES 2 |
@@ -875,20 +870,30 @@ typedef struct ct_data { | |||
875 | #define HEAP_SIZE (2*L_CODES + 1) | 870 | #define HEAP_SIZE (2*L_CODES + 1) |
876 | /* maximum heap size */ | 871 | /* maximum heap size */ |
877 | 872 | ||
878 | ////static int heap[HEAP_SIZE]; /* heap used to build the Huffman trees */ | 873 | typedef struct tree_desc { |
879 | ////let's try this | 874 | ct_data *dyn_tree; /* the dynamic tree */ |
880 | static ush heap[HEAP_SIZE]; /* heap used to build the Huffman trees */ | 875 | ct_data *static_tree; /* corresponding static tree or NULL */ |
881 | static int heap_len; /* number of elements in the heap */ | 876 | const extra_bits_t *extra_bits; /* extra bits for each code or NULL */ |
882 | static int heap_max; /* element of largest frequency */ | 877 | int extra_base; /* base index for extra_bits */ |
878 | int elems; /* max number of elements in the tree */ | ||
879 | int max_length; /* max bit length for the codes */ | ||
880 | int max_code; /* largest code with non zero frequency */ | ||
881 | } tree_desc; | ||
882 | |||
883 | struct G2 { | ||
884 | |||
885 | ush heap[HEAP_SIZE]; /* heap used to build the Huffman trees */ | ||
886 | int heap_len; /* number of elements in the heap */ | ||
887 | int heap_max; /* element of largest frequency */ | ||
883 | 888 | ||
884 | /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. | 889 | /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. |
885 | * The same heap array is used to build all trees. | 890 | * The same heap array is used to build all trees. |
886 | */ | 891 | */ |
887 | 892 | ||
888 | static ct_data dyn_ltree[HEAP_SIZE]; /* literal and length tree */ | 893 | ct_data dyn_ltree[HEAP_SIZE]; /* literal and length tree */ |
889 | static ct_data dyn_dtree[2 * D_CODES + 1]; /* distance tree */ | 894 | ct_data dyn_dtree[2 * D_CODES + 1]; /* distance tree */ |
890 | 895 | ||
891 | static ct_data static_ltree[L_CODES + 2]; | 896 | ct_data static_ltree[L_CODES + 2]; |
892 | 897 | ||
893 | /* The static literal tree. Since the bit lengths are imposed, there is no | 898 | /* The static literal tree. Since the bit lengths are imposed, there is no |
894 | * need for the L_CODES extra codes used during heap construction. However | 899 | * need for the L_CODES extra codes used during heap construction. However |
@@ -896,99 +901,94 @@ static ct_data static_ltree[L_CODES + 2]; | |||
896 | * below). | 901 | * below). |
897 | */ | 902 | */ |
898 | 903 | ||
899 | static ct_data static_dtree[D_CODES]; | 904 | ct_data static_dtree[D_CODES]; |
900 | 905 | ||
901 | /* The static distance tree. (Actually a trivial tree since all codes use | 906 | /* The static distance tree. (Actually a trivial tree since all codes use |
902 | * 5 bits.) | 907 | * 5 bits.) |
903 | */ | 908 | */ |
904 | 909 | ||
905 | static ct_data bl_tree[2 * BL_CODES + 1]; | 910 | ct_data bl_tree[2 * BL_CODES + 1]; |
906 | 911 | ||
907 | /* Huffman tree for the bit lengths */ | 912 | /* Huffman tree for the bit lengths */ |
908 | 913 | ||
909 | typedef struct tree_desc { | 914 | tree_desc l_desc; |
910 | ct_data *dyn_tree; /* the dynamic tree */ | 915 | tree_desc d_desc; |
911 | ct_data *static_tree; /* corresponding static tree or NULL */ | 916 | tree_desc bl_desc; |
912 | const extra_bits_t *extra_bits; /* extra bits for each code or NULL */ | ||
913 | int extra_base; /* base index for extra_bits */ | ||
914 | int elems; /* max number of elements in the tree */ | ||
915 | int max_length; /* max bit length for the codes */ | ||
916 | int max_code; /* largest code with non zero frequency */ | ||
917 | } tree_desc; | ||
918 | |||
919 | static tree_desc l_desc = { | ||
920 | dyn_ltree, static_ltree, extra_lbits, | ||
921 | LITERALS + 1, L_CODES, MAX_BITS, 0 | ||
922 | }; | ||
923 | 917 | ||
924 | static tree_desc d_desc = { | 918 | ush bl_count[MAX_BITS + 1]; |
925 | dyn_dtree, static_dtree, extra_dbits, 0, D_CODES, MAX_BITS, 0 | ||
926 | }; | ||
927 | |||
928 | static tree_desc bl_desc = { | ||
929 | bl_tree, NULL, extra_blbits, 0, BL_CODES, MAX_BL_BITS, 0 | ||
930 | }; | ||
931 | |||
932 | |||
933 | static ush bl_count[MAX_BITS + 1]; | ||
934 | |||
935 | /* number of codes at each bit length for an optimal tree */ | ||
936 | |||
937 | static const uch bl_order[BL_CODES] = { | ||
938 | 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 | ||
939 | }; | ||
940 | 919 | ||
941 | /* The lengths of the bit length codes are sent in order of decreasing | 920 | /* The lengths of the bit length codes are sent in order of decreasing |
942 | * probability, to avoid transmitting the lengths for unused bit length codes. | 921 | * probability, to avoid transmitting the lengths for unused bit length codes. |
943 | */ | 922 | */ |
944 | 923 | ||
945 | static uch depth[2 * L_CODES + 1]; | 924 | uch depth[2 * L_CODES + 1]; |
946 | 925 | ||
947 | /* Depth of each subtree used as tie breaker for trees of equal frequency */ | 926 | /* Depth of each subtree used as tie breaker for trees of equal frequency */ |
948 | 927 | ||
949 | static uch length_code[MAX_MATCH - MIN_MATCH + 1]; | 928 | uch length_code[MAX_MATCH - MIN_MATCH + 1]; |
950 | 929 | ||
951 | /* length code for each normalized match length (0 == MIN_MATCH) */ | 930 | /* length code for each normalized match length (0 == MIN_MATCH) */ |
952 | 931 | ||
953 | static uch dist_code[512]; | 932 | uch dist_code[512]; |
954 | 933 | ||
955 | /* distance codes. The first 256 values correspond to the distances | 934 | /* distance codes. The first 256 values correspond to the distances |
956 | * 3 .. 258, the last 256 values correspond to the top 8 bits of | 935 | * 3 .. 258, the last 256 values correspond to the top 8 bits of |
957 | * the 15 bit distances. | 936 | * the 15 bit distances. |
958 | */ | 937 | */ |
959 | 938 | ||
960 | static int base_length[LENGTH_CODES]; | 939 | int base_length[LENGTH_CODES]; |
961 | 940 | ||
962 | /* First normalized length for each code (0 = MIN_MATCH) */ | 941 | /* First normalized length for each code (0 = MIN_MATCH) */ |
963 | 942 | ||
964 | static int base_dist[D_CODES]; | 943 | int base_dist[D_CODES]; |
965 | 944 | ||
966 | /* First normalized distance for each code (0 = distance of 1) */ | 945 | /* First normalized distance for each code (0 = distance of 1) */ |
967 | 946 | ||
968 | static uch flag_buf[LIT_BUFSIZE / 8]; | 947 | uch flag_buf[LIT_BUFSIZE / 8]; |
969 | 948 | ||
970 | /* flag_buf is a bit array distinguishing literals from lengths in | 949 | /* flag_buf is a bit array distinguishing literals from lengths in |
971 | * l_buf, thus indicating the presence or absence of a distance. | 950 | * l_buf, thus indicating the presence or absence of a distance. |
972 | */ | 951 | */ |
973 | 952 | ||
974 | static unsigned last_lit; /* running index in l_buf */ | 953 | unsigned last_lit; /* running index in l_buf */ |
975 | static unsigned last_dist; /* running index in d_buf */ | 954 | unsigned last_dist; /* running index in d_buf */ |
976 | static unsigned last_flags; /* running index in flag_buf */ | 955 | unsigned last_flags; /* running index in flag_buf */ |
977 | static uch flags; /* current flags not yet saved in flag_buf */ | 956 | uch flags; /* current flags not yet saved in flag_buf */ |
978 | static uch flag_bit; /* current bit used in flags */ | 957 | uch flag_bit; /* current bit used in flags */ |
979 | 958 | ||
980 | /* bits are filled in flags starting at bit 0 (least significant). | 959 | /* bits are filled in flags starting at bit 0 (least significant). |
981 | * Note: these flags are overkill in the current code since we don't | 960 | * Note: these flags are overkill in the current code since we don't |
982 | * take advantage of DIST_BUFSIZE == LIT_BUFSIZE. | 961 | * take advantage of DIST_BUFSIZE == LIT_BUFSIZE. |
983 | */ | 962 | */ |
984 | 963 | ||
985 | static ulg opt_len; /* bit length of current block with optimal trees */ | 964 | ulg opt_len; /* bit length of current block with optimal trees */ |
986 | static ulg static_len; /* bit length of current block with static trees */ | 965 | ulg static_len; /* bit length of current block with static trees */ |
966 | |||
967 | ulg compressed_len; /* total bit length of compressed file */ | ||
987 | 968 | ||
988 | static ulg compressed_len; /* total bit length of compressed file */ | 969 | //// ush *file_type; /* pointer to UNKNOWN, BINARY or ASCII */ |
970 | //// int *file_method; /* pointer to DEFLATE or STORE */ | ||
971 | |||
972 | }; | ||
973 | |||
974 | static struct G2 *G2ptr; | ||
975 | #define G2 (*G2ptr) | ||
976 | /* { | ||
977 | .l_desc = { | ||
978 | G2.dyn_ltree, G2.static_ltree, extra_lbits, | ||
979 | LITERALS + 1, L_CODES, MAX_BITS, 0 | ||
980 | }, | ||
981 | .d_desc = { | ||
982 | G2.dyn_dtree, G2.static_dtree, extra_dbits, | ||
983 | 0, D_CODES, MAX_BITS, 0 | ||
984 | }, | ||
985 | .bl_desc = { | ||
986 | G2.bl_tree, NULL, extra_blbits, | ||
987 | 0, BL_CODES, MAX_BL_BITS, 0 | ||
988 | } | ||
989 | }; | ||
990 | */ | ||
989 | 991 | ||
990 | static ush *file_type; /* pointer to UNKNOWN, BINARY or ASCII */ | ||
991 | static int *file_method; /* pointer to DEFLATE or STORE */ | ||
992 | 992 | ||
993 | /* =========================================================================== | 993 | /* =========================================================================== |
994 | */ | 994 | */ |
@@ -1013,7 +1013,7 @@ static void compress_block(ct_data * ltree, ct_data * dtree); | |||
1013 | #endif | 1013 | #endif |
1014 | 1014 | ||
1015 | #define D_CODE(dist) \ | 1015 | #define D_CODE(dist) \ |
1016 | ((dist) < 256 ? dist_code[dist] : dist_code[256 + ((dist)>>7)]) | 1016 | ((dist) < 256 ? G2.dist_code[dist] : G2.dist_code[256 + ((dist)>>7)]) |
1017 | /* Mapping from a distance to a distance code. dist is the distance - 1 and | 1017 | /* Mapping from a distance to a distance code. dist is the distance - 1 and |
1018 | * must not have side effects. dist_code[256] and dist_code[257] are never | 1018 | * must not have side effects. dist_code[256] and dist_code[257] are never |
1019 | * used. | 1019 | * used. |
@@ -1030,17 +1030,17 @@ static void init_block(void) | |||
1030 | 1030 | ||
1031 | /* Initialize the trees. */ | 1031 | /* Initialize the trees. */ |
1032 | for (n = 0; n < L_CODES; n++) | 1032 | for (n = 0; n < L_CODES; n++) |
1033 | dyn_ltree[n].Freq = 0; | 1033 | G2.dyn_ltree[n].Freq = 0; |
1034 | for (n = 0; n < D_CODES; n++) | 1034 | for (n = 0; n < D_CODES; n++) |
1035 | dyn_dtree[n].Freq = 0; | 1035 | G2.dyn_dtree[n].Freq = 0; |
1036 | for (n = 0; n < BL_CODES; n++) | 1036 | for (n = 0; n < BL_CODES; n++) |
1037 | bl_tree[n].Freq = 0; | 1037 | G2.bl_tree[n].Freq = 0; |
1038 | 1038 | ||
1039 | dyn_ltree[END_BLOCK].Freq = 1; | 1039 | G2.dyn_ltree[END_BLOCK].Freq = 1; |
1040 | opt_len = static_len = 0; | 1040 | G2.opt_len = G2.static_len = 0; |
1041 | last_lit = last_dist = last_flags = 0; | 1041 | G2.last_lit = G2.last_dist = G2.last_flags = 0; |
1042 | flags = 0; | 1042 | G2.flags = 0; |
1043 | flag_bit = 1; | 1043 | G2.flag_bit = 1; |
1044 | } | 1044 | } |
1045 | 1045 | ||
1046 | 1046 | ||
@@ -1055,30 +1055,30 @@ static void init_block(void) | |||
1055 | * the subtrees have equal frequency. This minimizes the worst case length. */ | 1055 | * the subtrees have equal frequency. This minimizes the worst case length. */ |
1056 | #define SMALLER(tree, n, m) \ | 1056 | #define SMALLER(tree, n, m) \ |
1057 | (tree[n].Freq < tree[m].Freq \ | 1057 | (tree[n].Freq < tree[m].Freq \ |
1058 | || (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) | 1058 | || (tree[n].Freq == tree[m].Freq && G2.depth[n] <= G2.depth[m])) |
1059 | 1059 | ||
1060 | static void pqdownheap(ct_data * tree, int k) | 1060 | static void pqdownheap(ct_data * tree, int k) |
1061 | { | 1061 | { |
1062 | int v = heap[k]; | 1062 | int v = G2.heap[k]; |
1063 | int j = k << 1; /* left son of k */ | 1063 | int j = k << 1; /* left son of k */ |
1064 | 1064 | ||
1065 | while (j <= heap_len) { | 1065 | while (j <= G2.heap_len) { |
1066 | /* Set j to the smallest of the two sons: */ | 1066 | /* Set j to the smallest of the two sons: */ |
1067 | if (j < heap_len && SMALLER(tree, heap[j + 1], heap[j])) | 1067 | if (j < G2.heap_len && SMALLER(tree, G2.heap[j + 1], G2.heap[j])) |
1068 | j++; | 1068 | j++; |
1069 | 1069 | ||
1070 | /* Exit if v is smaller than both sons */ | 1070 | /* Exit if v is smaller than both sons */ |
1071 | if (SMALLER(tree, v, heap[j])) | 1071 | if (SMALLER(tree, v, G2.heap[j])) |
1072 | break; | 1072 | break; |
1073 | 1073 | ||
1074 | /* Exchange v with the smallest son */ | 1074 | /* Exchange v with the smallest son */ |
1075 | heap[k] = heap[j]; | 1075 | G2.heap[k] = G2.heap[j]; |
1076 | k = j; | 1076 | k = j; |
1077 | 1077 | ||
1078 | /* And continue down the tree, setting j to the left son of k */ | 1078 | /* And continue down the tree, setting j to the left son of k */ |
1079 | j <<= 1; | 1079 | j <<= 1; |
1080 | } | 1080 | } |
1081 | heap[k] = v; | 1081 | G2.heap[k] = v; |
1082 | } | 1082 | } |
1083 | 1083 | ||
1084 | 1084 | ||
@@ -1108,15 +1108,15 @@ static void gen_bitlen(tree_desc * desc) | |||
1108 | int overflow = 0; /* number of elements with bit length too large */ | 1108 | int overflow = 0; /* number of elements with bit length too large */ |
1109 | 1109 | ||
1110 | for (bits = 0; bits <= MAX_BITS; bits++) | 1110 | for (bits = 0; bits <= MAX_BITS; bits++) |
1111 | bl_count[bits] = 0; | 1111 | G2.bl_count[bits] = 0; |
1112 | 1112 | ||
1113 | /* In a first pass, compute the optimal bit lengths (which may | 1113 | /* In a first pass, compute the optimal bit lengths (which may |
1114 | * overflow in the case of the bit length tree). | 1114 | * overflow in the case of the bit length tree). |
1115 | */ | 1115 | */ |
1116 | tree[heap[heap_max]].Len = 0; /* root of the heap */ | 1116 | tree[G2.heap[G2.heap_max]].Len = 0; /* root of the heap */ |
1117 | 1117 | ||
1118 | for (h = heap_max + 1; h < HEAP_SIZE; h++) { | 1118 | for (h = G2.heap_max + 1; h < HEAP_SIZE; h++) { |
1119 | n = heap[h]; | 1119 | n = G2.heap[h]; |
1120 | bits = tree[tree[n].Dad].Len + 1; | 1120 | bits = tree[tree[n].Dad].Len + 1; |
1121 | if (bits > max_length) { | 1121 | if (bits > max_length) { |
1122 | bits = max_length; | 1122 | bits = max_length; |
@@ -1128,15 +1128,15 @@ static void gen_bitlen(tree_desc * desc) | |||
1128 | if (n > max_code) | 1128 | if (n > max_code) |
1129 | continue; /* not a leaf node */ | 1129 | continue; /* not a leaf node */ |
1130 | 1130 | ||
1131 | bl_count[bits]++; | 1131 | G2.bl_count[bits]++; |
1132 | xbits = 0; | 1132 | xbits = 0; |
1133 | if (n >= base) | 1133 | if (n >= base) |
1134 | xbits = extra[n - base]; | 1134 | xbits = extra[n - base]; |
1135 | f = tree[n].Freq; | 1135 | f = tree[n].Freq; |
1136 | opt_len += (ulg) f *(bits + xbits); | 1136 | G2.opt_len += (ulg) f *(bits + xbits); |
1137 | 1137 | ||
1138 | if (stree) | 1138 | if (stree) |
1139 | static_len += (ulg) f * (stree[n].Len + xbits); | 1139 | G2.static_len += (ulg) f * (stree[n].Len + xbits); |
1140 | } | 1140 | } |
1141 | if (overflow == 0) | 1141 | if (overflow == 0) |
1142 | return; | 1142 | return; |
@@ -1147,11 +1147,11 @@ static void gen_bitlen(tree_desc * desc) | |||
1147 | /* Find the first bit length which could increase: */ | 1147 | /* Find the first bit length which could increase: */ |
1148 | do { | 1148 | do { |
1149 | bits = max_length - 1; | 1149 | bits = max_length - 1; |
1150 | while (bl_count[bits] == 0) | 1150 | while (G2.bl_count[bits] == 0) |
1151 | bits--; | 1151 | bits--; |
1152 | bl_count[bits]--; /* move one leaf down the tree */ | 1152 | G2.bl_count[bits]--; /* move one leaf down the tree */ |
1153 | bl_count[bits + 1] += 2; /* move one overflow item as its brother */ | 1153 | G2.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ |
1154 | bl_count[max_length]--; | 1154 | G2.bl_count[max_length]--; |
1155 | /* The brother of the overflow item also moves one step up, | 1155 | /* The brother of the overflow item also moves one step up, |
1156 | * but this does not affect bl_count[max_length] | 1156 | * but this does not affect bl_count[max_length] |
1157 | */ | 1157 | */ |
@@ -1164,14 +1164,14 @@ static void gen_bitlen(tree_desc * desc) | |||
1164 | * from 'ar' written by Haruhiko Okumura.) | 1164 | * from 'ar' written by Haruhiko Okumura.) |
1165 | */ | 1165 | */ |
1166 | for (bits = max_length; bits != 0; bits--) { | 1166 | for (bits = max_length; bits != 0; bits--) { |
1167 | n = bl_count[bits]; | 1167 | n = G2.bl_count[bits]; |
1168 | while (n != 0) { | 1168 | while (n != 0) { |
1169 | m = heap[--h]; | 1169 | m = G2.heap[--h]; |
1170 | if (m > max_code) | 1170 | if (m > max_code) |
1171 | continue; | 1171 | continue; |
1172 | if (tree[m].Len != (unsigned) bits) { | 1172 | if (tree[m].Len != (unsigned) bits) { |
1173 | Trace((stderr, "code %d bits %d->%d\n", m, tree[m].Len, bits)); | 1173 | Trace((stderr, "code %d bits %d->%d\n", m, tree[m].Len, bits)); |
1174 | opt_len += ((int32_t) bits - tree[m].Len) * tree[m].Freq; | 1174 | G2.opt_len += ((int32_t) bits - tree[m].Len) * tree[m].Freq; |
1175 | tree[m].Len = bits; | 1175 | tree[m].Len = bits; |
1176 | } | 1176 | } |
1177 | n--; | 1177 | n--; |
@@ -1199,12 +1199,12 @@ static void gen_codes(ct_data * tree, int max_code) | |||
1199 | * without bit reversal. | 1199 | * without bit reversal. |
1200 | */ | 1200 | */ |
1201 | for (bits = 1; bits <= MAX_BITS; bits++) { | 1201 | for (bits = 1; bits <= MAX_BITS; bits++) { |
1202 | next_code[bits] = code = (code + bl_count[bits - 1]) << 1; | 1202 | next_code[bits] = code = (code + G2.bl_count[bits - 1]) << 1; |
1203 | } | 1203 | } |
1204 | /* Check that the bit counts in bl_count are consistent. The last code | 1204 | /* Check that the bit counts in bl_count are consistent. The last code |
1205 | * must be all ones. | 1205 | * must be all ones. |
1206 | */ | 1206 | */ |
1207 | Assert(code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, | 1207 | Assert(code + G2.bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, |
1208 | "inconsistent bit counts"); | 1208 | "inconsistent bit counts"); |
1209 | Tracev((stderr, "\ngen_codes: max_code %d ", max_code)); | 1209 | Tracev((stderr, "\ngen_codes: max_code %d ", max_code)); |
1210 | 1210 | ||
@@ -1216,7 +1216,7 @@ static void gen_codes(ct_data * tree, int max_code) | |||
1216 | /* Now reverse the bits */ | 1216 | /* Now reverse the bits */ |
1217 | tree[n].Code = bi_reverse(next_code[len]++, len); | 1217 | tree[n].Code = bi_reverse(next_code[len]++, len); |
1218 | 1218 | ||
1219 | Tracec(tree != static_ltree, | 1219 | Tracec(tree != G2.static_ltree, |
1220 | (stderr, "\nn %3d %c l %2d c %4x (%x) ", n, | 1220 | (stderr, "\nn %3d %c l %2d c %4x (%x) ", n, |
1221 | (isgraph(n) ? n : ' '), len, tree[n].Code, | 1221 | (isgraph(n) ? n : ' '), len, tree[n].Code, |
1222 | next_code[len] - 1)); | 1222 | next_code[len] - 1)); |
@@ -1240,11 +1240,11 @@ static void gen_codes(ct_data * tree, int max_code) | |||
1240 | /* Index within the heap array of least frequent node in the Huffman tree */ | 1240 | /* Index within the heap array of least frequent node in the Huffman tree */ |
1241 | 1241 | ||
1242 | #define PQREMOVE(tree, top) \ | 1242 | #define PQREMOVE(tree, top) \ |
1243 | { \ | 1243 | do { \ |
1244 | top = heap[SMALLEST]; \ | 1244 | top = G2.heap[SMALLEST]; \ |
1245 | heap[SMALLEST] = heap[heap_len--]; \ | 1245 | G2.heap[SMALLEST] = G2.heap[G2.heap_len--]; \ |
1246 | pqdownheap(tree, SMALLEST); \ | 1246 | pqdownheap(tree, SMALLEST); \ |
1247 | } | 1247 | } while (0) |
1248 | 1248 | ||
1249 | static void build_tree(tree_desc * desc) | 1249 | static void build_tree(tree_desc * desc) |
1250 | { | 1250 | { |
@@ -1259,12 +1259,13 @@ static void build_tree(tree_desc * desc) | |||
1259 | * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. | 1259 | * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. |
1260 | * heap[0] is not used. | 1260 | * heap[0] is not used. |
1261 | */ | 1261 | */ |
1262 | heap_len = 0, heap_max = HEAP_SIZE; | 1262 | G2.heap_len = 0; |
1263 | G2.heap_max = HEAP_SIZE; | ||
1263 | 1264 | ||
1264 | for (n = 0; n < elems; n++) { | 1265 | for (n = 0; n < elems; n++) { |
1265 | if (tree[n].Freq != 0) { | 1266 | if (tree[n].Freq != 0) { |
1266 | heap[++heap_len] = max_code = n; | 1267 | G2.heap[++G2.heap_len] = max_code = n; |
1267 | depth[n] = 0; | 1268 | G2.depth[n] = 0; |
1268 | } else { | 1269 | } else { |
1269 | tree[n].Len = 0; | 1270 | tree[n].Len = 0; |
1270 | } | 1271 | } |
@@ -1275,14 +1276,14 @@ static void build_tree(tree_desc * desc) | |||
1275 | * possible code. So to avoid special checks later on we force at least | 1276 | * possible code. So to avoid special checks later on we force at least |
1276 | * two codes of non zero frequency. | 1277 | * two codes of non zero frequency. |
1277 | */ | 1278 | */ |
1278 | while (heap_len < 2) { | 1279 | while (G2.heap_len < 2) { |
1279 | int new = heap[++heap_len] = (max_code < 2 ? ++max_code : 0); | 1280 | int new = G2.heap[++G2.heap_len] = (max_code < 2 ? ++max_code : 0); |
1280 | 1281 | ||
1281 | tree[new].Freq = 1; | 1282 | tree[new].Freq = 1; |
1282 | depth[new] = 0; | 1283 | G2.depth[new] = 0; |
1283 | opt_len--; | 1284 | G2.opt_len--; |
1284 | if (stree) | 1285 | if (stree) |
1285 | static_len -= stree[new].Len; | 1286 | G2.static_len -= stree[new].Len; |
1286 | /* new is 0 or 1 so it does not have extra bits */ | 1287 | /* new is 0 or 1 so it does not have extra bits */ |
1287 | } | 1288 | } |
1288 | desc->max_code = max_code; | 1289 | desc->max_code = max_code; |
@@ -1290,7 +1291,7 @@ static void build_tree(tree_desc * desc) | |||
1290 | /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, | 1291 | /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, |
1291 | * establish sub-heaps of increasing lengths: | 1292 | * establish sub-heaps of increasing lengths: |
1292 | */ | 1293 | */ |
1293 | for (n = heap_len / 2; n >= 1; n--) | 1294 | for (n = G2.heap_len / 2; n >= 1; n--) |
1294 | pqdownheap(tree, n); | 1295 | pqdownheap(tree, n); |
1295 | 1296 | ||
1296 | /* Construct the Huffman tree by repeatedly combining the least two | 1297 | /* Construct the Huffman tree by repeatedly combining the least two |
@@ -1298,28 +1299,28 @@ static void build_tree(tree_desc * desc) | |||
1298 | */ | 1299 | */ |
1299 | do { | 1300 | do { |
1300 | PQREMOVE(tree, n); /* n = node of least frequency */ | 1301 | PQREMOVE(tree, n); /* n = node of least frequency */ |
1301 | m = heap[SMALLEST]; /* m = node of next least frequency */ | 1302 | m = G2.heap[SMALLEST]; /* m = node of next least frequency */ |
1302 | 1303 | ||
1303 | heap[--heap_max] = n; /* keep the nodes sorted by frequency */ | 1304 | G2.heap[--G2.heap_max] = n; /* keep the nodes sorted by frequency */ |
1304 | heap[--heap_max] = m; | 1305 | G2.heap[--G2.heap_max] = m; |
1305 | 1306 | ||
1306 | /* Create a new node father of n and m */ | 1307 | /* Create a new node father of n and m */ |
1307 | tree[node].Freq = tree[n].Freq + tree[m].Freq; | 1308 | tree[node].Freq = tree[n].Freq + tree[m].Freq; |
1308 | depth[node] = MAX(depth[n], depth[m]) + 1; | 1309 | G2.depth[node] = MAX(G2.depth[n], G2.depth[m]) + 1; |
1309 | tree[n].Dad = tree[m].Dad = (ush) node; | 1310 | tree[n].Dad = tree[m].Dad = (ush) node; |
1310 | #ifdef DUMP_BL_TREE | 1311 | #ifdef DUMP_BL_TREE |
1311 | if (tree == bl_tree) { | 1312 | if (tree == G2.bl_tree) { |
1312 | bb_error_msg("\nnode %d(%d), sons %d(%d) %d(%d)", | 1313 | bb_error_msg("\nnode %d(%d), sons %d(%d) %d(%d)", |
1313 | node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); | 1314 | node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); |
1314 | } | 1315 | } |
1315 | #endif | 1316 | #endif |
1316 | /* and insert the new node in the heap */ | 1317 | /* and insert the new node in the heap */ |
1317 | heap[SMALLEST] = node++; | 1318 | G2.heap[SMALLEST] = node++; |
1318 | pqdownheap(tree, SMALLEST); | 1319 | pqdownheap(tree, SMALLEST); |
1319 | 1320 | ||
1320 | } while (heap_len >= 2); | 1321 | } while (G2.heap_len >= 2); |
1321 | 1322 | ||
1322 | heap[--heap_max] = heap[SMALLEST]; | 1323 | G2.heap[--G2.heap_max] = G2.heap[SMALLEST]; |
1323 | 1324 | ||
1324 | /* At this point, the fields freq and dad are set. We can now | 1325 | /* At this point, the fields freq and dad are set. We can now |
1325 | * generate the bit lengths. | 1326 | * generate the bit lengths. |
@@ -1360,15 +1361,15 @@ static void scan_tree(ct_data * tree, int max_code) | |||
1360 | continue; | 1361 | continue; |
1361 | 1362 | ||
1362 | if (count < min_count) { | 1363 | if (count < min_count) { |
1363 | bl_tree[curlen].Freq += count; | 1364 | G2.bl_tree[curlen].Freq += count; |
1364 | } else if (curlen != 0) { | 1365 | } else if (curlen != 0) { |
1365 | if (curlen != prevlen) | 1366 | if (curlen != prevlen) |
1366 | bl_tree[curlen].Freq++; | 1367 | G2.bl_tree[curlen].Freq++; |
1367 | bl_tree[REP_3_6].Freq++; | 1368 | G2.bl_tree[REP_3_6].Freq++; |
1368 | } else if (count <= 10) { | 1369 | } else if (count <= 10) { |
1369 | bl_tree[REPZ_3_10].Freq++; | 1370 | G2.bl_tree[REPZ_3_10].Freq++; |
1370 | } else { | 1371 | } else { |
1371 | bl_tree[REPZ_11_138].Freq++; | 1372 | G2.bl_tree[REPZ_11_138].Freq++; |
1372 | } | 1373 | } |
1373 | count = 0; | 1374 | count = 0; |
1374 | prevlen = curlen; | 1375 | prevlen = curlen; |
@@ -1411,21 +1412,21 @@ static void send_tree(ct_data * tree, int max_code) | |||
1411 | continue; | 1412 | continue; |
1412 | } else if (count < min_count) { | 1413 | } else if (count < min_count) { |
1413 | do { | 1414 | do { |
1414 | SEND_CODE(curlen, bl_tree); | 1415 | SEND_CODE(curlen, G2.bl_tree); |
1415 | } while (--count); | 1416 | } while (--count); |
1416 | } else if (curlen != 0) { | 1417 | } else if (curlen != 0) { |
1417 | if (curlen != prevlen) { | 1418 | if (curlen != prevlen) { |
1418 | SEND_CODE(curlen, bl_tree); | 1419 | SEND_CODE(curlen, G2.bl_tree); |
1419 | count--; | 1420 | count--; |
1420 | } | 1421 | } |
1421 | Assert(count >= 3 && count <= 6, " 3_6?"); | 1422 | Assert(count >= 3 && count <= 6, " 3_6?"); |
1422 | SEND_CODE(REP_3_6, bl_tree); | 1423 | SEND_CODE(REP_3_6, G2.bl_tree); |
1423 | send_bits(count - 3, 2); | 1424 | send_bits(count - 3, 2); |
1424 | } else if (count <= 10) { | 1425 | } else if (count <= 10) { |
1425 | SEND_CODE(REPZ_3_10, bl_tree); | 1426 | SEND_CODE(REPZ_3_10, G2.bl_tree); |
1426 | send_bits(count - 3, 3); | 1427 | send_bits(count - 3, 3); |
1427 | } else { | 1428 | } else { |
1428 | SEND_CODE(REPZ_11_138, bl_tree); | 1429 | SEND_CODE(REPZ_11_138, G2.bl_tree); |
1429 | send_bits(count - 11, 7); | 1430 | send_bits(count - 11, 7); |
1430 | } | 1431 | } |
1431 | count = 0; | 1432 | count = 0; |
@@ -1453,11 +1454,11 @@ static int build_bl_tree(void) | |||
1453 | int max_blindex; /* index of last bit length code of non zero freq */ | 1454 | int max_blindex; /* index of last bit length code of non zero freq */ |
1454 | 1455 | ||
1455 | /* Determine the bit length frequencies for literal and distance trees */ | 1456 | /* Determine the bit length frequencies for literal and distance trees */ |
1456 | scan_tree((ct_data *) dyn_ltree, l_desc.max_code); | 1457 | scan_tree(G2.dyn_ltree, G2.l_desc.max_code); |
1457 | scan_tree((ct_data *) dyn_dtree, d_desc.max_code); | 1458 | scan_tree(G2.dyn_dtree, G2.d_desc.max_code); |
1458 | 1459 | ||
1459 | /* Build the bit length tree: */ | 1460 | /* Build the bit length tree: */ |
1460 | build_tree((tree_desc *) &bl_desc); | 1461 | build_tree(&G2.bl_desc); |
1461 | /* opt_len now includes the length of the tree representations, except | 1462 | /* opt_len now includes the length of the tree representations, except |
1462 | * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. | 1463 | * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. |
1463 | */ | 1464 | */ |
@@ -1467,12 +1468,12 @@ static int build_bl_tree(void) | |||
1467 | * 3 but the actual value used is 4.) | 1468 | * 3 but the actual value used is 4.) |
1468 | */ | 1469 | */ |
1469 | for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { | 1470 | for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { |
1470 | if (bl_tree[bl_order[max_blindex]].Len != 0) | 1471 | if (G2.bl_tree[bl_order[max_blindex]].Len != 0) |
1471 | break; | 1472 | break; |
1472 | } | 1473 | } |
1473 | /* Update opt_len to include the bit length tree and counts */ | 1474 | /* Update opt_len to include the bit length tree and counts */ |
1474 | opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; | 1475 | G2.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; |
1475 | Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", opt_len, static_len)); | 1476 | Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", G2.opt_len, G2.static_len)); |
1476 | 1477 | ||
1477 | return max_blindex; | 1478 | return max_blindex; |
1478 | } | 1479 | } |
@@ -1496,41 +1497,41 @@ static void send_all_trees(int lcodes, int dcodes, int blcodes) | |||
1496 | send_bits(blcodes - 4, 4); /* not -3 as stated in appnote.txt */ | 1497 | send_bits(blcodes - 4, 4); /* not -3 as stated in appnote.txt */ |
1497 | for (rank = 0; rank < blcodes; rank++) { | 1498 | for (rank = 0; rank < blcodes; rank++) { |
1498 | Tracev((stderr, "\nbl code %2d ", bl_order[rank])); | 1499 | Tracev((stderr, "\nbl code %2d ", bl_order[rank])); |
1499 | send_bits(bl_tree[bl_order[rank]].Len, 3); | 1500 | send_bits(G2.bl_tree[bl_order[rank]].Len, 3); |
1500 | } | 1501 | } |
1501 | Tracev((stderr, "\nbl tree: sent %ld", bits_sent)); | 1502 | Tracev((stderr, "\nbl tree: sent %ld", G1.bits_sent)); |
1502 | 1503 | ||
1503 | send_tree((ct_data *) dyn_ltree, lcodes - 1); /* send the literal tree */ | 1504 | send_tree((ct_data *) G2.dyn_ltree, lcodes - 1); /* send the literal tree */ |
1504 | Tracev((stderr, "\nlit tree: sent %ld", bits_sent)); | 1505 | Tracev((stderr, "\nlit tree: sent %ld", G1.bits_sent)); |
1505 | 1506 | ||
1506 | send_tree((ct_data *) dyn_dtree, dcodes - 1); /* send the distance tree */ | 1507 | send_tree((ct_data *) G2.dyn_dtree, dcodes - 1); /* send the distance tree */ |
1507 | Tracev((stderr, "\ndist tree: sent %ld", bits_sent)); | 1508 | Tracev((stderr, "\ndist tree: sent %ld", G1.bits_sent)); |
1508 | } | 1509 | } |
1509 | 1510 | ||
1510 | 1511 | ||
1511 | /* =========================================================================== | 1512 | /////* =========================================================================== |
1512 | * Set the file type to ASCII or BINARY, using a crude approximation: | 1513 | //// * Set the file type to ASCII or BINARY, using a crude approximation: |
1513 | * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. | 1514 | //// * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. |
1514 | * IN assertion: the fields freq of dyn_ltree are set and the total of all | 1515 | //// * IN assertion: the fields freq of dyn_ltree are set and the total of all |
1515 | * frequencies does not exceed 64K (to fit in an int on 16 bit machines). | 1516 | //// * frequencies does not exceed 64K (to fit in an int on 16 bit machines). |
1516 | */ | 1517 | //// */ |
1517 | static void set_file_type(void) | 1518 | ////static void set_file_type(void) |
1518 | { | 1519 | ////{ |
1519 | int n = 0; | 1520 | //// int n = 0; |
1520 | unsigned ascii_freq = 0; | 1521 | //// unsigned ascii_freq = 0; |
1521 | unsigned bin_freq = 0; | 1522 | //// unsigned bin_freq = 0; |
1522 | 1523 | //// | |
1523 | while (n < 7) | 1524 | //// while (n < 7) |
1524 | bin_freq += dyn_ltree[n++].Freq; | 1525 | //// bin_freq += G2.dyn_ltree[n++].Freq; |
1525 | while (n < 128) | 1526 | //// while (n < 128) |
1526 | ascii_freq += dyn_ltree[n++].Freq; | 1527 | //// ascii_freq += G2.dyn_ltree[n++].Freq; |
1527 | while (n < LITERALS) | 1528 | //// while (n < LITERALS) |
1528 | bin_freq += dyn_ltree[n++].Freq; | 1529 | //// bin_freq += G2.dyn_ltree[n++].Freq; |
1529 | *file_type = (bin_freq > (ascii_freq >> 2)) ? BINARY : ASCII; | 1530 | //// *G2.file_type = (bin_freq > (ascii_freq >> 2)) ? BINARY : ASCII; |
1530 | if (*file_type == BINARY && translate_eol) { | 1531 | //// if (*G2.file_type == BINARY && translate_eol) { |
1531 | bb_error_msg("-l used on binary file"); | 1532 | //// bb_error_msg("-l used on binary file"); |
1532 | } | 1533 | //// } |
1533 | } | 1534 | ////} |
1534 | 1535 | ||
1535 | 1536 | ||
1536 | /* =========================================================================== | 1537 | /* =========================================================================== |
@@ -1539,10 +1540,10 @@ static void set_file_type(void) | |||
1539 | */ | 1540 | */ |
1540 | static int ct_tally(int dist, int lc) | 1541 | static int ct_tally(int dist, int lc) |
1541 | { | 1542 | { |
1542 | l_buf[last_lit++] = lc; | 1543 | G1.l_buf[G2.last_lit++] = lc; |
1543 | if (dist == 0) { | 1544 | if (dist == 0) { |
1544 | /* lc is the unmatched char */ | 1545 | /* lc is the unmatched char */ |
1545 | dyn_ltree[lc].Freq++; | 1546 | G2.dyn_ltree[lc].Freq++; |
1546 | } else { | 1547 | } else { |
1547 | /* Here, lc is the match length - MIN_MATCH */ | 1548 | /* Here, lc is the match length - MIN_MATCH */ |
1548 | dist--; /* dist = match distance - 1 */ | 1549 | dist--; /* dist = match distance - 1 */ |
@@ -1551,38 +1552,39 @@ static int ct_tally(int dist, int lc) | |||
1551 | && (ush) D_CODE(dist) < (ush) D_CODES, "ct_tally: bad match" | 1552 | && (ush) D_CODE(dist) < (ush) D_CODES, "ct_tally: bad match" |
1552 | ); | 1553 | ); |
1553 | 1554 | ||
1554 | dyn_ltree[length_code[lc] + LITERALS + 1].Freq++; | 1555 | G2.dyn_ltree[G2.length_code[lc] + LITERALS + 1].Freq++; |
1555 | dyn_dtree[D_CODE(dist)].Freq++; | 1556 | G2.dyn_dtree[D_CODE(dist)].Freq++; |
1556 | 1557 | ||
1557 | d_buf[last_dist++] = dist; | 1558 | G1.d_buf[G2.last_dist++] = dist; |
1558 | flags |= flag_bit; | 1559 | G2.flags |= G2.flag_bit; |
1559 | } | 1560 | } |
1560 | flag_bit <<= 1; | 1561 | G2.flag_bit <<= 1; |
1561 | 1562 | ||
1562 | /* Output the flags if they fill a byte: */ | 1563 | /* Output the flags if they fill a byte: */ |
1563 | if ((last_lit & 7) == 0) { | 1564 | if ((G2.last_lit & 7) == 0) { |
1564 | flag_buf[last_flags++] = flags; | 1565 | G2.flag_buf[G2.last_flags++] = G2.flags; |
1565 | flags = 0, flag_bit = 1; | 1566 | G2.flags = 0; |
1567 | G2.flag_bit = 1; | ||
1566 | } | 1568 | } |
1567 | /* Try to guess if it is profitable to stop the current block here */ | 1569 | /* Try to guess if it is profitable to stop the current block here */ |
1568 | if ((last_lit & 0xfff) == 0) { | 1570 | if ((G2.last_lit & 0xfff) == 0) { |
1569 | /* Compute an upper bound for the compressed length */ | 1571 | /* Compute an upper bound for the compressed length */ |
1570 | ulg out_length = last_lit * 8L; | 1572 | ulg out_length = G2.last_lit * 8L; |
1571 | ulg in_length = (ulg) strstart - block_start; | 1573 | ulg in_length = (ulg) G1.strstart - G1.block_start; |
1572 | int dcode; | 1574 | int dcode; |
1573 | 1575 | ||
1574 | for (dcode = 0; dcode < D_CODES; dcode++) { | 1576 | for (dcode = 0; dcode < D_CODES; dcode++) { |
1575 | out_length += dyn_dtree[dcode].Freq * (5L + extra_dbits[dcode]); | 1577 | out_length += G2.dyn_dtree[dcode].Freq * (5L + extra_dbits[dcode]); |
1576 | } | 1578 | } |
1577 | out_length >>= 3; | 1579 | out_length >>= 3; |
1578 | Trace((stderr, | 1580 | Trace((stderr, |
1579 | "\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", | 1581 | "\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", |
1580 | last_lit, last_dist, in_length, out_length, | 1582 | G2.last_lit, G2.last_dist, in_length, out_length, |
1581 | 100L - out_length * 100L / in_length)); | 1583 | 100L - out_length * 100L / in_length)); |
1582 | if (last_dist < last_lit / 2 && out_length < in_length / 2) | 1584 | if (G2.last_dist < G2.last_lit / 2 && out_length < in_length / 2) |
1583 | return 1; | 1585 | return 1; |
1584 | } | 1586 | } |
1585 | return (last_lit == LIT_BUFSIZE - 1 || last_dist == DIST_BUFSIZE); | 1587 | return (G2.last_lit == LIT_BUFSIZE - 1 || G2.last_dist == DIST_BUFSIZE); |
1586 | /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K | 1588 | /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K |
1587 | * on 16 bit machines and because stored blocks are restricted to | 1589 | * on 16 bit machines and because stored blocks are restricted to |
1588 | * 64K-1 bytes. | 1590 | * 64K-1 bytes. |
@@ -1603,23 +1605,23 @@ static void compress_block(ct_data * ltree, ct_data * dtree) | |||
1603 | unsigned code; /* the code to send */ | 1605 | unsigned code; /* the code to send */ |
1604 | int extra; /* number of extra bits to send */ | 1606 | int extra; /* number of extra bits to send */ |
1605 | 1607 | ||
1606 | if (last_lit != 0) do { | 1608 | if (G2.last_lit != 0) do { |
1607 | if ((lx & 7) == 0) | 1609 | if ((lx & 7) == 0) |
1608 | flag = flag_buf[fx++]; | 1610 | flag = G2.flag_buf[fx++]; |
1609 | lc = l_buf[lx++]; | 1611 | lc = G1.l_buf[lx++]; |
1610 | if ((flag & 1) == 0) { | 1612 | if ((flag & 1) == 0) { |
1611 | SEND_CODE(lc, ltree); /* send a literal byte */ | 1613 | SEND_CODE(lc, ltree); /* send a literal byte */ |
1612 | Tracecv(isgraph(lc), (stderr, " '%c' ", lc)); | 1614 | Tracecv(isgraph(lc), (stderr, " '%c' ", lc)); |
1613 | } else { | 1615 | } else { |
1614 | /* Here, lc is the match length - MIN_MATCH */ | 1616 | /* Here, lc is the match length - MIN_MATCH */ |
1615 | code = length_code[lc]; | 1617 | code = G2.length_code[lc]; |
1616 | SEND_CODE(code + LITERALS + 1, ltree); /* send the length code */ | 1618 | SEND_CODE(code + LITERALS + 1, ltree); /* send the length code */ |
1617 | extra = extra_lbits[code]; | 1619 | extra = extra_lbits[code]; |
1618 | if (extra != 0) { | 1620 | if (extra != 0) { |
1619 | lc -= base_length[code]; | 1621 | lc -= G2.base_length[code]; |
1620 | send_bits(lc, extra); /* send the extra length bits */ | 1622 | send_bits(lc, extra); /* send the extra length bits */ |
1621 | } | 1623 | } |
1622 | dist = d_buf[dx++]; | 1624 | dist = G1.d_buf[dx++]; |
1623 | /* Here, dist is the match distance - 1 */ | 1625 | /* Here, dist is the match distance - 1 */ |
1624 | code = D_CODE(dist); | 1626 | code = D_CODE(dist); |
1625 | Assert(code < D_CODES, "bad d_code"); | 1627 | Assert(code < D_CODES, "bad d_code"); |
@@ -1627,12 +1629,12 @@ static void compress_block(ct_data * ltree, ct_data * dtree) | |||
1627 | SEND_CODE(code, dtree); /* send the distance code */ | 1629 | SEND_CODE(code, dtree); /* send the distance code */ |
1628 | extra = extra_dbits[code]; | 1630 | extra = extra_dbits[code]; |
1629 | if (extra != 0) { | 1631 | if (extra != 0) { |
1630 | dist -= base_dist[code]; | 1632 | dist -= G2.base_dist[code]; |
1631 | send_bits(dist, extra); /* send the extra distance bits */ | 1633 | send_bits(dist, extra); /* send the extra distance bits */ |
1632 | } | 1634 | } |
1633 | } /* literal or match pair ? */ | 1635 | } /* literal or match pair ? */ |
1634 | flag >>= 1; | 1636 | flag >>= 1; |
1635 | } while (lx < last_lit); | 1637 | } while (lx < G2.last_lit); |
1636 | 1638 | ||
1637 | SEND_CODE(END_BLOCK, ltree); | 1639 | SEND_CODE(END_BLOCK, ltree); |
1638 | } | 1640 | } |
@@ -1648,18 +1650,18 @@ static ulg flush_block(char *buf, ulg stored_len, int eof) | |||
1648 | ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ | 1650 | ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ |
1649 | int max_blindex; /* index of last bit length code of non zero freq */ | 1651 | int max_blindex; /* index of last bit length code of non zero freq */ |
1650 | 1652 | ||
1651 | flag_buf[last_flags] = flags; /* Save the flags for the last 8 items */ | 1653 | G2.flag_buf[G2.last_flags] = G2.flags; /* Save the flags for the last 8 items */ |
1652 | 1654 | ||
1653 | /* Check if the file is ascii or binary */ | 1655 | //// /* Check if the file is ascii or binary */ |
1654 | if (*file_type == (ush) UNKNOWN) | 1656 | //// if (*G2.file_type == (ush) UNKNOWN) |
1655 | set_file_type(); | 1657 | //// set_file_type(); |
1656 | 1658 | ||
1657 | /* Construct the literal and distance trees */ | 1659 | /* Construct the literal and distance trees */ |
1658 | build_tree((tree_desc *) &l_desc); | 1660 | build_tree(&G2.l_desc); |
1659 | Tracev((stderr, "\nlit data: dyn %ld, stat %ld", opt_len, static_len)); | 1661 | Tracev((stderr, "\nlit data: dyn %ld, stat %ld", G2.opt_len, G2.static_len)); |
1660 | 1662 | ||
1661 | build_tree((tree_desc *) &d_desc); | 1663 | build_tree(&G2.d_desc); |
1662 | Tracev((stderr, "\ndist data: dyn %ld, stat %ld", opt_len, static_len)); | 1664 | Tracev((stderr, "\ndist data: dyn %ld, stat %ld", G2.opt_len, G2.static_len)); |
1663 | /* At this point, opt_len and static_len are the total bit lengths of | 1665 | /* At this point, opt_len and static_len are the total bit lengths of |
1664 | * the compressed block data, excluding the tree representations. | 1666 | * the compressed block data, excluding the tree representations. |
1665 | */ | 1667 | */ |
@@ -1670,13 +1672,13 @@ static ulg flush_block(char *buf, ulg stored_len, int eof) | |||
1670 | max_blindex = build_bl_tree(); | 1672 | max_blindex = build_bl_tree(); |
1671 | 1673 | ||
1672 | /* Determine the best encoding. Compute first the block length in bytes */ | 1674 | /* Determine the best encoding. Compute first the block length in bytes */ |
1673 | opt_lenb = (opt_len + 3 + 7) >> 3; | 1675 | opt_lenb = (G2.opt_len + 3 + 7) >> 3; |
1674 | static_lenb = (static_len + 3 + 7) >> 3; | 1676 | static_lenb = (G2.static_len + 3 + 7) >> 3; |
1675 | 1677 | ||
1676 | Trace((stderr, | 1678 | Trace((stderr, |
1677 | "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", | 1679 | "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", |
1678 | opt_lenb, opt_len, static_lenb, static_len, stored_len, | 1680 | opt_lenb, G2.opt_len, static_lenb, G2.static_len, stored_len, |
1679 | last_lit, last_dist)); | 1681 | G2.last_lit, G2.last_dist)); |
1680 | 1682 | ||
1681 | if (static_lenb <= opt_lenb) | 1683 | if (static_lenb <= opt_lenb) |
1682 | opt_lenb = static_lenb; | 1684 | opt_lenb = static_lenb; |
@@ -1685,14 +1687,14 @@ static ulg flush_block(char *buf, ulg stored_len, int eof) | |||
1685 | * and if the zip file can be seeked (to rewrite the local header), | 1687 | * and if the zip file can be seeked (to rewrite the local header), |
1686 | * the whole file is transformed into a stored file: | 1688 | * the whole file is transformed into a stored file: |
1687 | */ | 1689 | */ |
1688 | if (stored_len <= opt_lenb && eof && compressed_len == 0L && seekable()) { | 1690 | if (stored_len <= opt_lenb && eof && G2.compressed_len == 0L && seekable()) { |
1689 | /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ | 1691 | /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ |
1690 | if (buf == NULL) | 1692 | if (buf == NULL) |
1691 | bb_error_msg("block vanished"); | 1693 | bb_error_msg("block vanished"); |
1692 | 1694 | ||
1693 | copy_block(buf, (unsigned) stored_len, 0); /* without header */ | 1695 | copy_block(buf, (unsigned) stored_len, 0); /* without header */ |
1694 | compressed_len = stored_len << 3; | 1696 | G2.compressed_len = stored_len << 3; |
1695 | *file_method = STORED; | 1697 | //// *file_method = STORED; |
1696 | 1698 | ||
1697 | } else if (stored_len + 4 <= opt_lenb && buf != NULL) { | 1699 | } else if (stored_len + 4 <= opt_lenb && buf != NULL) { |
1698 | /* 4: two words for the lengths */ | 1700 | /* 4: two words for the lengths */ |
@@ -1703,33 +1705,33 @@ static ulg flush_block(char *buf, ulg stored_len, int eof) | |||
1703 | * transform a block into a stored block. | 1705 | * transform a block into a stored block. |
1704 | */ | 1706 | */ |
1705 | send_bits((STORED_BLOCK << 1) + eof, 3); /* send block type */ | 1707 | send_bits((STORED_BLOCK << 1) + eof, 3); /* send block type */ |
1706 | compressed_len = (compressed_len + 3 + 7) & ~7L; | 1708 | G2.compressed_len = (G2.compressed_len + 3 + 7) & ~7L; |
1707 | compressed_len += (stored_len + 4) << 3; | 1709 | G2.compressed_len += (stored_len + 4) << 3; |
1708 | 1710 | ||
1709 | copy_block(buf, (unsigned) stored_len, 1); /* with header */ | 1711 | copy_block(buf, (unsigned) stored_len, 1); /* with header */ |
1710 | 1712 | ||
1711 | } else if (static_lenb == opt_lenb) { | 1713 | } else if (static_lenb == opt_lenb) { |
1712 | send_bits((STATIC_TREES << 1) + eof, 3); | 1714 | send_bits((STATIC_TREES << 1) + eof, 3); |
1713 | compress_block((ct_data *) static_ltree, (ct_data *) static_dtree); | 1715 | compress_block((ct_data *) G2.static_ltree, (ct_data *) G2.static_dtree); |
1714 | compressed_len += 3 + static_len; | 1716 | G2.compressed_len += 3 + G2.static_len; |
1715 | } else { | 1717 | } else { |
1716 | send_bits((DYN_TREES << 1) + eof, 3); | 1718 | send_bits((DYN_TREES << 1) + eof, 3); |
1717 | send_all_trees(l_desc.max_code + 1, d_desc.max_code + 1, | 1719 | send_all_trees(G2.l_desc.max_code + 1, G2.d_desc.max_code + 1, |
1718 | max_blindex + 1); | 1720 | max_blindex + 1); |
1719 | compress_block((ct_data *) dyn_ltree, (ct_data *) dyn_dtree); | 1721 | compress_block((ct_data *) G2.dyn_ltree, (ct_data *) G2.dyn_dtree); |
1720 | compressed_len += 3 + opt_len; | 1722 | G2.compressed_len += 3 + G2.opt_len; |
1721 | } | 1723 | } |
1722 | Assert(compressed_len == bits_sent, "bad compressed size"); | 1724 | Assert(G2.compressed_len == G1.bits_sent, "bad compressed size"); |
1723 | init_block(); | 1725 | init_block(); |
1724 | 1726 | ||
1725 | if (eof) { | 1727 | if (eof) { |
1726 | bi_windup(); | 1728 | bi_windup(); |
1727 | compressed_len += 7; /* align on byte boundary */ | 1729 | G2.compressed_len += 7; /* align on byte boundary */ |
1728 | } | 1730 | } |
1729 | Tracev((stderr, "\ncomprlen %lu(%lu) ", compressed_len >> 3, | 1731 | Tracev((stderr, "\ncomprlen %lu(%lu) ", G2.compressed_len >> 3, |
1730 | compressed_len - 7 * eof)); | 1732 | G2.compressed_len - 7 * eof)); |
1731 | 1733 | ||
1732 | return compressed_len >> 3; | 1734 | return G2.compressed_len >> 3; |
1733 | } | 1735 | } |
1734 | 1736 | ||
1735 | 1737 | ||
@@ -1756,10 +1758,10 @@ static ulg flush_block(char *buf, ulg stored_len, int eof) | |||
1756 | * IN assertion: strstart is set to the end of the current match. */ | 1758 | * IN assertion: strstart is set to the end of the current match. */ |
1757 | #define FLUSH_BLOCK(eof) \ | 1759 | #define FLUSH_BLOCK(eof) \ |
1758 | flush_block( \ | 1760 | flush_block( \ |
1759 | block_start >= 0L \ | 1761 | G1.block_start >= 0L \ |
1760 | ? (char*)&window[(unsigned)block_start] \ | 1762 | ? (char*)&G1.window[(unsigned)G1.block_start] \ |
1761 | : (char*)NULL, \ | 1763 | : (char*)NULL, \ |
1762 | (ulg)strstart - block_start, \ | 1764 | (ulg)G1.strstart - G1.block_start, \ |
1763 | (eof) \ | 1765 | (eof) \ |
1764 | ) | 1766 | ) |
1765 | 1767 | ||
@@ -1770,11 +1772,11 @@ static ulg flush_block(char *buf, ulg stored_len, int eof) | |||
1770 | * input characters and the first MIN_MATCH bytes of s are valid | 1772 | * input characters and the first MIN_MATCH bytes of s are valid |
1771 | * (except for the last MIN_MATCH-1 bytes of the input file). */ | 1773 | * (except for the last MIN_MATCH-1 bytes of the input file). */ |
1772 | #define INSERT_STRING(s, match_head) \ | 1774 | #define INSERT_STRING(s, match_head) \ |
1773 | { \ | 1775 | do { \ |
1774 | UPDATE_HASH(ins_h, window[(s) + MIN_MATCH-1]); \ | 1776 | UPDATE_HASH(G1.ins_h, G1.window[(s) + MIN_MATCH-1]); \ |
1775 | prev[(s) & WMASK] = match_head = head[ins_h]; \ | 1777 | G1.prev[(s) & WMASK] = match_head = head[G1.ins_h]; \ |
1776 | head[ins_h] = (s); \ | 1778 | head[G1.ins_h] = (s); \ |
1777 | } | 1779 | } while (0) |
1778 | 1780 | ||
1779 | static ulg deflate(void) | 1781 | static ulg deflate(void) |
1780 | { | 1782 | { |
@@ -1785,19 +1787,20 @@ static ulg deflate(void) | |||
1785 | unsigned match_length = MIN_MATCH - 1; /* length of best match */ | 1787 | unsigned match_length = MIN_MATCH - 1; /* length of best match */ |
1786 | 1788 | ||
1787 | /* Process the input block. */ | 1789 | /* Process the input block. */ |
1788 | while (lookahead != 0) { | 1790 | while (G1.lookahead != 0) { |
1789 | /* Insert the string window[strstart .. strstart+2] in the | 1791 | /* Insert the string window[strstart .. strstart+2] in the |
1790 | * dictionary, and set hash_head to the head of the hash chain: | 1792 | * dictionary, and set hash_head to the head of the hash chain: |
1791 | */ | 1793 | */ |
1792 | INSERT_STRING(strstart, hash_head); | 1794 | INSERT_STRING(G1.strstart, hash_head); |
1793 | 1795 | ||
1794 | /* Find the longest match, discarding those <= prev_length. | 1796 | /* Find the longest match, discarding those <= prev_length. |
1795 | */ | 1797 | */ |
1796 | prev_length = match_length, prev_match = match_start; | 1798 | G1.prev_length = match_length; |
1799 | prev_match = G1.match_start; | ||
1797 | match_length = MIN_MATCH - 1; | 1800 | match_length = MIN_MATCH - 1; |
1798 | 1801 | ||
1799 | if (hash_head != 0 && prev_length < max_lazy_match | 1802 | if (hash_head != 0 && G1.prev_length < max_lazy_match |
1800 | && strstart - hash_head <= MAX_DIST | 1803 | && G1.strstart - hash_head <= MAX_DIST |
1801 | ) { | 1804 | ) { |
1802 | /* To simplify the code, we prevent matches with the string | 1805 | /* To simplify the code, we prevent matches with the string |
1803 | * of window index 0 (in particular we have to avoid a match | 1806 | * of window index 0 (in particular we have to avoid a match |
@@ -1805,12 +1808,12 @@ static ulg deflate(void) | |||
1805 | */ | 1808 | */ |
1806 | match_length = longest_match(hash_head); | 1809 | match_length = longest_match(hash_head); |
1807 | /* longest_match() sets match_start */ | 1810 | /* longest_match() sets match_start */ |
1808 | if (match_length > lookahead) | 1811 | if (match_length > G1.lookahead) |
1809 | match_length = lookahead; | 1812 | match_length = G1.lookahead; |
1810 | 1813 | ||
1811 | /* Ignore a length 3 match if it is too distant: */ | 1814 | /* Ignore a length 3 match if it is too distant: */ |
1812 | if (match_length == MIN_MATCH && strstart - match_start > TOO_FAR) { | 1815 | if (match_length == MIN_MATCH && G1.strstart - G1.match_start > TOO_FAR) { |
1813 | /* If prev_match is also MIN_MATCH, match_start is garbage | 1816 | /* If prev_match is also MIN_MATCH, G1.match_start is garbage |
1814 | * but we will ignore the current match anyway. | 1817 | * but we will ignore the current match anyway. |
1815 | */ | 1818 | */ |
1816 | match_length--; | 1819 | match_length--; |
@@ -1819,63 +1822,63 @@ static ulg deflate(void) | |||
1819 | /* If there was a match at the previous step and the current | 1822 | /* If there was a match at the previous step and the current |
1820 | * match is not better, output the previous match: | 1823 | * match is not better, output the previous match: |
1821 | */ | 1824 | */ |
1822 | if (prev_length >= MIN_MATCH && match_length <= prev_length) { | 1825 | if (G1.prev_length >= MIN_MATCH && match_length <= G1.prev_length) { |
1823 | check_match(strstart - 1, prev_match, prev_length); | 1826 | check_match(G1.strstart - 1, prev_match, G1.prev_length); |
1824 | flush = ct_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); | 1827 | flush = ct_tally(G1.strstart - 1 - prev_match, G1.prev_length - MIN_MATCH); |
1825 | 1828 | ||
1826 | /* Insert in hash table all strings up to the end of the match. | 1829 | /* Insert in hash table all strings up to the end of the match. |
1827 | * strstart-1 and strstart are already inserted. | 1830 | * strstart-1 and strstart are already inserted. |
1828 | */ | 1831 | */ |
1829 | lookahead -= prev_length - 1; | 1832 | G1.lookahead -= G1.prev_length - 1; |
1830 | prev_length -= 2; | 1833 | G1.prev_length -= 2; |
1831 | do { | 1834 | do { |
1832 | strstart++; | 1835 | G1.strstart++; |
1833 | INSERT_STRING(strstart, hash_head); | 1836 | INSERT_STRING(G1.strstart, hash_head); |
1834 | /* strstart never exceeds WSIZE-MAX_MATCH, so there are | 1837 | /* strstart never exceeds WSIZE-MAX_MATCH, so there are |
1835 | * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH | 1838 | * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH |
1836 | * these bytes are garbage, but it does not matter since the | 1839 | * these bytes are garbage, but it does not matter since the |
1837 | * next lookahead bytes will always be emitted as literals. | 1840 | * next lookahead bytes will always be emitted as literals. |
1838 | */ | 1841 | */ |
1839 | } while (--prev_length != 0); | 1842 | } while (--G1.prev_length != 0); |
1840 | match_available = 0; | 1843 | match_available = 0; |
1841 | match_length = MIN_MATCH - 1; | 1844 | match_length = MIN_MATCH - 1; |
1842 | strstart++; | 1845 | G1.strstart++; |
1843 | if (flush) { | 1846 | if (flush) { |
1844 | FLUSH_BLOCK(0); | 1847 | FLUSH_BLOCK(0); |
1845 | block_start = strstart; | 1848 | G1.block_start = G1.strstart; |
1846 | } | 1849 | } |
1847 | } else if (match_available) { | 1850 | } else if (match_available) { |
1848 | /* If there was no match at the previous position, output a | 1851 | /* If there was no match at the previous position, output a |
1849 | * single literal. If there was a match but the current match | 1852 | * single literal. If there was a match but the current match |
1850 | * is longer, truncate the previous match to a single literal. | 1853 | * is longer, truncate the previous match to a single literal. |
1851 | */ | 1854 | */ |
1852 | Tracevv((stderr, "%c", window[strstart - 1])); | 1855 | Tracevv((stderr, "%c", G1.window[G1.strstart - 1])); |
1853 | if (ct_tally(0, window[strstart - 1])) { | 1856 | if (ct_tally(0, G1.window[G1.strstart - 1])) { |
1854 | FLUSH_BLOCK(0); | 1857 | FLUSH_BLOCK(0); |
1855 | block_start = strstart; | 1858 | G1.block_start = G1.strstart; |
1856 | } | 1859 | } |
1857 | strstart++; | 1860 | G1.strstart++; |
1858 | lookahead--; | 1861 | G1.lookahead--; |
1859 | } else { | 1862 | } else { |
1860 | /* There is no previous match to compare with, wait for | 1863 | /* There is no previous match to compare with, wait for |
1861 | * the next step to decide. | 1864 | * the next step to decide. |
1862 | */ | 1865 | */ |
1863 | match_available = 1; | 1866 | match_available = 1; |
1864 | strstart++; | 1867 | G1.strstart++; |
1865 | lookahead--; | 1868 | G1.lookahead--; |
1866 | } | 1869 | } |
1867 | Assert(strstart <= isize && lookahead <= isize, "a bit too far"); | 1870 | Assert(G1.strstart <= G1.isize && lookahead <= G1.isize, "a bit too far"); |
1868 | 1871 | ||
1869 | /* Make sure that we always have enough lookahead, except | 1872 | /* Make sure that we always have enough lookahead, except |
1870 | * at the end of the input file. We need MAX_MATCH bytes | 1873 | * at the end of the input file. We need MAX_MATCH bytes |
1871 | * for the next match, plus MIN_MATCH bytes to insert the | 1874 | * for the next match, plus MIN_MATCH bytes to insert the |
1872 | * string following the next match. | 1875 | * string following the next match. |
1873 | */ | 1876 | */ |
1874 | while (lookahead < MIN_LOOKAHEAD && !eofile) | 1877 | while (G1.lookahead < MIN_LOOKAHEAD && !G1.eofile) |
1875 | fill_window(); | 1878 | fill_window(); |
1876 | } | 1879 | } |
1877 | if (match_available) | 1880 | if (match_available) |
1878 | ct_tally(0, window[strstart - 1]); | 1881 | ct_tally(0, G1.window[G1.strstart - 1]); |
1879 | 1882 | ||
1880 | return FLUSH_BLOCK(1); /* eof */ | 1883 | return FLUSH_BLOCK(1); /* eof */ |
1881 | } | 1884 | } |
@@ -1884,13 +1887,12 @@ static ulg deflate(void) | |||
1884 | /* =========================================================================== | 1887 | /* =========================================================================== |
1885 | * Initialize the bit string routines. | 1888 | * Initialize the bit string routines. |
1886 | */ | 1889 | */ |
1887 | static void bi_init(void) //// int zipfile) | 1890 | static void bi_init(void) |
1888 | { | 1891 | { |
1889 | //// zfile = zipfile; | 1892 | G1.bi_buf = 0; |
1890 | bi_buf = 0; | 1893 | G1.bi_valid = 0; |
1891 | bi_valid = 0; | ||
1892 | #ifdef DEBUG | 1894 | #ifdef DEBUG |
1893 | bits_sent = 0L; | 1895 | G1.bits_sent = 0L; |
1894 | #endif | 1896 | #endif |
1895 | } | 1897 | } |
1896 | 1898 | ||
@@ -1910,27 +1912,27 @@ static void lm_init(ush * flagsp) | |||
1910 | *flagsp |= 2; /* FAST 4, SLOW 2 */ | 1912 | *flagsp |= 2; /* FAST 4, SLOW 2 */ |
1911 | /* ??? reduce max_chain_length for binary files */ | 1913 | /* ??? reduce max_chain_length for binary files */ |
1912 | 1914 | ||
1913 | strstart = 0; | 1915 | G1.strstart = 0; |
1914 | block_start = 0L; | 1916 | G1.block_start = 0L; |
1915 | 1917 | ||
1916 | lookahead = file_read(window, | 1918 | G1.lookahead = file_read(G1.window, |
1917 | sizeof(int) <= 2 ? (unsigned) WSIZE : 2 * WSIZE); | 1919 | sizeof(int) <= 2 ? (unsigned) WSIZE : 2 * WSIZE); |
1918 | 1920 | ||
1919 | if (lookahead == 0 || lookahead == (unsigned) -1) { | 1921 | if (G1.lookahead == 0 || G1.lookahead == (unsigned) -1) { |
1920 | eofile = 1; | 1922 | G1.eofile = 1; |
1921 | lookahead = 0; | 1923 | G1.lookahead = 0; |
1922 | return; | 1924 | return; |
1923 | } | 1925 | } |
1924 | eofile = 0; | 1926 | G1.eofile = 0; |
1925 | /* Make sure that we always have enough lookahead. This is important | 1927 | /* Make sure that we always have enough lookahead. This is important |
1926 | * if input comes from a device such as a tty. | 1928 | * if input comes from a device such as a tty. |
1927 | */ | 1929 | */ |
1928 | while (lookahead < MIN_LOOKAHEAD && !eofile) | 1930 | while (G1.lookahead < MIN_LOOKAHEAD && !G1.eofile) |
1929 | fill_window(); | 1931 | fill_window(); |
1930 | 1932 | ||
1931 | ins_h = 0; | 1933 | G1.ins_h = 0; |
1932 | for (j = 0; j < MIN_MATCH - 1; j++) | 1934 | for (j = 0; j < MIN_MATCH - 1; j++) |
1933 | UPDATE_HASH(ins_h, window[j]); | 1935 | UPDATE_HASH(G1.ins_h, G1.window[j]); |
1934 | /* If lookahead < MIN_MATCH, ins_h is garbage, but this is | 1936 | /* If lookahead < MIN_MATCH, ins_h is garbage, but this is |
1935 | * not important since only literal bytes will be emitted. | 1937 | * not important since only literal bytes will be emitted. |
1936 | */ | 1938 | */ |
@@ -1943,28 +1945,28 @@ static void lm_init(ush * flagsp) | |||
1943 | * (DEFLATE/STORE). | 1945 | * (DEFLATE/STORE). |
1944 | * One callsite in zip() | 1946 | * One callsite in zip() |
1945 | */ | 1947 | */ |
1946 | static void ct_init(ush * attr, int *methodp) | 1948 | static void ct_init(void) ////ush * attr, int *methodp) |
1947 | { | 1949 | { |
1948 | int n; /* iterates over tree elements */ | 1950 | int n; /* iterates over tree elements */ |
1949 | int length; /* length value */ | 1951 | int length; /* length value */ |
1950 | int code; /* code value */ | 1952 | int code; /* code value */ |
1951 | int dist; /* distance index */ | 1953 | int dist; /* distance index */ |
1952 | 1954 | ||
1953 | file_type = attr; | 1955 | //// file_type = attr; |
1954 | file_method = methodp; | 1956 | //// file_method = methodp; |
1955 | compressed_len = 0L; | 1957 | G2.compressed_len = 0L; |
1956 | 1958 | ||
1957 | #ifdef NOT_NEEDED | 1959 | #ifdef NOT_NEEDED |
1958 | if (static_dtree[0].Len != 0) | 1960 | if (G2.static_dtree[0].Len != 0) |
1959 | return; /* ct_init already called */ | 1961 | return; /* ct_init already called */ |
1960 | #endif | 1962 | #endif |
1961 | 1963 | ||
1962 | /* Initialize the mapping length (0..255) -> length code (0..28) */ | 1964 | /* Initialize the mapping length (0..255) -> length code (0..28) */ |
1963 | length = 0; | 1965 | length = 0; |
1964 | for (code = 0; code < LENGTH_CODES - 1; code++) { | 1966 | for (code = 0; code < LENGTH_CODES - 1; code++) { |
1965 | base_length[code] = length; | 1967 | G2.base_length[code] = length; |
1966 | for (n = 0; n < (1 << extra_lbits[code]); n++) { | 1968 | for (n = 0; n < (1 << extra_lbits[code]); n++) { |
1967 | length_code[length++] = code; | 1969 | G2.length_code[length++] = code; |
1968 | } | 1970 | } |
1969 | } | 1971 | } |
1970 | Assert(length == 256, "ct_init: length != 256"); | 1972 | Assert(length == 256, "ct_init: length != 256"); |
@@ -1972,22 +1974,22 @@ static void ct_init(ush * attr, int *methodp) | |||
1972 | * in two different ways: code 284 + 5 bits or code 285, so we | 1974 | * in two different ways: code 284 + 5 bits or code 285, so we |
1973 | * overwrite length_code[255] to use the best encoding: | 1975 | * overwrite length_code[255] to use the best encoding: |
1974 | */ | 1976 | */ |
1975 | length_code[length - 1] = code; | 1977 | G2.length_code[length - 1] = code; |
1976 | 1978 | ||
1977 | /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ | 1979 | /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ |
1978 | dist = 0; | 1980 | dist = 0; |
1979 | for (code = 0; code < 16; code++) { | 1981 | for (code = 0; code < 16; code++) { |
1980 | base_dist[code] = dist; | 1982 | G2.base_dist[code] = dist; |
1981 | for (n = 0; n < (1 << extra_dbits[code]); n++) { | 1983 | for (n = 0; n < (1 << extra_dbits[code]); n++) { |
1982 | dist_code[dist++] = code; | 1984 | G2.dist_code[dist++] = code; |
1983 | } | 1985 | } |
1984 | } | 1986 | } |
1985 | Assert(dist == 256, "ct_init: dist != 256"); | 1987 | Assert(dist == 256, "ct_init: dist != 256"); |
1986 | dist >>= 7; /* from now on, all distances are divided by 128 */ | 1988 | dist >>= 7; /* from now on, all distances are divided by 128 */ |
1987 | for (; code < D_CODES; code++) { | 1989 | for (; code < D_CODES; code++) { |
1988 | base_dist[code] = dist << 7; | 1990 | G2.base_dist[code] = dist << 7; |
1989 | for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { | 1991 | for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { |
1990 | dist_code[256 + dist++] = code; | 1992 | G2.dist_code[256 + dist++] = code; |
1991 | } | 1993 | } |
1992 | } | 1994 | } |
1993 | Assert(dist == 256, "ct_init: 256+dist != 512"); | 1995 | Assert(dist == 256, "ct_init: 256+dist != 512"); |
@@ -1995,35 +1997,35 @@ static void ct_init(ush * attr, int *methodp) | |||
1995 | /* Construct the codes of the static literal tree */ | 1997 | /* Construct the codes of the static literal tree */ |
1996 | /* already zeroed - it's in bss | 1998 | /* already zeroed - it's in bss |
1997 | for (n = 0; n <= MAX_BITS; n++) | 1999 | for (n = 0; n <= MAX_BITS; n++) |
1998 | bl_count[n] = 0; */ | 2000 | G2.bl_count[n] = 0; */ |
1999 | 2001 | ||
2000 | n = 0; | 2002 | n = 0; |
2001 | while (n <= 143) { | 2003 | while (n <= 143) { |
2002 | static_ltree[n++].Len = 8; | 2004 | G2.static_ltree[n++].Len = 8; |
2003 | bl_count[8]++; | 2005 | G2.bl_count[8]++; |
2004 | } | 2006 | } |
2005 | while (n <= 255) { | 2007 | while (n <= 255) { |
2006 | static_ltree[n++].Len = 9; | 2008 | G2.static_ltree[n++].Len = 9; |
2007 | bl_count[9]++; | 2009 | G2.bl_count[9]++; |
2008 | } | 2010 | } |
2009 | while (n <= 279) { | 2011 | while (n <= 279) { |
2010 | static_ltree[n++].Len = 7; | 2012 | G2.static_ltree[n++].Len = 7; |
2011 | bl_count[7]++; | 2013 | G2.bl_count[7]++; |
2012 | } | 2014 | } |
2013 | while (n <= 287) { | 2015 | while (n <= 287) { |
2014 | static_ltree[n++].Len = 8; | 2016 | G2.static_ltree[n++].Len = 8; |
2015 | bl_count[8]++; | 2017 | G2.bl_count[8]++; |
2016 | } | 2018 | } |
2017 | /* Codes 286 and 287 do not exist, but we must include them in the | 2019 | /* Codes 286 and 287 do not exist, but we must include them in the |
2018 | * tree construction to get a canonical Huffman tree (longest code | 2020 | * tree construction to get a canonical Huffman tree (longest code |
2019 | * all ones) | 2021 | * all ones) |
2020 | */ | 2022 | */ |
2021 | gen_codes((ct_data *) static_ltree, L_CODES + 1); | 2023 | gen_codes((ct_data *) G2.static_ltree, L_CODES + 1); |
2022 | 2024 | ||
2023 | /* The static distance tree is trivial: */ | 2025 | /* The static distance tree is trivial: */ |
2024 | for (n = 0; n < D_CODES; n++) { | 2026 | for (n = 0; n < D_CODES; n++) { |
2025 | static_dtree[n].Len = 5; | 2027 | G2.static_dtree[n].Len = 5; |
2026 | static_dtree[n].Code = bi_reverse(n, 5); | 2028 | G2.static_dtree[n].Code = bi_reverse(n, 5); |
2027 | } | 2029 | } |
2028 | 2030 | ||
2029 | /* Initialize the first block of the first file: */ | 2031 | /* Initialize the first block of the first file: */ |
@@ -2039,32 +2041,33 @@ static void ct_init(ush * attr, int *methodp) | |||
2039 | 2041 | ||
2040 | /* put_header_byte is used for the compressed output | 2042 | /* put_header_byte is used for the compressed output |
2041 | * - for the initial 4 bytes that can't overflow the buffer. */ | 2043 | * - for the initial 4 bytes that can't overflow the buffer. */ |
2042 | #define put_header_byte(c) outbuf[outcnt++] = (c) | 2044 | #define put_header_byte(c) G1.outbuf[G1.outcnt++] = (c) |
2043 | 2045 | ||
2044 | static void zip(int in, int out) | 2046 | static void zip(int in, int out) |
2045 | { | 2047 | { |
2046 | uch my_flags = 0; /* general purpose bit flags */ | 2048 | uch my_flags = 0; /* general purpose bit flags */ |
2047 | ush attr = 0; /* ascii/binary flag */ | 2049 | //// ush attr = 0; /* ascii/binary flag */ |
2048 | ush deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */ | 2050 | ush deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */ |
2051 | //// int method = DEFLATED; /* compression method */ | ||
2049 | 2052 | ||
2050 | ifd = in; | 2053 | G1.ifd = in; |
2051 | ofd = out; | 2054 | G1.ofd = out; |
2052 | outcnt = 0; | 2055 | G1.outcnt = 0; |
2053 | 2056 | ||
2054 | /* Write the header to the gzip file. See algorithm.doc for the format */ | 2057 | /* Write the header to the gzip file. See algorithm.doc for the format */ |
2055 | 2058 | ||
2056 | method = DEFLATED; | ||
2057 | put_header_byte(0x1f); /* magic header for gzip files, 1F 8B */ | 2059 | put_header_byte(0x1f); /* magic header for gzip files, 1F 8B */ |
2058 | put_header_byte(0x8b); | 2060 | put_header_byte(0x8b); |
2059 | put_header_byte(DEFLATED); /* compression method */ | 2061 | ////put_header_byte(DEFLATED); /* compression method */ |
2062 | put_header_byte(8); /* compression method */ | ||
2060 | put_header_byte(my_flags); /* general flags */ | 2063 | put_header_byte(my_flags); /* general flags */ |
2061 | put_32bit(time_stamp); | 2064 | put_32bit(G1.time_stamp); |
2062 | 2065 | ||
2063 | /* Write deflated file to zip file */ | 2066 | /* Write deflated file to zip file */ |
2064 | crc = ~0; | 2067 | G1.crc = ~0; |
2065 | 2068 | ||
2066 | bi_init(); //// (out); | 2069 | bi_init(); |
2067 | ct_init(&attr, &method); | 2070 | ct_init(); //// &attr, &method); |
2068 | lm_init(&deflate_flags); | 2071 | lm_init(&deflate_flags); |
2069 | 2072 | ||
2070 | put_8bit(deflate_flags); /* extra flags */ | 2073 | put_8bit(deflate_flags); /* extra flags */ |
@@ -2073,8 +2076,8 @@ static void zip(int in, int out) | |||
2073 | deflate(); | 2076 | deflate(); |
2074 | 2077 | ||
2075 | /* Write the crc and uncompressed size */ | 2078 | /* Write the crc and uncompressed size */ |
2076 | put_32bit(~crc); | 2079 | put_32bit(~G1.crc); |
2077 | put_32bit(isize); | 2080 | put_32bit(G1.isize); |
2078 | 2081 | ||
2079 | flush_outbuf(); | 2082 | flush_outbuf(); |
2080 | } | 2083 | } |
@@ -2123,8 +2126,8 @@ int gzip_main(int argc, char **argv) | |||
2123 | } | 2126 | } |
2124 | #endif | 2127 | #endif |
2125 | 2128 | ||
2126 | foreground = signal(SIGINT, SIG_IGN) != SIG_IGN; | 2129 | /* Comment?? */ |
2127 | if (foreground) { | 2130 | if (signal(SIGINT, SIG_IGN) != SIG_IGN) { |
2128 | signal(SIGINT, abort_gzip); | 2131 | signal(SIGINT, abort_gzip); |
2129 | } | 2132 | } |
2130 | #ifdef SIGTERM | 2133 | #ifdef SIGTERM |
@@ -2138,22 +2141,36 @@ int gzip_main(int argc, char **argv) | |||
2138 | } | 2141 | } |
2139 | #endif | 2142 | #endif |
2140 | 2143 | ||
2144 | G2ptr = xzalloc(sizeof(*G2ptr)); | ||
2145 | G2.l_desc = (tree_desc) { | ||
2146 | G2.dyn_ltree, G2.static_ltree, extra_lbits, | ||
2147 | LITERALS + 1, L_CODES, MAX_BITS, 0 | ||
2148 | }; | ||
2149 | G2.d_desc = (tree_desc) { | ||
2150 | G2.dyn_dtree, G2.static_dtree, extra_dbits, | ||
2151 | 0, D_CODES, MAX_BITS, 0 | ||
2152 | }; | ||
2153 | G2.bl_desc = (tree_desc) { | ||
2154 | G2.bl_tree, NULL, extra_blbits, | ||
2155 | 0, BL_CODES, MAX_BL_BITS, 0 | ||
2156 | }; | ||
2157 | |||
2141 | /* Allocate all global buffers (for DYN_ALLOC option) */ | 2158 | /* Allocate all global buffers (for DYN_ALLOC option) */ |
2142 | ALLOC(uch, l_buf, INBUFSIZ); | 2159 | ALLOC(uch, G1.l_buf, INBUFSIZ); |
2143 | ALLOC(uch, outbuf, OUTBUFSIZ); | 2160 | ALLOC(uch, G1.outbuf, OUTBUFSIZ); |
2144 | ALLOC(ush, d_buf, DIST_BUFSIZE); | 2161 | ALLOC(ush, G1.d_buf, DIST_BUFSIZE); |
2145 | ALLOC(uch, window, 2L * WSIZE); | 2162 | ALLOC(uch, G1.window, 2L * WSIZE); |
2146 | ALLOC(ush, prev, 1L << BITS); | 2163 | ALLOC(ush, G1.prev, 1L << BITS); |
2147 | 2164 | ||
2148 | /* Initialise the CRC32 table */ | 2165 | /* Initialise the CRC32 table */ |
2149 | crc_32_tab = crc32_filltable(0); | 2166 | G1.crc_32_tab = crc32_filltable(0); |
2150 | 2167 | ||
2151 | clear_bufs(); | 2168 | clear_bufs(); |
2152 | 2169 | ||
2153 | if (optind == argc) { | 2170 | if (optind == argc) { |
2154 | time_stamp = 0; | 2171 | G1.time_stamp = 0; |
2155 | zip(STDIN_FILENO, STDOUT_FILENO); | 2172 | zip(STDIN_FILENO, STDOUT_FILENO); |
2156 | return exit_code; | 2173 | return 0; //## G1.exit_code; |
2157 | } | 2174 | } |
2158 | 2175 | ||
2159 | for (i = optind; i < argc; i++) { | 2176 | for (i = optind; i < argc; i++) { |
@@ -2161,14 +2178,14 @@ int gzip_main(int argc, char **argv) | |||
2161 | 2178 | ||
2162 | clear_bufs(); | 2179 | clear_bufs(); |
2163 | if (LONE_DASH(argv[i])) { | 2180 | if (LONE_DASH(argv[i])) { |
2164 | time_stamp = 0; | 2181 | G1.time_stamp = 0; |
2165 | inFileNum = STDIN_FILENO; | 2182 | inFileNum = STDIN_FILENO; |
2166 | outFileNum = STDOUT_FILENO; | 2183 | outFileNum = STDOUT_FILENO; |
2167 | } else { | 2184 | } else { |
2168 | inFileNum = xopen(argv[i], O_RDONLY); | 2185 | inFileNum = xopen(argv[i], O_RDONLY); |
2169 | if (fstat(inFileNum, &statBuf) < 0) | 2186 | if (fstat(inFileNum, &statBuf) < 0) |
2170 | bb_perror_msg_and_die("%s", argv[i]); | 2187 | bb_perror_msg_and_die("%s", argv[i]); |
2171 | time_stamp = statBuf.st_ctime; | 2188 | G1.time_stamp = statBuf.st_ctime; |
2172 | 2189 | ||
2173 | if (!(opt & OPT_tostdout)) { | 2190 | if (!(opt & OPT_tostdout)) { |
2174 | path = xasprintf("%s.gz", argv[i]); | 2191 | path = xasprintf("%s.gz", argv[i]); |
@@ -2219,5 +2236,5 @@ int gzip_main(int argc, char **argv) | |||
2219 | free(path); | 2236 | free(path); |
2220 | } | 2237 | } |
2221 | 2238 | ||
2222 | return exit_code; | 2239 | return 0; //##G1.exit_code; |
2223 | } | 2240 | } |