aboutsummaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorDanny Smith <dannysmith@users.sourceforge.net>2004-06-29 11:37:20 +0000
committerDanny Smith <dannysmith@gcc.gnu.org>2004-06-29 11:37:20 +0000
commit50a2de961ffa6022ac3084c94f76d1462be04845 (patch)
treeb5da2aaeee765d7fddc7920c266f1d75f1a0f0ae /libiberty
parentfe88415f1b385b2dfc11f54422ff414f643df9e0 (diff)
downloadgcc-50a2de961ffa6022ac3084c94f76d1462be04845.zip
gcc-50a2de961ffa6022ac3084c94f76d1462be04845.tar.gz
gcc-50a2de961ffa6022ac3084c94f76d1462be04845.tar.bz2
* lrealpath.c (lrealpath): Add _WIN32 support.
From-SVN: r83853
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/ChangeLog4
-rw-r--r--libiberty/lrealpath.c30
2 files changed, 34 insertions, 0 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 6458c2a..f8e1c9c 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,7 @@
+2004-06-29 Danny Smith <dannysmith@users.sourceforge.net>
+
+ * lrealpath.c (lrealpath): Add _WIN32 support.
+
2004-06-28 Zack Weinberg <zack@codesourcery.com>
* cp-demangle.h: Declare cplus_demangle_operators,
diff --git a/libiberty/lrealpath.c b/libiberty/lrealpath.c
index b001b38..4877753 100644
--- a/libiberty/lrealpath.c
+++ b/libiberty/lrealpath.c
@@ -64,6 +64,12 @@ extern char *canonicalize_file_name (const char *);
# define REALPATH_LIMIT MAXPATHLEN
# endif
# endif
+#else
+ /* cygwin has realpath, so it won't get here. */
+# if defined (_WIN32)
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h> /* for GetFullPathName */
+# endif
#endif
char *
@@ -123,6 +129,30 @@ lrealpath (filename)
}
#endif
+ /* The MS Windows method. If we don't have realpath, we assume we
+ don't have symlinks and just canonicalize to a Windows absolute
+ path. GetFullPath converts ../ and ./ in relative paths to
+ absolute paths, filling in current drive if one is not given
+ or using the current directory of a specified drive (eg, "E:foo").
+ It also converts all forward slashes to back slashes. */
+#if defined (_WIN32)
+ {
+ char buf[MAX_PATH];
+ char* basename;
+ DWORD len = GetFullPathName (filename, MAX_PATH, buf, &basename);
+ if (len == 0 || len > MAX_PATH - 1)
+ return strdup (filename);
+ else
+ {
+ /* The file system is case-preserving but case-insensitive,
+ Canonicalize to lowercase, using the codepage associated
+ with the process locale. */
+ CharLowerBuff (buf, len);
+ return strdup (buf);
+ }
+ }
+#endif
+
/* This system is a lost cause, just duplicate the filename. */
return strdup (filename);
}