diff --git a/lib/libc/snprintf.c b/lib/libc/snprintf.c index 3b175ed6a..f34cefd6a 100644 --- a/lib/libc/snprintf.c +++ b/lib/libc/snprintf.c @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -40,6 +41,12 @@ static void unsigned_num_print(char **s, size_t n, size_t *chars_printed, unsigned int rem; char ascii_a = capitalise ? 'A' : 'a'; + if (radix < 10) { + ERROR("snprintf: unsupported radix '%d'.", radix); + plat_panic_handler(); + assert(0); /* Unreachable */ + } + do { rem = unum % radix; if (rem < 10U) { @@ -52,31 +59,14 @@ static void unsigned_num_print(char **s, size_t n, size_t *chars_printed, } while (unum > 0U); width = i; - if (padn > width) { - (*chars_printed) += (size_t)padn; - } else { - (*chars_printed) += (size_t)width; + for (i = padn - width; i > 0; i--) { + CHECK_AND_PUT_CHAR(*s, n, *chars_printed, padc); } - - if (*chars_printed < n) { - - if (padn > 0) { - while (width < padn) { - *(*s)++ = padc; - padn--; - } - } - - while (--i >= 0) { - *(*s)++ = num_buf[i]; - } - - if (padn < 0) { - while (width < -padn) { - *(*s)++ = padc; - padn++; - } - } + for (i = width; i > 0; i--) { + CHECK_AND_PUT_CHAR(*s, n, *chars_printed, num_buf[i - 1]); + } + for (i = width + padn; i < 0; i++) { + CHECK_AND_PUT_CHAR(*s, n, *chars_printed, padc); } }