diff --git a/src/filesystem/cocoa/SDL_sysfilesystem.m b/src/filesystem/cocoa/SDL_sysfilesystem.m index ba9efe8d4..3e84681a0 100644 --- a/src/filesystem/cocoa/SDL_sysfilesystem.m +++ b/src/filesystem/cocoa/SDL_sysfilesystem.m @@ -71,8 +71,15 @@ char * SDL_GetPrefPath(const char *org, const char *app) { @autoreleasepool { - char *retval = NULL; + if (!app) { + SDL_InvalidParamError("app"); + return NULL; + } + if (!org) { + org = ""; + } + char *retval = NULL; NSArray *array = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); if ([array count] > 0) { /* we only want the first item in the list. */ @@ -85,7 +92,11 @@ SDL_GetPrefPath(const char *org, const char *app) SDL_OutOfMemory(); } else { char *ptr; - SDL_snprintf(retval, len, "%s/%s/%s/", base, org, app); + if (*org) { + SDL_snprintf(retval, len, "%s/%s/%s/", base, org, app); + } else { + SDL_snprintf(retval, len, "%s/%s/", base, app); + } for (ptr = retval+1; *ptr; ptr++) { if (*ptr == '/') { *ptr = '\0'; diff --git a/src/filesystem/emscripten/SDL_sysfilesystem.c b/src/filesystem/emscripten/SDL_sysfilesystem.c index 8a2228fb0..14b542453 100644 --- a/src/filesystem/emscripten/SDL_sysfilesystem.c +++ b/src/filesystem/emscripten/SDL_sysfilesystem.c @@ -46,6 +46,14 @@ SDL_GetPrefPath(const char *org, const char *app) char *retval; size_t len = 0; + if (!app) { + SDL_InvalidParamError("app"); + return NULL; + } + if (!org) { + org = ""; + } + len = SDL_strlen(append) + SDL_strlen(org) + SDL_strlen(app) + 3; retval = (char *) SDL_malloc(len); if (!retval) { @@ -53,7 +61,11 @@ SDL_GetPrefPath(const char *org, const char *app) return NULL; } - SDL_snprintf(retval, len, "%s%s/%s/", append, org, app); + if (*org) { + SDL_snprintf(retval, len, "%s%s/%s/", append, org, app); + } else { + SDL_snprintf(retval, len, "%s%s/", append, app); + } if (mkdir(retval, 0700) != 0 && errno != EEXIST) { SDL_SetError("Couldn't create directory '%s': '%s'", retval, strerror(errno)); diff --git a/src/filesystem/haiku/SDL_sysfilesystem.cc b/src/filesystem/haiku/SDL_sysfilesystem.cc index 3e9436989..090c808ea 100644 --- a/src/filesystem/haiku/SDL_sysfilesystem.cc +++ b/src/filesystem/haiku/SDL_sysfilesystem.cc @@ -77,6 +77,15 @@ SDL_GetPrefPath(const char *org, const char *app) const char *home = SDL_getenv("HOME"); const char *append = "/config/settings/"; size_t len = SDL_strlen(home); + + if (!app) { + SDL_InvalidParamError("app"); + return NULL; + } + if (!org) { + org = ""; + } + if (!len || (home[len - 1] == '/')) { ++append; // home empty or ends with separator, skip the one from append } @@ -85,7 +94,11 @@ SDL_GetPrefPath(const char *org, const char *app) if (!retval) { SDL_OutOfMemory(); } else { - SDL_snprintf(retval, len, "%s%s%s/%s/", home, append, org, app); + if (*org) { + SDL_snprintf(retval, len, "%s%s%s/%s/", home, append, org, app); + } else { + SDL_snprintf(retval, len, "%s%s%s/", home, append, app); + } create_directory(retval, 0700); // Haiku api: creates missing dirs } diff --git a/src/filesystem/nacl/SDL_sysfilesystem.c b/src/filesystem/nacl/SDL_sysfilesystem.c index 12e0ee35d..767ef9a4e 100644 --- a/src/filesystem/nacl/SDL_sysfilesystem.c +++ b/src/filesystem/nacl/SDL_sysfilesystem.c @@ -40,3 +40,4 @@ SDL_GetPrefPath(const char *org, const char *app) #endif /* SDL_FILESYSTEM_NACL */ +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/filesystem/unix/SDL_sysfilesystem.c b/src/filesystem/unix/SDL_sysfilesystem.c index 69f8febd7..2db83ee47 100644 --- a/src/filesystem/unix/SDL_sysfilesystem.c +++ b/src/filesystem/unix/SDL_sysfilesystem.c @@ -180,6 +180,14 @@ SDL_GetPrefPath(const char *org, const char *app) char *ptr = NULL; size_t len = 0; + if (!app) { + SDL_InvalidParamError("app"); + return NULL; + } + if (!org) { + org = ""; + } + if (!envr) { /* You end up with "$HOME/.local/share/Game Name 2" */ envr = SDL_getenv("HOME"); @@ -204,7 +212,11 @@ SDL_GetPrefPath(const char *org, const char *app) return NULL; } - SDL_snprintf(retval, len, "%s%s%s/%s/", envr, append, org, app); + if (*org) { + SDL_snprintf(retval, len, "%s%s%s/%s/", envr, append, org, app); + } else { + SDL_snprintf(retval, len, "%s%s%s/", envr, append, app); + } for (ptr = retval+1; *ptr; ptr++) { if (*ptr == '/') { diff --git a/src/filesystem/windows/SDL_sysfilesystem.c b/src/filesystem/windows/SDL_sysfilesystem.c index b74290efe..1a9514a1c 100644 --- a/src/filesystem/windows/SDL_sysfilesystem.c +++ b/src/filesystem/windows/SDL_sysfilesystem.c @@ -118,6 +118,14 @@ SDL_GetPrefPath(const char *org, const char *app) size_t new_wpath_len = 0; BOOL api_result = FALSE; + if (!app) { + SDL_InvalidParamError("app"); + return NULL; + } + if (!org) { + org = ""; + } + if (!SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path))) { WIN_SetError("Couldn't locate our prefpath"); return NULL; @@ -145,8 +153,10 @@ SDL_GetPrefPath(const char *org, const char *app) return NULL; } - lstrcatW(path, L"\\"); - lstrcatW(path, worg); + if (*worg) { + lstrcatW(path, L"\\"); + lstrcatW(path, worg); + } SDL_free(worg); api_result = CreateDirectoryW(path, NULL); diff --git a/src/filesystem/winrt/SDL_sysfilesystem.cpp b/src/filesystem/winrt/SDL_sysfilesystem.cpp index 880fcbc24..4afc96a1d 100644 --- a/src/filesystem/winrt/SDL_sysfilesystem.cpp +++ b/src/filesystem/winrt/SDL_sysfilesystem.cpp @@ -152,6 +152,14 @@ SDL_GetPrefPath(const char *org, const char *app) size_t new_wpath_len = 0; BOOL api_result = FALSE; + if (!app) { + SDL_InvalidParamError("app"); + return NULL; + } + if (!org) { + org = ""; + } + srcPath = SDL_WinRTGetFSPathUNICODE(SDL_WINRT_PATH_LOCAL_FOLDER); if ( ! srcPath) { SDL_SetError("Unable to find a source path"); @@ -186,9 +194,11 @@ SDL_GetPrefPath(const char *org, const char *app) return NULL; } - SDL_wcslcat(path, L"\\", new_wpath_len + 1); - SDL_wcslcat(path, worg, new_wpath_len + 1); - SDL_free(worg); + if (*worg) { + SDL_wcslcat(path, L"\\", new_wpath_len + 1); + SDL_wcslcat(path, worg, new_wpath_len + 1); + SDL_free(worg); + } api_result = CreateDirectoryW(path, NULL); if (api_result == FALSE) { @@ -219,3 +229,5 @@ SDL_GetPrefPath(const char *org, const char *app) } #endif /* __WINRT__ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/test/testfilesystem.c b/test/testfilesystem.c index 6d6eab4db..e8a3b3c36 100644 --- a/test/testfilesystem.c +++ b/test/testfilesystem.c @@ -46,6 +46,15 @@ main(int argc, char *argv[]) SDL_Log("pref path: '%s'\n", pref_path); SDL_free(pref_path); + pref_path = SDL_GetPrefPath(NULL, "testfilesystem"); + if(pref_path == NULL){ + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't find pref path without organization: %s\n", + SDL_GetError()); + return 1; + } + SDL_Log("pref path: '%s'\n", pref_path); + SDL_free(pref_path); + SDL_Quit(); return 0; }