diff --git a/libguile/filesys.c b/libguile/filesys.c index 1f0bba556..3400585a6 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -83,6 +83,9 @@ #include "ports-internal.h" #include "ports.h" #include "posix.h" +#if __MINGW32__ +#include "posix-w32.h" +#endif #include "smob.h" #include "srfi-13.h" #include "strings.h" diff --git a/libguile/fports.c b/libguile/fports.c index 9d4ca6ace..f0224d99f 100644 --- a/libguile/fports.c +++ b/libguile/fports.c @@ -59,6 +59,9 @@ #include "pairs.h" #include "ports-internal.h" #include "posix.h" +#if __MINGW32__ +#include "posix-w32.h" +#endif #include "read.h" #include "strings.h" #include "symbols.h" diff --git a/libguile/posix-w32.c b/libguile/posix-w32.c index f11c52673..44f033da1 100644 --- a/libguile/posix-w32.c +++ b/libguile/posix-w32.c @@ -24,6 +24,7 @@ #define WIN32_LEAN_AND_MEAN #include #include +#include #include #include #include @@ -34,6 +35,7 @@ #include #include "gc.h" /* for scm_*alloc, scm_strdup */ +#include "filename.h" #include "threads.h" /* for scm_i_scm_pthread_mutex_lock */ #include "posix-w32.h" @@ -1256,3 +1258,41 @@ dlerror_w32 () snprintf (dlerror_str, DLERROR_LEN, "error %ld: %s", (long) dw, msg_buf); return dlerror_str; } + +/* Use upcase drive letter in NAME. */ +static char * +canonicalize_device_name (char *name) +{ + if (name == NULL) + return name; + + if (HAS_DEVICE (name)) + name[0] = toupper (name[0]); + + return name; +} + +/* Replace any use of '\\' by '/' in NAME. */ +static char * +slashify_file_name (char *name) +{ + if (name == NULL) + return name; + + for (char *p = name; *p; p++) + if (ISSLASH (*p)) + *p = '/'; + return name; +} + +#undef canonicalize_file_name + +/* Also canonicalize use of drive letter and '/' for NAME. */ +char * +canonicalize_file_name_mingw (const char *name) +{ + char *canon = canonicalize_file_name (name); + canonicalize_device_name (canon); + slashify_file_name (canon); + return canon; +} diff --git a/libguile/posix-w32.h b/libguile/posix-w32.h index 7e4b3e0ba..f97e7f7ed 100644 --- a/libguile/posix-w32.h +++ b/libguile/posix-w32.h @@ -110,4 +110,7 @@ SCM_INTERNAL char *dlerror_w32 (void); #define RTLD_GLOBAL 4 #define RTLD_LOCAL 8 +#define canonicalize_file_name canonicalize_file_name_mingw +char *canonicalize_file_name_mingw (const char *name); + #endif /* SCM_POSIX_W32_H */