📄 zip.c
字号:
/* zip.c -- compress files to the gzip or pkzip format * Copyright (C) 1992-1993 Jean-loup Gailly * This is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, see the file COPYING. */#ifdef RCSIDstatic char rcsid[] = "$Id: zip.c,v 0.17 1993/06/10 13:29:25 jloup Exp $";#endif#include <ctype.h>#include <sys/types.h>#include "tailor.h"#include "gzip.h"#include "crypt.h"#include "bsdebug.h"//#define _DEBUG_ZIP_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_ZIP_C_) && defined(_TRACEHELPER_DEBUG_EACH_OF_FILE_) #define DBGPrintfi(a) DbgPrintfi a; #define DBGPrintfo(a) DbgPrintfo a;#else #define DBGPrintfi(a) #define DBGPrintfo(a)#endif#ifdef HAVE_UNISTD_H# include <unistd.h>#endif#ifndef NO_FCNTL_H# include <fcntl.h>#endiflocal ulg crc; /* crc on uncompressed file data */long header_bytes; /* number of bytes in gzip header *//* =========================================================================== * Deflate in to out. * IN assertions: the input and output buffers are cleared. * The variables time_stamp and save_orig_name are initialized. */int zip(in, out) int in, out; /* input and output file descriptors */{ DBGPrintfi(("zip(In)\r\n")); { uch flags = 0; /* general purpose bit flags */ ush attr = 0; /* ascii/binary flag */ ush deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */ ifd = in; ofd = out; outcnt = 0; /* Write the header to the gzip file. See algorithm.doc for the format */ method = DEFLATED; put_byte(GZIP_MAGIC[0]); /* magic header */ put_byte(GZIP_MAGIC[1]); put_byte(DEFLATED); /* compression method */ if (save_orig_name) { flags |= ORIG_NAME; } put_byte(flags); /* general flags */ put_long(time_stamp); /* Write deflated file to zip file */ crc = updcrc(0, 0); bi_init(out); ct_init(&attr, &method); if ( lm_init(level, &deflate_flags) < 0 ) return -1; put_byte((uch)deflate_flags); /* extra flags */ put_byte(OS_CODE); /* OS identifier */ if (save_orig_name) { char *p = basename(ifname); /* Don't save the directory part. */ do { put_char(*p); } while (*p++); } header_bytes = (long)outcnt; // (void)deflate(); if ( gzip_deflate() == -1 ) return -1;#if !defined(NO_SIZE_CHECK) && !defined(RECORD_IO) /* Check input size (but not in VMS -- variable record lengths mess it up) * and not on MSDOS -- diet in TSR mode reports an incorrect file size) */ if (ifile_size != -1L && isize != (ulg)ifile_size) { Trace((stderr, " actual=%ld, read=%ld ", ifile_size, isize)); fprintf(stderr, "%s: %s: file size changed while zipping\n", progname, ifname); }#endif /* Write the crc and uncompressed size */ put_long(crc); put_long(isize); header_bytes += 2*sizeof(long); flush_outbuf(); DBGPrintfo(("zip(out1)\r\n")); return OK; }}extern char *in_buf;extern int in_size;extern int in_rd_count;/* =========================================================================== * Read a new buffer from the current input file, perform end-of-line * translation, and update the crc and input file size. * IN assertion: size >= 2 (for end-of-line translation) */int file_read(buf, size) char *buf; unsigned size;{ DBGPrintfi(("file_read(In)\r\n")); { unsigned len, llen; Assert(insize == 0, "inbuf not empty"); if ( in_size > in_rd_count) llen = in_size - in_rd_count; else llen = 0; if ( llen < size ) size = llen; len = size; memcpy(buf, &in_buf[in_rd_count], size); if (size <= 0) { DBGPrintfo(("file_read(out1)\r\n")); return (int)size; } in_rd_count += len; crc = updcrc((uch*)buf, len); isize += (ulg)len; DBGPrintfo(("file_read(out2)\r\n")); return (int)len; }}#if 0int file_read(buf, size) char *buf; unsigned size;{ DBGPrintfi(("file_read(In)\r\n")); { unsigned len; Assert(insize == 0, "inbuf not empty"); len = read(ifd, buf, size); if (len == (unsigned)(-1) || len == 0) { DBGPrintfo(("file_read(out1)\r\n")); return (int)len; } crc = updcrc((uch*)buf, len); isize += (ulg)len; DBGPrintfo(("file_read(out2)\r\n")); return (int)len; }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -