~ubuntu-branches/ubuntu/saucy/pyqwt3d/saucy-proposed

« back to all changes in this revision

Viewing changes to zlib-1.2.3/minigzip.c

  • Committer: Bazaar Package Importer
  • Author(s): Gudjon I. Gudjonsson
  • Date: 2009-11-07 12:54:42 UTC
  • mfrom: (3.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20091107125442-92kgp0l7lessmiwo
Tags: 0.1.7~cvs20090625-2
* Change sip4 dependencies to >=4.9
* Add binary dependency on python-sip4 >=4.9
* Bump standards version to 3.8.3, no changes needed
* Add README.source file

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* minigzip.c -- simulate gzip using the zlib compression library
2
 
 * Copyright (C) 1995-2005 Jean-loup Gailly.
3
 
 * For conditions of distribution and use, see copyright notice in zlib.h
4
 
 */
5
 
 
6
 
/*
7
 
 * minigzip is a minimal implementation of the gzip utility. This is
8
 
 * only an example of using zlib and isn't meant to replace the
9
 
 * full-featured gzip. No attempt is made to deal with file systems
10
 
 * limiting names to 14 or 8+3 characters, etc... Error checking is
11
 
 * very limited. So use minigzip only for testing; use gzip for the
12
 
 * real thing. On MSDOS, use only on file names without extension
13
 
 * or in pipe mode.
14
 
 */
15
 
 
16
 
/* @(#) $Id$ */
17
 
 
18
 
#include <stdio.h>
19
 
#include "zlib.h"
20
 
 
21
 
#ifdef STDC
22
 
#  include <string.h>
23
 
#  include <stdlib.h>
24
 
#endif
25
 
 
26
 
#ifdef USE_MMAP
27
 
#  include <sys/types.h>
28
 
#  include <sys/mman.h>
29
 
#  include <sys/stat.h>
30
 
#endif
31
 
 
32
 
#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
33
 
#  include <fcntl.h>
34
 
#  include <io.h>
35
 
#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
36
 
#else
37
 
#  define SET_BINARY_MODE(file)
38
 
#endif
39
 
 
40
 
#ifdef VMS
41
 
#  define unlink delete
42
 
#  define GZ_SUFFIX "-gz"
43
 
#endif
44
 
#ifdef RISCOS
45
 
#  define unlink remove
46
 
#  define GZ_SUFFIX "-gz"
47
 
#  define fileno(file) file->__file
48
 
#endif
49
 
#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
50
 
#  include <unix.h> /* for fileno */
51
 
#endif
52
 
 
53
 
#ifndef WIN32 /* unlink already in stdio.h for WIN32 */
54
 
  extern int unlink OF((const char *));
55
 
#endif
56
 
 
57
 
#ifndef GZ_SUFFIX
58
 
#  define GZ_SUFFIX ".gz"
59
 
#endif
60
 
#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)
61
 
 
62
 
#define BUFLEN      16384
63
 
#define MAX_NAME_LEN 1024
64
 
 
65
 
#ifdef MAXSEG_64K
66
 
#  define local static
67
 
   /* Needed for systems with limitation on stack size. */
68
 
#else
69
 
#  define local
70
 
#endif
71
 
 
72
 
char *prog;
73
 
 
74
 
void error            OF((const char *msg));
75
 
void gz_compress      OF((FILE   *in, gzFile out));
76
 
#ifdef USE_MMAP
77
 
int  gz_compress_mmap OF((FILE   *in, gzFile out));
78
 
#endif
79
 
void gz_uncompress    OF((gzFile in, FILE   *out));
80
 
void file_compress    OF((char  *file, char *mode));
81
 
void file_uncompress  OF((char  *file));
82
 
int  main             OF((int argc, char *argv[]));
83
 
 
84
 
/* ===========================================================================
85
 
 * Display error message and exit
86
 
 */
87
 
void error(msg)
88
 
    const char *msg;
89
 
{
90
 
    fprintf(stderr, "%s: %s\n", prog, msg);
91
 
    exit(1);
92
 
}
93
 
 
94
 
/* ===========================================================================
95
 
 * Compress input to output then close both files.
96
 
 */
97
 
 
98
 
void gz_compress(in, out)
99
 
    FILE   *in;
100
 
    gzFile out;
101
 
{
102
 
    local char buf[BUFLEN];
103
 
    int len;
104
 
    int err;
105
 
 
106
 
#ifdef USE_MMAP
107
 
    /* Try first compressing with mmap. If mmap fails (minigzip used in a
108
 
     * pipe), use the normal fread loop.
109
 
     */
110
 
    if (gz_compress_mmap(in, out) == Z_OK) return;
111
 
#endif
112
 
    for (;;) {
113
 
        len = (int)fread(buf, 1, sizeof(buf), in);
114
 
        if (ferror(in)) {
115
 
            perror("fread");
116
 
            exit(1);
117
 
        }
118
 
        if (len == 0) break;
119
 
 
120
 
        if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err));
121
 
    }
