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