|
|
|
@ -188,6 +188,58 @@ basename(const char *name) |
|
|
|
return base; |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef HAS_WINDOWS |
|
|
|
/* allow back slashes \\ */ |
|
|
|
char * |
|
|
|
dirname(const char *name) |
|
|
|
{ |
|
|
|
static char *ret = NULL; |
|
|
|
int len; |
|
|
|
int size = 0; |
|
|
|
const char *p; |
|
|
|
|
|
|
|
if (ret) { |
|
|
|
free(ret); |
|
|
|
ret = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
if (!name || !strcmp(name, "") || (!strstr(name, "/") && !strstr(name, "\\"))) |
|
|
|
return("."); |
|
|
|
|
|
|
|
if (!strcmp(name, "/")) |
|
|
|
return(name); |
|
|
|
|
|
|
|
if (!strcmp(name, "\\")) |
|
|
|
return(name); |
|
|
|
|
|
|
|
// find the last slash in the string |
|
|
|
|
|
|
|
len = strlen(name); |
|
|
|
p = &name[len - 1]; |
|
|
|
|
|
|
|
if (*p == '/') p--; // skip the trailing / |
|
|
|
|
|
|
|
if (*p == '\\') p--; // skip the trailing \ |
|
|
|
|
|
|
|
while (p != name && *p != '/' && *p != '\\') p--; |
|
|
|
|
|
|
|
size = p - name; |
|
|
|
if (size) { |
|
|
|
ret = malloc(size + 1); |
|
|
|
memcpy(ret, name, size); |
|
|
|
ret[size] = '\0'; |
|
|
|
} else if (*p == '/') |
|
|
|
return "/"; |
|
|
|
else if (*p == '\\') |
|
|
|
return "\\"; |
|
|
|
else |
|
|
|
return ""; |
|
|
|
|
|
|
|
return (const char *) ret; |
|
|
|
} |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
char * |
|
|
|
dirname(const char *name) |
|
|
|
{ |
|
|
|
@ -228,5 +280,6 @@ dirname(const char *name) |
|
|
|
|
|
|
|
return (const char *) ret; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
#endif |