OSDN Git Service

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