You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.3 KiB
71 lines
1.3 KiB
#include "../git-compat-util.h" |
|
#include "../strbuf.h" |
|
|
|
/* Adapted from libiberty's basename.c. */ |
|
char *gitbasename (char *path) |
|
{ |
|
const char *base; |
|
|
|
if (path) |
|
skip_dos_drive_prefix(&path); |
|
|
|
if (!path || !*path) |
|
return "."; |
|
|
|
for (base = path; *path; path++) { |
|
if (!is_dir_sep(*path)) |
|
continue; |
|
do { |
|
path++; |
|
} while (is_dir_sep(*path)); |
|
if (*path) |
|
base = path; |
|
else |
|
while (--path != base && is_dir_sep(*path)) |
|
*path = '\0'; |
|
} |
|
return (char *)base; |
|
} |
|
|
|
char *gitdirname(char *path) |
|
{ |
|
static struct strbuf buf = STRBUF_INIT; |
|
char *p = path, *slash = NULL, c; |
|
int dos_drive_prefix; |
|
|
|
if (!p) |
|
return "."; |
|
|
|
if ((dos_drive_prefix = skip_dos_drive_prefix(&p)) && !*p) |
|
goto dot; |
|
|
|
/* |
|
* POSIX.1-2001 says dirname("/") should return "/", and dirname("//") |
|
* should return "//", but dirname("///") should return "/" again. |
|
*/ |
|
if (is_dir_sep(*p)) { |
|
if (!p[1] || (is_dir_sep(p[1]) && !p[2])) |
|
return path; |
|
slash = ++p; |
|
} |
|
while ((c = *(p++))) |
|
if (is_dir_sep(c)) { |
|
char *tentative = p - 1; |
|
|
|
/* POSIX.1-2001 says to ignore trailing slashes */ |
|
while (is_dir_sep(*p)) |
|
p++; |
|
if (*p) |
|
slash = tentative; |
|
} |
|
|
|
if (slash) { |
|
*slash = '\0'; |
|
return path; |
|
} |
|
|
|
dot: |
|
strbuf_reset(&buf); |
|
strbuf_addf(&buf, "%.*s.", dos_drive_prefix, path); |
|
return buf.buf; |
|
}
|
|
|