(root)/
tar-1.35/
gnu/
basename.c
       1  /* basename.c -- return the last element in a file name
       2  
       3     Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2023 Free Software
       4     Foundation, Inc.
       5  
       6     This program is free software: you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation, either version 3 of the License, or
       9     (at your option) any later version.
      10  
      11     This program 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
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <config.h>
      20  
      21  #include "dirname.h"
      22  
      23  #include <string.h>
      24  #include "xalloc.h"
      25  
      26  char *
      27  base_name (char const *name)
      28  {
      29    char const *base = last_component (name);
      30    idx_t length;
      31    int dotslash_len;
      32    if (*base)
      33      {
      34        length = base_len (base);
      35  
      36        /* Collapse a sequence of trailing slashes into one.  */
      37        length += ISSLASH (base[length]);
      38  
      39        /* On systems with drive letters, "a/b:c" must return "./b:c" rather
      40           than "b:c" to avoid confusion with a drive letter.  On systems
      41           with pure POSIX semantics, this is not an issue.  */
      42        dotslash_len = FILE_SYSTEM_PREFIX_LEN (base) != 0 ? 2 : 0;
      43      }
      44    else
      45      {
      46        /* There is no last component, so NAME is a file system root or
      47           the empty string.  */
      48        base = name;
      49        length = base_len (base);
      50        dotslash_len = 0;
      51      }
      52  
      53    char *p = ximalloc (dotslash_len + length + 1);
      54    if (dotslash_len)
      55      {
      56        p[0] = '.';
      57        p[1] = '/';
      58      }
      59  
      60    /* Finally, copy the basename.  */
      61    memcpy (p + dotslash_len, base, length);
      62    p[dotslash_len + length] = '\0';
      63    return p;
      64  }