(svn r8821) -Regression: Unable to browse directories on *nix if the filesystem is not in UTF-8 charset and special characters are used. The string passed to opendir() which is UTF-8 was not parsed back to the filesystem format. Use a wrapper called ttd_opendir() instead of redefining opendir itself.
--- a/src/fios.cpp Tue Feb 20 00:01:54 2007 +0000
+++ b/src/fios.cpp Tue Feb 20 00:09:23 2007 +0000
@@ -224,7 +224,7 @@
}
/* Show subdirectories */
- if (mode != SLD_NEW_GAME && (dir = opendir(_fios_path)) != NULL) {
+ if (mode != SLD_NEW_GAME && (dir = ttd_opendir(_fios_path)) != NULL) {
while ((dirent = readdir(dir)) != NULL) {
ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name));
@@ -254,7 +254,7 @@
sort_start = _fios_count;
/* Show files */
- dir = opendir(_fios_path);
+ dir = ttd_opendir(_fios_path);
if (dir != NULL) {
while ((dirent = readdir(dir)) != NULL) {
char fios_title[64];
--- a/src/fios.h Tue Feb 20 00:01:54 2007 +0000
+++ b/src/fios.h Tue Feb 20 00:09:23 2007 +0000
@@ -77,10 +77,21 @@
bool at_first_entry;
};
-DIR *opendir(const char *path);
+DIR *opendir(const wchar_t *path);
struct dirent *readdir(DIR *d);
int closedir(DIR *d);
-
#endif /* defined(WIN32) */
+/**
+ * A wrapper around opendir() which will convert the string from
+ * OPENTTD encoding to that of the filesystem. For all purposes this
+ * function behaves the same as the original opendir function
+ * @param path string to open directory of
+ * @return DIR pointer
+ */
+static inline DIR *ttd_opendir(const char *path)
+{
+ return opendir(OTTD2FS(path));
+}
+
#endif /* FIOS_H */
--- a/src/newgrf_config.cpp Tue Feb 20 00:01:54 2007 +0000
+++ b/src/newgrf_config.cpp Tue Feb 20 00:09:23 2007 +0000
@@ -274,7 +274,7 @@
struct dirent *dirent;
DIR *dir;
- if ((dir = opendir(path)) == NULL) return 0;
+ if ((dir = ttd_opendir(path)) == NULL) return 0;
while ((dirent = readdir(dir)) != NULL) {
const char *d_name = FS2OTTD(dirent->d_name);
--- a/src/strings.cpp Tue Feb 20 00:01:54 2007 +0000
+++ b/src/strings.cpp Tue Feb 20 00:09:23 2007 +0000
@@ -1164,7 +1164,7 @@
struct dirent *dirent;
int num = 0;
- dir = opendir(_paths.lang_dir);
+ dir = ttd_opendir(_paths.lang_dir);
if (dir != NULL) {
while ((dirent = readdir(dir)) != NULL) {
const char *d_name = FS2OTTD(dirent->d_name);
--- a/src/win32.cpp Tue Feb 20 00:01:54 2007 +0000
+++ b/src/win32.cpp Tue Feb 20 00:09:23 2007 +0000
@@ -653,19 +653,19 @@
}
}
-DIR *opendir(const char *path)
+DIR *opendir(const wchar_t *path)
{
DIR *d;
UINT sem = SetErrorMode(SEM_FAILCRITICALERRORS); // disable 'no-disk' message box
- DWORD fa = GetFileAttributesW(OTTD2FS(path));
+ DWORD fa = GetFileAttributesW(path);
if ((fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) {
d = dir_calloc();
if (d != NULL) {
- char search_path[MAX_PATH];
+ wchar_t search_path[MAX_PATH];
/* build search path for FindFirstFile */
- snprintf(search_path, lengthof(search_path), "%s" PATHSEP "*", path);
- d->hFind = FindFirstFileW(OTTD2FS(search_path), &d->fd);
+ _snwprintf_s(search_path, lengthof(search_path), L"%s\\*", path);
+ d->hFind = FindFirstFileW(search_path, &d->fd);
if (d->hFind != INVALID_HANDLE_VALUE ||
GetLastError() == ERROR_NO_MORE_FILES) { // the directory is empty