43 lines
793 B
ArmAsm
43 lines
793 B
ArmAsm
; Returns:
|
|
; rax - read(2) length
|
|
; rdi - if line is complete, line length;
|
|
; if line was incomplete, 0;
|
|
; if EOF or read(2) returned an error, undefined
|
|
; Errors (in rax):
|
|
; -1024 - line too long
|
|
; other negative - error from read(2)
|
|
; 0 - EOF from read(2)
|
|
; Arguments:
|
|
; rdi - fd
|
|
; rsi - buffer
|
|
; rdx - max length
|
|
readline:
|
|
push rsi
|
|
push rdx
|
|
mov rax, SYS_READ
|
|
syscall
|
|
pop rdx
|
|
pop rsi
|
|
cmp rax, 0
|
|
jl return
|
|
mov r10, 0
|
|
|
|
readline__scan:
|
|
cmp r10, rdx
|
|
jge readline__overflow
|
|
cmp r10, rax
|
|
jge readline__incomplete_line
|
|
mov r11b, [rsi + r10]
|
|
add r10, 1
|
|
cmp r11b, 0x0a ; '\n'
|
|
jne readline__scan
|
|
mov rdi, r10
|
|
ret
|
|
|
|
readline__incomplete_line:
|
|
mov rdi, 0
|
|
ret
|
|
|
|
readline__overflow:
|
|
mov rax, -1024
|
|
ret
|