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