aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/test/basename.test23
-rw-r--r--toys/basename.c10
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);
}