| From 233bc23e32c5213255d8391dede53aa0b61ec23f Mon Sep 17 00:00:00 2001 |
| From: Ray Donnelly <mingw.android@gmail.com> |
| Date: Wed, 5 Aug 2015 23:36:09 +0100 |
| Subject: [PATCH 04/15] Windows: Use '/' not '\' in progpath and leave case |
| as-is |
| |
| Windows can handle both '/' and '\' dirseps. GCC will |
| have been built using Cygwin, MSYS* or cross-compiled |
| from a system where dirsep is '/' so it is cleaner to |
| force the dirseps to be '/' and keep the case as-is. |
| |
| This way, the value will be consistent with the build |
| system and string operations, be they internal to GCC |
| or external to it (e.g. processing map files with sed) |
| have a better chance of working as expected. |
| |
| A concrete instance of when this matters is when cross |
| compiling GNU/Linux glibc on Windows. |
| --- |
| libiberty/lrealpath.c | 19 +++++++++++++++---- |
| 1 file changed, 15 insertions(+), 4 deletions(-) |
| |
| diff --git a/libiberty/lrealpath.c b/libiberty/lrealpath.c |
| index b27c8de..8165984 100644 |
| --- a/libiberty/lrealpath.c |
| +++ b/libiberty/lrealpath.c |
| @@ -138,15 +138,26 @@ lrealpath (const char *filename) |
| { |
| char buf[MAX_PATH]; |
| char* basename; |
| + char* slash; |
| 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); |
| + /* Turn all back slashes back into forward slashes |
| + and don't make it lowercase. |
| + Rationale: |
| + Windows is as happy with / as it is with \. This will |
| + have been built using Cygwin, MSYS* or cross-compiled |
| + from a system where dirsep is / so it is cleaner just |
| + to keep the dirseps as / (and the case un-modified). |
| + This way, the value will be consistent with the build |
| + system and string operations (be they internal to this |
| + software or external to it, e.g. processing map files |
| + with sed) work as expected. */ |
| + slash = buf; |
| + while ((slash = strchr(slash,'\\')) != NULL) |
| + *slash = '/'; |
| return strdup (buf); |
| } |
| } |
| -- |
| 2.8.1 |
| |