; 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: mov ax3, zero jmp ltostr ; ; void ltostr(char *buf, int num, int base, bool signed) ; ltostr: mov rax, ax0 mov r11, zero ; make sure base is in [2, 32] b.b ax2, 2, .bad b.a ax2, 36, .bad ; deal with zero b.z ax1, zero, .is_zero ; deal with base 10 signedness b.z ax3, zero, .conv b.nz ax2, 10, .conv ; base 10 shr r11, ax1, 63 ; extract ax1 sign cmp r11, zero ; negative? sub.nz ax1, zero, ax1 ; yes ; main loop .conv: b.z ax1, zero, .fini rem r10, ax1, ax2 ; ax1 % base b.a r10, 9, .nondec ; r10 > 9 ? add r10, r10, '0' jmp .next .nondec: add r10, r10, 55 ; 'A' - 10 .next: mov b[ax0], r10 add ax0, ax0, 1 div ax1, ax1, ax2 jmp .conv ; add minus flag, null-terminate and reverse .fini: cmp r11, -1 mov.z b[ax0], '-' add.z ax0, ax0, 1 mov b[ax0], zero call strrev2, rax ret ; ; exceptional cases ; .bad: mov q[errno], EINVAL mov b[ax0], 0 ret .is_zero: mov b[ax0], 48 ; '0' mov b[ax0+1], 0 ret