From b4e976364afd841028439b939737837a9e85652d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 10 Jul 2020 08:42:59 +0100 Subject: [PATCH] Add path_unix.odin --- core/path/path_unix.odin | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 core/path/path_unix.odin diff --git a/core/path/path_unix.odin b/core/path/path_unix.odin new file mode 100644 index 000000000..8c03dffaf --- /dev/null +++ b/core/path/path_unix.odin @@ -0,0 +1,81 @@ +//+build linux, darwin +package path + +foreign import libc "system:c" + +import "core:os" +import "core:strings" + + +MAX :: 4096; // @note(bp): apparently PATH_MAX is bullshit + +SEPARATOR :: '/'; +SEPARATOR_STRING :: "/"; + + +@(private) +null_term :: proc(str: string) -> string { + for c, i in str { + if c == '\x00' { + return str[:i]; + } + } + return str; +} + + +full :: proc(path: string, allocator := context.temp_allocator) -> string { + cpath := strings.clone_to_cstring(path, context.temp_allocator); + + foreign libc { + realpath :: proc(path: cstring, resolved_path: ^u8) -> cstring ---; + } + + buf := make([dynamic]u8, MAX, MAX, allocator); + + cstr := realpath(cpath, &buf[0]); + for cstr == nil && os.get_last_error() == int(os.ENAMETOOLONG) { + resize(&buf, len(buf) + MAX); + cstr = realpath(cpath, &buf[0]); + } + + return null_term(string(buf[:])); +} + +current :: proc(allocator := context.temp_allocator) -> string { + foreign libc{ + getcwd :: proc(buf: ^u8, size: int) -> cstring ---; + } + + buf := make([dynamic]u8, MAX, MAX, allocator); + + cstr := getcwd(&buf[0], len(buf)); + for cstr == nil && os.get_last_error() == int(os.ENAMETOOLONG) { + resize(&buf, len(buf) + MAX); + cstr = getcwd(&buf[0], len(buf)); + } + + return null_term(string(buf[:])); +} + + +exists :: proc(path: string) -> bool { + if _, ok := os.stat(path); ok { + return true; + } + return false; +} + +is_dir :: proc(path: string) -> bool { + if stat, ok := os.stat(path); ok { + return os.S_ISDIR(u32(stat.mode)); + } + return false; +} + +is_file :: proc(path: string) -> bool { + if stat, ok := os.stat(path); ok { + return os.S_ISREG(u32(stat.mode)); + } + return false; +}