/* unzip.c -- decompress files in 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. * * The code in this file is derived from the file funzip.c written * and put in the public domain by Mark Adler. */ /* This version can extract files in gzip format. Only the first entry is extracted, and it has to be either deflated or stored. */ #ifdef RCSID static char rcsid[] = "$Id: unzip.c,v 1.1 2002/08/18 00:59:21 hpa Exp $"; #endif #include "tailor.h" #include "gzip.h" /* =========================================================================== * Unzip in to out. This routine works on gzip files only. * * IN assertions: the buffer inbuf contains already the beginning of * the compressed data, from offsets inptr to insize-1 included. * The magic header has already been checked. The output buffer is cleared. */ int unzip(in, out) int in, out; /* input and output file descriptors */ { ulg orig_crc = 0; /* original crc */ ulg orig_len = 0; /* original uncompressed length */ int n; uch buf[8]; /* extended local header */ ifd = in; ofd = out; updcrc(NULL, 0); /* initialize crc */ /* Decompress */ if (method == DEFLATED) { int res = inflate(); if (res == 3) { error("out of memory"); } else if (res != 0) { error("invalid compressed data--format violated"); } } else { error("internal error, invalid method"); } /* Get the crc and original length */ /* crc32 (see algorithm.doc) * uncompressed input size modulo 2^32 */ for (n = 0; n < 8; n++) { buf[n] = (uch)get_byte(); /* may cause an error if EOF */ } orig_crc = LG(buf); orig_len = LG(buf+4); /* Validate decompression */ if (orig_crc != updcrc(outbuf, 0)) { error("invalid compressed data--crc error"); } if (orig_len != (ulg)bytes_out) { error("invalid compressed data--length error"); } return OK; }