15 #define PATH_SEPARATOR '/'
17 #define PATH_SEPARATOR '/'
19 #define PATH_SEPARATOR '/'
21 #define PATH_SEPARATOR '\\'
23 #define PATH_SEPARATOR '/'
27 #define isslash(c) ((c) == '/' || (c) == '\\')
29 #define isslash(c) ((c) == '/' || (c) == '\\')
31 #define isslash(c) ((c) == '/')
36 static int has_drive(
const char *path) {
39 if (path ==
NULL)
return 0;
40 if (!*p || !isalpha(*p))
return 0;
46 if (path ==
NULL)
return 0;
49 if (*path &&
isslash(*path))
return 1;
50 return has_drive(path);
52 if (*path &&
isslash(*path))
return 1;
53 return has_drive(path);
55 return (*path &&
isslash(*path));
59 static char *dir_name(
const char *path) {
63 if (path ==
NULL || strlen(path) == 0) {
64 snprintf(dname,
sizeof(dname),
".");
68 p = path + strlen(path) - 1;
69 while (p > path &&
isslash(*p)) {
73 while (p > path && !
isslash(*p)) {
83 }
while (p > path &&
isslash(*p));
90 snprintf(dname,
sizeof(dname),
"%.*s", (
int)(p - path + 1), path);
95 static char *base_name(
const char *path) {
99 if (path ==
NULL || strlen(path) == 0) {
100 snprintf(bname,
sizeof(bname),
".");
104 ep = path + strlen(path) - 1;
105 while (ep > path &&
isslash(*ep)) {
109 if (ep == path &&
isslash(*ep)) {
115 while (sp > path && !
isslash(*(sp - 1))) {
120 errno = ENAMETOOLONG;
123 snprintf(bname,
sizeof(bname),
"%.*s", (
int)(ep - sp + 1), sp);
128 static char *get_bdname(
const char *path,
int type) {
133 if (has_drive(path)) {
135 snprintf(drive,
sizeof(drive),
"%.2s", path);
145 if (strlen(drive) > 0 &&
isslash(*q)) {
147 errno = ENAMETOOLONG;
150 snprintf(bname,
sizeof(bname),
"%s%s", drive, q);
152 snprintf(bname,
sizeof(bname),
"%s", q);
158 char *bname = get_bdname(path,
'B');
166 char *dname = get_bdname(path,
'D');
#define HECMW_FILENAME_LEN
int HECMW_set_error(int errorno, const char *fmt,...)
char * HECMW_basename(const char *path)
char * HECMW_dirname(const char *path)
int HECMW_get_path_separator(void)
int HECMW_is_absolute_path(const char *path)