test_zipfile.c revision 62188564fab23418373295d9f4a942c3094a9f46
1#include <zipfile/zipfile.h>
2#include <string.h>
3#include <stdio.h>
4#include <stdlib.h>
5
6void dump_zipfile(FILE* to, zipfile_t file);
7
8int
9main(int argc, char** argv)
10{
11    FILE* f;
12    size_t size, unsize;
13    void* buf;
14    void* scratch;
15    zipfile_t zip;
16    zipentry_t entry;
17    int err;
18    enum { HUH, LIST, UNZIP } what = HUH;
19
20    if (strcmp(argv[2], "-l") == 0 && argc == 3) {
21        what = LIST;
22    }
23    else if (strcmp(argv[2], "-u") == 0 && argc == 5) {
24        what = UNZIP;
25    }
26    else {
27        fprintf(stderr, "usage: test_zipfile ZIPFILE -l\n"
28                        "          lists the files in the zipfile\n"
29                        "       test_zipfile ZIPFILE -u FILENAME SAVETO\n"
30                        "          saves FILENAME from the zip file into SAVETO\n");
31        return 1;
32    }
33
34    f = fopen(argv[1], "r");
35    if (f == NULL) {
36        fprintf(stderr, "couldn't open %s\n", argv[1]);
37        return 1;
38    }
39
40    fseek(f, 0, SEEK_END);
41    size = ftell(f);
42    rewind(f);
43
44    buf = malloc(size);
45    fread(buf, 1, size, f);
46
47    zip = init_zipfile(buf, size);
48    if (zip == NULL) {
49        fprintf(stderr, "inti_zipfile failed\n");
50        return 1;
51    }
52
53    fclose(f);
54
55
56    switch (what)
57    {
58        case HUH:
59            break;
60        case LIST:
61            dump_zipfile(stdout, zip);
62            break;
63        case UNZIP:
64            entry = lookup_zipentry(zip, argv[3]);
65            if (entry == NULL) {
66                fprintf(stderr, "zip file '%s' does not contain file '%s'\n",
67                                argv[1], argv[1]);
68                return 1;
69            }
70            f = fopen(argv[4], "w");
71            if (f == NULL) {
72                fprintf(stderr, "can't open file for writing '%s'\n", argv[4]);
73                return 1;
74            }
75            unsize = get_zipentry_size(entry);
76            size = unsize * 1.001;
77            scratch = malloc(size);
78            printf("scratch=%p\n", scratch);
79            err = decompress_zipentry(entry, scratch, size);
80            if (err != 0) {
81                fprintf(stderr, "error decompressing file\n");
82                return 1;
83            }
84            fwrite(scratch, unsize, 1, f);
85            free(scratch);
86            fclose(f);
87            break;
88    }
89
90    free(buf);
91
92    return 0;
93}
94
95