https://github.com/libsdl-org/SDL/commit/7acf78ba92e59d126a0c6895a3fd2a028831334a
From 7acf78ba92e59d126a0c6895a3fd2a028831334a Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Thu, 9 Jan 2025 11:53:54 -0500
Subject: [PATCH] storage: Trim the title storage root from enumerated paths
---
src/storage/generic/SDL_genericstorage.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/storage/generic/SDL_genericstorage.c b/src/storage/generic/SDL_genericstorage.c
index f2a87c03da61c..d8c300c59fc1e 100644
--- a/src/storage/generic/SDL_genericstorage.c
+++ b/src/storage/generic/SDL_genericstorage.c
@@ -44,13 +44,34 @@ static bool GENERIC_CloseStorage(void *userdata)
return true;
}
+typedef struct GenericEnumerateData
+{
+ size_t base_len;
+ SDL_EnumerateDirectoryCallback real_callback;
+ void *real_userdata;
+} GenericEnumerateData;
+
+static SDL_EnumerationResult SDLCALL GENERIC_EnumerateDirectory(void *userdata, const char *dirname, const char *fname)
+{
+ // SDL_EnumerateDirectory will return the full path, so for Storage we
+ // can take the base directory and add its length to the dirname string,
+ // effectively trimming the root without having to strdup anything.
+ GenericEnumerateData *wrap_data = (GenericEnumerateData *)userdata;
+ return wrap_data->real_callback(wrap_data->real_userdata, dirname + wrap_data->base_len, fname);
+}
+
static bool GENERIC_EnumerateStorageDirectory(void *userdata, const char *path, SDL_EnumerateDirectoryCallback callback, void *callback_userdata)
{
bool result = false;
+ GenericEnumerateData wrap_data;
char *fullpath = GENERIC_INTERNAL_CreateFullPath((char *)userdata, path);
if (fullpath) {
- result = SDL_EnumerateDirectory(fullpath, callback, callback_userdata);
+ wrap_data.base_len = SDL_strlen((char *)userdata);
+ wrap_data.real_callback = callback;
+ wrap_data.real_userdata = callback_userdata;
+
+ result = SDL_EnumerateDirectory(fullpath, GENERIC_EnumerateDirectory, &wrap_data);
SDL_free(fullpath);
}