Fix guards for qecvt
[platform/upstream/glibc.git] / stdlib / xpg_basename.c
1 /* Return basename of given pathname according to the weird XPG specification.
2    Copyright (C) 1997-2013 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The GNU C Library 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 GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, see
18    <http://www.gnu.org/licenses/>.  */
19
20 #include <string.h>
21 #include <libgen.h>
22
23
24 char *
25 __xpg_basename (char *filename)
26 {
27   char *p;
28
29   if (filename == NULL || filename[0] == '\0')
30     /* We return a pointer to a static string containing ".".  */
31     p = (char *) ".";
32   else
33     {
34       p = strrchr (filename, '/');
35
36       if (p == NULL)
37         /* There is no slash in the filename.  Return the whole string.  */
38         p = filename;
39       else
40         {
41           if (p[1] == '\0')
42             {
43               /* We must remove trailing '/'.  */
44               while (p > filename && p[-1] == '/')
45                 --p;
46
47               /* Now we can be in two situations:
48                  a) the string only contains '/' characters, so we return
49                     '/'
50                  b) p points past the last component, but we have to remove
51                     the trailing slash.  */
52               if (p > filename)
53                 {
54                   *p-- = '\0';
55                   while (p > filename && p[-1] != '/')
56                     --p;
57                 }
58               else
59                 /* The last slash we already found is the right position
60                    to return.  */
61                 while (p[1] != '\0')
62                   ++p;
63             }
64           else
65             /* Go to the first character of the name.  */
66             ++p;
67         }
68     }
69
70   return p;
71 }