summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthiasWM <visualc.git@matthiasm.com>2022-06-12 14:53:06 +0200
committerMatthiasWM <visualc.git@matthiasm.com>2022-06-12 14:53:06 +0200
commit1b1e8a4d4682dd802c66884db05f2ebdcaf82218 (patch)
treefd8fac33c443d856e2034665a491d0aa28f7fe88 /src
parent995e3118a6cdfc93ae75eff0061205983f468122 (diff)
Issue #141: fl_filename_absolute bugs fixed for MSWindows.
Diffstat (limited to 'src')
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
index cc6aede08..3aaa4401c 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
@@ -54,7 +54,7 @@ typedef RPC_STATUS (WINAPI *uuid_func)(UUID __RPC_FAR *Uuid);
# include <mntent.h>
#endif
-inline int isdirsep(char c) { return c == '/' || c == '\\'; }
+static inline int isdirsep(char c) { return c == '/' || c == '\\'; }
static wchar_t *mbwbuf = NULL;
static wchar_t *wbuf = NULL;
@@ -644,16 +644,22 @@ int Fl_WinAPI_System_Driver::filename_absolute(char *to, int tolen, const char *
if (isdirsep(*(a-1))) a--;
/* remove intermediate . and .. names: */
while (*start == '.') {
- if (start[1]=='.' && isdirsep(start[2])) {
+ if (start[1]=='.' && (isdirsep(start[2]) || start[2]==0) ) {
+ // found "..", remove the last directory segment form cwd
char *b;
for (b = a-1; b >= temp && !isdirsep(*b); b--) {/*empty*/}
if (b < temp) break;
a = b;
- start += 3;
+ if (start[2] == 0)
+ start += 2;
+ else
+ start += 3;
} else if (isdirsep(start[1])) {
+ // found "./" in path, just skip it
start += 2;
} else if (!start[1]) {
- start ++; // Skip lone "."
+ // found "." at end of path, just skip it
+ start ++;
break;
} else
break;