On Wed, Oct 22, 2025 at 12:30:23PM +0800, Michael Chang via Grub-devel wrote: > On Tue, Oct 21, 2025 at 05:17:58PM +0200, Daniel Kiper wrote: > > On Fri, Oct 17, 2025 at 05:01:32PM +0800, Michael Chang via Grub-devel > > wrote: > > > Add support for the 'z' length modifier in the printf code. This allows > > > printing of size_t and ssize_t values using %zu, %zd and related > > > formats. The parser maps 'z' to the correct integer width based on > > > sizeof (size_t). > > > > > > Signed-off-by: Michael Chang <[email protected]> > > > Reviewed-by: Neal Gompa <[email protected]> > > > Reviewed-by: Daniel Kiper <[email protected]> > > > --- > > > grub-core/kern/misc.c | 20 ++++++++++++++++++++ > > > 1 file changed, 20 insertions(+) > > > > > > diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c > > > index 2b7922393..ff614add5 100644 > > > --- a/grub-core/kern/misc.c > > > +++ b/grub-core/kern/misc.c > > > @@ -26,6 +26,7 @@ > > > #include <grub/i18n.h> > > > #include <grub/types.h> > > > #include <grub/charset.h> > > > +#include <stddef.h> > > > > > > union printf_arg > > > { > > > @@ -739,6 +740,9 @@ parse_printf_arg_fmt (const char *fmt0, struct > > > printf_args *args, > > > COMPILE_TIME_ASSERT (sizeof (long) <= sizeof (long long)); > > > COMPILE_TIME_ASSERT (sizeof (long long) == sizeof (void *) > > > || sizeof (int) == sizeof (void *)); > > > + COMPILE_TIME_ASSERT (sizeof (size_t) == sizeof (unsigned) > > > + || sizeof (size_t) == sizeof (unsigned long) > > > + || sizeof (size_t) == sizeof (unsigned long long)); > > > > > > fmt = fmt0; > > > while ((c = *fmt++) != 0) > > > @@ -773,11 +777,17 @@ parse_printf_arg_fmt (const char *fmt0, struct > > > printf_args *args, > > > fmt++; > > > > > > c = *fmt++; > > > + if (c == 'z') > > > + { > > > + c = *fmt++; > > > + goto do_count; > > > + } > > > if (c == 'l') > > > c = *fmt++; > > > if (c == 'l') > > > c = *fmt++; > > > > > > + do_count: > > > switch (c) > > > { > > > case 'p': > > > @@ -874,6 +884,14 @@ parse_printf_arg_fmt (const char *fmt0, struct > > > printf_args *args, > > > continue; > > > } > > > > > > + if (c == 'z') > > > + { > > > + c = *fmt++; > > > + if (sizeof (size_t) == sizeof (unsigned long)) > > > + longfmt = 1; > > > + else if (sizeof (size_t) == sizeof (unsigned long long)) > > > + longfmt = 2; > > > > I have just realized we should probably have: > > > > #ifdef GRUB_UTIL > > if (sizeof (size_t) == sizeof (unsigned long)) > > longfmt = 1; > > else if (sizeof (size_t) == sizeof (unsigned long long)) > > longfmt = 2; > > #else > > if (sizeof (grub_size_t) == sizeof (unsigned long)) > > longfmt = 1; > > else if (sizeof (grub_size_t) == sizeof (unsigned long long)) > > longfmt = 2; > > #endif > > > > Same for COMPILE_TIME_ASSERT() above. > > > > If it makes sense for you please post updated patch set. I want to merge > > it tomorrow... > > The type size_t is not only used in Linux utilities but also by core > components that import sources from Linux libraries, such as libgcrypt > and zstd, which run in GRUB's arch-platform pre-boot environment. > > Likewise, grub_size_t is not limited to the pre-boot context but is also > used in Linux utilities. > > As a result, their scope is not restricted by conditional checks. Each > type should follow its own established convention for portable format > specifiers: 'z' for size_t and PRI[ux]GRUB_SIZE for grub_size_t. This > can avoid ambiguity.
Ugh... Somehow I totally forgot about PRI[ux]GRUB_SIZE... :-( Ignore my comment then... Daniel _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
