diff options
-rwxr-xr-x | scripts/test/basename.test | 23 | ||||
-rw-r--r-- | toys/basename.c | 10 |
2 files changed, 29 insertions, 4 deletions
diff --git a/scripts/test/basename.test b/scripts/test/basename.test new file mode 100755 index 00000000..e0288ce1 --- /dev/null +++ b/scripts/test/basename.test @@ -0,0 +1,23 @@ +#!/bin/bash + +[ -f testing.sh ] && . testing.sh + +#testing "name" "command" "result" "infile" "stdin" + +# Removal of extra /'s +testing "basename /-only" "basename ///////" "/\n" "" "" +testing "basename trailing /" "basename a//////" "a\n" "" "" +testing "basename combined" "basename /////a///b///c///d/////" "d\n" "" "" + +# Standard suffix behavior. +testing "basename suffix" "basename a/b/c/d.suffix .suffix" "d\n" "" "" + +# A suffix cannot be the entire result. +testing "basename suffix=result" "basename .txt .txt" ".txt\n" "" "" + +# Deal with suffix appearing in the filename +testing "basename reappering suffix 1" "basename a.txt.txt .txt" "a.txt\n" "" "" +testing "basename reappering suffix 2" "basename a.txt.old .txt" "a.txt.old\n" "" "" + +# A suffix should be a real suffix, only a the end. +testing "basename invalid suffix" "basename isthisasuffix? suffix" "isthisasuffix?\n" "" ""
\ No newline at end of file diff --git a/toys/basename.c b/toys/basename.c index ef571032..a6a3bb96 100644 --- a/toys/basename.c +++ b/toys/basename.c @@ -15,7 +15,7 @@ config BASENAME help usage: basename string [suffix] - Return non-directory portion of a pathname + Return non-directory portion of a pathname removing suffix */ #include "toys.h" @@ -37,9 +37,11 @@ void basename_main(void) // chop off the suffix if provided if (suffix) { - char *s = strstr(base, suffix); - if (s && s != base) *s = 0; + int suflen = strlen(suffix); + int reslen = strlen(base); + if (suflen < reslen && !strcmp( base+reslen-suflen, suffix)) + base[reslen-suflen] = 0; } - + puts(base); } |