| /* SPDX-License-Identifier: BSD-2-Clause */ |
| /* Copyright 2023-2025 The NASM Authors - All Rights Reserved */ |
| |
| #include "nasmlib.h" |
| |
| const char * const nasmlib_digit_chars[2] = { |
| /* Lower case version */ |
| "0123456789" |
| "abcdefghijklmnopqrstuvwxyz" |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| "@_", |
| |
| /* Upper case version */ |
| "0123456789" |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| "abcdefghijklmnopqrstuvwxyz" |
| "@_" |
| }; |
| |
| /* |
| * Produce an unsigned integer string from a number with a specified |
| * base, digits and signedness. |
| */ |
| int numstr(char *buf, size_t buflen, uint64_t n, |
| int digits, unsigned int base, bool ucase) |
| { |
| const char * const dchars = nasm_digit_chars(ucase); |
| bool moredigits = digits <= 0; |
| char *p; |
| int len; |
| |
| if (base < 2 || base > NUMSTR_MAXBASE) |
| return -1; |
| |
| if (moredigits) |
| digits = -digits; |
| |
| p = buf + buflen; |
| *--p = '\0'; |
| |
| while (p > buf && (digits-- > 0 || (moredigits && n))) { |
| *--p = dchars[n % base]; |
| n /= base; |
| } |
| |
| len = buflen - (p - buf); /* Including final null */ |
| if (p != buf) |
| memmove(buf, p, len); |
| |
| return len - 1; |
| } |