1
0
mirror of https://gitlab.os-k.eu/os-k-team/kvisc.git synced 2023-08-25 14:05:46 +02:00
kvisc/ka/crt/fmt/ltostr.k
2019-07-17 20:26:03 +02:00

90 lines
1.3 KiB
Plaintext

; The OS/K Team licenses this file to you under the MIT license.
; See the LICENSE file in the project root for more information.
;
; void itoa(char *buf, int num, int base)
;
itoa:
mov ax3, 1
jmp ltostr
;
; void utoa(char *buf, int num, int base)
;
utoa:
xor ax3, ax3
jmp ltostr
;
; void ltostr(char *buf, int num, int base, bool signed)
;
ltostr:
mov rax, ax0
xor r11, r11
; make sure base is in [2, 32]
b.b ax2, 2, .bad
b.a ax2, 36, .bad
; deal with zero
b.z ax1, 0, .zero
; deal with base 10 signedness
test ax3, ax3
cmp.nz ax2, 10 ; base 10
j.nz .conv
sgn r11, ax1 ; extract ax1 sign
cmp r11, -1 ; negative?
neg.z ax1, ax1
; main loop
.conv:
b.z ax1, 0, .fini
rem r10, ax1, ax2 ; ax1 % base
b.a r10, 9, .nondec ; r10 > 9 ?
add r10, '0'
jmp .next
.nondec:
add r10, 55 ; 'A' - 10
.next:
mov b[ax0], r10
inc ax0
div ax1, ax1, ax2
jmp .conv
; add minus flag, null-terminate and reverse
.fini:
cmp r11, -1
mov.z b[ax0], '-'
inc.z ax0
mov b[ax0], 0
mov ax0, rax
call strrev2
ret
;
; exceptional cases
;
.bad:
mov q[errno], EINVAL
mov b[ax0], 0
ret
.zero:
mov b[ax0], 48 ; '0'
mov b[ax0+1], 0
ret