OS.listdir
This commit is contained in:
@@ -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()
|
||||||
```
|
```
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
31
test.zr
@@ -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")
|
|
||||||
Reference in New Issue
Block a user