Mercurial > repos > blastem
diff 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 |
line wrap: on
line diff
--- a/system.c Sat Feb 10 17:46:30 2024 -0800 +++ b/system.c Sun Feb 11 11:04:39 2024 -0800 @@ -5,6 +5,8 @@ #include "sms.h" #include "mediaplayer.h" #include "coleco.h" +#include "paths.h" +#include "util.h" uint8_t safe_cmp(char *str, long offset, uint8_t *buffer, long filesize) { @@ -137,3 +139,46 @@ system->force_release = force_release; system->request_exit(system); } + +void* load_media_subfile(const system_media *media, char *path, uint32_t *sizeout) +{ + char *to_free = NULL; + void *buffer = NULL; + uint32_t size = 0; + if (media->zip) { + uint32_t i; + for (i = 0; i < media->zip->num_entries; i++) + { + if (!strcasecmp(media->zip->entries[i].name, path)) { + break; + } + } + if (i < media->zip->num_entries) { + size_t zsize = media->zip->entries[i].size + 1; + buffer = zip_read(media->zip, i, &zsize); + size = zsize; + if (buffer) { + ((uint8_t *)buffer)[size] = 0; + } + goto end; + } + } + if (!is_absolute_path(path)) { + to_free = path = path_append(media->dir, path); + } + FILE *f = fopen(path, "rb"); + if (!f) { + goto end; + } + size = file_size(f); + buffer = calloc(1, size + 1); + size = fread(buffer, 1, size, f); + fclose(f); + +end: + if (sizeout) { + *sizeout = size; + } + free(to_free); + return buffer; +}