* [PATCH v4 0/2] tools/nolibc: support left-aligned printing in printf
@ 2026-01-30 10:22 licheng.li
2026-01-30 10:22 ` [PATCH v4 1/2] tools/nolibc: support left alignment (-) " licheng.li
2026-01-30 10:22 ` [PATCH v4 2/2] selftests/nolibc: add tests for printf left alignment and zero padding licheng.li
0 siblings, 2 replies; 4+ messages in thread
From: licheng.li @ 2026-01-30 10:22 UTC (permalink / raw)
To: Willy Tarreau, David Laight
Cc: Thomas Weißschuh, linux-kernel, im.lechain
From: Cheng Li <im.lechain@gmail.com>
This series adds support for left alignment ('-') to nolibc's printf implementation.
v4 adopted optimization suggestions from David Laight
Cheng Li (2):
tools/nolibc: support left alignment (-) in printf
selftests/nolibc: add tests for printf left alignment and zero padding
tools/include/nolibc/stdio.h | 17 +++++++++++++----
tools/testing/selftests/nolibc/nolibc-test.c | 2 ++
2 files changed, 15 insertions(+), 4 deletions(-)
--
2.52.0
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v4 1/2] tools/nolibc: support left alignment (-) in printf 2026-01-30 10:22 [PATCH v4 0/2] tools/nolibc: support left-aligned printing in printf licheng.li @ 2026-01-30 10:22 ` licheng.li 2026-01-30 15:00 ` David Laight 2026-01-30 10:22 ` [PATCH v4 2/2] selftests/nolibc: add tests for printf left alignment and zero padding licheng.li 1 sibling, 1 reply; 4+ messages in thread From: licheng.li @ 2026-01-30 10:22 UTC (permalink / raw) To: Willy Tarreau, David Laight Cc: Thomas Weißschuh, linux-kernel, im.lechain From: Cheng Li <im.lechain@gmail.com> Currently, __nolibc_printf() in nolibc parses the width field but always pads with spaces on the left. It ignores the '-' flag (left alignment). This patch implements support for the '-' flag to forces left alignment by padding spaces on the right. Logic behavior: - "%5d" -> " -5" (unchanged, right align) - "%-5d" -> "-5 " (new, left align) Suggested-by: David Laight <david.laight.linux@gmail.com> Suggested-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Cheng Li <im.lechain@gmail.com> --- v4 changes: - Adopted optimization suggestions from David Laight v3 changes: - Removed pad zeros support because of bug for signed number and pointer v2 changes: - Adopted optimization suggestions from Willy Tarreau: - Incremented 'written' counter at the start of loops. - Reordered loop checks to optimize compiler register usage. - Updated commit message to explicitly mention zero-padding ('0') support. --- tools/include/nolibc/stdio.h | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 1f16dab2ac88..1197928a1364 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -250,7 +250,7 @@ typedef int (*__nolibc_printf_cb)(intptr_t state, const char *buf, size_t size); static __attribute__((unused, format(printf, 4, 0))) int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char *fmt, va_list args) { - char escape, lpref, c; + char escape, lpref, padc, c; unsigned long long v; unsigned int written, width; size_t len, ofs, w; @@ -261,11 +261,17 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char while (1) { c = fmt[ofs++]; width = 0; + padc = ' '; if (escape) { /* we're in an escape sequence, ofs == 1 */ escape = 0; + if (c == '-') { + padc = c; + c = fmt[ofs++]; + } + /* width */ while (c >= '0' && c <= '9') { width *= 10; @@ -358,12 +364,15 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char if (n) { w = len < n ? len : n; n -= w; - while (width-- > w) { + if (padc == '-' && cb(state, outstr, w) != 0) + return -1; + while (width > w) { + written++; if (cb(state, " ", 1) != 0) return -1; - written += 1; + width--; } - if (cb(state, outstr, w) != 0) + if (padc != '-' && cb(state, outstr, w) != 0) return -1; } -- 2.52.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4 1/2] tools/nolibc: support left alignment (-) in printf 2026-01-30 10:22 ` [PATCH v4 1/2] tools/nolibc: support left alignment (-) " licheng.li @ 2026-01-30 15:00 ` David Laight 0 siblings, 0 replies; 4+ messages in thread From: David Laight @ 2026-01-30 15:00 UTC (permalink / raw) To: licheng.li; +Cc: Willy Tarreau, Thomas Weißschuh, linux-kernel On Fri, 30 Jan 2026 18:22:17 +0800 "licheng.li" <im.lechain@gmail.com> wrote: > From: Cheng Li <im.lechain@gmail.com> > > Currently, __nolibc_printf() in nolibc parses the width field but always > pads with spaces on the left. It ignores the '-' flag (left alignment). > > This patch implements support for the '-' flag > to forces left alignment by padding spaces on the right. > > Logic behavior: > - "%5d" -> " -5" (unchanged, right align) > - "%-5d" -> "-5 " (new, left align) > > Suggested-by: David Laight <david.laight.linux@gmail.com> > Suggested-by: Willy Tarreau <w@1wt.eu> > Signed-off-by: Cheng Li <im.lechain@gmail.com> Looks reasonable. Reviewed-by: David Laight <david.laight.linux@gmail.com> David > --- > v4 changes: > - Adopted optimization suggestions from David Laight > v3 changes: > - Removed pad zeros support because of bug for signed number and pointer > v2 changes: > - Adopted optimization suggestions from Willy Tarreau: > - Incremented 'written' counter at the start of loops. > - Reordered loop checks to optimize compiler register usage. > - Updated commit message to explicitly mention zero-padding ('0') support. > --- > tools/include/nolibc/stdio.h | 17 +++++++++++++---- > 1 file changed, 13 insertions(+), 4 deletions(-) > > diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h > index 1f16dab2ac88..1197928a1364 100644 > --- a/tools/include/nolibc/stdio.h > +++ b/tools/include/nolibc/stdio.h > @@ -250,7 +250,7 @@ typedef int (*__nolibc_printf_cb)(intptr_t state, const char *buf, size_t size); > static __attribute__((unused, format(printf, 4, 0))) > int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char *fmt, va_list args) > { > - char escape, lpref, c; > + char escape, lpref, padc, c; > unsigned long long v; > unsigned int written, width; > size_t len, ofs, w; > @@ -261,11 +261,17 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char > while (1) { > c = fmt[ofs++]; > width = 0; > + padc = ' '; > > if (escape) { > /* we're in an escape sequence, ofs == 1 */ > escape = 0; > > + if (c == '-') { > + padc = c; > + c = fmt[ofs++]; > + } > + > /* width */ > while (c >= '0' && c <= '9') { > width *= 10; > @@ -358,12 +364,15 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char > if (n) { > w = len < n ? len : n; > n -= w; > - while (width-- > w) { > + if (padc == '-' && cb(state, outstr, w) != 0) > + return -1; > + while (width > w) { > + written++; > if (cb(state, " ", 1) != 0) > return -1; > - written += 1; > + width--; > } > - if (cb(state, outstr, w) != 0) > + if (padc != '-' && cb(state, outstr, w) != 0) > return -1; > } > ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4 2/2] selftests/nolibc: add tests for printf left alignment and zero padding 2026-01-30 10:22 [PATCH v4 0/2] tools/nolibc: support left-aligned printing in printf licheng.li 2026-01-30 10:22 ` [PATCH v4 1/2] tools/nolibc: support left alignment (-) " licheng.li @ 2026-01-30 10:22 ` licheng.li 1 sibling, 0 replies; 4+ messages in thread From: licheng.li @ 2026-01-30 10:22 UTC (permalink / raw) To: Willy Tarreau, David Laight Cc: Thomas Weißschuh, linux-kernel, im.lechain From: Cheng Li <im.lechain@gmail.com> This patch adds validation for the recently added left-alignment ('-') flag in printf(). It ensures that Fields are correctly padded with spaces on the right when the '-' flag is used. Signed-off-by: Cheng Li <im.lechain@gmail.com> --- v3 changes: - Removed test case for zero padding that cannot work properly v2 changes: - Added test cases for zero padding (%08d) --- tools/testing/selftests/nolibc/nolibc-test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 3c5a226dad3a..c11fcf6c5075 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1723,6 +1723,8 @@ static int run_printf(int min, int max) CASE_TEST(truncation); EXPECT_VFPRINTF(25, "01234567890123456789", "%s", "0123456789012345678901234"); break; CASE_TEST(string_width); EXPECT_VFPRINTF(10, " 1", "%10s", "1"); break; CASE_TEST(number_width); EXPECT_VFPRINTF(10, " 1", "%10d", 1); break; + CASE_TEST(number_left); EXPECT_VFPRINTF(10, "|-5 |", "|%-8d|", -5); break; + CASE_TEST(string_align); EXPECT_VFPRINTF(10, "|foo |", "|%-8s|", "foo"); break; CASE_TEST(width_trunc); EXPECT_VFPRINTF(25, " ", "%25d", 1); break; CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; CASE_TEST(strerror); EXPECT_ZR(1, test_strerror()); break; -- 2.52.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-01-30 15:00 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-01-30 10:22 [PATCH v4 0/2] tools/nolibc: support left-aligned printing in printf licheng.li 2026-01-30 10:22 ` [PATCH v4 1/2] tools/nolibc: support left alignment (-) " licheng.li 2026-01-30 15:00 ` David Laight 2026-01-30 10:22 ` [PATCH v4 2/2] selftests/nolibc: add tests for printf left alignment and zero padding licheng.li
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.