Blame gnulib/lib/basename.c

Packit Service 51e54d
/* basename.c -- return the last element in a file name
Packit Service 51e54d
Packit Service 51e54d
   Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2014 Free Software
Packit Service 51e54d
   Foundation, Inc.
Packit Service 51e54d
Packit Service 51e54d
   This program is free software: you can redistribute it and/or modify
Packit Service 51e54d
   it under the terms of the GNU General Public License as published by
Packit Service 51e54d
   the Free Software Foundation; either version 3 of the License, or
Packit Service 51e54d
   (at your option) any later version.
Packit Service 51e54d
Packit Service 51e54d
   This program is distributed in the hope that it will be useful,
Packit Service 51e54d
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 51e54d
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 51e54d
   GNU General Public License for more details.
Packit Service 51e54d
Packit Service 51e54d
   You should have received a copy of the GNU General Public License
Packit Service 51e54d
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 51e54d
Packit Service 51e54d
#include <config.h>
Packit Service 51e54d
Packit Service 51e54d
#include "dirname.h"
Packit Service 51e54d
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
#include "xalloc.h"
Packit Service 51e54d
#include "xstrndup.h"
Packit Service 51e54d
Packit Service 51e54d
char *
Packit Service 51e54d
base_name (char const *name)
Packit Service 51e54d
{
Packit Service 51e54d
  char const *base = last_component (name);
Packit Service 51e54d
  size_t length;
Packit Service 51e54d
Packit Service 51e54d
  /* If there is no last component, then name is a file system root or the
Packit Service 51e54d
     empty string.  */
Packit Service 51e54d
  if (! *base)
Packit Service 51e54d
    return xstrndup (name, base_len (name));
Packit Service 51e54d
Packit Service 51e54d
  /* Collapse a sequence of trailing slashes into one.  */
Packit Service 51e54d
  length = base_len (base);
Packit Service 51e54d
  if (ISSLASH (base[length]))
Packit Service 51e54d
    length++;
Packit Service 51e54d
Packit Service 51e54d
  /* On systems with drive letters, "a/b:c" must return "./b:c" rather
Packit Service 51e54d
     than "b:c" to avoid confusion with a drive letter.  On systems
Packit Service 51e54d
     with pure POSIX semantics, this is not an issue.  */
Packit Service 51e54d
  if (FILE_SYSTEM_PREFIX_LEN (base))
Packit Service 51e54d
    {
Packit Service 51e54d
      char *p = xmalloc (length + 3);
Packit Service 51e54d
      p[0] = '.';
Packit Service 51e54d
      p[1] = '/';
Packit Service 51e54d
      memcpy (p + 2, base, length);
Packit Service 51e54d
      p[length + 2] = '\0';
Packit Service 51e54d
      return p;
Packit Service 51e54d
    }
Packit Service 51e54d
Packit Service 51e54d
  /* Finally, copy the basename.  */
Packit Service 51e54d
  return xstrndup (base, length);
Packit Service 51e54d
}