Mercurial > repos > blastem
comparison system.c @ 2438:bed4d3db8a3f
More flexible loading of Pico storyware assets
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 11 Feb 2024 11:04:39 -0800 |
parents | 65c2e4d990cc |
children | 9da3de58410d |
comparison
equal
deleted
inserted
replaced
2437:79a8cccb6ac1 | 2438:bed4d3db8a3f |
---|---|
3 #include "genesis.h" | 3 #include "genesis.h" |
4 #include "gen_player.h" | 4 #include "gen_player.h" |
5 #include "sms.h" | 5 #include "sms.h" |
6 #include "mediaplayer.h" | 6 #include "mediaplayer.h" |
7 #include "coleco.h" | 7 #include "coleco.h" |
8 #include "paths.h" | |
9 #include "util.h" | |
8 | 10 |
9 uint8_t safe_cmp(char *str, long offset, uint8_t *buffer, long filesize) | 11 uint8_t safe_cmp(char *str, long offset, uint8_t *buffer, long filesize) |
10 { | 12 { |
11 long len = strlen(str); | 13 long len = strlen(str); |
12 return filesize >= offset+len && !memcmp(str, buffer + offset, len); | 14 return filesize >= offset+len && !memcmp(str, buffer + offset, len); |
135 void system_request_exit(system_header *system, uint8_t force_release) | 137 void system_request_exit(system_header *system, uint8_t force_release) |
136 { | 138 { |
137 system->force_release = force_release; | 139 system->force_release = force_release; |
138 system->request_exit(system); | 140 system->request_exit(system); |
139 } | 141 } |
142 | |
143 void* load_media_subfile(const system_media *media, char *path, uint32_t *sizeout) | |
144 { | |
145 char *to_free = NULL; | |
146 void *buffer = NULL; | |
147 uint32_t size = 0; | |
148 if (media->zip) { | |
149 uint32_t i; | |
150 for (i = 0; i < media->zip->num_entries; i++) | |
151 { | |
152 if (!strcasecmp(media->zip->entries[i].name, path)) { | |
153 break; | |
154 } | |
155 } | |
156 if (i < media->zip->num_entries) { | |
157 size_t zsize = media->zip->entries[i].size + 1; | |
158 buffer = zip_read(media->zip, i, &zsize); | |
159 size = zsize; | |
160 if (buffer) { | |
161 ((uint8_t *)buffer)[size] = 0; | |
162 } | |
163 goto end; | |
164 } | |
165 } | |
166 if (!is_absolute_path(path)) { | |
167 to_free = path = path_append(media->dir, path); | |
168 } | |
169 FILE *f = fopen(path, "rb"); | |
170 if (!f) { | |
171 goto end; | |
172 } | |
173 size = file_size(f); | |
174 buffer = calloc(1, size + 1); | |
175 size = fread(buffer, 1, size, f); | |
176 fclose(f); | |
177 | |
178 end: | |
179 if (sizeout) { | |
180 *sizeout = size; | |
181 } | |
182 free(to_free); | |
183 return buffer; | |
184 } |