Mercurial > repos > blastem
annotate zip.c @ 2688:b42f00a3a937 default tip
Fix default target. Ensure m68k.h and z80.h are built before anything else when no dep info is available
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 31 Mar 2025 21:06:18 -0700 |
parents | c4256ce2c45a |
children |
rev | line source |
---|---|
1531
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <stdio.h> |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <stdlib.h> |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #include <stddef.h> |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 #include <string.h> |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 #include "util.h" |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 #include "zip.h" |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 #ifndef DISABLE_ZLIB |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 #include "zlib/zlib.h" |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 #endif |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 static const char cdfd_magic[4] = {'P', 'K', 1, 2}; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 static const char eocd_magic[4] = {'P', 'K', 5, 6}; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 #define MIN_EOCD_SIZE 22 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 #define MIN_CDFD_SIZE 46 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 #define ZIP_MAX_EOCD_OFFSET (64*1024+MIN_EOCD_SIZE) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 enum { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 ZIP_STORE = 0, |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 ZIP_DEFLATE = 8 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 }; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 |
1581
7121daaa48c2
Fix drag and drop when using Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1531
diff
changeset
|
22 zip_file *zip_open(const char *filename) |
1531
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 { |
2681
c4256ce2c45a
Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents:
2346
diff
changeset
|
24 #ifdef __ANDROID__ |
c4256ce2c45a
Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents:
2346
diff
changeset
|
25 FILE *f = fopen_wrapper(filename, "rb"); |
c4256ce2c45a
Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents:
2346
diff
changeset
|
26 #else |
1531
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 FILE *f = fopen(filename, "rb"); |
2681
c4256ce2c45a
Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents:
2346
diff
changeset
|
28 #endif |
1531
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 if (!f) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 return NULL; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 long fsize = file_size(f); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 if (fsize < MIN_EOCD_SIZE) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 //too small to be a zip file |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 goto fail; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 long max_offset = fsize > ZIP_MAX_EOCD_OFFSET ? ZIP_MAX_EOCD_OFFSET : fsize; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 fseek(f, -max_offset, SEEK_END); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 uint8_t *buf = malloc(max_offset); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 if (max_offset != fread(buf, 1, max_offset, f)) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 goto fail; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 long current_offset; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 uint32_t cd_start, cd_size; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 uint16_t cd_count; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 for (current_offset = max_offset - MIN_EOCD_SIZE; current_offset >= 0; current_offset--) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 if (memcmp(eocd_magic, buf + current_offset, sizeof(eocd_magic))) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 continue; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 uint16_t comment_size = buf[current_offset + 20] | buf[current_offset + 21] << 8; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 if (comment_size != (max_offset - current_offset - MIN_EOCD_SIZE)) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 continue; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 cd_start = buf[current_offset + 16] | buf[current_offset + 17] << 8 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 | buf[current_offset + 18] << 16 | buf[current_offset + 19] << 24; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 if (cd_start > (fsize - (max_offset - current_offset))) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 continue; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 cd_size = buf[current_offset + 12] | buf[current_offset + 13] << 8 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 | buf[current_offset + 14] << 16 | buf[current_offset + 15] << 24; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 if ((cd_start + cd_size) > (fsize - (max_offset - current_offset))) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 continue; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 cd_count = buf[current_offset + 10] | buf[current_offset + 11] << 8; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 break; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 free(buf); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 if (current_offset < 0) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 //failed to find EOCD |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 goto fail; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 buf = malloc(cd_size); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 fseek(f, cd_start, SEEK_SET); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 if (cd_size != fread(buf, 1, cd_size, f)) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 goto fail_free; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 zip_entry *entries = calloc(cd_count, sizeof(zip_entry)); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 uint32_t cd_max_last = cd_size - MIN_CDFD_SIZE; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 zip_entry *cur_entry = entries; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 for (uint32_t off = 0; cd_count && off <= cd_max_last; cur_entry++, cd_count--) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 if (memcmp(buf + off, cdfd_magic, sizeof(cdfd_magic))) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 goto fail_entries; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 uint32_t name_length = buf[off + 28] | buf[off + 29] << 8; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 uint32_t extra_length = buf[off + 30] | buf[off + 31] << 8; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 //TODO: verify name length doesn't go past end of CD |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 cur_entry->name = malloc(name_length + 1); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 memcpy(cur_entry->name, buf + off + MIN_CDFD_SIZE, name_length); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 cur_entry->name[name_length] = 0; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 cur_entry->compressed_size = buf[off + 20] | buf[off + 21] << 8 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 | buf[off + 22] << 16 | buf[off + 23] << 24; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 cur_entry->size = buf[off + 24] | buf[off + 25] << 8 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 | buf[off + 26] << 16 | buf[off + 27] << 24; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 cur_entry->local_header_off = buf[off + 42] | buf[off + 43] << 8 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 | buf[off + 44] << 16 | buf[off + 45] << 24; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 cur_entry->compression_method = buf[off + 10] | buf[off + 11] << 8; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 off += name_length + extra_length + MIN_CDFD_SIZE; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 zip_file *z = malloc(sizeof(zip_file)); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 z->entries = entries; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 z->file = f; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 z->num_entries = cur_entry - entries; |
2346
0111c8344477
Fix some issues identified by asan/ubsan
Michael Pavone <pavone@retrodev.com>
parents:
1594
diff
changeset
|
113 free(buf); |
1531
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 return z; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
116 fail_entries: |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 for (cur_entry--; cur_entry >= entries; cur_entry--) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
118 { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
119 free(cur_entry->name); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 free(entries); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 fail_free: |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 free(buf); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
124 fail: |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
125 fclose(f); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 return NULL; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 uint8_t *zip_read(zip_file *f, uint32_t index, size_t *out_size) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 fseek(f->file, f->entries[index].local_header_off + 26, SEEK_SET); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 uint8_t tmp[4]; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 if (sizeof(tmp) != fread(tmp, 1, sizeof(tmp), f->file)) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 return NULL; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
136 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 uint32_t local_variable = (tmp[0] | tmp[1] << 8) + (tmp[2] | tmp[3] << 8); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 fseek(f->file, f->entries[index].local_header_off + local_variable + 30, SEEK_SET); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 size_t int_size; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 if (!out_size) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
142 out_size = &int_size; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 int_size = f->entries[index].size; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
144 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
146 uint8_t *buf = malloc(*out_size); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 if (*out_size > f->entries[index].size) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 *out_size = f->entries[index].size; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 switch(f->entries[index].compression_method) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
151 { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 case ZIP_STORE: |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 if (*out_size != fread(buf, 1, *out_size, f->file)) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
154 free(buf); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
155 return NULL; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
157 break; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
158 #ifndef DISABLE_ZLIB |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
159 case ZIP_DEFLATE: { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
160 //note in unzip.c in zlib/contrib suggests a dummy byte is needed, so we allocate an extra byte here |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
161 uint8_t *src_buf = malloc(f->entries[index].compressed_size + 1); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
162 if (f->entries[index].compressed_size != fread(src_buf, 1, f->entries[index].compressed_size, f->file)) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
163 free(src_buf); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
164 return NULL; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
165 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
166 uLongf destLen = *out_size; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
167 z_stream stream; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
168 memset(&stream, 0, sizeof(stream)); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
169 stream.avail_in = f->entries[index].compressed_size + 1; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
170 stream.next_in = src_buf; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
171 stream.next_out = buf; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
172 stream.avail_out = *out_size; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
173 if (Z_OK == inflateInit2(&stream, -15)) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
174 int result = inflate(&stream, Z_FINISH); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 *out_size = stream.total_out; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
176 free(src_buf); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
177 inflateEnd(&stream); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
178 if (result != Z_OK && result != Z_STREAM_END && result != Z_BUF_ERROR) { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
179 free(buf); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
180 return NULL; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
181 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
182 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
183 break; |
1594
137dbd05ceab
Fix some issues identified by cppcheck
Michael Pavone <pavone@retrodev.com>
parents:
1581
diff
changeset
|
184 } |
1531
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
185 #endif |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 default: |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
187 free(buf); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
188 return NULL; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
189 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
190 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
191 return buf; |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
192 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
193 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
194 void zip_close(zip_file *f) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
195 { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
196 fclose(f->file); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
197 for (uint32_t i = 0; i < f->num_entries; i++) |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
198 { |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
199 free(f->entries[i].name); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
200 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
201 free(f->entries); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
202 free(f); |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
203 } |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
204 |
092675db4f37
Add support for loading ROMs from zip files
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
205 |