1*2a6b7db3Sskrll /* Return the basename of a pathname.
2*2a6b7db3Sskrll    This file is in the public domain. */
3*2a6b7db3Sskrll 
4*2a6b7db3Sskrll /*
5*2a6b7db3Sskrll 
6*2a6b7db3Sskrll @deftypefn Supplemental char* basename (const char *@var{name})
7*2a6b7db3Sskrll 
8*2a6b7db3Sskrll Returns a pointer to the last component of pathname @var{name}.
9*2a6b7db3Sskrll Behavior is undefined if the pathname ends in a directory separator.
10*2a6b7db3Sskrll 
11*2a6b7db3Sskrll @end deftypefn
12*2a6b7db3Sskrll 
13*2a6b7db3Sskrll */
14*2a6b7db3Sskrll 
15*2a6b7db3Sskrll #ifdef HAVE_CONFIG_H
16*2a6b7db3Sskrll #include "config.h"
17*2a6b7db3Sskrll #endif
18*2a6b7db3Sskrll #include "ansidecl.h"
19*2a6b7db3Sskrll #include "libiberty.h"
20*2a6b7db3Sskrll #include "safe-ctype.h"
21*2a6b7db3Sskrll 
22*2a6b7db3Sskrll #ifndef DIR_SEPARATOR
23*2a6b7db3Sskrll #define DIR_SEPARATOR '/'
24*2a6b7db3Sskrll #endif
25*2a6b7db3Sskrll 
26*2a6b7db3Sskrll #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
27*2a6b7db3Sskrll   defined (__OS2__)
28*2a6b7db3Sskrll #define HAVE_DOS_BASED_FILE_SYSTEM
29*2a6b7db3Sskrll #ifndef DIR_SEPARATOR_2
30*2a6b7db3Sskrll #define DIR_SEPARATOR_2 '\\'
31*2a6b7db3Sskrll #endif
32*2a6b7db3Sskrll #endif
33*2a6b7db3Sskrll 
34*2a6b7db3Sskrll /* Define IS_DIR_SEPARATOR.  */
35*2a6b7db3Sskrll #ifndef DIR_SEPARATOR_2
36*2a6b7db3Sskrll # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
37*2a6b7db3Sskrll #else /* DIR_SEPARATOR_2 */
38*2a6b7db3Sskrll # define IS_DIR_SEPARATOR(ch) \
39*2a6b7db3Sskrll 	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
40*2a6b7db3Sskrll #endif /* DIR_SEPARATOR_2 */
41*2a6b7db3Sskrll 
42*2a6b7db3Sskrll char *
basename(const char * name)43*2a6b7db3Sskrll basename (const char *name)
44*2a6b7db3Sskrll {
45*2a6b7db3Sskrll   const char *base;
46*2a6b7db3Sskrll 
47*2a6b7db3Sskrll #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
48*2a6b7db3Sskrll   /* Skip over the disk name in MSDOS pathnames. */
49*2a6b7db3Sskrll   if (ISALPHA (name[0]) && name[1] == ':')
50*2a6b7db3Sskrll     name += 2;
51*2a6b7db3Sskrll #endif
52*2a6b7db3Sskrll 
53*2a6b7db3Sskrll   for (base = name; *name; name++)
54*2a6b7db3Sskrll     {
55*2a6b7db3Sskrll       if (IS_DIR_SEPARATOR (*name))
56*2a6b7db3Sskrll 	{
57*2a6b7db3Sskrll 	  base = name + 1;
58*2a6b7db3Sskrll 	}
59*2a6b7db3Sskrll     }
60*2a6b7db3Sskrll   return (char *) base;
61*2a6b7db3Sskrll }
62*2a6b7db3Sskrll 
63