122
 
    fclose(in);
123
 
    if (gzclose(out) != Z_OK) error("failed gzclose");
124
 
}
125
 
 
126
 
#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */
127
 
 
128
 
/* Try compressing the input file at once using mmap. Return Z_OK if
129
 
 * if success, Z_ERRNO otherwise.
130
 
 */
131
 
int gz_compress_mmap(in, out)
132
 
    FILE   *in;
133
 
    gzFile out;
134
 
{
135
 
    int len;
136
 
    int err;
137
 
    int ifd = fileno(in);
138
 
    caddr_t buf;    /* mmap'ed buffer for the entire input file */
139
 
    off_t buf_len;  /* length of the input file */
140
 
    struct stat sb;
141
 
 
142
 
    /* Determine the size of the file, needed for mmap: */
143
 
    if (fstat(ifd, &sb) < 0) return Z_ERRNO;
144
 
    buf_len = sb.st_size;
145
 
    if (buf_len <= 0) return Z_ERRNO;
146
 
 
147
 
    /* Now do the actual mmap: */
148
 
    buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0);
149
 
    if (buf == (caddr_t)(-1)) return Z_ERRNO;
150
 
 
151
 
    /* Compress the whole file at once: */
152
 
    len = gzwrite(out, (char *)buf, (unsigned)buf_len);
153
 
 
154
 
    if (len != (int)buf_len) error(gzerror(out, &err));
155
 
 
156
 
    munmap(buf, buf_len);
157
 
    fclose(in);
158
 
    if (gzclose(out) != Z_OK) error("failed gzclose");
159
 
    return Z_OK;
160
 
}
161
 
#endif /* USE_MMAP */
162
 
 
163
 
/* ===========================================================================
164
 
 * Uncompress input to output then close both files.
165
 
 */
166
 
void gz_uncompress(in, out)
167
 
    gzFile in;
168
 
    FILE   *out;
169
 
{
170
 
    local char buf[BUFLEN];
171
 
    int len;
172
 
    int err;
173
 
 
174
 
    for (;;) {
175
 
        len = gzread(in, buf, sizeof(buf));
176
 
        if (len < 0) error (gzerror(in, &err));
177
 
        if (len == 0) break;
178
 
 
179
 
        if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
180
 
            error("failed fwrite");
181
 
        }
182
 
    }
183
 
    if (fclose(out)) error("failed fclose");
184
 
 
185
 
    if (gzclose(in) != Z_OK) error("failed gzclose");
186
 
}
187
 
 
188
 
 
189
 
/* ===========================================================================
190
 
 * Compress the given file: create a corresponding .gz file and remove the
191
 
 * original.
192
 
 */
193
 
void file_compress(file, mode)
194
 
    char  *file;
195
 
    char  *mode;
196
 
{
197
 
    local char outfile[MAX_NAME_LEN];
198
 
    FILE  *in;
199
 
    gzFile out;
200
 
 
201
 
    strcpy(outfile, file);
202
 
    strcat(outfile, GZ_SUFFIX);
203
 
 
204
 
    in = fopen(file, "rb");
205
 
    if (in == NULL) {
206
 
        perror(file);
207
 
        exit(1);
208
 
    }
209
 
    out = gzopen(outfile, mode);
210
 
    if (out == NULL) {
211
 
        fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);
212
 
        exit(1);
213
 
    }
