From f4a98356220bb1084ef72d26c9211ee63dd3c852 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Fri, 18 Oct 2019 20:52:49 -0500 Subject: Teach getdirname() to return "." as appropriate. --- lib/lib.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index fe402af8..f98f00a5 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -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 -- cgit v1.2.3