diff options
author | Jan (janneke) Nieuwenhuizen <janneke@gnu.org> | 2021-12-12 15:48:18 +0100 |
---|---|---|
committer | Michael Gran <spk121@yahoo.com> | 2025-03-30 16:38:00 -0700 |
commit | a3018d6d0e1c750cd07a1b468507dfe60b3dbfcf (patch) | |
tree | d3c2fcdfd457454b2c0ae890dcdcdaa3f27eb8a2 | |
parent | 79ea1082d029c66c830345cd019d043f05a87830 (diff) | |
download | guile-a3018d6d0e1c750cd07a1b468507dfe60b3dbfcf.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/posix-w32.c | 40 | ||||
-rw-r--r-- | libguile/posix-w32.h | 3 |
3 files changed, 46 insertions, 0 deletions
diff --git a/libguile/filesys.c b/libguile/filesys.c index be223a85d..65ba6284e 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -90,6 +90,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/posix-w32.c b/libguile/posix-w32.c index 239fd1156..ad12bf0aa 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" @@ -342,3 +344,41 @@ getpagesize_w32 (void) { return 4 * 1024; } + +/* 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 5478f91f7..09de7db1c 100644 --- a/libguile/posix-w32.h +++ b/libguile/posix-w32.h @@ -85,4 +85,7 @@ SCM_INTERNAL int getpagesize_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 */ |