|
|
1.1 root 1: /* zip.c -- compress files to the gzip or pkzip format
2: * Copyright (C) 1992-1993 Jean-loup Gailly
3: * This is free software; you can redistribute it and/or modify it under the
4: * terms of the GNU General Public License, see the file COPYING.
5: */
6:
7: #ifndef lint
8: static char rcsid[] = "$Id: zip.c,v 0.12 1993/02/24 18:23:13 jloup Exp $";
9: #endif
10:
11: #include "tailor.h"
12: #include "gzip.h"
13: #include "crypt.h"
14:
15: #include <ctype.h>
16: #include <stdio.h>
17:
18: #ifdef HAVE_UNISTD_H
19: # include <sys/types.h>
20: # include <unistd.h>
21: #endif
22:
23: local ulg crc; /* crc on uncompressed file data */
24: long overhead; /* number of bytes in gzip header */
25:
26: /* ===========================================================================
27: * Deflate in to out.
28: * IN assertions: the input and output buffers are cleared.
29: * The variables time_stamp, save_orig_name and text_mode are initialized.
30: */
31: void zip(in, out)
32: int in, out; /* input and output file descriptors */
33: {
34: uch flags = 0; /* general purpose bit flags */
35: ush attr = 0; /* ascii/binary flag */
36: ush deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */
37:
38: ifd = in;
39: ofd = out;
40: outcnt = 0;
41:
42: /* Write the header to the gzip file. See algorithm.doc for the format */
43:
44: method = DEFLATED;
45: put_byte(GZIP_MAGIC[0]); /* magic header */
46: put_byte(GZIP_MAGIC[1]);
47: put_byte(DEFLATED); /* compression method */
48:
49: if (save_orig_name) {
50: flags |= ORIG_NAME;
51: }
52: if (text_mode) {
53: flags |= ASCII_FLAG;
54: /* This currently works only for VMS files in variable record format.
55: * For other systems, we should look ahead a little in the input to
56: * determine the ascii/binary flag.
57: */
58: }
59: put_byte(flags); /* general flags */
60: put_long(time_stamp);
61:
62: /* Write deflated file to zip file */
63: crc = updcrc(0, 0);
64:
65: bi_init(out);
66: ct_init(&attr, &method);
67: lm_init(level, &deflate_flags);
68:
69: put_byte((uch)deflate_flags); /* extra flags */
70: put_byte(OS_CODE); /* OS identifier */
71:
72: if (save_orig_name) {
73: char *p = basename(ifname); /* Don't save the directory part. */
74: do {
75: put_byte(*p);
76: } while (*p++);
77: }
78: overhead = (long)outcnt;
79:
80: (void)deflate();
81:
82: #if !defined(NO_SIZE_CHECK) && !defined(RECORD_IO)
83: /* Check input size (but not in VMS -- variable record lengths mess it up)
84: * and not on MSDOS -- diet in TSR mode reports an incorrect file size)
85: */
86: if (ifile_size != -1L && isize != (ulg)ifile_size) {
87: Trace((stderr, " actual=%ld, read=%ld ", ifile_size, isize));
88: fprintf(stderr, " file size changed while zipping %s\n", ifname);
89: }
90: #endif
91:
92: /* Write the crc and uncompressed size */
93: put_long(crc);
94: put_long(isize);
95:
96: flush_outbuf();
97: }
98:
99:
100: /* ===========================================================================
101: * Read a new buffer from the current input file, perform end-of-line
102: * translation, and update the crc and input file size.
103: * IN assertion: size >= 2 (for end-of-line translation)
104: */
105: int file_read(buf, size)
106: char *buf;
107: unsigned size;
108: {
109: unsigned len;
110:
111: Assert(insize == 0, "inbuf not empty");
112:
113: len = read(ifd, buf, size);
114: if (len == (unsigned)(-1) || len == 0) return (int)len;
115:
116: crc = updcrc((uch*)buf, len);
117: isize += (ulg)len;
118: return (int)len;
119: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.