🐛 if stat fails, return nil

This commit is contained in:
ValKmjolnir 2025-02-12 19:13:30 +08:00
parent a25f309063
commit b177a58662
4 changed files with 30 additions and 4 deletions

View File

@ -178,8 +178,9 @@ var builtin_stat(context* ctx, gc* ngc) {
return nas_err("io::stat", "\"filename\" must be string"); return nas_err("io::stat", "\"filename\" must be string");
} }
struct stat buffer; struct stat buffer;
if (stat(name.str().c_str(), &buffer)<0) { // if failed to stat, return nil
return nas_err("io::stat", "failed to open file <" + name.str() + ">"); if (stat(name.str().c_str(), &buffer) < 0) {
return nil;
} }
auto result = ngc->alloc(vm_type::vm_vec); auto result = ngc->alloc(vm_type::vm_vec);
result.vec().elems = { result.vec().elems = {

View File

@ -76,6 +76,9 @@ var stderr = func() { return __stderr; }();
# get file status. using data from stat # get file status. using data from stat
var fstat = func(filename) { var fstat = func(filename) {
var s = stat(filename); var s = stat(filename);
if (s == nil) {
return nil;
}
return { return {
st_dev: s[0], st_dev: s[0],
st_ino: s[1], st_ino: s[1],

View File

@ -8,11 +8,19 @@ var _S_IFDIR = 0x4000;
var _S_IFREG = 0x8000; var _S_IFREG = 0x8000;
var isdir = func(path) { 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) { 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) { var opendir = func(path) {

14
tools/find_clang.nas Normal file
View File

@ -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);
}
}
}