zipfile.c
来自「Android 一些工具」· C语言 代码 · 共 161 行
C
161 行
#include <zipfile/zipfile.h>#include "private.h"#include <stdlib.h>#include <string.h>#include <zlib.h>#define DEF_MEM_LEVEL 8 // normally in zutil.h?zipfile_tinit_zipfile(const void* data, size_t size){ int err; Zipfile *file = malloc(sizeof(Zipfile)); if (file == NULL) return NULL; memset(file, 0, sizeof(Zipfile)); file->buf = data; file->bufsize = size; err = read_central_dir(file); if (err != 0) goto fail; return file;fail: free(file); return NULL;}voidrelease_zipfile(zipfile_t f){ Zipfile* file = (Zipfile*)f; Zipentry* entry = file->entries; while (entry) { Zipentry* next = entry->next; free(entry); entry = next; } free(file);}zipentry_tlookup_zipentry(zipfile_t f, const char* entryName){ Zipfile* file = (Zipfile*)f; Zipentry* entry = file->entries; while (entry) { if (0 == memcmp(entryName, entry->fileName, entry->fileNameLength)) { return entry; } entry = entry->next; } return NULL;}size_tget_zipentry_size(zipentry_t entry){ return ((Zipentry*)entry)->uncompressedSize;}char*get_zipentry_name(zipentry_t entry){ Zipentry* e = (Zipentry*)entry; int l = e->fileNameLength; char* s = malloc(l+1); memcpy(s, e->fileName, l); s[l] = '\0'; return s;}enum { STORED = 0, DEFLATED = 8};static intuninflate(unsigned char* out, int unlen, const unsigned char* in, int clen){ z_stream zstream; unsigned long crc; int err = 0; int zerr; memset(&zstream, 0, sizeof(zstream)); zstream.zalloc = Z_NULL; zstream.zfree = Z_NULL; zstream.opaque = Z_NULL; zstream.next_in = (void*)in; zstream.avail_in = unlen; zstream.next_out = (Bytef*) out; zstream.avail_out = unlen; zstream.data_type = Z_UNKNOWN; // Use the undocumented "negative window bits" feature to tell zlib // that there's no zlib header waiting for it. zerr = inflateInit2(&zstream, -MAX_WBITS); if (zerr != Z_OK) { return -1; } // uncompress the data zerr = inflate(&zstream, Z_FINISH); if (zerr != Z_STREAM_END) { fprintf(stderr, "zerr=%d Z_STREAM_END=%d total_out=%lu\n", zerr, Z_STREAM_END, zstream.total_out); err = -1; } inflateEnd(&zstream); return err;}intdecompress_zipentry(zipentry_t e, void* buf, int bufsize){ Zipentry* entry = (Zipentry*)e; switch (entry->compressionMethod) { case STORED: memcpy(buf, entry->data, entry->uncompressedSize); return 0; case DEFLATED: return uninflate(buf, bufsize, entry->data, entry->compressedSize); default: return -1; }}voiddump_zipfile(FILE* to, zipfile_t file){ Zipfile* zip = (Zipfile*)file; Zipentry* entry = zip->entries; int i; fprintf(to, "entryCount=%d\n", zip->entryCount); for (i=0; i<zip->entryCount; i++) { fprintf(to, " file \""); fwrite(entry->fileName, entry->fileNameLength, 1, to); fprintf(to, "\"\n"); entry = entry->next; }}zipentry_titerate_zipfile(zipfile_t file, void** cookie){ Zipentry* entry = (Zipentry*)*cookie; if (entry == NULL) { Zipfile* zip = (Zipfile*)file; *cookie = zip->entries; return *cookie; } else { entry = entry->next; *cookie = entry; return entry; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?