gzip cleanup part #2
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 7 Jan 2007 19:38:06 +0000 (19:38 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 7 Jan 2007 19:38:06 +0000 (19:38 -0000)
archival/gzip.c

index c441942f3e56857f4d737066f97ef4c6904a7dad..a16e369783091ce9e05705ff7f7e4f458c102820 100644 (file)
@@ -141,19 +141,19 @@ aa:      85.1% -- replaced with aa.gz
 
 /* Diagnostic functions */
 #ifdef DEBUG
-# define Assert(cond,msg) {if(!(cond)) bb_error_msg(msg);}
-# define Trace(x) fprintf x
-# define Tracev(x) {if (verbose) fprintf x ;}
-# define Tracevv(x) {if (verbose>1) fprintf x ;}
-# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
-# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
+#  define Assert(cond,msg) {if(!(cond)) bb_error_msg(msg);}
+#  define Trace(x) fprintf x
+#  define Tracev(x) {if (verbose) fprintf x ;}
+#  define Tracevv(x) {if (verbose>1) fprintf x ;}
+#  define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
+#  define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
 #else
-# define Assert(cond,msg)
-# define Trace(x)
-# define Tracev(x)
-# define Tracevv(x)
-# define Tracec(c,x)
-# define Tracecv(c,x)
+#  define Assert(cond,msg)
+#  define Trace(x)
+#  define Tracev(x)
+#  define Tracevv(x)
+#  define Tracec(c,x)
+#  define Tracecv(c,x)
 #endif
 
 typedef unsigned char uch;
@@ -163,7 +163,7 @@ typedef unsigned long ulg;
 
        /* from zip.c: */
 static int zip(int in, int out);
-static int file_read(char *buf, unsigned size);
+static unsigned file_read(void *buf, unsigned size);
 
                /* from deflate.c */
 static void lm_init(ush * flags);
@@ -180,7 +180,6 @@ static void send_bits(int value, int length);
 static unsigned bi_reverse(unsigned value, int length);
 static void bi_windup(void);
 static void copy_block(char *buf, unsigned len, int header);
-static int (*read_buf) (char *buf, unsigned size);
 
 static void flush_outbuf(void);
 
@@ -297,22 +296,6 @@ static void clear_bufs(void)
        isize = 0L;
 }
 
-/* ===========================================================================
- * Does the same as write(), but also handles partial pipe writes and checks
- * for error return.
- */
-static void write_buf(int fd, void *buf, unsigned cnt)
-{
-       unsigned n;
-
-       while ((n = write(fd, buf, cnt)) != cnt) {
-               if (n == (unsigned) (-1))
-                       bb_error_msg_and_die(bb_msg_write_error);
-               cnt -= n;
-               buf = (void *) ((char *) buf + n);
-       }
-}
-
 /* ===========================================================================
  * Run a set of bytes through the crc shift register.  If s is a NULL
  * pointer, then initialize the crc shift register contents instead.
@@ -333,62 +316,9 @@ static uint32_t updcrc(uch * s, unsigned n)
                        } while (--n);
        }
        crc = c;
-       return ~c;
+       return c;
 }
 
-/* bits.c -- output variable-length bit strings
- * Copyright (C) 1992-1993 Jean-loup Gailly
- * This is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License, see the file COPYING.
- */
-
-
-/*
- *  PURPOSE
- *
- *      Output variable-length bit strings. Compression can be done
- *      to a file or to memory. (The latter is not supported in this version.)
- *
- *  DISCUSSION
- *
- *      The PKZIP "deflate" file format interprets compressed file data
- *      as a sequence of bits.  Multi-bit strings in the file may cross
- *      byte boundaries without restriction.
- *
- *      The first bit of each byte is the low-order bit.
- *
- *      The routines in this file allow a variable-length bit value to
- *      be output right-to-left (useful for literal values). For
- *      left-to-right output (useful for code strings from the tree routines),
- *      the bits must have been reversed first with bi_reverse().
- *
- *      For in-memory compression, the compressed bit stream goes directly
- *      into the requested output buffer. The input data is read in blocks
- *      by the mem_read() function. The buffer is limited to 64K on 16 bit
- *      machines.
- *
- *  INTERFACE
- *
- *      void bi_init (FILE *zipfile)
- *          Initialize the bit string routines.
- *
- *      void send_bits (int value, int length)
- *          Write out a bit string, taking the source bits right to
- *          left.
- *
- *      int bi_reverse (int value, int length)
- *          Reverse the bits of a bit string, taking the source bits left to
- *          right and emitting them right to left.
- *
- *      void bi_windup (void)
- *          Write out any remaining bits in an incomplete byte.
- *
- *      void copy_block(char *buf, unsigned len, int header)
- *          Copy a stored block to the zip file, storing first the length and
- *          its one's complement if requested.
- *
- */
-
 /* ===========================================================================
  * Initialize the bit string routines.
  */
