diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index 2142a674c..3a11c09e8 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -241,7 +241,7 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> ( for ti < tl && target[ti] != SEPARATOR { ti += 1; } - if !strings.equal_fold(target[t0:ti], base[t0:ti]) { + if !strings.equal_fold(target[t0:ti], base[b0:bi]) { break; } if bi < bl { @@ -284,7 +284,7 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> ( dir :: proc(path: string, allocator := context.allocator) -> string { vol := volume_name(path); i := len(path) - 1; - for i >= len(vol) && is_separator(path[i]) { + for i >= len(vol) && !is_separator(path[i]) { i -= 1; } dir := clean(path[len(vol) : i+1], allocator); diff --git a/src/common.cpp b/src/common.cpp index 8d2802b1f..350127e1e 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -968,7 +968,20 @@ ReadDirectoryError read_directory(String path, Array *fi) { DIR *dir = opendir(c_path); if (!dir) { - return ReadDirectory_NotDir; + switch (errno) { + case ENOENT: + return ReadDirectory_NotExists; + case EACCES: + return ReadDirectory_Permission; + case ENOTDIR: + return ReadDirectory_NotDir; + default: + // ENOMEM: out of memory + // EMFILE: per-process limit on open fds reached + // ENFILE: system-wide limit on total open files reached + return ReadDirectory_Unknown; + } + GB_PANIC("unreachable"); } array_init(fi, a, 0, 100);