xref: /dflybsd-src/contrib/binutils-2.27/libiberty/lbasename.c (revision e656dc90e3d65d744d534af2f5ea88cf8101ebcf)
1*a9fa9459Szrj /* Libiberty basename.  Like basename, but is not overridden by the
2*a9fa9459Szrj    system C library.
3*a9fa9459Szrj    Copyright (C) 2001, 2002, 2010 Free Software Foundation, Inc.
4*a9fa9459Szrj 
5*a9fa9459Szrj This file is part of the libiberty library.
6*a9fa9459Szrj Libiberty is free software; you can redistribute it and/or
7*a9fa9459Szrj modify it under the terms of the GNU Library General Public
8*a9fa9459Szrj License as published by the Free Software Foundation; either
9*a9fa9459Szrj version 2 of the License, or (at your option) any later version.
10*a9fa9459Szrj 
11*a9fa9459Szrj Libiberty is distributed in the hope that it will be useful,
12*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
13*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*a9fa9459Szrj Library General Public License for more details.
15*a9fa9459Szrj 
16*a9fa9459Szrj You should have received a copy of the GNU Library General Public
17*a9fa9459Szrj License along with libiberty; see the file COPYING.LIB.  If
18*a9fa9459Szrj not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
19*a9fa9459Szrj Boston, MA 02110-1301, USA.  */
20*a9fa9459Szrj 
21*a9fa9459Szrj /*
22*a9fa9459Szrj 
23*a9fa9459Szrj @deftypefn Replacement {const char*} lbasename (const char *@var{name})
24*a9fa9459Szrj 
25*a9fa9459Szrj Given a pointer to a string containing a typical pathname
26*a9fa9459Szrj (@samp{/usr/src/cmd/ls/ls.c} for example), returns a pointer to the
27*a9fa9459Szrj last component of the pathname (@samp{ls.c} in this case).  The
28*a9fa9459Szrj returned pointer is guaranteed to lie within the original
29*a9fa9459Szrj string.  This latter fact is not true of many vendor C
30*a9fa9459Szrj libraries, which return special strings or modify the passed
31*a9fa9459Szrj strings for particular input.
32*a9fa9459Szrj 
33*a9fa9459Szrj In particular, the empty string returns the same empty string,
34*a9fa9459Szrj and a path ending in @code{/} returns the empty string after it.
35*a9fa9459Szrj 
36*a9fa9459Szrj @end deftypefn
37*a9fa9459Szrj 
38*a9fa9459Szrj */
39*a9fa9459Szrj 
40*a9fa9459Szrj #ifdef HAVE_CONFIG_H
41*a9fa9459Szrj #include "config.h"
42*a9fa9459Szrj #endif
43*a9fa9459Szrj #include "ansidecl.h"
44*a9fa9459Szrj #include "libiberty.h"
45*a9fa9459Szrj #include "safe-ctype.h"
46*a9fa9459Szrj #include "filenames.h"
47*a9fa9459Szrj 
48*a9fa9459Szrj const char *
unix_lbasename(const char * name)49*a9fa9459Szrj unix_lbasename (const char *name)
50*a9fa9459Szrj {
51*a9fa9459Szrj   const char *base;
52*a9fa9459Szrj 
53*a9fa9459Szrj   for (base = name; *name; name++)
54*a9fa9459Szrj     if (IS_UNIX_DIR_SEPARATOR (*name))
55*a9fa9459Szrj       base = name + 1;
56*a9fa9459Szrj 
57*a9fa9459Szrj   return base;
58*a9fa9459Szrj }
59*a9fa9459Szrj 
60*a9fa9459Szrj const char *
dos_lbasename(const char * name)61*a9fa9459Szrj dos_lbasename (const char *name)
62*a9fa9459Szrj {
63*a9fa9459Szrj   const char *base;
64*a9fa9459Szrj 
65*a9fa9459Szrj   /* Skip over a possible disk name.  */
66*a9fa9459Szrj   if (ISALPHA (name[0]) && name[1] == ':')
67*a9fa9459Szrj     name += 2;
68*a9fa9459Szrj 
69*a9fa9459Szrj   for (base = name; *name; name++)
70*a9fa9459Szrj     if (IS_DOS_DIR_SEPARATOR (*name))
71*a9fa9459Szrj       base = name + 1;
72*a9fa9459Szrj 
73*a9fa9459Szrj   return base;
74*a9fa9459Szrj }
75*a9fa9459Szrj 
76*a9fa9459Szrj const char *
lbasename(const char * name)77*a9fa9459Szrj lbasename (const char *name)
78*a9fa9459Szrj {
79*a9fa9459Szrj #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
80*a9fa9459Szrj   return dos_lbasename (name);
81*a9fa9459Szrj #else
82*a9fa9459Szrj   return unix_lbasename (name);
83*a9fa9459Szrj #endif
84*a9fa9459Szrj }
85