diff --git a/lib/std/fs/path.zig b/lib/std/fs/path.zig index 5e418e8e5c..1bf2211372 100644 --- a/lib/std/fs/path.zig +++ b/lib/std/fs/path.zig @@ -749,8 +749,12 @@ fn testResolvePosix(paths: []const []const u8, expected: []const u8) !void { return testing.expect(mem.eql(u8, actual, expected)); } +/// Strip the last component from a file path. +/// /// If the path is a file in the current directory (no directory component) -/// then returns null +/// then returns null. +/// +/// If the path is the root directory, returns null. pub fn dirname(path: []const u8) ?[]const u8 { if (builtin.os.tag == .windows) { return dirnameWindows(path); @@ -765,19 +769,19 @@ pub fn dirnameWindows(path: []const u8) ?[]const u8 { const root_slice = diskDesignatorWindows(path); if (path.len == root_slice.len) - return path; + return null; const have_root_slash = path.len > root_slice.len and (path[root_slice.len] == '/' or path[root_slice.len] == '\\'); var end_index: usize = path.len - 1; - while ((path[end_index] == '/' or path[end_index] == '\\') and end_index > root_slice.len) { + while (path[end_index] == '/' or path[end_index] == '\\') { if (end_index == 0) return null; end_index -= 1; } - while (path[end_index] != '/' and path[end_index] != '\\' and end_index > root_slice.len) { + while (path[end_index] != '/' and path[end_index] != '\\') { if (end_index == 0) return null; end_index -= 1; @@ -800,7 +804,7 @@ pub fn dirnamePosix(path: []const u8) ?[]const u8 { var end_index: usize = path.len - 1; while (path[end_index] == '/') { if (end_index == 0) - return path[0..1]; + return null; end_index -= 1; } @@ -810,7 +814,7 @@ pub fn dirnamePosix(path: []const u8) ?[]const u8 { end_index -= 1; } - if (end_index == 0 and path[end_index] == '/') + if (end_index == 0 and path[0] == '/') return path[0..1]; if (end_index == 0) @@ -823,8 +827,10 @@ test "dirnamePosix" { testDirnamePosix("/a/b/c", "/a/b"); testDirnamePosix("/a/b/c///", "/a/b"); testDirnamePosix("/a", "/"); - testDirnamePosix("/", "/"); - testDirnamePosix("////", "/"); + testDirnamePosix("/", null); + testDirnamePosix("//", null); + testDirnamePosix("///", null); + testDirnamePosix("////", null); testDirnamePosix("", null); testDirnamePosix("a", null); testDirnamePosix("a/", null); @@ -832,27 +838,27 @@ test "dirnamePosix" { } test "dirnameWindows" { - testDirnameWindows("c:\\", "c:\\"); + testDirnameWindows("c:\\", null); testDirnameWindows("c:\\foo", "c:\\"); testDirnameWindows("c:\\foo\\", "c:\\"); testDirnameWindows("c:\\foo\\bar", "c:\\foo"); testDirnameWindows("c:\\foo\\bar\\", "c:\\foo"); testDirnameWindows("c:\\foo\\bar\\baz", "c:\\foo\\bar"); - testDirnameWindows("\\", "\\"); + testDirnameWindows("\\", null); testDirnameWindows("\\foo", "\\"); testDirnameWindows("\\foo\\", "\\"); testDirnameWindows("\\foo\\bar", "\\foo"); testDirnameWindows("\\foo\\bar\\", "\\foo"); testDirnameWindows("\\foo\\bar\\baz", "\\foo\\bar"); - testDirnameWindows("c:", "c:"); - testDirnameWindows("c:foo", "c:"); - testDirnameWindows("c:foo\\", "c:"); + testDirnameWindows("c:", null); + testDirnameWindows("c:foo", null); + testDirnameWindows("c:foo\\", null); testDirnameWindows("c:foo\\bar", "c:foo"); testDirnameWindows("c:foo\\bar\\", "c:foo"); testDirnameWindows("c:foo\\bar\\baz", "c:foo\\bar"); testDirnameWindows("file:stream", null); testDirnameWindows("dir\\file:stream", "dir"); - testDirnameWindows("\\\\unc\\share", "\\\\unc\\share"); + testDirnameWindows("\\\\unc\\share", null); testDirnameWindows("\\\\unc\\share\\foo", "\\\\unc\\share\\"); testDirnameWindows("\\\\unc\\share\\foo\\", "\\\\unc\\share\\"); testDirnameWindows("\\\\unc\\share\\foo\\bar", "\\\\unc\\share\\foo"); @@ -862,8 +868,8 @@ test "dirnameWindows" { testDirnameWindows("/a/b", "/a"); testDirnameWindows("/a", "/"); testDirnameWindows("", null); - testDirnameWindows("/", "/"); - testDirnameWindows("////", "/"); + testDirnameWindows("/", null); + testDirnameWindows("////", null); testDirnameWindows("foo", null); }