summaryrefslogtreecommitdiff
path: root/function.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2013-10-02 19:39:53 +0300
committerEli Zaretskii <eliz@gnu.org>2013-10-02 19:39:53 +0300
commitf8786092ad753e75021db36a5a4daeca7f2b77e7 (patch)
treea29cee81e07c0816d42420da1f9fac7ce840907e /function.c
parent1d4c15b4e16cca40d238bff3e8ff2d0e2d0e2ca2 (diff)
downloadgunmake-f8786092ad753e75021db36a5a4daeca7f2b77e7.tar.gz
Fix $abspath on Cygwin when HAVE_DOS_PATHS is in effect.
function.c (IS_ABSOLUTE) [__CYGWIN__]: Special definition for Cygwin. (abspath) [__CYGWIN__]: Reset root_len to 1 if the absolute file name has the Posix /foo/bar form. [HAVE_DOS_PATHS]: Use root_len instead of hard-coded 2.
Diffstat (limited to 'function.c')
-rw-r--r--function.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/function.c b/function.c
index ce60ef5..1eceabb 100644
--- a/function.c
+++ b/function.c
@@ -1949,8 +1949,12 @@ func_not (char *o, char **argv, char *funcname UNUSED)
#ifdef HAVE_DOS_PATHS
-#define IS_ABSOLUTE(n) (n[0] && n[1] == ':')
-#define ROOT_LEN 3
+# ifdef __CYGWIN__
+# define IS_ABSOLUTE(n) ((n[0] && n[1] == ':') || STOP_SET (n[0], MAP_PATHSEP))
+# else
+# define IS_ABSOLUTE(n) (n[0] && n[1] == ':')
+# endif
+# define ROOT_LEN 3
#else
#define IS_ABSOLUTE(n) (n[0] == '/')
#define ROOT_LEN 1
@@ -2001,13 +2005,17 @@ abspath (const char *name, char *apath)
}
else
{
+#ifdef __CYGWIN__
+ if (STOP_SET (name[0], MAP_PATHSEP))
+ root_len = 1;
+#endif
strncpy (apath, name, root_len);
apath[root_len] = '\0';
dest = apath + root_len;
/* Get past the root, since we already copied it. */
name += root_len;
#ifdef HAVE_DOS_PATHS
- if (! STOP_SET (apath[2], MAP_PATHSEP))
+ if (! STOP_SET (apath[root_len - 1], MAP_PATHSEP))
{
/* Convert d:foo into d:./foo and increase root_len. */
apath[2] = '.';
@@ -2018,7 +2026,7 @@ abspath (const char *name, char *apath)
name--;
}
else
- apath[2] = '/'; /* make sure it's a forward slash */
+ apath[root_len - 1] = '/'; /* make sure it's a forward slash */
#endif
}