diff --git a/src/natives/io_lib.cpp b/src/natives/io_lib.cpp index d7f0c8e..834491a 100644 --- a/src/natives/io_lib.cpp +++ b/src/natives/io_lib.cpp @@ -178,8 +178,9 @@ var builtin_stat(context* ctx, gc* ngc) { return nas_err("io::stat", "\"filename\" must be string"); } struct stat buffer; - if (stat(name.str().c_str(), &buffer)<0) { - return nas_err("io::stat", "failed to open file <" + name.str() + ">"); + // if failed to stat, return nil + if (stat(name.str().c_str(), &buffer) < 0) { + return nil; } auto result = ngc->alloc(vm_type::vm_vec); result.vec().elems = { diff --git a/std/io.nas b/std/io.nas index bbc9e74..2ea34e5 100644 --- a/std/io.nas +++ b/std/io.nas @@ -76,6 +76,9 @@ var stderr = func() { return __stderr; }(); # get file status. using data from stat var fstat = func(filename) { var s = stat(filename); + if (s == nil) { + return nil; + } return { st_dev: s[0], st_ino: s[1], diff --git a/std/unix.nas b/std/unix.nas index 714f46f..c9db58b 100644 --- a/std/unix.nas +++ b/std/unix.nas @@ -8,11 +8,19 @@ var _S_IFDIR = 0x4000; var _S_IFREG = 0x8000; var isdir = func(path) { - return !!bits.u32_and(io.stat(path)[2], _S_IFDIR); + var s = io.stat(path); + if (s == nil) { + return false; + } + return !!bits.u32_and(s[2], _S_IFDIR); } var isfile = func(path) { - return !!bits.u32_and(io.stat(path)[2], _S_IFREG); + var s = io.stat(path); + if (s == nil) { + return false; + } + return !!bits.u32_and(s[2], _S_IFREG); } var opendir = func(path) { diff --git a/tools/find_clang.nas b/tools/find_clang.nas new file mode 100644 index 0000000..fb00d76 --- /dev/null +++ b/tools/find_clang.nas @@ -0,0 +1,14 @@ +use std.unix; +use std.file; + +var path_vec = split(":", unix.getenv("PATH")); +foreach (var path; path_vec) { + var files = file.find_all_files(path); + foreach (var f; files) { + if (f == "clang") { + println(path ~ "/" ~ f); + } elsif (find("clang-", f) == 0 and isnum(substr(f, 5, size(f)))) { + println(path ~ "/" ~ f); + } + } +} \ No newline at end of file