diff options
author | Jan (janneke) Nieuwenhuizen <janneke@gnu.org> | 2021-12-12 15:48:18 +0100 |
---|---|---|
committer | Michael Gran <spk121@yahoo.com> | 2022-11-10 10:31:16 -0800 |
commit | 2d82b49cf38cbf5a6a2ce934852649d10e9e6a84 (patch) | |
tree | bb8ddbd7e0184701d85a715e58364ab7cb8caf43 | |
parent | 558fe0113daf3e6a9b327539d7b3481b064bd180 (diff) | |
download | guile-2d82b49cf38cbf5a6a2ce934852649d10e9e6a84.tar.gz |
mingw: canonicalize-path: Also canonicalize drive letter and '/'.
* libguile/posix-w32.c (canonicalize_device_name,
slashify_file_name): New static functions.
(canonicalize_file_name_mingw): Use them in new function.
* libguile/posix-w32.h (canonicalize_file_name_mingw): Declare it.
(canonicalize_file_name): New define.
* libguile/filesys.c[__MINGW32__]: Include posix-w32.h to use it.
* libguile/fports.c[__MINGW32__]: Likewise.
-rw-r--r-- | libguile/filesys.c | 3 | ||||
-rw-r--r-- | libguile/fports.c | 3 | ||||
-rw-r--r-- | libguile/posix-w32.c | 40 | ||||
-rw-r--r-- | libguile/posix-w32.h | 3 |
4 files changed, 49 insertions, 0 deletions
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 <windows.h> #include <c-strcase.h> +#include <ctype.h> #include <process.h> #include <stdio.h> #include <stdlib.h> @@ -34,6 +35,7 @@ #include <fcntl.h> #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 */ |