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