diff options
Diffstat (limited to 'lib/lib.c')
-rw-r--r-- | lib/lib.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -1005,14 +1005,18 @@ void mode_to_string(mode_t mode, char *buf) } // dirname() can modify its argument or return a pointer to a constant string -// This always returns a malloc() copy of everyting before last (run of ) '/'. +// This returns a malloc() copy of everyting before last (run of ) '/', +// or "." if no path. char *getdirname(char *name) { - char *s = xstrdup(name), *ss = strrchr(s, '/'); + char *s, *ss, *keep; - while (ss && *ss && *ss == '/' && s != ss) *ss-- = 0; - - return s; + for (s = name, ss = keep = 0; ; s++) { + if (!*s) return keep ? xstrndup(name, keep-name) : xstrdup("."); + if (*s != '/') keep = ss; + else if (s == name) keep = ss = s+1; + else if (s[-1] != '/') ss = s; + } } // basename() can modify its argument or return a pointer to a constant string |