214
 
    gz_compress(in, out);
215
 
 
216
 
    unlink(file);
217
 
}
218
 
 
219
 
 
220
 
/* ===========================================================================
221
 
 * Uncompress the given file and remove the original.
222
 
 */
223
 
void file_uncompress(file)
224
 
    char  *file;
225
 
{
226
 
    local char buf[MAX_NAME_LEN];
227
 
    char *infile, *outfile;
228
 
    FILE  *out;
229
 
    gzFile in;
230
 
    uInt len = (uInt)strlen(file);
231
 
 
232
 
    strcpy(buf, file);
233
 
 
234
 
    if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) {
235
 
        infile = file;
236
 
        outfile = buf;
237
 
        outfile[len-3] = '\0';
238
 
    } else {
239
 
        outfile = file;
240
 
        infile = buf;
241
 
        strcat(infile, GZ_SUFFIX);
242
 
    }
243
 
    in = gzopen(infile, "rb");
244
 
    if (in == NULL) {
245
 
        fprintf(stderr, "%s: can't gzopen %s\n", prog, infile);
246
 
        exit(1);
247
 
    }
248
 
    out = fopen(outfile, "wb");
249
 
    if (out == NULL) {
250
 
        perror(file);
251
 
        exit(1);
252
 
    }
253
 
 
254
 
    gz_uncompress(in, out);
255
 
 
256
 
    unlink(infile);
257
 
}
258
 
 
259
 
 
260
 
/* ===========================================================================
261
 
 * Usage:  minigzip [-d] [-f] [-h] [-r] [-1 to -9] [files...]
262
 
 *   -d : decompress
263
 
 *   -f : compress with Z_FILTERED
264
 
 *   -h : compress with Z_HUFFMAN_ONLY
265
 
 *   -r : compress with Z_RLE
266
 
 *   -1 to -9 : compression level
267
 
 */
268
 
 
269
 
int main(argc, argv)
270
 
    int argc;
271
 
    char *argv[];
272
 
{
273
 
    int uncompr = 0;
274
 
    gzFile file;
275
 
    char outmode[20];
276
 
 
277
 
    strcpy(outmode, "wb6 ");
278
 
 
279
 
    prog = argv[0];
280
 
    argc--, argv++;
281
 
 
282
 
    while (argc > 0) {
283
 
      if (strcmp(*argv, "-d") == 0)
284
 
        uncompr = 1;
285
 
      else if (strcmp(*argv, "-f") == 0)
286
 
        outmode[3] = 'f';
287
 
      else if (strcmp(*argv, "-h") == 0)
288
 
        outmode[3] = 'h';
289
 
      else if (strcmp(*argv, "-r") == 0)
290
 
        outmode[3] = 'R';
291
 
      else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' &&
292
 
               (*argv)[2] == 0)
293
 
        outmode[2] = (*argv)[1];
294
 
      else
295
 
        break;
296
 
      argc--, argv++;
297
 
    }
298
 
    if (outmode[3] == ' ')
299
 
        outmode[3] = 0;
300
 
    if (argc == 0) {
301
 
        SET_BINARY_MODE(stdin);
302
 
        SET_BINARY_MODE(stdout);
303
 
        if (uncompr) {
304
 
            file = gzdopen(fileno(stdin), "rb");
305
 
            if (file == NULL) error("can't gzdopen stdin");
306
 
            gz_uncompress(file, stdout);
307
 
        } else {
308
 
            file = gzdopen(fileno(stdout), outmode);
309
 
            if (file == NULL) error("can't gzdopen stdout");
310
 
            gz_compress(stdin, file);
311
 
        }
312
 
    } else {
313
 
        do {
314
 
            if (uncompr) {
315
 
                file_uncompress(*argv);
316
 
            } else {
317
 
                file_compress(*argv, outmode);
318
 
            }
319
 
        } while (argv++, --argc);
320
 
    }
321
 
    return 0;
322
 
}