about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2024-05-06 17:13:23 -0400
committerRich Felker <dalias@aerifal.cx>2024-05-06 17:13:23 -0400
commit3f9d4224d8db7868b6c2f526746d597785d30c61 (patch)
tree29e628c78af5507e3200b06f0153162fc51aa926
parenta23cf8f9c5ab8ff1e1742a68b352e58b9febbe4a (diff)
downloadmusl-3f9d4224d8db7868b6c2f526746d597785d30c61.tar.gz
musl-3f9d4224d8db7868b6c2f526746d597785d30c61.tar.xz
musl-3f9d4224d8db7868b6c2f526746d597785d30c61.zip
printf decimal integer formatting: shave off one division
once the remaining value is less than 10, the modulo operation to
produce the final digit and division to prepare for next loop
iteration can be dropped. this may be a meaningful performance
distinction when formatting low-magnitude numbers in bulk, and should
never hurt.

based on patch by Viktor Reznov.
-rw-r--r--src/stdio/vfprintf.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
index dc648e7e..360d723a 100644
--- a/src/stdio/vfprintf.c
+++ b/src/stdio/vfprintf.c
@@ -166,7 +166,8 @@ static char *fmt_u(uintmax_t x, char *s)
 {
 	unsigned long y;
 	for (   ; x>ULONG_MAX; x/=10) *--s = '0' + x%10;
-	for (y=x;           y; y/=10) *--s = '0' + y%10;
+	for (y=x;       y>=10; y/=10) *--s = '0' + y%10;
+	if (y) *--s = '0' + y;
 	return s;
 }