diff options
author | Rob Landley <rob@landley.net> | 2019-10-18 20:52:49 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2019-10-18 20:52:49 -0500 |
commit | f4a98356220bb1084ef72d26c9211ee63dd3c852 (patch) | |
tree | 70cdaf176c2b9aa2547b2e860c50e68b50e6e775 | |
parent | f5425b1c4875383d7a4963d79bca8dbf241ec05c (diff) | |
download | toybox-f4a98356220bb1084ef72d26c9211ee63dd3c852.tar.gz |
Teach getdirname() to return "." as appropriate.
-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 |