* lrealpath.c (lrealpath): Add _WIN32 support.
authorDanny Smith <dannysmith@users.sourceforge.net>
Tue, 29 Jun 2004 11:37:20 +0000 (11:37 +0000)
committerDanny Smith <dannysmith@gcc.gnu.org>
Tue, 29 Jun 2004 11:37:20 +0000 (11:37 +0000)
From-SVN: r83853

libiberty/ChangeLog
libiberty/lrealpath.c

index 6458c2afe624f1b92b9c666c0c9f17b567b7600a..f8e1c9c5bff4d996d9c215c204642e17d4477866 100644 (file)
@@ -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,
index b001b38ef66325a61f93d8d8a81c64b6cd78eced..4877753cd66fb7bfa99775c4c3d130c478768221 100644 (file)
@@ -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);
 }