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 * Sometimes works
## Syntax ## Syntax
```go ```swift
func fib[n: I64] : I64 func fib[n: I64] : I64
if n <= 1 if n <= 1
return n return n
return fib(n-2) + fib(n-1) return fib(n-2) + fib(n-1)
func main[] : I64 func main[] : I64
for i in 0..20 for i in 0:20
fib(i) |> I64.to_string() |> print() fib(i) |> I64.to_string() |> print()
``` ```

View File

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

View File

@@ -115,9 +115,11 @@ extern ftell
extern fread extern fread
extern rewind extern rewind
extern system extern system
extern opendir
extern readdir
extern closedir
extern exit extern exit
extern gettimeofday extern gettimeofday
copystr equ strdup
String.nth: String.nth:
movzx rax, byte [rdi + rsi] movzx rax, byte [rdi + rsi]
@@ -127,7 +129,7 @@ String.set:
mov [rdi + rsi], dl mov [rdi + rsi], dl
ret ret
time: OS.time:
push rbx push rbx
sub rsp, 16 sub rsp, 16
mov rbx, rsp mov rbx, rsp
@@ -144,6 +146,47 @@ time:
pop rbx pop rbx
ret 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: Array.new:
mov rdi, 1 mov rdi, 1
mov rsi, 24 mov rsi, 24

View File

@@ -19,7 +19,7 @@ func substr[s: String, start: I64, length: I64] : String
strlcpy(out, s + start, length + 1) strlcpy(out, s + start, length + 1)
return out return out
func strrev[s: String] : String func String.rev[s: String] : String
let len: I64 = strlen(s) let len: I64 = strlen(s)
let out: String = malloc(len + 1) 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) printf("\033[93mBuilding %s...\033[0m", x)
let cmd: String = concat("./target/release/zern examples/", 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 if system(cmd) != 0
exit(1) exit(1)
let build_end_time: I64 = time() let build_end_time: I64 = OS.time()
free(cmd) free(cmd)
printf(" %ldms\n", build_end_time - build_start_time) 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 if system("./out") != 0
exit(1) 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) printf("\033[93mRunning %s...\033[0m %ldms\n", x, run_end_time - run_start_time)
func main[] : I64 func main[] : I64
system("cargo build --release") system("cargo build --release")
// TODO: listdir let files: Array = OS.listdir("examples/")
run_test("euler1.zr") for i in 0:Array.size(files)
run_test("euler2.zr") let file: String = Array.nth(files, i)
run_test("euler3.zr") run_test(file)
run_test("euler4.zr") free(file)
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")