📄 zip.c
字号:
/* zip.c -- IO on .zip files using zlib Version 0.15 beta, Mar 19th, 1998, Read zip.h for more info*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "zlib.h"#include "zip.h"#ifdef STDC# include <stddef.h># include <string.h># include <stdlib.h>#endif#ifdef NO_ERRNO_H extern int errno;#else# include <errno.h>#endif#ifndef local# define local static#endif/* compile with -Dlocal if your debugger can't find static symbols */#ifndef VERSIONMADEBY# define VERSIONMADEBY (0x0) /* platform depedent */#endif#ifndef Z_BUFSIZE#define Z_BUFSIZE (16384)#endif#ifndef Z_MAXFILENAMEINZIP#define Z_MAXFILENAMEINZIP (256)#endif#ifndef ALLOC# define ALLOC(size) (malloc(size))#endif#ifndef TRYFREE# define TRYFREE(p) {if (p) free(p);}#endif/*#define SIZECENTRALDIRITEM (0x2e)#define SIZEZIPLOCALHEADER (0x1e)*//* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */#ifndef SEEK_CUR#define SEEK_CUR 1#endif#ifndef SEEK_END#define SEEK_END 2#endif#ifndef SEEK_SET#define SEEK_SET 0#endifconst char zip_copyright[] = " zip 0.15 Copyright 1998 Gilles Vollant ";#define SIZEDATA_INDATABLOCK (4096-(4*4))#define LOCALHEADERMAGIC (0x04034b50)#define CENTRALHEADERMAGIC (0x02014b50)#define ENDHEADERMAGIC (0x06054b50)#define FLAG_LOCALHEADER_OFFSET (0x06)#define CRC_LOCALHEADER_OFFSET (0x0e)#define SIZECENTRALHEADER (0x2e) /* 46 */typedef struct linkedlist_datablock_internal_s{ struct linkedlist_datablock_internal_s* next_datablock; uLong avail_in_this_block; uLong filled_in_this_block; uLong unused; /* for future use and alignement */ unsigned char data[SIZEDATA_INDATABLOCK];} linkedlist_datablock_internal;typedef struct linkedlist_data_s{ linkedlist_datablock_internal* first_block; linkedlist_datablock_internal* last_block;} linkedlist_data;typedef struct{ z_stream stream; /* zLib stream structure for inflate */ int stream_initialised; /* 1 is stream is initialised */ uInt pos_in_buffered_data; /* last written byte in buffered_data */ uLong pos_local_header; /* offset of the local header of the file currenty writing */ char* central_header; /* central header data for the current file */ uLong size_centralheader; /* size of the central header for cur file */ uLong flag; /* flag of the file currently writing */ int method; /* compression method of file currenty wr.*/ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ uLong dosDate; uLong crc32;} curfile_info;typedef struct{ FILE * filezip; linkedlist_data central_dir;/* datablock with central dir in construction*/ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ curfile_info ci; /* info on the file curretly writing */ uLong begin_pos; /* position of the beginning of the zipfile */ uLong number_entry;} zip_internal;local linkedlist_datablock_internal* allocate_new_datablock(){ linkedlist_datablock_internal* ldi; ldi = (linkedlist_datablock_internal*) ALLOC(sizeof(linkedlist_datablock_internal)); if (ldi!=NULL) { ldi->next_datablock = NULL ; ldi->filled_in_this_block = 0 ; ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; } return ldi;}local void free_datablock(ldi) linkedlist_datablock_internal* ldi;{ while (ldi!=NULL) { linkedlist_datablock_internal* ldinext = ldi->next_datablock; TRYFREE(ldi); ldi = ldinext; }}local void init_linkedlist(ll) linkedlist_data* ll;{ ll->first_block = ll->last_block = NULL;}local void free_linkedlist(ll) linkedlist_data* ll;{ free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL;}local int add_data_in_datablock(ll,buf,len) linkedlist_data* ll; const void* buf; uLong len;{ linkedlist_datablock_internal* ldi; const unsigned char* from_copy; if (ll==NULL) return ZIP_INTERNALERROR; if (ll->last_block == NULL) { ll->first_block = ll->last_block = allocate_new_datablock(); if (ll->first_block == NULL) return ZIP_INTERNALERROR; } ldi = ll->last_block; from_copy = (unsigned char*)buf; while (len>0) { uInt copy_this; uInt i; unsigned char* to_copy; if (ldi->avail_in_this_block==0) { ldi->next_datablock = allocate_new_datablock(); if (ldi->next_datablock == NULL) return ZIP_INTERNALERROR; ldi = ldi->next_datablock ; ll->last_block = ldi; } if (ldi->avail_in_this_block < len) copy_this = (uInt)ldi->avail_in_this_block; else copy_this = (uInt)len; to_copy = &(ldi->data[ldi->filled_in_this_block]); for (i=0;i<copy_this;i++) *(to_copy+i)=*(from_copy+i); ldi->filled_in_this_block += copy_this; ldi->avail_in_this_block -= copy_this; from_copy += copy_this ; len -= copy_this; } return ZIP_OK;}local int write_datablock(fout,ll) FILE * fout; linkedlist_data* ll; { linkedlist_datablock_internal* ldi; ldi = ll->first_block; while (ldi!=NULL) { if (ldi->filled_in_this_block > 0) if (fwrite(ldi->data,(uInt)ldi->filled_in_this_block,1,fout)!=1) return ZIP_ERRNO; ldi = ldi->next_datablock; } return ZIP_OK;}/****************************************************************************//* =========================================================================== Outputs a long in LSB order to the given file nbByte == 1, 2 or 4 (byte, short or long)*/local int ziplocal_putValue OF((FILE *file, uLong x, int nbByte));local int ziplocal_putValue (file, x, nbByte) FILE *file; uLong x; int nbByte;{ unsigned char buf[4]; int n; for (n = 0; n < nbByte; n++) { buf[n] = (unsigned char)(x & 0xff); x >>= 8; } if (fwrite(buf,nbByte,1,file)!=1) return ZIP_ERRNO; else return ZIP_OK;}local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));local void ziplocal_putValue_inmemory (dest, x, nbByte) void* dest; uLong x; int nbByte;{ unsigned char* buf=(unsigned char*)dest; int n; for (n = 0; n < nbByte; n++) { buf[n] = (unsigned char)(x & 0xff); x >>= 8; }}/****************************************************************************/local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) tm_zip* ptm; uLong dosDate;{ uLong year = (uLong)ptm->tm_year; if (year>1980) year-=1980; else if (year>80) year-=80; return (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));}/****************************************************************************/extern zipFile ZEXPORT zipOpen (pathname, append) const char *pathname; int append;{ zip_internal ziinit; zip_internal* zi; ziinit.filezip = fopen(pathname,(append == 0) ? "wb" : "ab"); if (ziinit.filezip == NULL) return NULL; ziinit.begin_pos = ftell(ziinit.filezip); ziinit.in_opened_file_inzip = 0; ziinit.ci.stream_initialised = 0; ziinit.number_entry = 0; init_linkedlist(&(ziinit.central_dir)); zi = (zip_internal*)ALLOC(sizeof(zip_internal)); if (zi==NULL) { fclose(ziinit.filezip); return NULL; } *zi = ziinit; return (zipFile)zi;}extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, comment, method, level) zipFile file; const char* filename; const zip_fileinfo* zipfi; const void* extrafield_local; uInt size_extrafield_local; const void* extrafield_global; uInt size_extrafield_global; const char* comment; int method; int level;{ zip_internal* zi; uInt size_filename; uInt size_comment; uInt i; int err = ZIP_OK; if (file == NULL) return ZIP_PARAMERROR; if ((method!=0) && (method!=Z_DEFLATED)) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 1) { err = zipCloseFileInZip (file); if (err != ZIP_OK) return err; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -