/* util.c -- utility functions for gzip support
- Copyright (C) 1997-1999, 2001-2002, 2006, 2009-2010 Free Software
+ Copyright (C) 1997-1999, 2001-2002, 2006, 2009-2012 Free Software
Foundation, Inc.
Copyright (C) 1992-1993 Jean-loup Gailly
#include <errno.h>
#include "gzip.h"
-#include "crypt.h"
#include <xalloc.h>
#ifndef CHAR_BIT
# define CHAR_BIT 8
#endif
-static int write_buffer OF((int, voidp, unsigned int));
+static int write_buffer (int, voidp, unsigned int);
-extern ulg crc_32_tab[]; /* crc table, defined below */
+static const ulg crc_32_tab[]; /* crc table, defined below */
/* ===========================================================================
* Copy input to output unchanged: zcat == cat with --force.
- * IN assertion: insize bytes have already been read in inbuf.
+ * IN assertion: insize bytes have already been read in inbuf and inptr bytes
+ * already processed or copied.
*/
int copy(in, out)
int in, out; /* input and output file descriptors */
{
+ int got;
+
errno = 0;
- while (insize != 0 && (int)insize != -1) {
- write_buf(out, (char*)inbuf, insize);
- bytes_out += insize;
- insize = read_buffer (in, (char *) inbuf, INBUFSIZ);
- }
- if ((int)insize == -1) {
- read_error();
+ while (insize > inptr) {
+ write_buf(out, (char*)inbuf + inptr, insize - inptr);
+ bytes_out += insize - inptr;
+ got = read_buffer (in, (char *) inbuf, INBUFSIZ);
+ if (got == -1)
+ read_error();
+ bytes_in += got;
+ insize = (unsigned)got;
+ inptr = 0;
}
- bytes_in = bytes_out;
return OK;
}
/* ========================================================================
* Table of CRC-32's of all single-byte values (made by makecrc.c)
*/
-ulg crc_32_tab[] = {
+static const ulg crc_32_tab[] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,