17eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* minigzip.c -- simulate gzip using the zlib compression library 27eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Copyright (C) 1995-2006, 2010, 2011 Jean-loup Gailly. 37eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * For conditions of distribution and use, see copyright notice in zlib.h 47eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 57eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 67eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* 77eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * minigzip is a minimal implementation of the gzip utility. This is 87eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * only an example of using zlib and isn't meant to replace the 97eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * full-featured gzip. No attempt is made to deal with file systems 107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * limiting names to 14 or 8+3 characters, etc... Error checking is 117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * very limited. So use minigzip only for testing; use gzip for the 127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * real thing. On MSDOS, use only on file names without extension 137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * or in pipe mode. 147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* @(#) $Id$ */ 177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include "zlib.h" 197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <stdio.h> 207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef STDC 227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <string.h> 237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <stdlib.h> 247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP 277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <sys/types.h> 287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <sys/mman.h> 297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <sys/stat.h> 307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) 337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <fcntl.h> 347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <io.h> 357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# ifdef UNDER_CE 367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <stdlib.h> 377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# endif 387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) 397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else 407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define SET_BINARY_MODE(file) 417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef _MSC_VER 447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define snprintf _snprintf 457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef VMS 487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define unlink delete 497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define GZ_SUFFIX "-gz" 507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef RISCOS 527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define unlink remove 537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define GZ_SUFFIX "-gz" 547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define fileno(file) file->__file 557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os 577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <unix.h> /* for fileno */ 587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) 617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ 627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel extern int unlink OF((const char *)); 637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(UNDER_CE) 677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <windows.h> 687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define perror(s) pwinerror(s) 697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* Map the Windows error number in ERROR to a locale-dependent error 717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel message string and return a pointer to it. Typically, the values 727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for ERROR come from GetLastError. 737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel The string pointed to shall not be modified by the application, 757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel but may be overwritten by a subsequent call to strwinerror 767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel The strwinerror function does not change the current setting 787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel of GetLastError. */ 797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic char *strwinerror (error) 817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel DWORD error; 827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel static char buf[1024]; 847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel wchar_t *msgbuf; 867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel DWORD lasterr = GetLastError(); 877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM 887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel | FORMAT_MESSAGE_ALLOCATE_BUFFER, 897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel NULL, 907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel error, 917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 0, /* Default language */ 927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel (LPVOID)&msgbuf, 937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 0, 947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel NULL); 957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (chars != 0) { 967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* If there is an \r\n appended, zap it. */ 977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (chars >= 2 987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { 997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel chars -= 2; 1007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel msgbuf[chars] = 0; 1017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (chars > sizeof (buf) - 1) { 1047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel chars = sizeof (buf) - 1; 1057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel msgbuf[chars] = 0; 1067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel wcstombs(buf, msgbuf, chars + 1); 1097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel LocalFree(msgbuf); 1107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else { 1127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel sprintf(buf, "unknown win32 error (%ld)", error); 1137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 1147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel SetLastError(lasterr); 1167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return buf; 1177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 1187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic void pwinerror (s) 1207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel const char *s; 1217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 1227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (s && *s) 1237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ())); 1247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else 1257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s\n", strwinerror(GetLastError ())); 1267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 1277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* UNDER_CE */ 1297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifndef GZ_SUFFIX 1317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define GZ_SUFFIX ".gz" 1327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 1337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) 1347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define BUFLEN 16384 1367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define MAX_NAME_LEN 1024 1377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef MAXSEG_64K 1397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define local static 1407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Needed for systems with limitation on stack size. */ 1417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else 1427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# define local 1437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 1447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Z_SOLO 1467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* for Z_SOLO, create simplified gz* functions using deflate and inflate */ 1477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE) 1497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel# include <unistd.h> /* for unlink() */ 1507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 1517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid *myalloc OF((void *, unsigned, unsigned)); 1537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid myfree OF((void *, void *)); 1547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid *myalloc(q, n, m) 1567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel void *q; 1577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned n, m; 1587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 1597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel q = Z_NULL; 1607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return calloc(n, m); 1617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 1627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid myfree(q, p) 1647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel void *q, *p; 1657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 1667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel q = Z_NULL; 1677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel free(p); 1687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 1697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanieltypedef struct gzFile_s { 1717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel FILE *file; 1727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int write; 1737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int err; 1747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *msg; 1757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel z_stream strm; 1767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} *gzFile; 1777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzopen OF((const char *, const char *)); 1797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzdopen OF((int, const char *)); 1807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gz_open OF((const char *, int, const char *)); 1817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzopen(path, mode) 1837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *path; 1847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *mode; 1857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 1867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return gz_open(path, -1, mode); 1877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 1887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzdopen(fd, mode) 1907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint fd; 1917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *mode; 1927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 1937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return gz_open(NULL, fd, mode); 1947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 1957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 1967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gz_open(path, fd, mode) 1977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel const char *path; 1987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int fd; 1997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel const char *mode; 2007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 2017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile gz; 2027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int ret; 2037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz = malloc(sizeof(struct gzFile_s)); 2057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz == NULL) 2067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 2077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->write = strchr(mode, 'w') != NULL; 2087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->strm.zalloc = myalloc; 2097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->strm.zfree = myfree; 2107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->strm.opaque = Z_NULL; 2117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz->write) 2127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0); 2137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else { 2147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->strm.next_in = 0; 2157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->strm.avail_in = Z_NULL; 2167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ret = inflateInit2(&(gz->strm), 15 + 16); 2177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 2187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (ret != Z_OK) { 2197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel free(gz); 2207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 2217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 2227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") : 2237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fopen(path, gz->write ? "wb" : "rb"); 2247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz->file == NULL) { 2257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm)); 2267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel free(gz); 2277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return NULL; 2287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 2297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->err = 0; 2307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->msg = ""; 2317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return gz; 2327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 2337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzwrite OF((gzFile, const void *, unsigned)); 2357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzwrite(gz, buf, len) 2377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile gz; 2387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel const void *buf; 2397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned len; 2407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 2417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel z_stream *strm; 2427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned char out[BUFLEN]; 2437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz == NULL || !gz->write) 2457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 2467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm = &(gz->strm); 2477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->next_in = (void *)buf; 2487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->avail_in = len; 2497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel do { 2507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->next_out = out; 2517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->avail_out = BUFLEN; 2527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel (void)deflate(strm, Z_NO_FLUSH); 2537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); 2547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } while (strm->avail_out == 0); 2557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return len; 2567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 2577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzread OF((gzFile, void *, unsigned)); 2597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzread(gz, buf, len) 2617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile gz; 2627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel void *buf; 2637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned len; 2647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 2657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int ret; 2667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned got; 2677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned char in[1]; 2687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel z_stream *strm; 2697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz == NULL || gz->write) 2717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 2727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz->err) 2737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 2747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm = &(gz->strm); 2757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->next_out = (void *)buf; 2767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->avail_out = len; 2777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel do { 2787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel got = fread(in, 1, 1, gz->file); 2797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (got == 0) 2807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel break; 2817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->next_in = in; 2827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->avail_in = 1; 2837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel ret = inflate(strm, Z_NO_FLUSH); 2847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (ret == Z_DATA_ERROR) { 2857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->err = Z_DATA_ERROR; 2867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz->msg = strm->msg; 2877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 2887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 2897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (ret == Z_STREAM_END) 2907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel inflateReset(strm); 2917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } while (strm->avail_out); 2927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return len - strm->avail_out; 2937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 2947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzclose OF((gzFile)); 2967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 2977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzclose(gz) 2987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile gz; 2997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 3007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel z_stream *strm; 3017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unsigned char out[BUFLEN]; 3027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz == NULL) 3047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return Z_STREAM_ERROR; 3057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm = &(gz->strm); 3067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz->write) { 3077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->next_in = Z_NULL; 3087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->avail_in = 0; 3097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel do { 3107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->next_out = out; 3117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strm->avail_out = BUFLEN; 3127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel (void)deflate(strm, Z_FINISH); 3137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); 3147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } while (strm->avail_out == 0); 3157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel deflateEnd(strm); 3167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else 3187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel inflateEnd(strm); 3197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fclose(gz->file); 3207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel free(gz); 3217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return Z_OK; 3227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 3237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *gzerror OF((gzFile, int *)); 3257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *gzerror(gz, err) 3277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile gz; 3287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int *err; 3297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 3307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel *err = gz->err; 3317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return gz->msg; 3327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 3337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 3357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielchar *prog; 3377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid error OF((const char *msg)); 3397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_compress OF((FILE *in, gzFile out)); 3407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP 3417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gz_compress_mmap OF((FILE *in, gzFile out)); 3427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 3437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_uncompress OF((gzFile in, FILE *out)); 3447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_compress OF((char *file, char *mode)); 3457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_uncompress OF((char *file)); 3467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint main OF((int argc, char *argv[])); 3477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* =========================================================================== 3497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Display error message and exit 3507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 3517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid error(msg) 3527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel const char *msg; 3537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 3547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s: %s\n", prog, msg); 3557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 3567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 3577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* =========================================================================== 3597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Compress input to output then close both files. 3607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 3617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_compress(in, out) 3637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel FILE *in; 3647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile out; 3657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 3667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel local char buf[BUFLEN]; 3677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int len; 3687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int err; 3697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP 3717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Try first compressing with mmap. If mmap fails (minigzip used in a 3727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * pipe), use the normal fread loop. 3737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 3747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gz_compress_mmap(in, out) == Z_OK) return; 3757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 3767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (;;) { 3777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel len = (int)fread(buf, 1, sizeof(buf), in); 3787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (ferror(in)) { 3797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel perror("fread"); 3807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 3817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (len == 0) break; 3837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); 3857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 3867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fclose(in); 3877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gzclose(out) != Z_OK) error("failed gzclose"); 3887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 3897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */ 3917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 3927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* Try compressing the input file at once using mmap. Return Z_OK if 3937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * if success, Z_ERRNO otherwise. 3947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 3957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gz_compress_mmap(in, out) 3967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel FILE *in; 3977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile out; 3987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 3997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int len; 4007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int err; 4017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int ifd = fileno(in); 4027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel caddr_t buf; /* mmap'ed buffer for the entire input file */ 4037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel off_t buf_len; /* length of the input file */ 4047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel struct stat sb; 4057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Determine the size of the file, needed for mmap: */ 4077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (fstat(ifd, &sb) < 0) return Z_ERRNO; 4087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel buf_len = sb.st_size; 4097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (buf_len <= 0) return Z_ERRNO; 4107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Now do the actual mmap: */ 4127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); 4137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (buf == (caddr_t)(-1)) return Z_ERRNO; 4147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel /* Compress the whole file at once: */ 4167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel len = gzwrite(out, (char *)buf, (unsigned)buf_len); 4177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (len != (int)buf_len) error(gzerror(out, &err)); 4197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel munmap(buf, buf_len); 4217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fclose(in); 4227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gzclose(out) != Z_OK) error("failed gzclose"); 4237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return Z_OK; 4247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 4257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* USE_MMAP */ 4267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* =========================================================================== 4287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Uncompress input to output then close both files. 4297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 4307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_uncompress(in, out) 4317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile in; 4327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel FILE *out; 4337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 4347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel local char buf[BUFLEN]; 4357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int len; 4367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int err; 4377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel for (;;) { 4397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel len = gzread(in, buf, sizeof(buf)); 4407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (len < 0) error (gzerror(in, &err)); 4417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (len == 0) break; 4427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { 4447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel error("failed fwrite"); 4457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 4467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 4477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (fclose(out)) error("failed fclose"); 4487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (gzclose(in) != Z_OK) error("failed gzclose"); 4507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 4517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* =========================================================================== 4547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Compress the given file: create a corresponding .gz file and remove the 4557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * original. 4567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 4577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_compress(file, mode) 4587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *file; 4597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *mode; 4607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 4617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel local char outfile[MAX_NAME_LEN]; 4627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel FILE *in; 4637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile out; 4647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { 4667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s: filename too long\n", prog); 4677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 4687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 4697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf) 4717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX); 4727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else 4737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strcpy(outfile, file); 4747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strcat(outfile, GZ_SUFFIX); 4757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 4767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel in = fopen(file, "rb"); 4787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (in == NULL) { 4797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel perror(file); 4807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 4817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 4827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel out = gzopen(outfile, mode); 4837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (out == NULL) { 4847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); 4857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 4867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 4877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz_compress(in, out); 4887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unlink(file); 4907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 4917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 4937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* =========================================================================== 4947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Uncompress the given file and remove the original. 4957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 4967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_uncompress(file) 4977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *file; 4987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 4997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel local char buf[MAX_NAME_LEN]; 5007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *infile, *outfile; 5017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel FILE *out; 5027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile in; 5037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel size_t len = strlen(file); 5047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { 5067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s: filename too long\n", prog); 5077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 5087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 5097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf) 5117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel snprintf(buf, sizeof(buf), "%s", file); 5127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else 5137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strcpy(buf, file); 5147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { 5177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel infile = file; 5187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outfile = buf; 5197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outfile[len-3] = '\0'; 5207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 5217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outfile = file; 5227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel infile = buf; 5237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf) 5247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX); 5257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else 5267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strcat(infile, GZ_SUFFIX); 5277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 5297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel in = gzopen(infile, "rb"); 5307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (in == NULL) { 5317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); 5327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 5337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 5347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel out = fopen(outfile, "wb"); 5357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (out == NULL) { 5367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel perror(file); 5377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel exit(1); 5387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 5397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz_uncompress(in, out); 5417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel unlink(infile); 5437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 5447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* =========================================================================== 5477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] 5487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * -c : write to standard output 5497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * -d : decompress 5507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * -f : compress with Z_FILTERED 5517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * -h : compress with Z_HUFFMAN_ONLY 5527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * -r : compress with Z_RLE 5537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * -1 to -9 : compression level 5547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */ 5557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint main(argc, argv) 5577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int argc; 5587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *argv[]; 5597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{ 5607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int copyout = 0; 5617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel int uncompr = 0; 5627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gzFile file; 5637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel char *bname, outmode[20]; 5647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf) 5667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel snprintf(outmode, sizeof(outmode), "%s", "wb6 "); 5677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else 5687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel strcpy(outmode, "wb6 "); 5697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif 5707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel prog = argv[0]; 5727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel bname = strrchr(argv[0], '/'); 5737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (bname) 5747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel bname++; 5757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else 5767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel bname = argv[0]; 5777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel argc--, argv++; 5787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (!strcmp(bname, "gunzip")) 5807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel uncompr = 1; 5817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else if (!strcmp(bname, "zcat")) 5827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel copyout = uncompr = 1; 5837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 5847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel while (argc > 0) { 5857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (strcmp(*argv, "-c") == 0) 5867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel copyout = 1; 5877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else if (strcmp(*argv, "-d") == 0) 5887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel uncompr = 1; 5897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else if (strcmp(*argv, "-f") == 0) 5907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outmode[3] = 'f'; 5917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else if (strcmp(*argv, "-h") == 0) 5927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outmode[3] = 'h'; 5937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else if (strcmp(*argv, "-r") == 0) 5947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outmode[3] = 'R'; 5957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && 5967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel (*argv)[2] == 0) 5977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outmode[2] = (*argv)[1]; 5987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else 5997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel break; 6007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel argc--, argv++; 6017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (outmode[3] == ' ') 6037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel outmode[3] = 0; 6047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (argc == 0) { 6057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel SET_BINARY_MODE(stdin); 6067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel SET_BINARY_MODE(stdout); 6077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (uncompr) { 6087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel file = gzdopen(fileno(stdin), "rb"); 6097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (file == NULL) error("can't gzdopen stdin"); 6107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz_uncompress(file, stdout); 6117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 6127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel file = gzdopen(fileno(stdout), outmode); 6137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (file == NULL) error("can't gzdopen stdout"); 6147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz_compress(stdin, file); 6157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 6177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (copyout) { 6187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel SET_BINARY_MODE(stdout); 6197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel do { 6217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (uncompr) { 6227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (copyout) { 6237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel file = gzopen(*argv, "rb"); 6247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (file == NULL) 6257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); 6267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel else 6277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz_uncompress(file, stdout); 6287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 6297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel file_uncompress(*argv); 6307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 6327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (copyout) { 6337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel FILE * in = fopen(*argv, "rb"); 6347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (in == NULL) { 6367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel perror(*argv); 6377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 6387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel file = gzdopen(fileno(stdout), outmode); 6397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel if (file == NULL) error("can't gzdopen stdout"); 6407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel gz_compress(in, file); 6427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel 6447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } else { 6457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel file_compress(*argv, outmode); 6467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } while (argv++, --argc); 6497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel } 6507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel return 0; 6517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} 652