From aa99b2e1d31413fb9ff9af452912a77e3d5d8abf Mon Sep 17 00:00:00 2001 From: Alexander Arkhipov <119879895+drjfaust@users.noreply.github.com> Date: Wed, 26 Apr 2023 17:45:36 +0300 Subject: [PATCH] Convert file paths to correct case (#214) --- src/platform_compat.cc | 61 ++++++++++++++++++++++++++++++++++++++++++ src/platform_compat.h | 1 + 2 files changed, 62 insertions(+) diff --git a/src/platform_compat.cc b/src/platform_compat.cc index b629fb6..e47e974 100644 --- a/src/platform_compat.cc +++ b/src/platform_compat.cc @@ -12,6 +12,7 @@ #include #include #else +#include #include #include #endif @@ -204,6 +205,7 @@ int compat_mkdir(const char* path) char nativePath[COMPAT_MAX_PATH]; strcpy(nativePath, path); compat_windows_path_to_native(nativePath); + compat_resolve_path(nativePath); #ifdef _WIN32 return mkdir(nativePath); @@ -228,6 +230,7 @@ FILE* compat_fopen(const char* path, const char* mode) char nativePath[COMPAT_MAX_PATH]; strcpy(nativePath, path); compat_windows_path_to_native(nativePath); + compat_resolve_path(nativePath); return fopen(nativePath, mode); } @@ -236,6 +239,7 @@ gzFile compat_gzopen(const char* path, const char* mode) char nativePath[COMPAT_MAX_PATH]; strcpy(nativePath, path); compat_windows_path_to_native(nativePath); + compat_resolve_path(nativePath); return gzopen(nativePath, mode); } @@ -274,6 +278,7 @@ int compat_remove(const char* path) char nativePath[COMPAT_MAX_PATH]; strcpy(nativePath, path); compat_windows_path_to_native(nativePath); + compat_resolve_path(nativePath); return remove(nativePath); } @@ -282,10 +287,12 @@ int compat_rename(const char* oldFileName, const char* newFileName) char nativeOldFileName[COMPAT_MAX_PATH]; strcpy(nativeOldFileName, oldFileName); compat_windows_path_to_native(nativeOldFileName); + compat_resolve_path(nativeOldFileName); char nativeNewFileName[COMPAT_MAX_PATH]; strcpy(nativeNewFileName, newFileName); compat_windows_path_to_native(nativeNewFileName); + compat_resolve_path(nativeNewFileName); return rename(nativeOldFileName, nativeNewFileName); } @@ -303,6 +310,60 @@ void compat_windows_path_to_native(char* path) #endif } +void compat_resolve_path(char* path) +{ +#ifndef _WIN32 + char* pch = path; + + DIR *dir; + if (pch[0] == '/') { + dir = opendir("/"); + pch++; + } else { + dir = opendir("."); + } + + while (dir != NULL) { + char* sep = strchr(pch, '/'); + size_t length; + if (sep != NULL) { + length = sep - pch; + } else { + length = strlen(pch); + } + + bool found = false; + + struct dirent* entry = readdir(dir); + while (entry != NULL) { + if (strlen(entry->d_name) == length && compat_strnicmp(pch, entry->d_name, length) == 0) { + strncpy(pch, entry->d_name, length); + found = true; + break; + } + entry = readdir(dir); + } + + closedir(dir); + dir = NULL; + + if (!found) { + break; + } + + if (sep == NULL) { + break; + } + + *sep = '\0'; + dir = opendir(path); + *sep = '/'; + + pch = sep + 1; + } +#endif +} + char* compat_strdup(const char* string) { return SDL_strdup(string); diff --git a/src/platform_compat.h b/src/platform_compat.h index 9fb7574..345a500 100644 --- a/src/platform_compat.h +++ b/src/platform_compat.h @@ -40,6 +40,7 @@ char* compat_gzgets(gzFile stream, char* buffer, int maxCount); int compat_remove(const char* path); int compat_rename(const char* oldFileName, const char* newFileName); void compat_windows_path_to_native(char* path); +void compat_resolve_path(char* path); char* compat_strdup(const char* string); long getFileSize(FILE* stream);