xref: /aosp_15_r20/external/toybox/toys/posix/basename.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* basename.c - Return non-directory portion of a pathname
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2012 Tryn Mirell <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker  *
5*cf5a6c84SAndroid Build Coastguard Worker  * See http://opengroup.org/onlinepubs/9699919799/utilities/basename.html
6*cf5a6c84SAndroid Build Coastguard Worker 
7*cf5a6c84SAndroid Build Coastguard Worker 
8*cf5a6c84SAndroid Build Coastguard Worker USE_BASENAME(NEWTOY(basename, "^<1as:", TOYFLAG_USR|TOYFLAG_BIN))
9*cf5a6c84SAndroid Build Coastguard Worker 
10*cf5a6c84SAndroid Build Coastguard Worker config BASENAME
11*cf5a6c84SAndroid Build Coastguard Worker   bool "basename"
12*cf5a6c84SAndroid Build Coastguard Worker   default y
13*cf5a6c84SAndroid Build Coastguard Worker   help
14*cf5a6c84SAndroid Build Coastguard Worker     usage: basename [-a] [-s SUFFIX] NAME... | NAME [SUFFIX]
15*cf5a6c84SAndroid Build Coastguard Worker 
16*cf5a6c84SAndroid Build Coastguard Worker     Return non-directory portion of a pathname removing suffix.
17*cf5a6c84SAndroid Build Coastguard Worker 
18*cf5a6c84SAndroid Build Coastguard Worker     -a		All arguments are names
19*cf5a6c84SAndroid Build Coastguard Worker     -s SUFFIX	Remove suffix (implies -a)
20*cf5a6c84SAndroid Build Coastguard Worker */
21*cf5a6c84SAndroid Build Coastguard Worker 
22*cf5a6c84SAndroid Build Coastguard Worker #define FOR_basename
23*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
24*cf5a6c84SAndroid Build Coastguard Worker 
GLOBALS(char * s;)25*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
26*cf5a6c84SAndroid Build Coastguard Worker   char *s;
27*cf5a6c84SAndroid Build Coastguard Worker )
28*cf5a6c84SAndroid Build Coastguard Worker 
29*cf5a6c84SAndroid Build Coastguard Worker void basename_main(void)
30*cf5a6c84SAndroid Build Coastguard Worker {
31*cf5a6c84SAndroid Build Coastguard Worker   char **arg, *base, *p;
32*cf5a6c84SAndroid Build Coastguard Worker 
33*cf5a6c84SAndroid Build Coastguard Worker   if (FLAG(s)) toys.optflags |= FLAG_a;
34*cf5a6c84SAndroid Build Coastguard Worker 
35*cf5a6c84SAndroid Build Coastguard Worker   if (!FLAG(a)) {
36*cf5a6c84SAndroid Build Coastguard Worker     if (toys.optc>2) error_exit("too many args");
37*cf5a6c84SAndroid Build Coastguard Worker     TT.s = toys.optargs[1];
38*cf5a6c84SAndroid Build Coastguard Worker     toys.optargs[1] = 0;
39*cf5a6c84SAndroid Build Coastguard Worker   }
40*cf5a6c84SAndroid Build Coastguard Worker 
41*cf5a6c84SAndroid Build Coastguard Worker   for (arg = toys.optargs; *arg; ++arg) {
42*cf5a6c84SAndroid Build Coastguard Worker     // Chop off the suffix if provided.
43*cf5a6c84SAndroid Build Coastguard Worker     base = basename(*arg);
44*cf5a6c84SAndroid Build Coastguard Worker     if (TT.s && *TT.s && (p = strend(base, TT.s))) *p = 0;
45*cf5a6c84SAndroid Build Coastguard Worker     puts(base);
46*cf5a6c84SAndroid Build Coastguard Worker   }
47*cf5a6c84SAndroid Build Coastguard Worker }
48