?? 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. */#include "bsdebug.h"//#define _DEBUG_GZIP_C_#ifdef DBGPrintfi#undef DBGPrintfi#endif#ifdef DBGPrintfo#undef DBGPrintfo#endif#if defined(_TRACEHELPER_DEBUG_ALL_) #define DBGPrintfi(a) DbgPrintfi a; #define DBGPrintfo(a) DbgPrintfo a;#elif defined(_DEBUG_GZIP_C_) && defined(_TRACEHELPER_DEBUG_EACH_OF_FILE_) #define DBGPrintfi(a) DbgPrintfi a; #define DBGPrintfo(a) DbgPrintfo a;#else #define DBGPrintfi(a) #define DBGPrintfo(a)#endifstatic char *license_msg[] = {" Copyright (C) 1992-1993 Jean-loup Gailly"," This program is free software; you can redistribute it and/or modify"," it under the terms of the GNU General Public License as published by"," the Free Software Foundation; either version 2, or (at your option)"," any later version.",""," This program is distributed in the hope that it will be useful,"," but WITHOUT ANY WARRANTY; without even the implied warranty of"," MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"," GNU General Public License for more details.",""," You should have received a copy of the GNU General Public License"," along with this program; if not, write to the Free Software"," Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.",0};/* 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. */#ifdef RCSIDstatic char rcsid[] = "$Id: gzip.c,v 0.24 1993/06/24 10:52:07 jloup Exp $";#endif#include <ctype.h>#include <sys/types.h>#include <signal.h>#include <sys/stat.h>#include <errno.h>#include "tailor.h"#include "gzip.h"#include "lzw.h"#include "revision.h"#include "getopt.h" /* 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);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 */int foreground; /* set if program run in foreground */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 */unsigned insize; /* valid bytes in inbuf */unsigned inptr; /* index of next byte to be processed in inbuf */unsigned outcnt; /* bytes in output buffer */struct option longopts[] ={ /* { name has_arg *flag val } */ {"ascii", 0, 0, 'a'}, /* ascii text mode */ {"to-stdout", 0, 0, 'c'}, /* write output on standard output */ {"stdout", 0, 0, 'c'}, /* write output on standard output */ {"decompress", 0, 0, 'd'}, /* decompress */ {"uncompress", 0, 0, 'd'}, /* decompress */ /* {"encrypt", 0, 0, 'e'}, encrypt */ {"force", 0, 0, 'f'}, /* force overwrite of output file */ {"help", 0, 0, 'h'}, /* give help */ /* {"pkzip", 0, 0, 'k'}, force output in pkzip format */ {"list", 0, 0, 'l'}, /* list .gz file contents */ {"license", 0, 0, 'L'}, /* display software license */ {"no-name", 0, 0, 'n'}, /* don't save or restore original name & time */ {"name", 0, 0, 'N'}, /* save or restore original name & time */ {"quiet", 0, 0, 'q'}, /* quiet mode */ {"silent", 0, 0, 'q'}, /* quiet mode */ {"recursive", 0, 0, 'r'}, /* recurse through directories */ {"suffix", 1, 0, 'S'}, /* use given suffix instead of .gz */ {"test", 0, 0, 't'}, /* test compressed file integrity */ {"no-time", 0, 0, 'T'}, /* don't save or restore the time stamp */ {"verbose", 0, 0, 'v'}, /* verbose mode */ {"version", 0, 0, 'V'}, /* display version number */ {"fast", 0, 0, '1'}, /* compress faster */ {"best", 0, 0, '9'}, /* compress better */ {"lzw", 0, 0, 'Z'}, /* make output compatible with old compress */ {"bits", 1, 0, 'b'}, /* max number of bits per code (implies -Z) */ { 0, 0, 0, 0 }};/* local functions */local void usage OF((void));local void help OF((void));local void license OF((void));local void version OF((void));local int treat_stdin OF((void));local int treat_file OF((char *iname));local int create_outfile OF((void));local int do_stat OF((char *name, struct stat *sbuf));local char *get_suffix OF((char *name));local int get_istat OF((char *iname, struct stat *sbuf));local int make_ofname OF((void));local int same_file OF((struct stat *stat1, struct stat *stat2));local int name_too_long OF((char *name, struct stat *statb));local int shorten_name OF((char *name));local int get_method OF((int in));local int do_list OF((int ifd, int method));local int check_ofname OF((void));local void copy_stat OF((struct stat *ifstat));local void do_exit OF((int exitcode)); int main OF((int argc, char **argv));int (*work) OF((int infile, int outfile)) = zip; /* function to call */#ifndef NO_DIRlocal void treat_dir OF((char *dir));#endif#ifndef NO_UTIMElocal void reset_times OF((char *name, struct stat *statb));#endif#define strequ(s1, s2) (strcmp((s1),(s2)) == 0)/* ======================================================================== */local void usage(){ DBGPrintfi(("usage(In)\r\n")); { fprintf(stderr, "usage: %s [-%scdfhlLnN%stvV19] [-S suffix] [file ...]\n", progname,#if O_BINARY "a",#else "",#endif#ifdef NO_DIR ""#else "r"#endif ); } DBGPrintfo(("usage(out)\r\n"));}/* ======================================================================== */local void help(){ DBGPrintfi(("help(In)\r\n")); { static char *help_msg[] = {#if O_BINARY " -a --ascii ascii text; convert end-of-lines using local conventions",#endif " -c --stdout write on standard output, keep original files unchanged", " -d --decompress decompress",/* -e --encrypt encrypt */ " -f --force force overwrite of output file and compress links", " -h --help give this help",/* -k --pkzip force output in pkzip format */ " -l --list list compressed file contents", " -L --license display software license",#ifdef UNDOCUMENTED " -m --no-time do not save or restore the original modification time", " -M --time save or restore the original modification time",#endif " -n --no-name do not save or restore the original name and time stamp", " -N --name save or restore the original name and time stamp", " -q --quiet suppress all warnings",#ifndef NO_DIR " -r --recursive operate recursively on directories",#endif " -S .suf --suffix .suf use suffix .suf on compressed files", " -t --test test compressed file integrity", " -v --verbose verbose mode", " -V --version display version number", " -1 --fast compress faster", " -9 --best compress better",#ifdef LZW " -Z --lzw produce output compatible with old compress", " -b --bits maxbits max number of bits per code (implies -Z)",#endif " file... files to (de)compress. If none given, use standard input.", 0}; char **p = help_msg; fprintf(stderr,"%s %s (%s)\n", progname, VERSION, REVDATE); usage(); while (*p) fprintf(stderr, "%s\n", *p++); } DBGPrintfo(("help(out)\r\n"));}/* ======================================================================== */local void license(){ DBGPrintfi(("license(In)\r\n")); { char **p = license_msg; fprintf(stderr,"%s %s (%s)\n", progname, VERSION, REVDATE); while (*p) fprintf(stderr, "%s\n", *p++); } DBGPrintfo(("license(out)\r\n"));}/* ======================================================================== */local void version(){ DBGPrintfi(("version(In)\r\n")); { fprintf(stderr,"%s %s (%s)\n", progname, VERSION, REVDATE); fprintf(stderr, "Compilation options:\n%s %s ", DIR_OPT, TIME_OPT);#ifdef STDC_HEADERS fprintf(stderr, "STDC_HEADERS ");#endif#ifdef HAVE_UNISTD_H fprintf(stderr, "HAVE_UNISTD_H ");#endif#ifdef NO_MEMORY_H fprintf(stderr, "NO_MEMORY_H ");#endif#ifdef NO_STRING_H fprintf(stderr, "NO_STRING_H ");#endif#ifdef NO_SYMLINK fprintf(stderr, "NO_SYMLINK ");#endif#ifdef NO_MULTIPLE_DOTS fprintf(stderr, "NO_MULTIPLE_DOTS ");#endif#ifdef NO_CHOWN fprintf(stderr, "NO_CHOWN ");#endif#ifdef PROTO fprintf(stderr, "PROTO ");#endif#ifdef ASMV fprintf(stderr, "ASMV ");#endif#ifdef DEBUG fprintf(stderr, "DEBUG ");#endif#ifdef DYN_ALLOC fprintf(stderr, "DYN_ALLOC ");#endif#ifdef MAXSEG_64K fprintf(stderr, "MAXSEG_64K");#endif fprintf(stderr, "\n");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -