⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gzip.c

📁 GZip Compress Souce Code
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 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 + -