Prex Home / Browse Source - Prex Version: 0.9.0

root/usr/lib/libc/gen/basename.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. basename

   1 /*
   2  * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com>
   3  *
   4  * Permission to use, copy, modify, and distribute this software for any
   5  * purpose with or without fee is hereby granted, provided that the above
   6  * copyright notice and this permission notice appear in all copies.
   7  *
   8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15  */
  16 
  17 #include <errno.h>
  18 #include <libgen.h>
  19 #include <string.h>
  20 #include <sys/param.h>
  21 
  22 char *
  23 basename(const char *path)
  24 {
  25         static char bname[MAXPATHLEN];
  26         size_t len;
  27         const char *endp, *startp;
  28 
  29         /* Empty or NULL string gets treated as "." */
  30         if (path == NULL || *path == '\0') {
  31                 bname[0] = '.';
  32                 bname[1] = '\0';
  33                 return (bname);
  34         }
  35 
  36         /* Strip any trailing slashes */
  37         endp = path + strlen(path) - 1;
  38         while (endp > path && *endp == '/')
  39                 endp--;
  40 
  41         /* All slashes becomes "/" */
  42         if (endp == path && *endp == '/') {
  43                 bname[0] = '/';
  44                 bname[1] = '\0';
  45                 return (bname);
  46         }
  47 
  48         /* Find the start of the base */
  49         startp = endp;
  50         while (startp > path && *(startp - 1) != '/')
  51                 startp--;
  52 
  53         len = endp - startp + 1;
  54         if (len >= sizeof(bname)) {
  55                 errno = ENAMETOOLONG;
  56                 return (NULL);
  57         }
  58         memcpy(bname, startp, len);
  59         bname[len] = '\0';
  60         return (bname);
  61 }

/* [<][>][^][v][top][bottom][index][help] */