psp bugfixes, tools
[picodrive.git] / tools / compdecomp.c
diff --git a/tools/compdecomp.c b/tools/compdecomp.c
new file mode 100644 (file)
index 0000000..b97d32a
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * :make compdecomp CFLAGS=-Wall LDFLAGS=-lz
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <zlib.h>
+
+#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> <infile> <outfile>\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;
+}
+