root / prex-0.9.0 / usr / lib / libc / gen / dirname.c @ 03e9c04a
History | View | Annotate | Download (2.07 KB)
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 |
dirname(const char *path) |
24 |
{ |
25 |
static char dname[MAXPATHLEN]; |
26 |
size_t len; |
27 |
const char *endp; |
28 |
|
29 |
/* Empty or NULL string gets treated as "." */
|
30 |
if (path == NULL || *path == '\0') { |
31 |
dname[0] = '.'; |
32 |
dname[1] = '\0'; |
33 |
return (dname);
|
34 |
} |
35 |
|
36 |
/* Strip any trailing slashes */
|
37 |
endp = path + strlen(path) - 1;
|
38 |
while (endp > path && *endp == '/') |
39 |
endp--; |
40 |
|
41 |
/* Find the start of the dir */
|
42 |
while (endp > path && *endp != '/') |
43 |
endp--; |
44 |
|
45 |
/* Either the dir is "/" or there are no slashes */
|
46 |
if (endp == path) {
|
47 |
dname[0] = *endp == '/' ? '/' : '.'; |
48 |
dname[1] = '\0'; |
49 |
return (dname);
|
50 |
} else {
|
51 |
/* Move forward past the separating slashes */
|
52 |
do {
|
53 |
endp--; |
54 |
} while (endp > path && *endp == '/'); |
55 |
} |
56 |
|
57 |
len = endp - path + 1;
|
58 |
if (len >= sizeof(dname)) { |
59 |
errno = ENAMETOOLONG; |
60 |
return (NULL); |
61 |
} |
62 |
memcpy(dname, path, len); |
63 |
dname[len] = '\0';
|
64 |
return (dname);
|
65 |
} |