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...

Daniel

_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to