Make it possible to have this (basename(1)) perform basename(3) on multiple
files. The traditional behaviour, 'basename string .suffix', is preserved, however a suffix may now also be specified via a getopt(3) option, -s, such that if it is specified in that way, all string arguments follow. There is also a new flag, -a, which allows a user to say "yes, please basename(3) on all arguments". Update manual to reflect this unobtrusively. Reviewed by: obrien
This commit is contained in:
parent
492fa19f70
commit
549e1e057c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=99137
@ -45,6 +45,11 @@
|
||||
.Nm
|
||||
.Ar string
|
||||
.Op Ar suffix
|
||||
.Nm
|
||||
.Op Fl a
|
||||
.Op Fl s Ar suffix
|
||||
.Ar string
|
||||
.Op Ar ...
|
||||
.Nm dirname
|
||||
.Ar string
|
||||
.Sh DESCRIPTION
|
||||
@ -64,6 +69,19 @@ is not stripped if it is identical to the remaining characters in
|
||||
.Ar string .
|
||||
The resulting filename is written to the standard output.
|
||||
A non-existent suffix is ignored.
|
||||
If
|
||||
.Fl a
|
||||
is specified, then every argument is treated as a
|
||||
.Ar string
|
||||
as if
|
||||
.Nm
|
||||
were invoked with just one argument.
|
||||
If
|
||||
.Fl s
|
||||
is specified, then the
|
||||
.Ar suffix
|
||||
is taken as its argument, and all other arguments are treated as a
|
||||
.Ar string .
|
||||
.Pp
|
||||
The
|
||||
.Nm dirname
|
||||
|
@ -61,11 +61,22 @@ main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
char *p, *q;
|
||||
int ch;
|
||||
char *p, *q, *suffix;
|
||||
size_t suffixlen;
|
||||
int aflag, ch;
|
||||
|
||||
while ((ch = getopt(argc, argv, "")) != -1)
|
||||
aflag = 0;
|
||||
suffix = NULL;
|
||||
suffixlen = 0;
|
||||
|
||||
while ((ch = getopt(argc, argv, "as:")) != -1)
|
||||
switch(ch) {
|
||||
case 'a':
|
||||
aflag = 1;
|
||||
break;
|
||||
case 's':
|
||||
suffix = optarg;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
@ -73,7 +84,7 @@ main(argc, argv)
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (argc != 1 && argc != 2)
|
||||
if (argc < 1)
|
||||
usage();
|
||||
|
||||
if (!*argv[0]) {
|
||||
@ -82,10 +93,21 @@ main(argc, argv)
|
||||
}
|
||||
if ((p = basename(argv[0])) == NULL)
|
||||
err(1, "%s", argv[0]);
|
||||
if (*++argv && (q = strchr(p, '\0') - strlen(*argv)) > p &&
|
||||
strcmp(*argv, q) == 0)
|
||||
if ((suffix == NULL && !aflag) && argc == 2) {
|
||||
suffix = argv[1];
|
||||
argc--;
|
||||
}
|
||||
if (suffix != NULL)
|
||||
suffixlen = strlen(suffix);
|
||||
while (argc--) {
|
||||
if ((p = basename(*argv)) == NULL)
|
||||
err(1, "%s", argv[0]);
|
||||
if (suffixlen && (q = strchr(p, '\0') - suffixlen) > p &&
|
||||
strcmp(suffix, q) == 0)
|
||||
*q = '\0';
|
||||
(void)printf("%s\n", p);
|
||||
argv++;
|
||||
(void)printf("%s\n", p);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@ -93,6 +115,8 @@ void
|
||||
usage()
|
||||
{
|
||||
|
||||
(void)fprintf(stderr, "usage: basename string [suffix]\n");
|
||||
(void)fprintf(stderr,
|
||||
"usage: basename string [suffix]\n"
|
||||
" basename [-a] [-s suffix] string [...]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user