From 5fd20cc95552747117eeed503236fa143b866108 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 22 Mar 2018 10:39:31 -0700 Subject: [PATCH] Fix lovr.filesystem.setRequirePath; --- src/api/filesystem.c | 8 +------- src/filesystem/filesystem.c | 37 ++++++++++++++++++++++++------------- src/filesystem/filesystem.h | 7 +++---- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/api/filesystem.c b/src/api/filesystem.c index b4a71ba5..fb8fbb47 100644 --- a/src/api/filesystem.c +++ b/src/api/filesystem.c @@ -290,13 +290,7 @@ int l_lovrFilesystemSetIdentity(lua_State* L) { } int l_lovrFilesystemSetRequirePath(lua_State* L) { - char* requirePath = strdup(luaL_checkstring(L, 1)); - char* pattern; - lovrFilesystemClearRequirePath(); - while ((pattern = strsep(&requirePath, ";")) != NULL) { - lovrFilesystemAddRequirePath(pattern); - } - free(requirePath); + lovrFilesystemSetRequirePath(luaL_checkstring(L, 1)); return 0; } diff --git a/src/filesystem/filesystem.c b/src/filesystem/filesystem.c index 9f5e4114..724cf430 100644 --- a/src/filesystem/filesystem.c +++ b/src/filesystem/filesystem.c @@ -31,9 +31,8 @@ void lovrFilesystemInit(const char* arg0, const char* arg1) { state.source = malloc(LOVR_PATH_MAX * sizeof(char)); state.identity = NULL; state.isFused = true; - vec_init(&state.requirePath); - vec_push(&state.requirePath, "?.lua"); - vec_push(&state.requirePath, "?/init.lua"); + vec_init(&state.requirePatterns); + lovrFilesystemSetRequirePath("?.lua;?/init.lua"); // Try to mount either an archive fused to the executable or an archive from the command line lovrFilesystemGetExecutablePath(state.source, LOVR_PATH_MAX); @@ -57,19 +56,12 @@ void lovrFilesystemDestroy() { free(state.source); free(state.savePathFull); free(state.savePathRelative); - vec_deinit(&state.requirePath); + free(state.requirePath); + vec_deinit(&state.requirePatterns); PHYSFS_deinit(); memset(&state, 0, sizeof(FilesystemState)); } -void lovrFilesystemAddRequirePath(const char* path) { - vec_push(&state.requirePath, (char*) path); -} - -void lovrFilesystemClearRequirePath() { - vec_clear(&state.requirePath); -} - int lovrFilesystemCreateDirectory(const char* path) { return !PHYSFS_mkdir(path); } @@ -145,7 +137,7 @@ const char* lovrFilesystemGetRealDirectory(const char* path) { } vec_str_t* lovrFilesystemGetRequirePath() { - return &state.requirePath; + return &state.requirePatterns; } const char* lovrFilesystemGetSaveDirectory() { @@ -286,6 +278,25 @@ int lovrFilesystemSetIdentity(const char* identity) { return 0; } +void lovrFilesystemSetRequirePath(const char* requirePath) { + if (state.requirePath) { + free(state.requirePath); + vec_clear(&state.requirePatterns); + } + + state.requirePath = strdup(requirePath); + char* p = state.requirePath; + + while (1) { + vec_push(&state.requirePatterns, p); + if ((p = strchr(p, ';')) != NULL) { + *p++ = '\0'; + } else { + break; + } + } +} + int lovrFilesystemUnmount(const char* path) { return !PHYSFS_unmount(path); } diff --git a/src/filesystem/filesystem.h b/src/filesystem/filesystem.h index eeae7570..d0edf5e2 100644 --- a/src/filesystem/filesystem.h +++ b/src/filesystem/filesystem.h @@ -15,13 +15,12 @@ typedef struct { char* savePathRelative; char* savePathFull; bool isFused; - vec_str_t requirePath; + char* requirePath; + vec_str_t requirePatterns; } FilesystemState; void lovrFilesystemInit(const char* arg0, const char* arg1); void lovrFilesystemDestroy(); -void lovrFilesystemAddRequirePath(const char* path); -void lovrFilesystemClearRequirePath(); int lovrFilesystemCreateDirectory(const char* path); int lovrFilesystemGetAppdataDirectory(char* dest, unsigned int size); void lovrFilesystemGetDirectoryItems(const char* path, getDirectoryItemsCallback callback, void* userdata); @@ -42,6 +41,6 @@ int lovrFilesystemMount(const char* path, const char* mountpoint, bool append); void* lovrFilesystemRead(const char* path, size_t* bytesRead); int lovrFilesystemRemove(const char* path); int lovrFilesystemSetIdentity(const char* identity); -int lovrFilesystemSetSource(const char* source); +void lovrFilesystemSetRequirePath(const char* requirePath); int lovrFilesystemUnmount(const char* path); size_t lovrFilesystemWrite(const char* path, const char* content, size_t size, bool append);