@@ -400,13 +330,6 @@ static void bi_init(int zipfile)
 #ifdef DEBUG
        bits_sent = 0L;
 #endif
-
-       /* Set the defaults for file compression. They are set by memcompress
-        * for in-memory compression.
-        */
-       if (zfile != NO_FILE) {
-               read_buf = file_read;
-       }
 }
 
 /* ===========================================================================
@@ -418,7 +341,7 @@ static void send_bits(int value, int length)
 #ifdef DEBUG
        Tracev((stderr, " l %2d v %4x ", length, value));
        Assert(length > 0 && length <= 15, "invalid length");
-       bits_sent += (ulg) length;
+       bits_sent += length;
 #endif
        /* If not enough room in bi_buf, use (valid) bits from bi_buf and
         * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
@@ -477,8 +400,8 @@ static void copy_block(char *buf, unsigned len, int header)
        bi_windup();            /* align on byte boundary */
 
        if (header) {
-               put_16bit((ush) len);
-               put_16bit((ush) ~ len);
+               put_16bit(len);
+               put_16bit(~len);
 #ifdef DEBUG
                bits_sent += 2 * 16;
 #endif
@@ -491,61 +414,7 @@ static void copy_block(char *buf, unsigned len, int header)
        }
 }
 
-/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1992-1993 Jean-loup Gailly
- * This is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License, see the file COPYING.
- */
-
-/*
- *  PURPOSE
- *
- *      Identify new text as repetitions of old text within a fixed-
- *      length sliding window trailing behind the new text.
- *
- *  DISCUSSION
- *
- *      The "deflation" process depends on being able to identify portions
- *      of the input text which are identical to earlier input (within a
- *      sliding window trailing behind the input currently being processed).
- *
- *      The most straightforward technique turns out to be the fastest for
- *      most input files: try all possible matches and select the longest.
- *      The key feature of this algorithm is that insertions into the string
- *      dictionary are very simple and thus fast, and deletions are avoided
- *      completely. Insertions are performed at each input character, whereas
- *      string matches are performed only when the previous match ends. So it
- *      is preferable to spend more time in matches to allow very fast string
- *      insertions and avoid deletions. The matching algorithm for small
- *      strings is inspired from that of Rabin & Karp. A brute force approach
- *      is used to find longer strings when a small match has been found.
- *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
- *      (by Leonid Broukhis).
- *         A previous version of this file used a more sophisticated algorithm
- *      (by Fiala and Greene) which is guaranteed to run in linear amortized
- *      time, but has a larger average cost, uses more memory and is patented.
- *      However the F&G algorithm may be faster for some highly redundant
- *      files if the parameter max_chain_length (described below) is too large.
- *
- *  ACKNOWLEDGMENTS
- *
- *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
- *      I found it in 'freeze' written by Leonid Broukhis.
- *      Thanks to many info-zippers for bug reports and testing.
- *
- *  REFERENCES
- *
- *      APPNOTE.TXT documentation file in PKZIP 1.93a distribution.
- *
- *      A description of the Rabin and Karp algorithm is given in the book
- *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
- *
- *      Fiala,E.R., and Greene,D.H.
- *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
- *
- *  INTERFACE
- *
- *      void lm_init (int pack_level, ush *flags)
+/*      void lm_init (int pack_level, ush *flags)
  *          Initialize the "longest match" routines for a new file
  *
  *      ulg deflate (void)
@@ -752,11 +621,12 @@ static void lm_init(ush * flags)
        strstart = 0;
        block_start = 0L;
 
-       lookahead = read_buf((char *) window,
-                                                sizeof(int) <= 2 ? (unsigned) WSIZE : 2 * WSIZE);
+       lookahead = file_read(window,
+                       sizeof(int) <= 2 ? (unsigned) WSIZE : 2 * WSIZE);
 
-       if (lookahead == 0 || lookahead == (unsigned) EOF) {
-               eofile = 1, lookahead = 0;
+       if (lookahead == 0 || lookahead == (unsigned) -1) {
+               eofile = 1;
+               lookahead = 0;
                return;
        }
        eofile = 0;
@@ -935,8 +805,8 @@ static void fill_window(void)
        }
        /* At this point, more >= 2 */
        if (!eofile) {
-               n = read_buf((char *) window + strstart + lookahead, more);
-               if (n == 0 || n == (unsigned) EOF) {
+               n = file_read(window + strstart + lookahead, more);
+               if (n == 0 || n == (unsigned) -1) {
                        eofile = 1;
                } else {
                        lookahead += n;
@@ -977,8 +847,9 @@ static ulg deflate(void)
                prev_length = match_length, prev_match = match_start;
                match_length = MIN_MATCH - 1;
 
-               if (hash_head != NIL && prev_length < max_lazy_match &&
-                       strstart - hash_head <= MAX_DIST) {
+               if (hash_head != 0 && prev_length < max_lazy_match
+                && strstart - hash_head <= MAX_DIST
+               ) {
                        /* To simplify the code, we prevent matches with the string
                         * of window index 0 (in particular we have to avoid a match
                         * of the string with itself at the start of the input file).
@@ -1024,7 +895,6 @@ static ulg deflate(void)
                        strstart++;
                        if (flush)
                                FLUSH_BLOCK(0), block_start = strstart;
-
                } else if (match_available) {
                        /* If there was no match at the previous position, output a
                         * single literal. If there was a match but the current match
@@ -1060,30 +930,6 @@ static ulg deflate(void)
        return FLUSH_BLOCK(1);  /* eof */
 }
 
-/* gzip (GNU zip) -- compress files with zip algorithm and 'compress' interface
- * Copyright (C) 1992-1993 Jean-loup Gailly
- * The unzip code was written and put in the public domain by Mark Adler.
- * Portions of the lzw code are derived from the public domain 'compress'
- * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies,
- * Ken Turkowski, Dave Mack and Peter Jannesen.
- *
- * See the license_msg below and the file COPYING for the software license.
- * See the file algorithm.doc for the compression algorithms and file formats.
- */
-
-/* Compress files with zip algorithm and 'compress' interface.
- * See usage() and help() functions below for all options.
- * Outputs:
- *        file.gz:   compressed file with same mode, owner, and utimes
- *     or stdout with -c option or if stdin used as input.
- * If the output file name had to be truncated, the original name is kept
- * in the compressed file.
- */
-
-/* configuration */
-
-typedef struct dirent dir_type;
-
 /* ======================================================================== */
 static void abort_gzip(int ATTRIBUTE_UNUSED ignored)
 {
@@ -1268,12 +1114,12 @@ int gzip_main(int argc, char **argv)
  *
  *  INTERFACE
  *
- *      void ct_init (ush *attr, int *methodp)
+ *      void ct_init(ush *attr, int *methodp)
  *          Allocate the match buffer, initialize the various tables and save
  *          the location of the internal file attribute (ascii/binary) and
  *          method (DEFLATE/STORE)
  *
- *      void ct_tally (int dist, int lc);
+ *      void ct_tally(int dist, int lc);
  *          Save the match info and tally the frequency counts.
  *
  *      long flush_block (char *buf, ulg stored_len, int eof)
@@ -1433,17 +1279,17 @@ typedef struct tree_desc {
        int max_code;           /* largest code with non zero frequency */
 } tree_desc;
 
-static tree_desc l_desc =
-       { dyn_ltree, static_ltree, extra_lbits, LITERALS + 1, L_CODES,
-       MAX_BITS, 0
+static tree_desc l_desc = {
+       dyn_ltree, static_ltree, extra_lbits,
+       LITERALS + 1, L_CODES, MAX_BITS, 0
 };
 
-static tree_desc d_desc =
-       { dyn_dtree, static_dtree, extra_dbits, 0, D_CODES, MAX_BITS, 0 };
+static tree_desc d_desc = {
+       dyn_dtree, static_dtree, extra_dbits, 0, D_CODES, MAX_BITS, 0
+};
 
-static tree_desc bl_desc =
-       { bl_tree, (ct_data *) 0, extra_blbits, 0, BL_CODES, MAX_BL_BITS,
-       0
+static tree_desc bl_desc = {
+       bl_tree, NULL, extra_blbits, 0, BL_CODES, MAX_BL_BITS,  0
 };
 
 
@@ -1451,8 +1297,9 @@ static ush bl_count[MAX_BITS + 1];
 
 /* number of codes at each bit length for an optimal tree */
 
-static const uch bl_order[BL_CODES]
-= { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
+static const uch bl_order[BL_CODES] = {
+       16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+};
 
 /* The lengths of the bit length codes are sent in order of decreasing
  * probability, to avoid transmitting the lengths for unused bit length codes.
@@ -2334,13 +2181,6 @@ static void set_file_type(void)
        }
 }
 
-/* zip.c -- compress files to the gzip or pkzip format
- * Copyright (C) 1992-1993 Jean-loup Gailly
- * This is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License, see the file COPYING.
- */
-
-
 static uint32_t crc;                   /* crc on uncompressed file data */
 
 /* ===========================================================================
@@ -2369,7 +2209,7 @@ static int zip(int in, int out)
        put_32bit(time_stamp);
 
        /* Write deflated file to zip file */
-       crc = updcrc(0, 0);
+       crc = 0;
 
        bi_init(out);
        ct_init(&attr, &method);
@@ -2388,25 +2228,24 @@ static int zip(int in, int out)
        return 0;
 }
 
-
 /* ===========================================================================
  * Read a new buffer from the current input file, perform end-of-line
  * translation, and update the crc and input file size.
  * IN assertion: size >= 2 (for end-of-line translation)
  */
-static int file_read(char *buf, unsigned size)
+static unsigned file_read(void *buf, unsigned size)
 {
        unsigned len;
 
        Assert(insize == 0, "inbuf not empty");
 
        len = read(ifd, buf, size);
-       if (len == (unsigned) (-1) || len == 0)
-               return (int) len;
+       if (len == (unsigned)(-1) || len == 0)
+               return len;
 
-       crc = updcrc((uch *) buf, len);
-       isize += (ulg) len;
-       return (int) len;
+       crc = ~updcrc((uch *) buf, len);
+       isize += len;
+       return len;
 }
 
 /* ===========================================================================
@@ -2418,6 +2257,7 @@ static void flush_outbuf(void)
        if (outcnt == 0)
                return;
 
-       write_buf(ofd, (char *) outbuf, outcnt);
+       xwrite(ofd, (char *) outbuf, outcnt);
        outcnt = 0;
 }
+