From 2aff8adc1dcd1315877fdb4ac4ef5e649c5b7d11 Mon Sep 17 00:00:00 2001 From: Riku Viitanen <riku.viitanen@protonmail.com> Date: Sat, 10 Feb 2024 21:23:33 +0200 Subject: [PATCH 1/2] romfile: implement a generic loader romfile_loadfile_g: Based on romfile_loadfile but more flexible. User has to supply pointer to a malloc function and the number of trailing padding bytes. Thus, any memory region may be used. romfile_loadfile: It is now a wrapper around romfile_loadfile_g. Functionality is the same. Signed-off-by: Riku Viitanen <riku.viitanen@protonmail.com> --- src/romfile.c | 25 ++++++++++++++++++++----- src/romfile.h | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/romfile.c b/src/romfile.c index b598274e..8bf95713 100644 --- a/src/romfile.c +++ b/src/romfile.c @@ -47,10 +47,12 @@ romfile_find(const char *name) return __romfile_findprefix(name, strlen(name) + 1, NULL); } -// Helper function to find, malloc_tmphigh, and copy a romfile. This -// function adds a trailing zero to the malloc'd copy. +// Generic function to find romfile, malloc (using provided function +// pointer), and copy a romfile. add_len specifies how many additional +// trailing bytes to reserve. The extra bytes will not be initialised. void * -romfile_loadfile(const char *name, int *psize) +romfile_loadfile_g(const char *name, int *psize, + void *(*malloc_fn)(), int add_len) { struct romfile_s *file = romfile_find(name); if (!file) @@ -60,7 +62,7 @@ romfile_loadfile(const char *name, int *psize) if (!filesize) return NULL; - char *data = malloc_tmphigh(filesize+1); + char *data = malloc_fn(filesize+add_len); if (!data) { warn_noalloc(); return NULL; @@ -74,7 +76,20 @@ romfile_loadfile(const char *name, int *psize) } if (psize) *psize = filesize; - data[filesize] = '\0'; + + return data; +} + +// Helper function to find, malloc_tmphigh, and copy a romfile. This +// function adds a trailing zero to the malloc'd copy. +void * +romfile_loadfile(const char *name, int *psize) +{ + char *data = romfile_loadfile_g(name, psize, &malloc_tmphigh, 1); + if (!data) + return NULL; + + data[*psize] = '\0'; return data; } diff --git a/src/romfile.h b/src/romfile.h index 3e0f8200..a320a5bc 100644 --- a/src/romfile.h +++ b/src/romfile.h @@ -13,6 +13,8 @@ struct romfile_s { void romfile_add(struct romfile_s *file); struct romfile_s *romfile_findprefix(const char *prefix, struct romfile_s *prev); struct romfile_s *romfile_find(const char *name); +void *romfile_loadfile_g(const char *name, int *psize, + void *(*malloc_fn)(), int add_len); void *romfile_loadfile(const char *name, int *psize); u64 romfile_loadint(const char *name, u64 defval); -- 2.43.0