utils: Support Windows path separators in path_basename/dirname
This commit is contained in:
@@ -520,6 +520,24 @@ static struct {
|
|||||||
{"", ".", "."},
|
{"", ".", "."},
|
||||||
{".", ".", "."},
|
{".", ".", "."},
|
||||||
{"..", ".", ".."},
|
{"..", ".", ".."},
|
||||||
|
#ifdef WIN32
|
||||||
|
{"C:\\", "C:\\", "C:\\"},
|
||||||
|
{"C:\\\\", "C:\\", "C:\\"},
|
||||||
|
{"foo", ".", "foo"},
|
||||||
|
{"f\\", ".", "f"},
|
||||||
|
{"foo\\", ".", "foo"},
|
||||||
|
{"foo\\\\", ".", "foo"},
|
||||||
|
{"C:\\f", "C:\\", "f"},
|
||||||
|
{"C:\\f\\", "\\", "f"},
|
||||||
|
{"C:\\foo", "C:\\", "foo"},
|
||||||
|
{"C:\\foo\\", "C:\\", "foo"},
|
||||||
|
{"foo\\bar", "foo", "bar"},
|
||||||
|
{"foo\\\\bar", "foo", "bar"},
|
||||||
|
{"C:\\foo\\bar", "C:\\foo", "bar"},
|
||||||
|
{"C:\\foo\\bar\\", "C:\\foo", "bar"},
|
||||||
|
{"C:\\foo\\bar\\baz", "C:\\foo\\bar", "baz"},
|
||||||
|
{"\\foo\\bar", "\\foo", "bar"},
|
||||||
|
#else /* !WIN32 */
|
||||||
{"/", "/", "/"},
|
{"/", "/", "/"},
|
||||||
{"//", "/", "/"},
|
{"//", "/", "/"},
|
||||||
{"foo", ".", "foo"},
|
{"foo", ".", "foo"},
|
||||||
@@ -536,6 +554,7 @@ static struct {
|
|||||||
{"/foo/bar", "/foo", "bar"},
|
{"/foo/bar", "/foo", "bar"},
|
||||||
{"/foo/bar/", "/foo", "bar"},
|
{"/foo/bar/", "/foo", "bar"},
|
||||||
{"/foo/bar/baz", "/foo/bar", "baz"},
|
{"/foo/bar/baz", "/foo/bar", "baz"},
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
START_TEST(test_path_dirname)
|
START_TEST(test_path_dirname)
|
||||||
|
|||||||
@@ -229,21 +229,21 @@ char* path_dirname(const char *path)
|
|||||||
{
|
{
|
||||||
char *pos;
|
char *pos;
|
||||||
|
|
||||||
pos = path ? strrchr(path, '/') : NULL;
|
pos = path ? strrchr(path, DIRECTORY_SEPARATOR[0]) : NULL;
|
||||||
|
|
||||||
if (pos && !pos[1])
|
if (pos && !pos[1])
|
||||||
{ /* if path ends with slashes we have to look beyond them */
|
{ /* if path ends with slashes we have to look beyond them */
|
||||||
while (pos > path && *pos == '/')
|
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
{ /* skip trailing slashes */
|
{ /* skip trailing slashes */
|
||||||
pos--;
|
pos--;
|
||||||
}
|
}
|
||||||
pos = memrchr(path, '/', pos - path + 1);
|
pos = memrchr(path, DIRECTORY_SEPARATOR[0], pos - path + 1);
|
||||||
}
|
}
|
||||||
if (!pos)
|
if (!pos)
|
||||||
{
|
{
|
||||||
return strdup(".");
|
return strdup(".");
|
||||||
}
|
}
|
||||||
while (pos > path && *pos == '/')
|
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
{ /* skip superfluous slashes */
|
{ /* skip superfluous slashes */
|
||||||
pos--;
|
pos--;
|
||||||
}
|
}
|
||||||
@@ -261,19 +261,19 @@ char* path_basename(const char *path)
|
|||||||
{
|
{
|
||||||
return strdup(".");
|
return strdup(".");
|
||||||
}
|
}
|
||||||
pos = strrchr(path, '/');
|
pos = strrchr(path, DIRECTORY_SEPARATOR[0]);
|
||||||
if (pos && !pos[1])
|
if (pos && !pos[1])
|
||||||
{ /* if path ends with slashes we have to look beyond them */
|
{ /* if path ends with slashes we have to look beyond them */
|
||||||
while (pos > path && *pos == '/')
|
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
{ /* skip trailing slashes */
|
{ /* skip trailing slashes */
|
||||||
pos--;
|
pos--;
|
||||||
}
|
}
|
||||||
if (pos == path && *pos == '/')
|
if (pos == path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
{ /* contains only slashes */
|
{ /* contains only slashes */
|
||||||
return strdup("/");
|
return strdup(DIRECTORY_SEPARATOR);
|
||||||
}
|
}
|
||||||
trail = pos + 1;
|
trail = pos + 1;
|
||||||
pos = memrchr(path, '/', trail - path);
|
pos = memrchr(path, DIRECTORY_SEPARATOR[0], trail - path);
|
||||||
}
|
}
|
||||||
pos = pos ? pos + 1 : (char*)path;
|
pos = pos ? pos + 1 : (char*)path;
|
||||||
return trail ? strndup(pos, trail - pos) : strdup(pos);
|
return trail ? strndup(pos, trail - pos) : strdup(pos);
|
||||||
|
|||||||
Reference in New Issue
Block a user