xref: /plan9/sys/src/ape/cmd/patch/basename.c (revision 0b459c2cb92b7c9d88818e9a2f72e678e5bc4553)
1*0b459c2cSDavid du Colombier /* basename.c -- return the last element in a path */
2*0b459c2cSDavid du Colombier 
3*0b459c2cSDavid du Colombier #if HAVE_CONFIG_H
4*0b459c2cSDavid du Colombier # include <config.h>
5*0b459c2cSDavid du Colombier #endif
6*0b459c2cSDavid du Colombier 
7*0b459c2cSDavid du Colombier #include <backupfile.h>
8*0b459c2cSDavid du Colombier 
9*0b459c2cSDavid du Colombier #ifndef FILESYSTEM_PREFIX_LEN
10*0b459c2cSDavid du Colombier #define FILESYSTEM_PREFIX_LEN(f) 0
11*0b459c2cSDavid du Colombier #endif
12*0b459c2cSDavid du Colombier 
13*0b459c2cSDavid du Colombier #ifndef ISSLASH
14*0b459c2cSDavid du Colombier #define ISSLASH(c) ((c) == '/')
15*0b459c2cSDavid du Colombier #endif
16*0b459c2cSDavid du Colombier 
17*0b459c2cSDavid du Colombier /* In general, we can't use the builtin `basename' function if available,
18*0b459c2cSDavid du Colombier    since it has different meanings in different environments.
19*0b459c2cSDavid du Colombier    In some environments the builtin `basename' modifies its argument.  */
20*0b459c2cSDavid du Colombier 
21*0b459c2cSDavid du Colombier char *
base_name(name)22*0b459c2cSDavid du Colombier base_name (name)
23*0b459c2cSDavid du Colombier      char const *name;
24*0b459c2cSDavid du Colombier {
25*0b459c2cSDavid du Colombier   char const *base = name += FILESYSTEM_PREFIX_LEN (name);
26*0b459c2cSDavid du Colombier 
27*0b459c2cSDavid du Colombier   for (; *name; name++)
28*0b459c2cSDavid du Colombier     if (ISSLASH (*name))
29*0b459c2cSDavid du Colombier       base = name + 1;
30*0b459c2cSDavid du Colombier 
31*0b459c2cSDavid du Colombier   return (char *) base;
32*0b459c2cSDavid du Colombier }
33