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