basename.c revision 218822
156893Sfenner/* Return the basename of a pathname.
256893Sfenner   This file is in the public domain. */
356893Sfenner
456893Sfenner/*
556893Sfenner
656893Sfenner@deftypefn Supplemental char* basename (const char *@var{name})
756893Sfenner
856893SfennerReturns a pointer to the last component of pathname @var{name}.
956893SfennerBehavior is undefined if the pathname ends in a directory separator.
1056893Sfenner
1156893Sfenner@end deftypefn
1256893Sfenner
1356893Sfenner*/
1456893Sfenner
1556893Sfenner#ifdef HAVE_CONFIG_H
1656893Sfenner#include "config.h"
1756893Sfenner#endif
1856893Sfenner#include "ansidecl.h"
1956893Sfenner#include "libiberty.h"
2056893Sfenner#include "safe-ctype.h"
2156893Sfenner
2256893Sfenner#ifndef DIR_SEPARATOR
2356893Sfenner#define DIR_SEPARATOR '/'
2456893Sfenner#endif
2556893Sfenner
2656893Sfenner#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
2756893Sfenner  defined (__OS2__)
2856893Sfenner#define HAVE_DOS_BASED_FILE_SYSTEM
2956893Sfenner#ifndef DIR_SEPARATOR_2
3056893Sfenner#define DIR_SEPARATOR_2 '\\'
3156893Sfenner#endif
3256893Sfenner#endif
3356893Sfenner
3456893Sfenner/* Define IS_DIR_SEPARATOR.  */
3556893Sfenner#ifndef DIR_SEPARATOR_2
3656893Sfenner# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
3756893Sfenner#else /* DIR_SEPARATOR_2 */
3856893Sfenner# define IS_DIR_SEPARATOR(ch) \
3956893Sfenner	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
4056893Sfenner#endif /* DIR_SEPARATOR_2 */
4156893Sfenner
4256893Sfennerchar *
4356893Sfennerbasename (const char *name)
4456893Sfenner{
4556893Sfenner  const char *base;
4656893Sfenner
4756893Sfenner#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
4856893Sfenner  /* Skip over the disk name in MSDOS pathnames. */
4956893Sfenner  if (ISALPHA (name[0]) && name[1] == ':')
5056893Sfenner    name += 2;
5156893Sfenner#endif
5256893Sfenner
5356893Sfenner  for (base = name; *name; name++)
5456893Sfenner    {
5556893Sfenner      if (IS_DIR_SEPARATOR (*name))
5656893Sfenner	{
5756893Sfenner	  base = name + 1;
5856893Sfenner	}
5956893Sfenner    }
6056893Sfenner  return (char *) base;
6156893Sfenner}
6256893Sfenner
6356893Sfenner