Magellan Linux

Annotation of /trunk/mkinitrd-magellan/klibc/usr/gzip/zip.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 815 - (hide annotations) (download)
Fri Apr 24 18:32:46 2009 UTC (15 years ago) by niro
File MIME type: text/plain
File size: 3031 byte(s)
-updated to klibc-1.5.15
1 niro 532 /* 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     #ifdef RCSID
8 niro 815 static char rcsid[] = "$Id: zip.c,v 1.1 2002/08/18 00:59:21 hpa Exp $";
9 niro 532 #endif
10    
11     #include <ctype.h>
12     #include <sys/types.h>
13     #include <unistd.h>
14     #include <fcntl.h>
15    
16     #include "tailor.h"
17     #include "gzip.h"
18    
19     local ulg crc; /* crc on uncompressed file data */
20    
21     /* ===========================================================================
22     * Deflate in to out.
23     * IN assertions: the input and output buffers are cleared.
24     * The variables time_stamp and save_orig_name are initialized.
25     */
26     int zip(in, out)
27     int in, out; /* input and output file descriptors */
28     {
29     uch flags = 0; /* general purpose bit flags */
30     ush attr = 0; /* ascii/binary flag */
31     ush deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */
32    
33     ifd = in;
34     ofd = out;
35     outcnt = 0;
36    
37     /* Write the header to the gzip file. See algorithm.doc for the format */
38    
39     method = DEFLATED;
40     put_byte(GZIP_MAGIC[0]); /* magic header */
41     put_byte(GZIP_MAGIC[1]);
42     put_byte(DEFLATED); /* compression method */
43    
44     if (save_orig_name) {
45     flags |= ORIG_NAME;
46     }
47     put_byte(flags); /* general flags */
48     put_long(time_stamp);
49    
50     /* Write deflated file to zip file */
51     crc = updcrc(0, 0);
52    
53     bi_init(out);
54     ct_init(&attr, &method);
55     lm_init(level, &deflate_flags);
56    
57     put_byte((uch)deflate_flags); /* extra flags */
58     put_byte(OS_CODE); /* OS identifier */
59    
60     if (save_orig_name) {
61     char *p = basename(ifname); /* Don't save the directory part. */
62     do {
63     put_char(*p);
64     } while (*p++);
65     }
66     header_bytes = (long)outcnt;
67    
68     (void)deflate();
69    
70     #if !defined(NO_SIZE_CHECK) && !defined(RECORD_IO)
71     /* Check input size (but not in VMS -- variable record lengths mess it up)
72     * and not on MSDOS -- diet in TSR mode reports an incorrect file size)
73     */
74     if (ifile_size != -1L && isize != (ulg)ifile_size) {
75     Trace((stderr, " actual=%ld, read=%ld ", ifile_size, isize));
76     fprintf(stderr, "%s: %s: file size changed while zipping\n",
77     progname, ifname);
78     }
79     #endif
80    
81     /* Write the crc and uncompressed size */
82     put_long(crc);
83     put_long(isize);
84     header_bytes += 2*sizeof(long);
85    
86     flush_outbuf();
87     return OK;
88     }
89    
90    
91     /* ===========================================================================
92     * Read a new buffer from the current input file, perform end-of-line
93     * translation, and update the crc and input file size.
94     * IN assertion: size >= 2 (for end-of-line translation)
95     */
96     int file_read(buf, size)
97     char *buf;
98     unsigned size;
99     {
100     unsigned len;
101    
102     Assert(insize == 0, "inbuf not empty");
103    
104     len = read(ifd, buf, size);
105     if (len == (unsigned)(-1) || len == 0) return (int)len;
106    
107     crc = updcrc((uch*)buf, len);
108     isize += (ulg)len;
109     return (int)len;
110     }