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 }