1169695Skan/* Return the basename of a pathname. 2169695Skan This file is in the public domain. */ 3169695Skan 4169695Skan/* 5169695Skan 6169695Skan@deftypefn Supplemental char* basename (const char *@var{name}) 7169695Skan 8169695SkanReturns a pointer to the last component of pathname @var{name}. 9169695SkanBehavior is undefined if the pathname ends in a directory separator. 10169695Skan 11169695Skan@end deftypefn 12169695Skan 13169695Skan*/ 14169695Skan 15169695Skan#ifdef HAVE_CONFIG_H 16169695Skan#include "config.h" 17169695Skan#endif 18169695Skan#include "ansidecl.h" 19169695Skan#include "libiberty.h" 20169695Skan#include "safe-ctype.h" 21169695Skan 22169695Skan#ifndef DIR_SEPARATOR 23169695Skan#define DIR_SEPARATOR '/' 24169695Skan#endif 25169695Skan 26169695Skan#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ 27169695Skan defined (__OS2__) 28169695Skan#define HAVE_DOS_BASED_FILE_SYSTEM 29169695Skan#ifndef DIR_SEPARATOR_2 30169695Skan#define DIR_SEPARATOR_2 '\\' 31169695Skan#endif 32169695Skan#endif 33169695Skan 34169695Skan/* Define IS_DIR_SEPARATOR. */ 35169695Skan#ifndef DIR_SEPARATOR_2 36169695Skan# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) 37169695Skan#else /* DIR_SEPARATOR_2 */ 38169695Skan# define IS_DIR_SEPARATOR(ch) \ 39169695Skan (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) 40169695Skan#endif /* DIR_SEPARATOR_2 */ 41169695Skan 42169695Skanchar * 43169695Skanbasename (const char *name) 44169695Skan{ 45169695Skan const char *base; 46169695Skan 47169695Skan#if defined (HAVE_DOS_BASED_FILE_SYSTEM) 48169695Skan /* Skip over the disk name in MSDOS pathnames. */ 49169695Skan if (ISALPHA (name[0]) && name[1] == ':') 50169695Skan name += 2; 51169695Skan#endif 52169695Skan 53169695Skan for (base = name; *name; name++) 54169695Skan { 55169695Skan if (IS_DIR_SEPARATOR (*name)) 56169695Skan { 57169695Skan base = name + 1; 58169695Skan } 59169695Skan } 60169695Skan return (char *) base; 61169695Skan} 62169695Skan 63