Fix 64-bit vsprintf.
PATCH 1/1 Fix 64-bit vsprintf.
From: James Yang <[email protected]>
There were some size and unsigned problems.
Also add support for "ll" size modifier in format string like glibc
Signed-off-by James Yang <[email protected]>
Acked-by Jon Loeliger <[email protected]>
--- lib_generic/vsprintf.c | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-)
lib_generic/vsprintf.c +17 -4
@@ -105,17 +105,26 @@ static int skip_atoi(const char **s)#define SPECIAL 32/* 0x */ #define LARGE 64/* use 'ABCDEF' instead of 'abcdef' */ +#ifdef CFG_64BIT_VSPRINTF +#define do_div (n,base) ({ \ + unsigned int __res; \ + __res = ((unsigned long long) n) % base; \ + n = ((unsigned long long) n) / base; \ + __res; \ +}) +#else #define do_div (n,base) ({ \ int __res; \ - __res = ((unsigned long) n) % (unsigned) base; \ - n = ((unsigned long) n) / (unsigned) base; \ + __res = ((unsigned long) n) % base; \ + n = ((unsigned long) n) / base; \ __res; \ }) +#endif #ifdef CFG_64BIT_VSPRINTF -static char * number(char * str, long long num, int base, int size, int precision ,int type) +static char * number(char * str, long long num, unsigned int base, int size, int precision ,int type)#else -static char * number(char * str, long num, int base, int size, int precision ,int type) +static char * number(char * str, long num, unsigned int base, int size, int precision ,int type)#endif {char c,sign,tmp[66 ];
@@ -255,6 +264,10 @@ int vsprintf(char *buf, const char *fmt, va_list args) qualifier =-1 ;if (*fmt =='h' || *fmt =='l' || *fmt =='q' ) { qualifier = *fmt; +if (qualifier =='l' && *(fmt+1 ) =='l' ) { + qualifier ='q' ; + ++fmt; + } ++fmt; }
Signature · 1 line
1.5.2.1.126.g6abd0
Wolfgang Denk
AppliedPATCH 1/1 Fix 64-bit vsprintf.
Quoted 7 lines · In message <1200002527.22619.51.camel@ld0161-tx32> you wrote:
From: James Yang <[email protected]>
There were some size and unsigned problems.
Also add support for "ll" size modifier in format string like glibcSigned-off-by James Yang <[email protected]>Acked-by Jon Loeliger <[email protected]>
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Systems programmers are the high priests of a low cult.
-- R.S. Barton