Fix filepath.dir

This commit is contained in:
Jeroen van Rijn
2026-02-14 12:52:51 +01:00
parent 67922a57e9
commit 1af1beb248
2 changed files with 23 additions and 16 deletions

View File

@@ -250,26 +250,14 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> (
then `"."` is returned.
*/
dir :: proc(path: string, allocator := context.allocator) -> string {
context.allocator = allocator
vol_len := len(volume_name(path))
when ODIN_OS == .Windows {
if len(path) >= 3 && is_separator(path[2]) {
vol_len += 1
}
}
vol := path[:vol_len]
i := len(path) - 1
for i >= vol_len && !is_separator(path[i]) {
for i > 0 && !is_separator(path[i]) {
i -= 1
}
dir, dir_err := clean(path[vol_len : i+1], allocator)
res, dir_err := clean(path[:i], allocator)
if dir_err != nil { return "" }
defer delete(dir)
if dir == "." && vol_len > 2 {
return strings.clone(vol)
}
return strings.concatenate({vol, dir})
return res
}

View File

@@ -132,4 +132,23 @@ test_stem :: proc(t: ^testing.T) {
for d in short_stem {
testing.expect_value(t, filepath.short_stem(d[0]), d[1])
}
}
@(test)
test_dir :: proc(t: ^testing.T) {
when ODIN_OS == .Windows {
@static dirs := [][2]string{
{"../bin/css", "..\\bin"},
{"W:/Odin/odin", "W:\\Odin"},
}
} else {
@static dirs := [][2]string{
{"../bin/css", "../bin"},
{"/bin/usr/", "/bin/usr"},
}
}
for d in dirs {
testing.expect_value(t, filepath.dir(d[0], context.temp_allocator), d[1])
}
}