rewrite listdir and stdin builtins in zern
This commit is contained in:
@@ -7,7 +7,7 @@ func main[] : I64
|
|||||||
let s: I64 = 1
|
let s: I64 = 1
|
||||||
let j: I64 = 0
|
let j: I64 = 0
|
||||||
while j < 13
|
while j < 13
|
||||||
s = s * U8.parse_i64(String.nth(n, i + j))
|
s = s * (String.nth(n, i + j) - '0')
|
||||||
j = j + 1
|
j = j + 1
|
||||||
if s > out
|
if s > out
|
||||||
out = s
|
out = s
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ extern strcat
|
|||||||
extern strcpy
|
extern strcpy
|
||||||
extern strdup
|
extern strdup
|
||||||
extern strncpy
|
extern strncpy
|
||||||
extern fgets
|
extern syscall
|
||||||
extern fopen
|
extern fopen
|
||||||
extern fseek
|
extern fseek
|
||||||
extern ftell
|
extern ftell
|
||||||
@@ -160,11 +160,6 @@ _builtin_set64:
|
|||||||
mov [rdi], rsi
|
mov [rdi], rsi
|
||||||
ret
|
ret
|
||||||
|
|
||||||
section .text._builtin_stdin
|
|
||||||
_builtin_stdin:
|
|
||||||
mov rax, [rel stdin]
|
|
||||||
ret
|
|
||||||
|
|
||||||
section .text._builtin_lshift
|
section .text._builtin_lshift
|
||||||
_builtin_lshift:
|
_builtin_lshift:
|
||||||
mov rcx, rsi
|
mov rcx, rsi
|
||||||
@@ -178,50 +173,6 @@ _builtin_rshift:
|
|||||||
mov rax, rdi
|
mov rax, rdi
|
||||||
sar rax, cl
|
sar rax, cl
|
||||||
ret
|
ret
|
||||||
|
|
||||||
section .text._builtin_listdir
|
|
||||||
_builtin_listdir:
|
|
||||||
push r14
|
|
||||||
push rbx
|
|
||||||
push rax
|
|
||||||
mov r14, rdi
|
|
||||||
call Array.new
|
|
||||||
mov rbx, rax
|
|
||||||
mov rdi, r14
|
|
||||||
call opendir
|
|
||||||
mov r14, rax
|
|
||||||
._builtin_listdir.1:
|
|
||||||
mov rdi, r14
|
|
||||||
call readdir
|
|
||||||
test rax, rax
|
|
||||||
je ._builtin_listdir.3
|
|
||||||
cmp byte [rax+19], 46
|
|
||||||
jne ._builtin_listdir.2
|
|
||||||
movzx ecx, byte [rax+20]
|
|
||||||
test ecx, ecx
|
|
||||||
je ._builtin_listdir.1
|
|
||||||
cmp ecx, 46
|
|
||||||
jne ._builtin_listdir.2
|
|
||||||
cmp byte [rax+21], 0
|
|
||||||
je ._builtin_listdir.1
|
|
||||||
._builtin_listdir.2:
|
|
||||||
add rax, 19
|
|
||||||
mov rdi, rax
|
|
||||||
call strdup
|
|
||||||
mov rsi, rax
|
|
||||||
mov rdi, rbx
|
|
||||||
mov [rsp], rbx
|
|
||||||
call Array.push
|
|
||||||
mov rbx, [rsp]
|
|
||||||
jmp ._builtin_listdir.1
|
|
||||||
._builtin_listdir.3:
|
|
||||||
mov rdi, r14
|
|
||||||
call closedir
|
|
||||||
mov rax, rbx
|
|
||||||
add rsp, 8
|
|
||||||
pop rbx
|
|
||||||
pop r14
|
|
||||||
ret
|
|
||||||
"
|
"
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
33
src/std.zr
33
src/std.zr
@@ -60,12 +60,11 @@ func String.rev[s: String] : String
|
|||||||
String.set(out, len, 0)
|
String.set(out, len, 0)
|
||||||
return out
|
return out
|
||||||
|
|
||||||
func IO.stdin[]: Ptr
|
|
||||||
return _builtin_stdin()
|
|
||||||
|
|
||||||
func IO.read_line[]: String
|
func IO.read_line[]: String
|
||||||
let buffer: String = malloc(1024)
|
let buffer: String = malloc(1024)
|
||||||
fgets(buffer, 1024, IO.stdin())
|
let sys_read: I64 = 0
|
||||||
|
let stdin: I64 = 0
|
||||||
|
syscall(sys_read, stdin, buffer, 1024)
|
||||||
return buffer
|
return buffer
|
||||||
|
|
||||||
func IO.read_file[path: String]: String
|
func IO.read_file[path: String]: String
|
||||||
@@ -92,9 +91,6 @@ func IO.write_file[path: String, content: String] : Void
|
|||||||
fwrite(content, 1, strlen(content), file)
|
fwrite(content, 1, strlen(content), file)
|
||||||
fclose(file)
|
fclose(file)
|
||||||
|
|
||||||
func U8.parse_i64[c: U8]: I64
|
|
||||||
return c - '0'
|
|
||||||
|
|
||||||
func I64.to_string[n: I64] : String
|
func I64.to_string[n: I64] : String
|
||||||
let x: String = malloc(21)
|
let x: String = malloc(21)
|
||||||
sprintf(x, "%ld", n)
|
sprintf(x, "%ld", n)
|
||||||
@@ -213,7 +209,26 @@ func OS.time[] : I64
|
|||||||
return seconds * 1000 + microseconds / 1000
|
return seconds * 1000 + microseconds / 1000
|
||||||
|
|
||||||
func OS.listdir[path: String] : Array
|
func OS.listdir[path: String] : Array
|
||||||
return _builtin_listdir(path)
|
let dir: Ptr = opendir(path)
|
||||||
|
let files: Array = []
|
||||||
|
|
||||||
|
while true
|
||||||
|
let entry: Ptr = readdir(dir)
|
||||||
|
if entry == 0
|
||||||
|
break
|
||||||
|
|
||||||
|
let skip: Bool = false
|
||||||
|
if String.nth(entry, 19) == '.'
|
||||||
|
if String.nth(entry, 20) == 0
|
||||||
|
skip = true
|
||||||
|
else if String.nth(entry, 20) == '.'
|
||||||
|
if String.nth(entry, 21) == 0
|
||||||
|
skip = true
|
||||||
|
|
||||||
|
if !skip
|
||||||
|
Array.push(files, strdup(entry + 19))
|
||||||
|
closedir(dir)
|
||||||
|
return files
|
||||||
|
|
||||||
func Bit.lshift[a: I64, b: I64] : I64
|
func Bit.lshift[a: I64, b: I64] : I64
|
||||||
return _builtin_lshift(a, b)
|
return _builtin_lshift(a, b)
|
||||||
@@ -242,7 +257,7 @@ func Crypto.from_hex_digit[d: U8] : I64
|
|||||||
return d - 'a' + 10
|
return d - 'a' + 10
|
||||||
if d >= 'A' && d <= 'F'
|
if d >= 'A' && d <= 'F'
|
||||||
return d - 'A' + 10
|
return d - 'A' + 10
|
||||||
return U8.parse_i64(d)
|
return d - '0'
|
||||||
|
|
||||||
func Crypto.hex_decode[s: String] : String
|
func Crypto.hex_decode[s: String] : String
|
||||||
let s_len: I64 = strlen(s)
|
let s_len: I64 = strlen(s)
|
||||||
|
|||||||
Reference in New Issue
Block a user