]> git.saurik.com Git - apple/libc.git/blobdiff - gen/FreeBSD/basename.c
Libc-1439.100.3.tar.gz
[apple/libc.git] / gen / FreeBSD / basename.c
index 3de44fb2927ec423112793ec1df1afa3ad260b2e..140ccbb6a08741be8f94aed7dfbb45da2fd12d40 100644 (file)
@@ -39,38 +39,29 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/basename.c,v 1.7 2002/12/30 01:41:14 marcel
 #include <string.h>
 #include <sys/param.h>
 
 #include <string.h>
 #include <sys/param.h>
 
-#if __DARWIN_UNIX03
-#define const /**/
-#endif
-
 char *
 char *
-basename(path)
-       const char *path;
+basename_r(const char *path, char *bname)
 {
 {
-       static char *bname = NULL;
        const char *endp, *startp;
        const char *endp, *startp;
-
-       if (bname == NULL) {
-               bname = (char *)malloc(MAXPATHLEN);
-               if (bname == NULL)
-                       return(NULL);
-       }
+       size_t len;
 
        /* Empty or NULL string gets treated as "." */
        if (path == NULL || *path == '\0') {
 
        /* Empty or NULL string gets treated as "." */
        if (path == NULL || *path == '\0') {
-               (void)strcpy(bname, ".");
-               return(bname);
+               bname[0] = '.';
+               bname[1] = '\0';
+               return (bname);
        }
 
        }
 
-       /* Strip trailing slashes */
+       /* Strip any trailing slashes */
        endp = path + strlen(path) - 1;
        while (endp > path && *endp == '/')
                endp--;
 
        /* All slashes becomes "/" */
        if (endp == path && *endp == '/') {
        endp = path + strlen(path) - 1;
        while (endp > path && *endp == '/')
                endp--;
 
        /* All slashes becomes "/" */
        if (endp == path && *endp == '/') {
-               (void)strcpy(bname, "/");
-               return(bname);
+               bname[0] = '/';
+               bname[1] = '\0';
+               return (bname);
        }
 
        /* Find the start of the base */
        }
 
        /* Find the start of the base */
@@ -78,11 +69,29 @@ basename(path)
        while (startp > path && *(startp - 1) != '/')
                startp--;
 
        while (startp > path && *(startp - 1) != '/')
                startp--;
 
-       if (endp - startp + 2 > MAXPATHLEN) {
+       len = endp - startp + 1;
+       if (len >= MAXPATHLEN) {
                errno = ENAMETOOLONG;
                errno = ENAMETOOLONG;
-               return(NULL);
+               return (NULL);
+       }
+       memcpy(bname, startp, len);
+       bname[len] = '\0';
+       return (bname);
+}
+
+#if __DARWIN_UNIX03
+#define const /**/
+#endif
+
+char *
+basename(const char *path)
+{
+       static char *bname = NULL;
+
+       if (bname == NULL) {
+               bname = (char *)malloc(MAXPATHLEN);
+               if (bname == NULL)
+                       return (NULL);
        }
        }
-       (void)strncpy(bname, startp, endp - startp + 1);
-       bname[endp - startp + 1] = '\0';
-       return(bname);
+       return (basename_r(path, bname));
 }
 }