grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[patch] printf long format


From: Hollis Blanchard
Subject: [patch] printf long format
Date: Tue, 21 Jun 2005 18:14:10 -0500
User-agent: Mutt/1.5.6+20040907i

Hmm, no idea what happened to the first mail.

Debugging a partition map bug, I was adding more grub_dprintf messages...
and re-discovered that our printf doesn't handle e.g. "%lx" format strings (yet
gcc requires these when printing longs).

This patch works for me, though I didn't check that it implements all "l"
formating according to POSIX or SUS or whatever. Has not been tested on 64-bit
platforms. Comments?

-Hollis

          * kern/misc.c (grub_vsprintf): Add `longfmt'.  If format string
          contains `l' modifier, get a long from va_arg().

Index: kern/misc.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/misc.c,v
retrieving revision 1.19
diff -u -p -r1.19 misc.c
--- kern/misc.c 9 May 2005 01:47:37 -0000       1.19
+++ kern/misc.c 21 Jun 2005 04:02:35 -0000
@@ -562,13 +562,14 @@ grub_vsprintf (char *str, const char *fm
          char zerofill = ' ';
          int rightfill = 0;
          int n;
-         
+         int longfmt = 0;
+
          if (*fmt && *fmt =='-')
            {
              rightfill = 1;
              fmt++;
            }
-         
+
          p = (char *) fmt;
          /* Read formatting parameters.  */
          while (*p && grub_isdigit (*p))
@@ -600,6 +601,11 @@ grub_vsprintf (char *str, const char *fm
            }
 
          c = *fmt++;
+         if (c == 'l')
+           {
+             longfmt = 1;
+             c = *fmt++;
+           }
 
          switch (c)
            {
@@ -610,7 +616,10 @@ grub_vsprintf (char *str, const char *fm
            case 'x':
            case 'u':
            case 'd':
-             n = va_arg (args, int);
+             if (longfmt)
+               n = va_arg (args, long);
+             else
+               n = va_arg (args, int);
              grub_itoa (tmp, c, n);
              if (!rightfill && grub_strlen (tmp) < format1)
                write_fill (zerofill, format1 - grub_strlen (tmp));




reply via email to

[Prev in Thread] Current Thread [Next in Thread]