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*2a6b7db3Sskrllbasename (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