OS.listdir

This commit is contained in:
2025-06-03 13:31:04 +02:00
parent 946ab52a19
commit cebc3d1822
5 changed files with 58 additions and 28 deletions

View File

@@ -8,13 +8,13 @@ A very cool language
* Sometimes works
## Syntax
```go
```swift
func fib[n: I64] : I64
if n <= 1
return n
return fib(n-2) + fib(n-1)
func main[] : I64
for i in 0..20
for i in 0:20
fib(i) |> I64.to_string() |> print()
```

View File

@@ -5,7 +5,7 @@ func main[] : I64
for b in 500:1000
if a * b > out
let s: String = I64.to_string(a * b)
let s_rev: String = strrev(s)
let s_rev: String = String.rev(s)
if strcmp(s, s_rev) == 0
out = a * b
free(s)

View File

@@ -115,9 +115,11 @@ extern ftell
extern fread
extern rewind
extern system
extern opendir
extern readdir
extern closedir
extern exit
extern gettimeofday
copystr equ strdup
String.nth:
movzx rax, byte [rdi + rsi]
@@ -127,7 +129,7 @@ String.set:
mov [rdi + rsi], dl
ret
time:
OS.time:
push rbx
sub rsp, 16
mov rbx, rsp
@@ -144,6 +146,47 @@ time:
pop rbx
ret
OS.listdir:
push r14
push rbx
push rax
mov r14, rdi
call Array.new
mov rbx, rax
mov rdi, r14
call opendir
mov r14, rax
.LBB5_1:
mov rdi, r14
call readdir
test rax, rax
je .LBB5_7
cmp byte [rax+19], 46
jne .LBB5_6
movzx ecx, byte [rax+20]
test ecx, ecx
je .LBB5_1
cmp ecx, 46
jne .LBB5_6
cmp byte [rax+21], 0
je .LBB5_1
.LBB5_6:
add rax, 19
mov rdi, rax
call strdup
mov rsi, rax
mov rdi, rbx
call Array.push
jmp .LBB5_1
.LBB5_7:
mov rdi, r14
call closedir
mov rax, rbx
add rsp, 8
pop rbx
pop r14
ret
Array.new:
mov rdi, 1
mov rsi, 24

View File

@@ -19,7 +19,7 @@ func substr[s: String, start: I64, length: I64] : String
strlcpy(out, s + start, length + 1)
return out
func strrev[s: String] : String
func String.rev[s: String] : String
let len: I64 = strlen(s)
let out: String = malloc(len + 1)

31
test.zr
View File

@@ -3,39 +3,26 @@ func run_test[x: String] : I64
printf("\033[93mBuilding %s...\033[0m", x)
let cmd: String = concat("./target/release/zern examples/", x)
let build_start_time: I64 = time()
let build_start_time: I64 = OS.time()
if system(cmd) != 0
exit(1)
let build_end_time: I64 = time()
let build_end_time: I64 = OS.time()
free(cmd)
printf(" %ldms\n", build_end_time - build_start_time)
let run_start_time: I64 = time()
let run_start_time: I64 = OS.time()
if system("./out") != 0
exit(1)
let run_end_time: I64 = time()
let run_end_time: I64 = OS.time()
printf("\033[93mRunning %s...\033[0m %ldms\n", x, run_end_time - run_start_time)
func main[] : I64
system("cargo build --release")
// TODO: listdir
run_test("euler1.zr")
run_test("euler2.zr")
run_test("euler3.zr")
run_test("euler4.zr")
run_test("euler5.zr")
run_test("euler6.zr")
run_test("euler7.zr")
run_test("euler8.zr")
run_test("euler9.zr")
run_test("euler10.zr")
run_test("euler12.zr")
run_test("euler13.zr")
run_test("euler14.zr")
run_test("euler15.zr")
run_test("fib.zr")
run_test("hello.zr")
run_test("strings.zr")
let files: Array = OS.listdir("examples/")
for i in 0:Array.size(files)
let file: String = Array.nth(files, i)
run_test(file)
free(file)