On Saturday 11 April 2009 17:08:29 David Miller wrote: > The grub printf code tries to treat 'long' and 'int' the same, > that doesn't work on (most) 64-bit platforms.
Right. Good finding. Regards, Okuji > > 2009-04-11 David S. Miller <da...@davemloft.net> > > * kern/misc.c (grub_ltoa): New function. > (grub_vsprintf): Use it to format 'long' integers. > --- > kern/misc.c | 35 +++++++++++++++++++++++++++++++---- > 1 files changed, 31 insertions(+), 4 deletions(-) > > diff --git a/kern/misc.c b/kern/misc.c > index 23eaa14..85a5d95 100644 > --- a/kern/misc.c > +++ b/kern/misc.c > @@ -590,6 +590,31 @@ grub_itoa (char *str, int c, unsigned n) > return p; > } > > +static char * > +grub_ltoa (char *str, int c, unsigned long n) > +{ > + unsigned long base = (c == 'x') ? 16 : 10; > + char *p; > + > + if ((long) n < 0 && c == 'd') > + { > + n = (unsigned) (-((long) n)); > + *str++ = '-'; > + } > + > + p = str; > + do > + { > + unsigned long d = n % base; > + *p++ = (d > 9) ? d + 'a' - 10 : d + '0'; > + } > + while (n /= base); > + *p = 0; > + > + grub_reverse (str); > + return p; > +} > + > /* Divide N by D, return the quotient, and store the remainder in *R. */ > grub_uint64_t > grub_divmod64 (grub_uint64_t n, grub_uint32_t d, grub_uint32_t *r) > @@ -790,12 +815,14 @@ grub_vsprintf (char *str, const char *fmt, va_list > args) ll = va_arg (args, long long); > grub_lltoa (tmp, c, ll); > } > + else if (longfmt) > + { > + long l = va_arg (args, long); > + grub_ltoa (tmp, c, l); > + } > else > { > - if (longfmt) > - n = va_arg (args, long); > - else > - n = va_arg (args, int); > + n = va_arg (args, int); > grub_itoa (tmp, c, n); > } > if (! rightfill && grub_strlen (tmp) < format1) _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel