root/maint/gnulib/lib/basename-lgpl.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. last_component
  2. base_len

   1 /* basename.c -- return the last element in a file name
   2 
   3    Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2021 Free Software
   4    Foundation, Inc.
   5 
   6    This file is free software: you can redistribute it and/or modify
   7    it under the terms of the GNU Lesser General Public License as
   8    published by the Free Software Foundation; either version 2.1 of the
   9    License, or (at your option) any later version.
  10 
  11    This file 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 Lesser General Public License for more details.
  15 
  16    You should have received a copy of the GNU Lesser General Public License
  17    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  18 
  19 #include <config.h>
  20 
  21 /* Specification.  */
  22 #include "basename-lgpl.h"
  23 
  24 #include <stdbool.h>
  25 #include <string.h>
  26 
  27 #include "filename.h"
  28 
  29 char *
  30 last_component (char const *name)
     /* [previous][next][first][last][top][bottom][index][help] */
  31 {
  32   char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
  33   char const *p;
  34   bool last_was_slash = false;
  35 
  36   while (ISSLASH (*base))
  37     base++;
  38 
  39   for (p = base; *p; p++)
  40     {
  41       if (ISSLASH (*p))
  42         last_was_slash = true;
  43       else if (last_was_slash)
  44         {
  45           base = p;
  46           last_was_slash = false;
  47         }
  48     }
  49 
  50   return (char *) base;
  51 }
  52 
  53 size_t
  54 base_len (char const *name)
     /* [previous][next][first][last][top][bottom][index][help] */
  55 {
  56   size_t len;
  57   size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
  58 
  59   for (len = strlen (name);  1 < len && ISSLASH (name[len - 1]);  len--)
  60     continue;
  61 
  62   if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
  63       && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
  64     return 2;
  65 
  66   if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
  67       && len == prefix_len && ISSLASH (name[prefix_len]))
  68     return prefix_len + 1;
  69 
  70   return len;
  71 }

/* [previous][next][first][last][top][bottom][index][help] */