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

📄 gzip.c

📁 tftp client sorser code,Please download it and compolie it ,byebye
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -