Blame gnulib/lib/basename-lgpl.c

Packit eba2e2
/* basename.c -- return the last element in a file name
Packit eba2e2
Packit eba2e2
   Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2014 Free Software
Packit eba2e2
   Foundation, Inc.
Packit eba2e2
Packit eba2e2
   This program is free software: you can redistribute it and/or modify
Packit eba2e2
   it under the terms of the GNU General Public License as published by
Packit eba2e2
   the Free Software Foundation; either version 3 of the License, or
Packit eba2e2
   (at your option) any later version.
Packit eba2e2
Packit eba2e2
   This program is distributed in the hope that it will be useful,
Packit eba2e2
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit eba2e2
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit eba2e2
   GNU General Public License for more details.
Packit eba2e2
Packit eba2e2
   You should have received a copy of the GNU General Public License
Packit eba2e2
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit eba2e2
Packit eba2e2
#include <config.h>
Packit eba2e2
Packit eba2e2
#include "dirname.h"
Packit eba2e2
Packit eba2e2
#include <string.h>
Packit eba2e2
Packit eba2e2
/* Return the address of the last file name component of NAME.  If
Packit eba2e2
   NAME has no relative file name components because it is a file
Packit eba2e2
   system root, return the empty string.  */
Packit eba2e2
Packit eba2e2
char *
Packit eba2e2
last_component (char const *name)
Packit eba2e2
{
Packit eba2e2
  char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
Packit eba2e2
  char const *p;
Packit eba2e2
  bool saw_slash = false;
Packit eba2e2
Packit eba2e2
  while (ISSLASH (*base))
Packit eba2e2
    base++;
Packit eba2e2
Packit eba2e2
  for (p = base; *p; p++)
Packit eba2e2
    {
Packit eba2e2
      if (ISSLASH (*p))
Packit eba2e2
        saw_slash = true;
Packit eba2e2
      else if (saw_slash)
Packit eba2e2
        {
Packit eba2e2
          base = p;
Packit eba2e2
          saw_slash = false;
Packit eba2e2
        }
Packit eba2e2
    }
Packit eba2e2
Packit eba2e2
  return (char *) base;
Packit eba2e2
}
Packit eba2e2
Packit eba2e2
/* Return the length of the basename NAME.  Typically NAME is the
Packit eba2e2
   value returned by base_name or last_component.  Act like strlen
Packit eba2e2
   (NAME), except omit all trailing slashes.  */
Packit eba2e2
Packit eba2e2
size_t
Packit eba2e2
base_len (char const *name)
Packit eba2e2
{
Packit eba2e2
  size_t len;
Packit eba2e2
  size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
Packit eba2e2
Packit eba2e2
  for (len = strlen (name);  1 < len && ISSLASH (name[len - 1]);  len--)
Packit eba2e2
    continue;
Packit eba2e2
Packit eba2e2
  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
Packit eba2e2
      && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
Packit eba2e2
    return 2;
Packit eba2e2
Packit eba2e2
  if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
Packit eba2e2
      && len == prefix_len && ISSLASH (name[prefix_len]))
Packit eba2e2
    return prefix_len + 1;
Packit eba2e2
Packit eba2e2
  return len;
Packit eba2e2
}