Merge pull request #67 from ValKmjolnir/develop

🐛 if io.stat fails, return nil
This commit is contained in:
ValK 2025-02-12 19:27:24 +08:00 committed by GitHub
commit 9ea97c5608
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
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");
}
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 = {

View File

@ -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],

View File

@ -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) {

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