summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc25
1 files changed, 11 insertions, 14 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 10a174838..6d4228d63 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1255,29 +1255,26 @@ special_name (const char *s, int inc = 1)
return false;
s += inc;
- if (strpbrk (s, special_chars))
- return !strncasematch (s, "%2f", 3);
- if (strcasematch (s, ".") || strcasematch (s, ".."))
+ if (strcmp (s, ".") == 0 || strcmp (s, "..") == 0)
return false;
- if (s[strlen (s)-1] == '.')
- return true;
-
- const char *p;
- if (strcasematch (s, "conin$") || strcasematch (s, "conout$"))
- return -1;
- if (strncasematch (s, "nul", 3)
+ int n;
+ const char *p = NULL;
+ if (strncasematch (s, "conin$", n = 5)
+ || strncasematch (s, "conout$", n = 7)
+ || strncasematch (s, "nul", n = 3)
|| strncasematch (s, "aux", 3)
|| strncasematch (s, "prn", 3)
|| strncasematch (s, "con", 3))
- p = s + 3;
+ p = s + n;
else if (strncasematch (s, "com", 3) || strncasematch (s, "lpt", 3))
(void) strtoul (s + 3, (char **) &p, 10);
- else
- return false;
+ if (p && (*p == '\0' || *p == '.'))
+ return -1;
- return (*p == '\0' || *p == '.') ? -1 : false;
+ return (strchr (s, '\0')[-1] == '.')
+ || (strpbrk (s, special_chars) && !strncasematch (s, "%2f", 3));
}
bool