Back to index

glibc  2.9
xpg_basename.c
Go to the documentation of this file.
00001 /* Return basename of given pathname according to the weird XPG specification.
00002    Copyright (C) 1997, 1999 Free Software Foundation, Inc.
00003    This file is part of the GNU C Library.
00004    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
00005 
00006    The GNU C Library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Lesser General Public
00008    License as published by the Free Software Foundation; either
00009    version 2.1 of the License, or (at your option) any later version.
00010 
00011    The GNU C Library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Lesser General Public License for more details.
00015 
00016    You should have received a copy of the GNU Lesser General Public
00017    License along with the GNU C Library; if not, write to the Free
00018    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00019    02111-1307 USA.  */
00020 
00021 #include <string.h>
00022 #include <libgen.h>
00023 
00024 
00025 char *
00026 __xpg_basename (char *filename)
00027 {
00028   char *p;
00029 
00030   if (filename == NULL || filename[0] == '\0')
00031     /* We return a pointer to a static string containing ".".  */
00032     p = (char *) ".";
00033   else
00034     {
00035       p = strrchr (filename, '/');
00036 
00037       if (p == NULL)
00038        /* There is no slash in the filename.  Return the whole string.  */
00039        p = filename;
00040       else
00041        {
00042          if (p[1] == '\0')
00043            {
00044              /* We must remove trailing '/'.  */
00045              while (p > filename && p[-1] == '/')
00046               --p;
00047 
00048              /* Now we can be in two situations:
00049                a) the string only contains '/' characters, so we return
00050                   '/'
00051                b) p points past the last component, but we have to remove
00052                   the trailing slash.  */
00053              if (p > filename)
00054               {
00055                 *p-- = '\0';
00056                 while (p > filename && p[-1] != '/')
00057                   --p;
00058               }
00059              else
00060               /* The last slash we already found is the right position
00061                  to return.  */
00062               while (p[1] != '\0')
00063                 ++p;
00064            }
00065          else
00066            /* Go to the first character of the name.  */
00067            ++p;
00068        }
00069     }
00070 
00071   return p;
00072 }