Convert file paths to correct case (#214)

This commit is contained in:
Alexander Arkhipov 2023-04-26 17:45:36 +03:00 committed by GitHub
parent 63d8300c61
commit aa99b2e1d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 0 deletions

View File

@ -12,6 +12,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <dirent.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#endif #endif
@ -204,6 +205,7 @@ int compat_mkdir(const char* path)
char nativePath[COMPAT_MAX_PATH]; char nativePath[COMPAT_MAX_PATH];
strcpy(nativePath, path); strcpy(nativePath, path);
compat_windows_path_to_native(nativePath); compat_windows_path_to_native(nativePath);
compat_resolve_path(nativePath);
#ifdef _WIN32 #ifdef _WIN32
return mkdir(nativePath); return mkdir(nativePath);
@ -228,6 +230,7 @@ FILE* compat_fopen(const char* path, const char* mode)
char nativePath[COMPAT_MAX_PATH]; char nativePath[COMPAT_MAX_PATH];
strcpy(nativePath, path); strcpy(nativePath, path);
compat_windows_path_to_native(nativePath); compat_windows_path_to_native(nativePath);
compat_resolve_path(nativePath);
return fopen(nativePath, mode); return fopen(nativePath, mode);
} }
@ -236,6 +239,7 @@ gzFile compat_gzopen(const char* path, const char* mode)
char nativePath[COMPAT_MAX_PATH]; char nativePath[COMPAT_MAX_PATH];
strcpy(nativePath, path); strcpy(nativePath, path);
compat_windows_path_to_native(nativePath); compat_windows_path_to_native(nativePath);
compat_resolve_path(nativePath);
return gzopen(nativePath, mode); return gzopen(nativePath, mode);
} }
@ -274,6 +278,7 @@ int compat_remove(const char* path)
char nativePath[COMPAT_MAX_PATH]; char nativePath[COMPAT_MAX_PATH];
strcpy(nativePath, path); strcpy(nativePath, path);
compat_windows_path_to_native(nativePath); compat_windows_path_to_native(nativePath);
compat_resolve_path(nativePath);
return remove(nativePath); return remove(nativePath);
} }
@ -282,10 +287,12 @@ int compat_rename(const char* oldFileName, const char* newFileName)
char nativeOldFileName[COMPAT_MAX_PATH]; char nativeOldFileName[COMPAT_MAX_PATH];
strcpy(nativeOldFileName, oldFileName); strcpy(nativeOldFileName, oldFileName);
compat_windows_path_to_native(nativeOldFileName); compat_windows_path_to_native(nativeOldFileName);
compat_resolve_path(nativeOldFileName);
char nativeNewFileName[COMPAT_MAX_PATH]; char nativeNewFileName[COMPAT_MAX_PATH];
strcpy(nativeNewFileName, newFileName); strcpy(nativeNewFileName, newFileName);
compat_windows_path_to_native(nativeNewFileName); compat_windows_path_to_native(nativeNewFileName);
compat_resolve_path(nativeNewFileName);
return rename(nativeOldFileName, nativeNewFileName); return rename(nativeOldFileName, nativeNewFileName);
} }
@ -303,6 +310,60 @@ void compat_windows_path_to_native(char* path)
#endif #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) char* compat_strdup(const char* string)
{ {
return SDL_strdup(string); return SDL_strdup(string);

View File

@ -40,6 +40,7 @@ char* compat_gzgets(gzFile stream, char* buffer, int maxCount);
int compat_remove(const char* path); int compat_remove(const char* path);
int compat_rename(const char* oldFileName, const char* newFileName); int compat_rename(const char* oldFileName, const char* newFileName);
void compat_windows_path_to_native(char* path); void compat_windows_path_to_native(char* path);
void compat_resolve_path(char* path);
char* compat_strdup(const char* string); char* compat_strdup(const char* string);
long getFileSize(FILE* stream); long getFileSize(FILE* stream);