From 528e3ba874f0d89f5a4d1f8ce8c04adbaa2ec1e4 Mon Sep 17 00:00:00 2001 From: Elie De Brauwer Date: Sun, 12 Feb 2012 14:14:58 +0100 Subject: Add test for basename, fix issue where suffix is wrongfully applied if it appears in the middle of the filename --- scripts/test/basename.test | 23 +++++++++++++++++++++++ toys/basename.c | 10 ++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100755 scripts/test/basename.test 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); } -- cgit v1.2.3