This is done by hacking awesome miniz library and layering functions on top of the miniz v1.15 API.
It was the reason, why I decided to write zip module on top of the miniz. It required a little bit hacking and wrapping some functions, but I kept simplicity. So, you can grab these 3 files and compile them into your project. I hope that interface is also extremely simple, so you will not have any problems to understand it.
struct zip_t *zip = zip_open("foo.zip", ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); { zip_entry_open(zip, "foo-1.txt"); { char *buf = "Some data here..."; zip_entry_write(zip, buf, strlen(buf)); } zip_entry_close(zip); zip_entry_open(zip, "foo-2.txt"); { // merge 3 files into one entry and compress them on-the-fly. zip_entry_fwrite(zip, "foo-2.1.txt"); zip_entry_fwrite(zip, "foo-2.2.txt"); zip_entry_fwrite(zip, "foo-2.3.txt"); } zip_entry_close(zip); } zip_close(zip);
struct zip_t *zip = zip_open("foo.zip", ZIP_DEFAULT_COMPRESSION_LEVEL, 'a'); { zip_entry_open(zip, "foo-3.txt"); { char *buf = "Append some data here..."; zip_entry_write(zip, buf, strlen(buf)); } zip_entry_close(zip); } zip_close(zip);
int on_extract_entry(const char *filename, void *arg) { static int i = 0; int n = *(int *)arg; printf("Extracted: %s (%d of %d)\n", filename, ++i, n); return 0; } int arg = 2; zip_extract("foo.zip", "/tmp", on_extract_entry, &arg);
void *buf = NULL; size_t bufsize; struct zip_t *zip = zip_open("foo.zip", 0, 'r'); { zip_entry_open(zip, "foo-1.txt"); { zip_entry_read(zip, &buf, &bufsize); } zip_entry_close(zip); } zip_close(zip); free(buf);
struct buffer_t { char *data; size_t size; }; static size_t on_extract(void *arg, unsigned long long offset, const void *data, size_t size) { struct buffer_t *buf = (struct buffer_t *)arg; buf->data = realloc(buf->data, buf->size + size + 1); assert(NULL != buf->data); memcpy(&(buf->data[buf->size]), data, size); buf->size += size; buf->data[buf->size] = 0; return size; } struct buffer_t buf = {0}; struct zip_t *zip = zip_open("foo.zip", 0, 'r'); { zip_entry_open(zip, "foo-1.txt"); { zip_entry_extract(zip, on_extract, &buf); } zip_entry_close(zip); } zip_close(zip); free(buf.data);
struct zip_t *zip = zip_open("foo.zip", 0, 'r'); { zip_entry_open(zip, "foo-2.txt"); { zip_entry_fread(zip, "foo-2.txt"); } zip_entry_close(zip); } zip_close(zip);