diff options
| author | vda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2007-01-07 19:37:42 +0000 |
|---|---|---|
| committer | vda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2007-01-07 19:37:42 +0000 |
| commit | 90c9339f617c7445265ef9fc888673718161e70b (patch) | |
| tree | 20210fd66571bd6b455a0846b4f303fd9c538754 | |
| parent | b51bedafcde0408e3587c0ce2980ca85e79bc1f7 (diff) | |
| download | busybox-w32-90c9339f617c7445265ef9fc888673718161e70b.tar.gz busybox-w32-90c9339f617c7445265ef9fc888673718161e70b.tar.bz2 busybox-w32-90c9339f617c7445265ef9fc888673718161e70b.zip | |
a ton of gzip changes, split up in compiled and
run-tested pieces. Code was rather messy.
It's not a bug fix, more like code cleanup.
This is the first part.
git-svn-id: svn://busybox.net/trunk/busybox@17183 69ca8d6d-28ef-0310-b511-8ec308f3f277
| -rw-r--r-- | archival/gzip.c | 333 |
1 files changed, 145 insertions, 188 deletions
diff --git a/archival/gzip.c b/archival/gzip.c index b8a448435..c441942f3 100644 --- a/archival/gzip.c +++ b/archival/gzip.c | |||
| @@ -25,45 +25,15 @@ aa: 85.1% -- replaced with aa.gz | |||
| 25 | 25 | ||
| 26 | #define SMALL_MEM | 26 | #define SMALL_MEM |
| 27 | 27 | ||
| 28 | #include <stdlib.h> | 28 | //#include <dirent.h> |
| 29 | #include <stdio.h> | ||
| 30 | #include <string.h> | ||
| 31 | #include <unistd.h> | ||
| 32 | #include <errno.h> | ||
| 33 | #include <sys/types.h> | ||
| 34 | #include <signal.h> | ||
| 35 | #include <utime.h> | ||
| 36 | #include <ctype.h> | ||
| 37 | #include <sys/types.h> | ||
| 38 | #include <unistd.h> | ||
| 39 | #include <dirent.h> | ||
| 40 | #include <fcntl.h> | ||
| 41 | #include <time.h> | ||
| 42 | #include "busybox.h" | 29 | #include "busybox.h" |
| 43 | 30 | ||
| 44 | typedef unsigned char uch; | ||
| 45 | typedef unsigned short ush; | ||
| 46 | typedef unsigned long ulg; | ||
| 47 | |||
| 48 | /* Return codes from gzip */ | ||
| 49 | #define OK 0 | ||
| 50 | #define ERROR 1 | ||
| 51 | #define WARNING 2 | ||
| 52 | |||
| 53 | /* Compression methods (see algorithm.doc) */ | 31 | /* Compression methods (see algorithm.doc) */ |
| 54 | /* Only STORED and DEFLATED are supported by this BusyBox module */ | 32 | /* Only STORED and DEFLATED are supported by this BusyBox module */ |
| 55 | #define STORED 0 | 33 | #define STORED 0 |
| 56 | /* methods 4 to 7 reserved */ | 34 | /* methods 4 to 7 reserved */ |
| 57 | #define DEFLATED 8 | 35 | #define DEFLATED 8 |
| 58 | 36 | ||
| 59 | /* To save memory for 16 bit systems, some arrays are overlaid between | ||
| 60 | * the various modules: | ||
| 61 | * deflate: prev+head window d_buf l_buf outbuf | ||
| 62 | * unlzw: tab_prefix tab_suffix stack inbuf outbuf | ||
| 63 | * For compression, input is done in window[]. For decompression, output | ||
| 64 | * is done in window except for unlzw. | ||
| 65 | */ | ||
| 66 | |||
| 67 | #ifndef INBUFSIZ | 37 | #ifndef INBUFSIZ |
| 68 | # ifdef SMALL_MEM | 38 | # ifdef SMALL_MEM |
| 69 | # define INBUFSIZ 0x2000 /* input buffer size */ | 39 | # define INBUFSIZ 0x2000 /* input buffer size */ |
| @@ -71,6 +41,7 @@ typedef unsigned long ulg; | |||
| 71 | # define INBUFSIZ 0x8000 /* input buffer size */ | 41 | # define INBUFSIZ 0x8000 /* input buffer size */ |
| 72 | # endif | 42 | # endif |
| 73 | #endif | 43 | #endif |
| 44 | |||
| 74 | #define INBUF_EXTRA 64 /* required by unlzw() */ | 45 | #define INBUF_EXTRA 64 /* required by unlzw() */ |
| 75 | 46 | ||
| 76 | #ifndef OUTBUFSIZ | 47 | #ifndef OUTBUFSIZ |
| @@ -90,21 +61,8 @@ typedef unsigned long ulg; | |||
| 90 | # endif | 61 | # endif |
| 91 | #endif | 62 | #endif |
| 92 | 63 | ||
| 93 | # define DECLARE(type, array, size) static type * array | ||
| 94 | # define ALLOC(type, array, size) { \ | ||
| 95 | array = xzalloc((size_t)(((size)+1L)/2) * 2*sizeof(type)); \ | ||
| 96 | } | ||
| 97 | # define FREE(array) {free(array), array=NULL;} | ||
| 98 | |||
| 99 | #define tab_suffix window | ||
| 100 | #define tab_prefix prev /* hash link (see deflate.c) */ | ||
| 101 | #define head (prev+WSIZE) /* hash head (see deflate.c) */ | ||
| 102 | |||
| 103 | static long isize; /* number of input bytes */ | ||
| 104 | |||
| 105 | #define NO_FILE (-1) /* in memory compression */ | 64 | #define NO_FILE (-1) /* in memory compression */ |
| 106 | 65 | ||
| 107 | |||
| 108 | #define PACK_MAGIC "\037\036" /* Magic header for packed files */ | 66 | #define PACK_MAGIC "\037\036" /* Magic header for packed files */ |
| 109 | #define GZIP_MAGIC "\037\213" /* Magic header for gzip files, 1F 8B */ | 67 | #define GZIP_MAGIC "\037\213" /* Magic header for gzip files, 1F 8B */ |
| 110 | #define OLD_GZIP_MAGIC "\037\236" /* Magic header for gzip 0.5 = freeze 1.x */ | 68 | #define OLD_GZIP_MAGIC "\037\236" /* Magic header for gzip 0.5 = freeze 1.x */ |
| @@ -142,37 +100,66 @@ static long isize; /* number of input bytes */ | |||
| 142 | * distances are limited to MAX_DIST instead of WSIZE. | 100 | * distances are limited to MAX_DIST instead of WSIZE. |
| 143 | */ | 101 | */ |
| 144 | 102 | ||
| 145 | /* put_byte is used for the compressed output */ | 103 | #ifndef MAX_PATH_LEN |
| 146 | #define put_byte(c) {outbuf[outcnt++]=(uch)(c); if (outcnt==OUTBUFSIZ)\ | 104 | # define MAX_PATH_LEN 1024 /* max pathname length */ |
| 147 | flush_outbuf();} | 105 | #endif |
| 148 | 106 | ||
| 149 | #define seekable() 0 /* force sequential output */ | 107 | #define seekable() 0 /* force sequential output */ |
| 150 | #define translate_eol 0 /* no option -a yet */ | 108 | #define translate_eol 0 /* no option -a yet */ |
| 151 | 109 | ||
| 152 | /* Diagnostic functions */ | 110 | #ifndef BITS |
| 153 | #ifdef DEBUG | 111 | # define BITS 16 |
| 154 | # define Assert(cond,msg) {if(!(cond)) bb_error_msg(msg);} | 112 | #endif |
| 155 | # define Trace(x) fprintf x | 113 | #define INIT_BITS 9 /* Initial number of bits per code */ |
| 156 | # define Tracev(x) {if (verbose) fprintf x ;} | 114 | |
| 157 | # define Tracevv(x) {if (verbose>1) fprintf x ;} | 115 | #define BIT_MASK 0x1f /* Mask for 'number of compression bits' */ |
| 158 | # define Tracec(c,x) {if (verbose && (c)) fprintf x ;} | 116 | /* Mask 0x20 is reserved to mean a fourth header byte, and 0x40 is free. |
| 159 | # define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} | 117 | * It's a pity that old uncompress does not check bit 0x20. That makes |
| 118 | * extension of the format actually undesirable because old compress | ||
| 119 | * would just crash on the new format instead of giving a meaningful | ||
| 120 | * error message. It does check the number of bits, but it's more | ||
| 121 | * helpful to say "unsupported format, get a new version" than | ||
| 122 | * "can only handle 16 bits". | ||
| 123 | */ | ||
| 124 | |||
| 125 | #ifdef MAX_EXT_CHARS | ||
| 126 | # define MAX_SUFFIX MAX_EXT_CHARS | ||
| 160 | #else | 127 | #else |
| 161 | # define Assert(cond,msg) | 128 | # define MAX_SUFFIX 30 |
| 162 | # define Trace(x) | ||
| 163 | # define Tracev(x) | ||
| 164 | # define Tracevv(x) | ||
| 165 | # define Tracec(c,x) | ||
| 166 | # define Tracecv(c,x) | ||
| 167 | #endif | 129 | #endif |
| 168 | 130 | ||
| 169 | #define WARN(msg) {if (!quiet) fprintf msg ; \ | ||
| 170 | if (exit_code == OK) exit_code = WARNING;} | ||
| 171 | 131 | ||
| 172 | #ifndef MAX_PATH_LEN | 132 | #define DECLARE(type, array, size)\ |
| 173 | # define MAX_PATH_LEN 1024 /* max pathname length */ | 133 | static type * array |
| 134 | #define ALLOC(type, array, size) { \ | ||
| 135 | array = xzalloc((size_t)(((size)+1L)/2) * 2*sizeof(type)); \ | ||
| 136 | } | ||
| 137 | #define FREE(array) { \ | ||
| 138 | free(array); \ | ||
| 139 | array = NULL; \ | ||
| 140 | } | ||
| 141 | |||
| 142 | /* Diagnostic functions */ | ||
| 143 | #ifdef DEBUG | ||
| 144 | # define Assert(cond,msg) {if(!(cond)) bb_error_msg(msg);} | ||
| 145 | # define Trace(x) fprintf x | ||
| 146 | # define Tracev(x) {if (verbose) fprintf x ;} | ||
| 147 | # define Tracevv(x) {if (verbose>1) fprintf x ;} | ||
| 148 | # define Tracec(c,x) {if (verbose && (c)) fprintf x ;} | ||
| 149 | # define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} | ||
| 150 | #else | ||
| 151 | # define Assert(cond,msg) | ||
| 152 | # define Trace(x) | ||
| 153 | # define Tracev(x) | ||
| 154 | # define Tracevv(x) | ||
| 155 | # define Tracec(c,x) | ||
| 156 | # define Tracecv(c,x) | ||
| 174 | #endif | 157 | #endif |
| 175 | 158 | ||
| 159 | typedef unsigned char uch; | ||
| 160 | typedef unsigned short ush; | ||
| 161 | typedef unsigned long ulg; | ||
| 162 | |||
| 176 | 163 | ||
| 177 | /* from zip.c: */ | 164 | /* from zip.c: */ |
| 178 | static int zip(int in, int out); | 165 | static int zip(int in, int out); |
| @@ -195,66 +182,22 @@ static void bi_windup(void); | |||
| 195 | static void copy_block(char *buf, unsigned len, int header); | 182 | static void copy_block(char *buf, unsigned len, int header); |
| 196 | static int (*read_buf) (char *buf, unsigned size); | 183 | static int (*read_buf) (char *buf, unsigned size); |
| 197 | 184 | ||
| 198 | /* from util.c: */ | ||
| 199 | static void flush_outbuf(void); | 185 | static void flush_outbuf(void); |
| 200 | 186 | ||
| 201 | /* lzw.h -- define the lzw functions. | 187 | /* global buffers */ |
| 202 | * Copyright (C) 1992-1993 Jean-loup Gailly. | ||
| 203 | * This is free software; you can redistribute it and/or modify it under the | ||
| 204 | * terms of the GNU General Public License, see the file COPYING. | ||
| 205 | */ | ||
| 206 | 188 | ||
| 207 | #ifndef BITS | 189 | /* To save memory for 16 bit systems, some arrays are overlaid between |
| 208 | # define BITS 16 | 190 | * the various modules: |
| 209 | #endif | 191 | * deflate: prev+head window d_buf l_buf outbuf |
| 210 | #define INIT_BITS 9 /* Initial number of bits per code */ | 192 | * unlzw: tab_prefix tab_suffix stack inbuf outbuf |
| 211 | 193 | * For compression, input is done in window[]. For decompression, output | |
| 212 | #define BIT_MASK 0x1f /* Mask for 'number of compression bits' */ | 194 | * is done in window except for unlzw. |
| 213 | /* Mask 0x20 is reserved to mean a fourth header byte, and 0x40 is free. | ||
| 214 | * It's a pity that old uncompress does not check bit 0x20. That makes | ||
| 215 | * extension of the format actually undesirable because old compress | ||
| 216 | * would just crash on the new format instead of giving a meaningful | ||
| 217 | * error message. It does check the number of bits, but it's more | ||
| 218 | * helpful to say "unsupported format, get a new version" than | ||
| 219 | * "can only handle 16 bits". | ||
| 220 | */ | ||
| 221 | |||
| 222 | /* tailor.h -- target dependent definitions | ||
| 223 | * Copyright (C) 1992-1993 Jean-loup Gailly. | ||
| 224 | * This is free software; you can redistribute it and/or modify it under the | ||
| 225 | * terms of the GNU General Public License, see the file COPYING. | ||
| 226 | */ | ||
| 227 | |||
| 228 | /* The target dependent definitions should be defined here only. | ||
| 229 | * The target dependent functions should be defined in tailor.c. | ||
| 230 | */ | 195 | */ |
| 231 | 196 | ||
| 232 | 197 | ||
| 233 | /* Common defaults */ | 198 | #define tab_suffix window |
| 234 | 199 | #define tab_prefix prev /* hash link (see deflate.c) */ | |
| 235 | #ifndef OS_CODE | 200 | #define head (prev+WSIZE) /* hash head (see deflate.c) */ |
| 236 | # define OS_CODE 0x03 /* assume Unix */ | ||
| 237 | #endif | ||
| 238 | |||
| 239 | #ifndef PATH_SEP | ||
| 240 | # define PATH_SEP '/' | ||
| 241 | #endif | ||
| 242 | |||
| 243 | #ifndef OPTIONS_VAR | ||
| 244 | # define OPTIONS_VAR "GZIP" | ||
| 245 | #endif | ||
| 246 | |||
| 247 | #ifndef Z_SUFFIX | ||
| 248 | # define Z_SUFFIX ".gz" | ||
| 249 | #endif | ||
| 250 | |||
| 251 | #ifdef MAX_EXT_CHARS | ||
| 252 | # define MAX_SUFFIX MAX_EXT_CHARS | ||
| 253 | #else | ||
| 254 | # define MAX_SUFFIX 30 | ||
| 255 | #endif | ||
| 256 | |||
| 257 | /* global buffers */ | ||
| 258 | 201 | ||
| 259 | DECLARE(uch, inbuf, INBUFSIZ + INBUF_EXTRA); | 202 | DECLARE(uch, inbuf, INBUFSIZ + INBUF_EXTRA); |
| 260 | DECLARE(uch, outbuf, OUTBUFSIZ + OUTBUF_EXTRA); | 203 | DECLARE(uch, outbuf, OUTBUFSIZ + OUTBUF_EXTRA); |
| @@ -262,10 +205,12 @@ DECLARE(ush, d_buf, DIST_BUFSIZE); | |||
| 262 | DECLARE(uch, window, 2L * WSIZE); | 205 | DECLARE(uch, window, 2L * WSIZE); |
| 263 | DECLARE(ush, tab_prefix, 1L << BITS); | 206 | DECLARE(ush, tab_prefix, 1L << BITS); |
| 264 | 207 | ||
| 265 | static int foreground; /* set if program run in foreground */ | 208 | static long isize; /* number of input bytes */ |
| 209 | |||
| 210 | static int foreground; /* set if program run in foreground */ | ||
| 266 | static int method = DEFLATED; /* compression method */ | 211 | static int method = DEFLATED; /* compression method */ |
| 267 | static int exit_code = OK; /* program exit code */ | 212 | static int exit_code; /* program exit code */ |
| 268 | static long time_stamp; /* original time stamp (modification time) */ | 213 | static long time_stamp; /* original time stamp (modification time) */ |
| 269 | static char z_suffix[MAX_SUFFIX + 1]; /* default suffix (can be set with --suffix) */ | 214 | static char z_suffix[MAX_SUFFIX + 1]; /* default suffix (can be set with --suffix) */ |
| 270 | 215 | ||
| 271 | static int ifd; /* input file descriptor */ | 216 | static int ifd; /* input file descriptor */ |
| @@ -277,24 +222,67 @@ static unsigned outcnt; /* bytes in output buffer */ | |||
| 277 | 222 | ||
| 278 | static uint32_t *crc_32_tab; | 223 | static uint32_t *crc_32_tab; |
| 279 | 224 | ||
| 225 | |||
| 226 | /* =========================================================================== | ||
| 227 | * Local data used by the "bit string" routines. | ||
| 228 | */ | ||
| 229 | |||
| 230 | static int zfile; /* output gzip file */ | ||
| 231 | |||
| 232 | static unsigned short bi_buf; | ||
| 233 | |||
| 234 | /* Output buffer. bits are inserted starting at the bottom (least significant | ||
| 235 | * bits). | ||
| 236 | */ | ||
| 237 | |||
| 238 | #undef BUF_SIZE | ||
| 239 | #define BUF_SIZE (8 * sizeof(bi_buf)) | ||
| 240 | /* Number of bits used within bi_buf. (bi_buf might be implemented on | ||
| 241 | * more than 16 bits on some systems.) | ||
| 242 | */ | ||
| 243 | |||
| 244 | static int bi_valid; | ||
| 245 | |||
| 246 | /* Current input function. Set to mem_read for in-memory compression */ | ||
| 247 | |||
| 248 | #ifdef DEBUG | ||
| 249 | static ulg bits_sent; /* bit length of the compressed data */ | ||
| 250 | #endif | ||
| 251 | |||
| 252 | |||
| 253 | /* =========================================================================== | ||
| 254 | */ | ||
| 255 | /* put_8bit is used for the compressed output */ | ||
| 256 | #define put_8bit(c) \ | ||
| 257 | { \ | ||
| 258 | outbuf[outcnt++] = (c); \ | ||
| 259 | if (outcnt == OUTBUFSIZ) flush_outbuf(); \ | ||
| 260 | } | ||
| 261 | |||
| 280 | /* Output a 16 bit value, lsb first */ | 262 | /* Output a 16 bit value, lsb first */ |
| 281 | static void put_short(ush w) | 263 | static void put_16bit(ush w) |
| 282 | { | 264 | { |
| 283 | if (outcnt < OUTBUFSIZ - 2) { | 265 | if (outcnt < OUTBUFSIZ - 2) { |
| 284 | outbuf[outcnt++] = (uch) ((w) & 0xff); | 266 | outbuf[outcnt++] = w; |
| 285 | outbuf[outcnt++] = (uch) ((ush) (w) >> 8); | 267 | outbuf[outcnt++] = w >> 8; |
| 286 | } else { | 268 | } else { |
| 287 | put_byte((uch) ((w) & 0xff)); | 269 | put_8bit(w); |
| 288 | put_byte((uch) ((ush) (w) >> 8)); | 270 | put_8bit(w >> 8); |
| 289 | } | 271 | } |
| 290 | } | 272 | } |
| 291 | 273 | ||
| 292 | /* ======================================================================== | 274 | static void put_32bit(ulg n) |
| 293 | * Signal and error handler. | ||
| 294 | */ | ||
| 295 | static void abort_gzip(int ATTRIBUTE_UNUSED ignored) | ||
| 296 | { | 275 | { |
| 297 | exit(ERROR); | 276 | put_16bit(n); |
| 277 | put_16bit(n >> 16); | ||
| 278 | } | ||
| 279 | |||
| 280 | /* put_header_byte is used for the compressed output | ||
| 281 | * - for the initial 4 bytes that can't overflow the buffer. | ||
| 282 | */ | ||
| 283 | #define put_header_byte(c) \ | ||
| 284 | { \ | ||
| 285 | outbuf[outcnt++] = (c); \ | ||
| 298 | } | 286 | } |
| 299 | 287 | ||
| 300 | /* =========================================================================== | 288 | /* =========================================================================== |
| @@ -318,7 +306,8 @@ static void write_buf(int fd, void *buf, unsigned cnt) | |||
| 318 | unsigned n; | 306 | unsigned n; |
| 319 | 307 | ||
| 320 | while ((n = write(fd, buf, cnt)) != cnt) { | 308 | while ((n = write(fd, buf, cnt)) != cnt) { |
| 321 | if (n == (unsigned) (-1)) bb_error_msg_and_die(bb_msg_write_error); | 309 | if (n == (unsigned) (-1)) |
| 310 | bb_error_msg_and_die(bb_msg_write_error); | ||
| 322 | cnt -= n; | 311 | cnt -= n; |
| 323 | buf = (void *) ((char *) buf + n); | 312 | buf = (void *) ((char *) buf + n); |
| 324 | } | 313 | } |
| @@ -401,31 +390,6 @@ static uint32_t updcrc(uch * s, unsigned n) | |||
| 401 | */ | 390 | */ |
| 402 | 391 | ||
| 403 | /* =========================================================================== | 392 | /* =========================================================================== |
| 404 | * Local data used by the "bit string" routines. | ||
| 405 | */ | ||
| 406 | |||
| 407 | static int zfile; /* output gzip file */ | ||
| 408 | |||
| 409 | static unsigned short bi_buf; | ||
| 410 | |||
| 411 | /* Output buffer. bits are inserted starting at the bottom (least significant | ||
| 412 | * bits). | ||
| 413 | */ | ||
| 414 | |||
| 415 | #define Buf_size (8 * 2*sizeof(char)) | ||
| 416 | /* Number of bits used within bi_buf. (bi_buf might be implemented on | ||
| 417 | * more than 16 bits on some systems.) | ||
| 418 | */ | ||
| 419 | |||
| 420 | static int bi_valid; | ||
| 421 | |||
| 422 | /* Current input function. Set to mem_read for in-memory compression */ | ||
| 423 | |||
| 424 | #ifdef DEBUG | ||
| 425 | ulg bits_sent; /* bit length of the compressed data */ | ||
| 426 | #endif | ||
| 427 | |||
| 428 | /* =========================================================================== | ||
| 429 | * Initialize the bit string routines. | 393 | * Initialize the bit string routines. |
| 430 | */ | 394 | */ |
| 431 | static void bi_init(int zipfile) | 395 | static void bi_init(int zipfile) |
| @@ -460,11 +424,11 @@ static void send_bits(int value, int length) | |||
| 460 | * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) | 424 | * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) |
| 461 | * unused bits in value. | 425 | * unused bits in value. |
| 462 | */ | 426 | */ |
| 463 | if (bi_valid > (int) Buf_size - length) { | 427 | if (bi_valid > (int) BUF_SIZE - length) { |
| 464 | bi_buf |= (value << bi_valid); | 428 | bi_buf |= (value << bi_valid); |
| 465 | put_short(bi_buf); | 429 | put_16bit(bi_buf); |
| 466 | bi_buf = (ush) value >> (Buf_size - bi_valid); | 430 | bi_buf = (ush) value >> (BUF_SIZE - bi_valid); |
| 467 | bi_valid += length - Buf_size; | 431 | bi_valid += length - BUF_SIZE; |
| 468 | } else { | 432 | } else { |
| 469 | bi_buf |= value << bi_valid; | 433 | bi_buf |= value << bi_valid; |
| 470 | bi_valid += length; | 434 | bi_valid += length; |
| @@ -493,9 +457,9 @@ static unsigned bi_reverse(unsigned code, int len) | |||
| 493 | static void bi_windup(void) | 457 | static void bi_windup(void) |
| 494 | { | 458 | { |
| 495 | if (bi_valid > 8) { | 459 | if (bi_valid > 8) { |
| 496 | put_short(bi_buf); | 460 | put_16bit(bi_buf); |
| 497 | } else if (bi_valid > 0) { | 461 | } else if (bi_valid > 0) { |
| 498 | put_byte(bi_buf); | 462 | put_8bit(bi_buf); |
| 499 | } | 463 | } |
| 500 | bi_buf = 0; | 464 | bi_buf = 0; |
| 501 | bi_valid = 0; | 465 | bi_valid = 0; |
| @@ -513,8 +477,8 @@ static void copy_block(char *buf, unsigned len, int header) | |||
| 513 | bi_windup(); /* align on byte boundary */ | 477 | bi_windup(); /* align on byte boundary */ |
| 514 | 478 | ||
| 515 | if (header) { | 479 | if (header) { |
| 516 | put_short((ush) len); | 480 | put_16bit((ush) len); |
| 517 | put_short((ush) ~ len); | 481 | put_16bit((ush) ~ len); |
| 518 | #ifdef DEBUG | 482 | #ifdef DEBUG |
| 519 | bits_sent += 2 * 16; | 483 | bits_sent += 2 * 16; |
| 520 | #endif | 484 | #endif |
| @@ -523,7 +487,7 @@ static void copy_block(char *buf, unsigned len, int header) | |||
| 523 | bits_sent += (ulg) len << 3; | 487 | bits_sent += (ulg) len << 3; |
| 524 | #endif | 488 | #endif |
| 525 | while (len--) { | 489 | while (len--) { |
| 526 | put_byte(*buf++); | 490 | put_8bit(*buf++); |
| 527 | } | 491 | } |
| 528 | } | 492 | } |
| 529 | 493 | ||
| @@ -1039,8 +1003,7 @@ static ulg deflate(void) | |||
| 1039 | 1003 | ||
| 1040 | check_match(strstart - 1, prev_match, prev_length); | 1004 | check_match(strstart - 1, prev_match, prev_length); |
| 1041 | 1005 | ||
| 1042 | flush = | 1006 | flush = ct_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); |
| 1043 | ct_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); | ||
| 1044 | 1007 | ||
| 1045 | /* Insert in hash table all strings up to the end of the match. | 1008 | /* Insert in hash table all strings up to the end of the match. |
| 1046 | * strstart-1 and strstart are already inserted. | 1009 | * strstart-1 and strstart are already inserted. |
| @@ -1122,6 +1085,11 @@ static ulg deflate(void) | |||
| 1122 | typedef struct dirent dir_type; | 1085 | typedef struct dirent dir_type; |
| 1123 | 1086 | ||
| 1124 | /* ======================================================================== */ | 1087 | /* ======================================================================== */ |
| 1088 | static void abort_gzip(int ATTRIBUTE_UNUSED ignored) | ||
| 1089 | { | ||
| 1090 | exit(1); | ||
| 1091 | } | ||
| 1092 | |||
| 1125 | int gzip_main(int argc, char **argv) | 1093 | int gzip_main(int argc, char **argv) |
| 1126 | { | 1094 | { |
| 1127 | enum { | 1095 | enum { |
| @@ -1174,7 +1142,7 @@ int gzip_main(int argc, char **argv) | |||
| 1174 | } | 1142 | } |
| 1175 | #endif | 1143 | #endif |
| 1176 | 1144 | ||
| 1177 | strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix) - 1); | 1145 | strncpy(z_suffix, ".gz", sizeof(z_suffix) - 1); |
| 1178 | 1146 | ||
| 1179 | /* Allocate all global buffers (for DYN_ALLOC option) */ | 1147 | /* Allocate all global buffers (for DYN_ALLOC option) */ |
| 1180 | ALLOC(uch, inbuf, INBUFSIZ + INBUF_EXTRA); | 1148 | ALLOC(uch, inbuf, INBUFSIZ + INBUF_EXTRA); |
| @@ -1244,7 +1212,7 @@ int gzip_main(int argc, char **argv) | |||
| 1244 | close(outFileNum); | 1212 | close(outFileNum); |
| 1245 | 1213 | ||
| 1246 | /* Delete the original file */ | 1214 | /* Delete the original file */ |
| 1247 | if (result == OK) | 1215 | if (result == 0) |
| 1248 | delFileName = argv[i]; | 1216 | delFileName = argv[i]; |
| 1249 | else | 1217 | else |
| 1250 | delFileName = path; | 1218 | delFileName = path; |
| @@ -2375,17 +2343,6 @@ static void set_file_type(void) | |||
| 2375 | 2343 | ||
| 2376 | static uint32_t crc; /* crc on uncompressed file data */ | 2344 | static uint32_t crc; /* crc on uncompressed file data */ |
| 2377 | 2345 | ||
| 2378 | static void put_long(ulg n) | ||
| 2379 | { | ||
| 2380 | put_short((n) & 0xffff); | ||
| 2381 | put_short(((ulg) (n)) >> 16); | ||
| 2382 | } | ||
| 2383 | |||
| 2384 | /* put_header_byte is used for the compressed output | ||
| 2385 | * - for the initial 4 bytes that can't overflow the buffer. | ||
| 2386 | */ | ||
| 2387 | #define put_header_byte(c) {outbuf[outcnt++]=(uch)(c);} | ||
| 2388 | |||
| 2389 | /* =========================================================================== | 2346 | /* =========================================================================== |
| 2390 | * Deflate in to out. | 2347 | * Deflate in to out. |
| 2391 | * IN assertions: the input and output buffers are cleared. | 2348 | * IN assertions: the input and output buffers are cleared. |
| @@ -2409,7 +2366,7 @@ static int zip(int in, int out) | |||
| 2409 | put_header_byte(DEFLATED); /* compression method */ | 2366 | put_header_byte(DEFLATED); /* compression method */ |
| 2410 | 2367 | ||
| 2411 | put_header_byte(my_flags); /* general flags */ | 2368 | put_header_byte(my_flags); /* general flags */ |
| 2412 | put_long(time_stamp); | 2369 | put_32bit(time_stamp); |
| 2413 | 2370 | ||
| 2414 | /* Write deflated file to zip file */ | 2371 | /* Write deflated file to zip file */ |
| 2415 | crc = updcrc(0, 0); | 2372 | crc = updcrc(0, 0); |
| @@ -2418,17 +2375,17 @@ static int zip(int in, int out) | |||
| 2418 | ct_init(&attr, &method); | 2375 | ct_init(&attr, &method); |
| 2419 | lm_init(&deflate_flags); | 2376 | lm_init(&deflate_flags); |
| 2420 | 2377 | ||
| 2421 | put_byte((uch) deflate_flags); /* extra flags */ | 2378 | put_8bit((uch) deflate_flags); /* extra flags */ |
| 2422 | put_byte(OS_CODE); /* OS identifier */ | 2379 | put_8bit(3); /* OS identifier = 3 (Unix) */ |
| 2423 | 2380 | ||
| 2424 | (void) deflate(); | 2381 | (void) deflate(); |
| 2425 | 2382 | ||
| 2426 | /* Write the crc and uncompressed size */ | 2383 | /* Write the crc and uncompressed size */ |
| 2427 | put_long(crc); | 2384 | put_32bit(crc); |
| 2428 | put_long(isize); | 2385 | put_32bit(isize); |
| 2429 | 2386 | ||
| 2430 | flush_outbuf(); | 2387 | flush_outbuf(); |
| 2431 | return OK; | 2388 | return 0; |
| 2432 | } | 2389 | } |
| 2433 | 2390 | ||
| 2434 | 2391 | ||
