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:
Juli Mallett 2002-06-30 13:40:35 +00:00
parent 492fa19f70
commit 549e1e057c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=99137
2 changed files with 50 additions and 8 deletions

View File

@ -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

View File

@ -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);
}