/* 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 char rcsid
[] = "$Id: zip.c,v 0.17 1993/06/10 13:29:25 jloup Exp $";
local ulg crc
; /* crc on uncompressed file data */
long header_bytes
; /* number of bytes in gzip header */
/* ===========================================================================
* IN assertions: the input and output buffers are cleared.
* The variables time_stamp and save_orig_name are initialized.
int in
, out
; /* input and output file descriptors */
uch flags
= 0; /* general purpose bit flags */
ush attr
= 0; /* ascii/binary flag */
ush deflate_flags
= 0; /* pkzip -es, -en or -ex equivalent */
/* Write the header to the gzip file. See algorithm.doc for the format */
put_byte(GZIP_MAGIC
[0]); /* magic header */
put_byte(DEFLATED
); /* compression method */
put_byte(flags
); /* general flags */
/* Write deflated file to zip file */
lm_init(level
, &deflate_flags
);
put_byte((uch
)deflate_flags
); /* extra flags */
put_byte(OS_CODE
); /* OS identifier */
char *p
= basename(ifname
); /* Don't save the directory part. */
header_bytes
= (long)outcnt
;
#if !defined(NO_SIZE_CHECK) && !defined(RECORD_IO)
/* Check input size (but not in VMS -- variable record lengths mess it up)
* and not on MSDOS -- diet in TSR mode reports an incorrect file size)
if (ifile_size
!= -1L && isize
!= (ulg
)ifile_size
) {
Trace((stderr
, " actual=%ld, read=%ld ", ifile_size
, isize
));
fprintf(stderr
, "%s: %s: file size changed while zipping\n",
/* Write the crc and uncompressed size */
header_bytes
+= 2*sizeof(long);
/* ===========================================================================
* 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)
Assert(insize
== 0, "inbuf not empty");
len
= read(ifd
, buf
, size
);
if (len
== (unsigned)(-1) || len
== 0) return (int)len
;
crc
= updcrc((uch
*)buf
, len
);