aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/basename.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/coreutils/basename.c b/coreutils/basename.c
index efd07e272..10ae76188 100644
--- a/coreutils/basename.c
+++ b/coreutils/basename.c
@@ -26,12 +26,14 @@
extern int basename_main(int argc, char **argv)
{
- char* s, *s1;
+ int m, n;
+ char *s, *s1;
if ((argc < 2) || (**(argv + 1) == '-')) {
- usage("basename [FILE ...]\n"
+ usage("basename FILE [SUFFIX]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nStrips directory path and suffixes from FILE(s).\n"
+ "\nStrips directory path and suffixes from FILE.\n"
+ "If specified, also removes any trailing SUFFIX.\n"
#endif
);
}
@@ -40,10 +42,20 @@ extern int basename_main(int argc, char **argv)
s1=*argv+strlen(*argv)-1;
while (s1 && *s1 == '/') {
*s1 = '\0';
- s1=*argv+strlen(*argv)-1;
+ s1--;
}
s = strrchr(*argv, '/');
- printf("%s\n", (s)? s + 1 : *argv);
+ if (s==NULL) s=*argv;
+ else s++;
+
+ if (argc>2) {
+ argv++;
+ n = strlen(*argv);
+ m = strlen(s);
+ if (m>=n && strncmp(s+m-n, *argv, n)==0)
+ s[m-n] = '\0';
+ }
+ printf("%s\n", s);
exit(TRUE);
}