?? gzip.c
字號:
/* gzip (GNU zip) -- compress files with zip algorithm and 'compress' interface * Copyright (C) 1992-1993 Jean-loup Gailly * The unzip code was written and put in the public domain by Mark Adler. * Portions of the lzw code are derived from the public domain 'compress' * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies, * Ken Turkowski, Dave Mack and Peter Jannesen. * * See the license_msg below and the file COPYING for the software license. * See the file algorithm.doc for the compression algorithms and file formats. *//* Compress files with zip algorithm and 'compress' interface. * See usage() and help() functions below for all options. * Outputs: * file.gz: compressed file with same mode, owner, and utimes * or stdout with -c option or if stdin used as input. * If the output file name had to be truncated, the original name is kept * in the compressed file. * On MSDOS, file.tmp -> file.tmz. On VMS, file.tmp -> file.tmp-gz. * * Using gz on MSDOS would create too many file name conflicts. For * example, foo.txt -> foo.tgz (.tgz must be reserved as shorthand for * tar.gz). Similarly, foo.dir and foo.doc would both be mapped to foo.dgz. * I also considered 12345678.txt -> 12345txt.gz but this truncates the name * too heavily. There is no ideal solution given the MSDOS 8+3 limitation. * * For the meaning of all compilation flags, see comments in Makefile.in. */#include <ctype.h>#include <sys/types.h>#include <signal.h>#include <sys/stat.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include "tailor.h"#include "gzip.h"#include "lzw.h"#include "revision.h"#include "getopt.h"char *strlwr(char *s); /* configuration */#ifdef NO_TIME_H# include <sys/time.h>#else# include <time.h>#endif#ifndef NO_FCNTL_H# include <fcntl.h>#endif#ifdef HAVE_UNISTD_H# include <unistd.h>#endif#if defined(STDC_HEADERS) || !defined(NO_STDLIB_H)# include <stdlib.h>#else extern int errno;#endif#if defined(DIRENT)# include <dirent.h> typedef struct dirent dir_type;# define NLENGTH(dirent) ((int)strlen((dirent)->d_name))# define DIR_OPT "DIRENT"#else# define NLENGTH(dirent) ((dirent)->d_namlen)# ifdef SYSDIR# include <sys/dir.h> typedef struct direct dir_type;# define DIR_OPT "SYSDIR"# else# ifdef SYSNDIR# include <sys/ndir.h> typedef struct direct dir_type;# define DIR_OPT "SYSNDIR"# else# ifdef NDIR# include <ndir.h> typedef struct direct dir_type;# define DIR_OPT "NDIR"# else# define NO_DIR# define DIR_OPT "NO_DIR"# endif# endif# endif#endif#ifndef NO_UTIME# ifndef NO_UTIME_H# include <utime.h># define TIME_OPT "UTIME"# else# ifdef HAVE_SYS_UTIME_H# include <sys/utime.h># define TIME_OPT "SYS_UTIME"# else struct utimbuf { time_t actime; time_t modtime; };# define TIME_OPT ""# endif# endif#else# define TIME_OPT "NO_UTIME"#endif#if !defined(S_ISDIR) && defined(S_IFDIR)# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)#endif#if !defined(S_ISREG) && defined(S_IFREG)# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)#endiftypedef RETSIGTYPE (*sig_type) OF((int));#ifndef O_BINARY# define O_BINARY 0 /* creation mode for open() */#endif#ifndef O_CREAT /* Pure BSD system? */# include <sys/file.h># ifndef O_CREAT# define O_CREAT FCREAT# endif# ifndef O_EXCL# define O_EXCL FEXCL# endif#endif#ifndef S_IRUSR# define S_IRUSR 0400#endif#ifndef S_IWUSR# define S_IWUSR 0200#endif#define RW_USER (S_IRUSR | S_IWUSR) /* creation mode for open() */#ifndef MAX_PATH_LEN# define MAX_PATH_LEN 1024 /* max pathname length */#endif#ifndef SEEK_END# define SEEK_END 2#endif#ifdef NO_OFF_T typedef long off_t; off_t lseek OF((int fd, off_t offset, int whence));#endif/* Separator for file name parts (see shorten_name()) */#ifdef NO_MULTIPLE_DOTS# define PART_SEP "-"#else# define PART_SEP "."#endif /* global buffers */ DECLARE(uch, inbuf, INBUFSIZ +INBUF_EXTRA);//uch *inbuf;DECLARE(uch, outbuf, OUTBUFSIZ+OUTBUF_EXTRA);DECLARE(ush, d_buf, DIST_BUFSIZE);DECLARE(uch, window, 2L*WSIZE);#ifndef MAXSEG_64K DECLARE(ush, tab_prefix, 1L<<BITS);#else DECLARE(ush, tab_prefix0, 1L<<(BITS-1)); DECLARE(ush, tab_prefix1, 1L<<(BITS-1));#endif /* local variables */int ascii = 0; /* convert end-of-lines to local OS conventions */int to_stdout = 0; /* output to stdout (-c) */int decompress = 0; /* decompress (-d) */int force = 0; /* don't ask questions, compress links (-f) */int no_name = -1; /* don't save or restore the original file name */int no_time = -1; /* don't save or restore the original file time */int recursive = 0; /* recurse through directories (-r) */int list = 0; /* list the file contents (-l) */int verbose = 0; /* be verbose (-v) */int quiet = 0; /* be very quiet (-q) */int do_lzw = 0; /* generate output compatible with old compress (-Z) */int test = 0; /* test .gz file integrity */char *progname; /* program name */int maxbits = BITS; /* max bits per code for LZW */int method = DEFLATED;/* compression method */int level = 6; /* compression level */int exit_code = OK; /* program exit code */int save_orig_name; /* set if original name must be saved */int last_member; /* set for .zip and .Z files */int part_nb; /* number of parts in .gz file */long time_stamp; /* original time stamp (modification time) */long ifile_size; /* input file size, -1 for devices (debug only) */char *env; /* contents of GZIP env variable */char **args = NULL; /* argv pointer if GZIP env variable defined */char z_suffix[MAX_SUFFIX+1]; /* default suffix (can be set with --suffix) */int z_len; /* strlen(z_suffix) */long bytes_in; /* number of input bytes */long bytes_out; /* number of output bytes */long total_in = 0; /* input bytes for all files */long total_out = 0; /* output bytes for all files */char ifname[MAX_PATH_LEN]; /* input file name */char ofname[MAX_PATH_LEN]; /* output file name */int remove_ofname = 0; /* remove output file on error */struct stat istat; /* status for input file */int ifd; /* input file descriptor */int ofd; /* output file descriptor */char *ungzipbuf; int gziplen ;char *gzipbuf;unsigned insize; /* valid bytes in inbuf */unsigned inptr; /* index of next byte to be processed in inbuf *///unsigned outcnt; /* bytes in output buffer */long outcnt; /* bytes in output buffer */long out_len = 0;/* local functions */int ungzip OF((char *, int, char *, long, long *));local int get_method OF(());//local void copy_stat OF((struct stat *ifstat));local void do_exit OF((int exitcode));int (*work) OF((int infile, int outfile)) = zip; /* function to call */#ifndef NO_UTIMElocal void reset_times OF((char *name, struct stat *statb));#endif#define strequ(s1, s2) (strcmp((s1),(s2)) == 0)/* ======================================================================== * Compress or decompress the given file */int ungzip(char *inbuf, int len, char *outbuf, long out_size, long *outlen){ gzipbuf = malloc(MAX_INBUF); memcpy(gzipbuf, inbuf, len); gziplen = len; decompress = 1; part_nb = 0; if (inbuf == NULL) { WARN((stderr, "ungzip is NULL\n")); return NULL_ERR; } if (len <= 0) { WARN((stderr, " len of ungzip is error\n")); return SIZE_ERR; } if (decompress) { method = get_method(); if (method < 0) { WARN((stderr, "method is error\n")); return METHOD_ERR; } } /* Actually do the compression/decompression. Loop over zipped members. */ for (;;) { if (unzip(inbuf, outbuf) != OK) { method = -1; /* force cleanup */ //break; WARN((stderr, "unzip error\n")); return UNZIP_ERR; } if (out_size != out_len) return -1; *outlen = out_len; outlen = &out_len; outcnt = 0; if (!decompress || last_member || inptr == insize) break; bytes_out = 0; /* required for length check */ } free(gzipbuf); return OK;}/* ======================================================================== * Check the magic number of the input file and update ofname if an * original name was given and to_stdout is not set. * Return the compression method, -1 for error, -2 for warning. * Set inptr to the offset of the next byte to be processed. * Updates time_stamp if there is one and --no-time is not used. * This function may be called repeatedly for an input file consisting * of several contiguous gzip'ed members. * IN assertions: there is at least one remaining compressed member.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -