Home | History | Annotate | Line # | Download | only in zcat
zcat.c revision 1.1
      1  1.1  gwr /*	$NetBSD: zcat.c,v 1.1 1996/09/12 20:24:00 gwr Exp $	*/
      2  1.1  gwr 
      3  1.1  gwr /* mini zcat.c -- a minimal zcat using the zlib compression library
      4  1.1  gwr  * Copyright (C) 1995-1996 Jean-loup Gailly.
      5  1.1  gwr  * For conditions of distribution and use, see copyright notice in zlib.h
      6  1.1  gwr  */
      7  1.1  gwr 
      8  1.1  gwr /*
      9  1.1  gwr  * Credits, History:
     10  1.1  gwr  * This program is a reduced version of the minigzip.c
     11  1.1  gwr  * program originally written by Jean-loup Gailly.
     12  1.1  gwr  * This reduction is the work of Gordon Ross.
     13  1.1  gwr  */
     14  1.1  gwr 
     15  1.1  gwr #include <stdio.h>
     16  1.1  gwr #include <string.h>
     17  1.1  gwr #include <stdlib.h>
     18  1.1  gwr 
     19  1.1  gwr #include "zlib.h"
     20  1.1  gwr 
     21  1.1  gwr #define BUFLEN 4096
     22  1.1  gwr 
     23  1.1  gwr char *prog;
     24  1.1  gwr 
     25  1.1  gwr void error           __P((const char *msg));
     26  1.1  gwr void gz_uncompress   __P((gzFile in, FILE   *out));
     27  1.1  gwr int  main            __P((int argc, char *argv[]));
     28  1.1  gwr 
     29  1.1  gwr /* ===========================================================================
     30  1.1  gwr  * Display error message and exit
     31  1.1  gwr  */
     32  1.1  gwr void error(msg)
     33  1.1  gwr     const char *msg;
     34  1.1  gwr {
     35  1.1  gwr     fprintf(stderr, "%s: %s\n", prog, msg);
     36  1.1  gwr     exit(1);
     37  1.1  gwr }
     38  1.1  gwr 
     39  1.1  gwr /* ===========================================================================
     40  1.1  gwr  * Uncompress input to output then close both files.
     41  1.1  gwr  */
     42  1.1  gwr void gz_uncompress(in, out)
     43  1.1  gwr     gzFile in;
     44  1.1  gwr     FILE   *out;
     45  1.1  gwr {
     46  1.1  gwr     char buf[BUFLEN];
     47  1.1  gwr     int len;
     48  1.1  gwr     int err;
     49  1.1  gwr 
     50  1.1  gwr     for (;;) {
     51  1.1  gwr         len = gzread(in, buf, sizeof(buf));
     52  1.1  gwr         if (len < 0) error (gzerror(in, &err));
     53  1.1  gwr         if (len == 0) break;
     54  1.1  gwr 
     55  1.1  gwr         if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
     56  1.1  gwr 	    error("failed fwrite");
     57  1.1  gwr 	}
     58  1.1  gwr     }
     59  1.1  gwr     if (fclose(out)) error("failed fclose");
     60  1.1  gwr 
     61  1.1  gwr     if (gzclose(in) != Z_OK) error("failed gzclose");
     62  1.1  gwr }
     63  1.1  gwr 
     64  1.1  gwr 
     65  1.1  gwr /* ===========================================================================
     66  1.1  gwr  * Usage:  miniunzip [files...]
     67  1.1  gwr  */
     68  1.1  gwr 
     69  1.1  gwr int main(argc, argv)
     70  1.1  gwr     int argc;
     71  1.1  gwr     char *argv[];
     72  1.1  gwr {
     73  1.1  gwr     gzFile zfp;
     74  1.1  gwr 
     75  1.1  gwr 	/* save program name and skip */
     76  1.1  gwr     prog = argv[0];
     77  1.1  gwr     argc--, argv++;
     78  1.1  gwr 
     79  1.1  gwr 	/* ignore any switches */
     80  1.1  gwr 	while (*argv && (**argv == '-')) {
     81  1.1  gwr         argc--, argv++;
     82  1.1  gwr     }
     83  1.1  gwr 
     84  1.1  gwr     if (argc == 0) {
     85  1.1  gwr 		zfp = gzdopen(fileno(stdin), "rb");
     86  1.1  gwr 		if (zfp == NULL)
     87  1.1  gwr 			error("can't gzdopen stdin");
     88  1.1  gwr 		gz_uncompress(zfp, stdout);
     89  1.1  gwr 		return 0;
     90  1.1  gwr     }
     91  1.1  gwr 
     92  1.1  gwr 	do {
     93  1.1  gwr 		/* file_uncompress(*argv); */
     94  1.1  gwr 		zfp = gzopen(*argv, "rb");
     95  1.1  gwr 		if (zfp == NULL) {
     96  1.1  gwr 			fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);
     97  1.1  gwr 			exit(1);
     98  1.1  gwr 		}
     99  1.1  gwr 		gz_uncompress(zfp, stdout);
    100  1.1  gwr 	} while (argv++, --argc);
    101  1.1  gwr     return 0; /* to avoid warning */
    102  1.1  gwr }
    103