/* * :make compdecomp CFLAGS=-Wall LDFLAGS=-lz */ #include #include #include #define MEM_LIMIT (128*1024*1024) int main(int argc, char *argv[]) { void *pi, *po = NULL; FILE *fi, *fo; int ret, si, so; if (argc != 4) { printf("usage: %s <0|1> \n", argv[0]); return 1; } fi = fopen(argv[2], "rb"); if (fi == NULL) return 2; fseek(fi, 0, SEEK_END); si = ftell(fi); fseek(fi, 0, SEEK_SET); pi = malloc(si); if (pi == NULL) return 3; fread(pi, 1, si, fi); fclose(fi); if (atoi(argv[1])) { // decompress so = si; do { so *= 16; if (so > MEM_LIMIT) return 4; po = realloc(po, so); if (po == NULL) return 5; ret = uncompress(po, (uLongf *) &so, pi, si); } while (ret == Z_BUF_ERROR); } else { // compress so = si + 1024; po = malloc(so); if (po == NULL) return 5; ret = compress2(po, (uLongf *) &so, pi, si, Z_BEST_COMPRESSION); } if (ret == Z_OK) { fo = fopen(argv[3], "wb"); if (fo == NULL) return 6; fwrite(po, 1, so, fo); fclose(fo); } printf("result %i, size %i -> %i\n", ret, si, so); return ret; }