summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan (janneke) Nieuwenhuizen <janneke@gnu.org>2021-12-12 15:48:18 +0100
committerMichael Gran <spk121@yahoo.com>2025-03-30 16:38:00 -0700
commita3018d6d0e1c750cd07a1b468507dfe60b3dbfcf (patch)
treed3c2fcdfd457454b2c0ae890dcdcdaa3f27eb8a2
parent79ea1082d029c66c830345cd019d043f05a87830 (diff)
downloadguile-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.c3
-rw-r--r--libguile/posix-w32.c40
-rw-r--r--libguile/posix-w32.h3
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 */