fix: atoibase overflow check
This commit is contained in:
parent
defcb4338b
commit
fb49a1b217
1 changed files with 14 additions and 34 deletions
|
|
@ -41,9 +41,9 @@ check_base:
|
|||
je .done
|
||||
|
||||
; if (*p == '-' || *p == '+') return -1
|
||||
cmp dl, 45 ; '-'
|
||||
cmp dl, 45
|
||||
je .error
|
||||
cmp dl, 43 ; '+'
|
||||
cmp dl, 43
|
||||
je .error
|
||||
|
||||
; r10(idx) = *p / 32
|
||||
|
|
@ -83,12 +83,11 @@ check_base:
|
|||
mov rax, -1
|
||||
jmp .return
|
||||
|
||||
; skip whitespace and sign
|
||||
; rdi: str
|
||||
; skip whitespace
|
||||
; return:
|
||||
; rax str + x
|
||||
; rax str + x + is_signed
|
||||
; dl is_signed
|
||||
; rax = 0 if 2 sign
|
||||
find_start:
|
||||
push r12
|
||||
mov r12, rdi
|
||||
|
|
@ -118,27 +117,6 @@ find_start:
|
|||
inc rax
|
||||
ret
|
||||
|
||||
; rdi base
|
||||
; rsi char
|
||||
is_in_base:
|
||||
.loop:
|
||||
mov dl, byte [rdi]
|
||||
test dl, dl
|
||||
je .is_not_in
|
||||
|
||||
cmp dl, sil
|
||||
je .is_in
|
||||
|
||||
inc rdi
|
||||
jmp .loop
|
||||
|
||||
.is_in:
|
||||
mov rax, 1
|
||||
ret
|
||||
|
||||
.is_not_in:
|
||||
xor rax, rax
|
||||
ret
|
||||
|
||||
; rdi: base
|
||||
; rsi: char
|
||||
|
|
@ -147,12 +125,12 @@ is_in_base:
|
|||
; int i = 0
|
||||
; while i < baselen
|
||||
; if (c == base[i])
|
||||
; return 1
|
||||
; return base[i]
|
||||
; inc i
|
||||
; return -1
|
||||
|
||||
get_num_from_base:
|
||||
xor rax, rax; rax = i = 0
|
||||
xor rax, rax
|
||||
|
||||
.loop:
|
||||
cmp rax, rdx
|
||||
|
|
@ -199,7 +177,6 @@ ft_atoibase:
|
|||
mov r12, rax
|
||||
mov r15b, dl
|
||||
|
||||
; r11 = r = 0
|
||||
xor r11, r11
|
||||
.loop:
|
||||
cmp byte [r12], 0
|
||||
|
|
@ -216,9 +193,10 @@ ft_atoibase:
|
|||
test rax, rax
|
||||
jl .end_loop
|
||||
|
||||
mul r11, r14
|
||||
imul r11d, r14d
|
||||
jo .overflow
|
||||
add r11, rax
|
||||
; r += rax
|
||||
jc .overflow
|
||||
|
||||
inc r12
|
||||
jmp .loop
|
||||
|
|
@ -246,5 +224,7 @@ ft_atoibase:
|
|||
jmp .done
|
||||
|
||||
.overflow:
|
||||
xor rax, rax ; TODO: LONG_MAX | LONG_MIN
|
||||
jmp .done
|
||||
call __errno_location wrt ..plt
|
||||
mov dword [rax], 34
|
||||
xor rax, rax
|
||||
jmp .cleanup
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue