utils: Support Windows path separators in path_basename/dirname

This commit is contained in:
Martin Willi
2014-06-04 15:53:08 +02:00
parent a43f1e5631
commit 8182631bc3
2 changed files with 28 additions and 9 deletions
@@ -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)
+9 -9
View File
@@ -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);