diff --git a/README.md b/README.md index 8758f41..095849c 100644 --- a/README.md +++ b/README.md @@ -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() ``` \ No newline at end of file diff --git a/examples/euler4.zr b/examples/euler4.zr index 2a32079..a77a1c1 100644 --- a/examples/euler4.zr +++ b/examples/euler4.zr @@ -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) diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs index b90ad4e..d4fd18b 100644 --- a/src/codegen_x86_64.rs +++ b/src/codegen_x86_64.rs @@ -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 diff --git a/src/std.zr b/src/std.zr index 10ee35d..6b8556c 100644 --- a/src/std.zr +++ b/src/std.zr @@ -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) diff --git a/test.zr b/test.zr index c4bc77a..ddd6776 100644 --- a/test.zr +++ b/test.zr @@ -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") \ No newline at end of file + 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) \ No newline at end of file