Author: gschneider Date: Mon Apr 12 22:45:38 2010 New Revision: 46855
URL: http://svn.reactos.org/svn/reactos?rev=46855&view=rev Log: [RTL] Revert s(w)printf changes of r44970 See issue #5125 for more details.
Modified: trunk/reactos/lib/rtl/sprintf.c trunk/reactos/lib/rtl/swprintf.c
Modified: trunk/reactos/lib/rtl/sprintf.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/sprintf.c?rev=46855... ============================================================================== --- trunk/reactos/lib/rtl/sprintf.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/sprintf.c [iso-8859-1] Mon Apr 12 22:45:38 2010 @@ -27,33 +27,40 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef union { - struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; - }; - long long AsLongLong; +typedef struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; } double_t; - -/* We depend on this being true */ -C_ASSERT(sizeof(double_t) == sizeof(double));
static __inline int -_isinf(double_t x) -{ - return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); +_isinf(double __x) +{ + union + { + double* __x; + double_t* x; + } x; + + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); }
static __inline int -_isnan(double_t x) -{ - return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); +_isnan(double __x) +{ + union + { + double* __x; + double_t* x; + } x; + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); }
@@ -173,13 +180,14 @@ }
static char * -numberf(char * buf, char * end, double_t num, int base, int size, int precision, int type) +numberf(char * buf, char * end, double num, int base, int size, int precision, int type) { char c,sign,tmp[66]; const char *digits; const char *small_digits = "0123456789abcdefghijklmnopqrstuvwxyz"; const char *large_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; + long long x;
/* FIXME the float version of number is direcly copy of number @@ -193,9 +201,9 @@ c = (type & ZEROPAD) ? '0' : ' '; sign = 0; if (type & SIGN) { - if (num.sign) { + if (num < 0) { sign = '-'; - num.sign = 0; + num = -num; size--; } else if (type & PLUS) { sign = '+'; @@ -212,11 +220,15 @@ size--; } i = 0; - if (num.AsLongLong == 0) + if (num == 0) tmp[i++] = '0'; - else while (num.AsLongLong != 0) + else while (num != 0) { - tmp[i++] = digits[do_div(&num.AsLongLong,base)]; + x = num; + tmp[i++] = digits[do_div(&x,base)]; +#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4 + num=x; +#endif } if (i > precision) precision = i; @@ -377,7 +389,7 @@ { int len; unsigned long long num; - double_t _double; + double _double;
int base; char *str, *end; @@ -591,7 +603,7 @@ case 'f': case 'g': case 'G': - _double = va_arg(args, double_t); + _double = (double)va_arg(args, double); if ( _isnan(_double) ) { s = "Nan"; len = 3; @@ -622,7 +634,7 @@ } else { if ( precision == -1 ) precision = 6; - str = numberf(str, end, _double, base, field_width, precision, flags); + str = numberf(str, end, (int)_double, base, field_width, precision, flags); }
continue;
Modified: trunk/reactos/lib/rtl/swprintf.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/swprintf.c?rev=4685... ============================================================================== --- trunk/reactos/lib/rtl/swprintf.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/swprintf.c [iso-8859-1] Mon Apr 12 22:45:38 2010 @@ -27,33 +27,40 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef union { - struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; - }; - long long AsLongLong; +typedef struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; } double_t; - -/* We depend on this being true */ -C_ASSERT(sizeof(double_t) == sizeof(double));
static __inline int -_isinf(double_t x) -{ - return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); +_isinf(double __x) +{ + union + { + double* __x; + double_t* x; + } x; + + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); }
static __inline int -_isnan(double_t x) -{ - return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); +_isnan(double __x) +{ + union + { + double* __x; + double_t* x; + } x; + x.__x = &__x; + return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); }
@@ -172,13 +179,14 @@ }
static wchar_t * -numberf(wchar_t * buf, wchar_t * end, double_t num, int base, int size, int precision, int type) +numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precision, int type) { wchar_t c, sign, tmp[66]; const wchar_t *digits; const wchar_t *small_digits = L"0123456789abcdefghijklmnopqrstuvwxyz"; const wchar_t *large_digits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; + long long x;
/* FIXME the float version of number is direcly copy of number @@ -193,9 +201,9 @@ c = (type & ZEROPAD) ? L'0' : L' '; sign = 0; if (type & SIGN) { - if (num.sign) { + if (num < 0) { sign = L'-'; - num.sign = 0; + num = -num; size--; } else if (type & PLUS) { sign = L'+'; @@ -212,11 +220,15 @@ size--; } i = 0; - if (num.AsLongLong == 0) + if (num == 0) tmp[i++] = L'0'; - else while (num.AsLongLong != 0) - { - tmp[i++] = digits[do_div(&num.AsLongLong,base)]; + else while (num != 0) + { + x = num; + tmp[i++] = digits[do_div(&x,base)]; +#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4 + num = x; +#endif } if (i > precision) precision = i; @@ -382,7 +394,7 @@ const char *s; const wchar_t *sw; const wchar_t *ss; - double_t _double; + double _double;
int flags; /* flags to number() */
@@ -588,7 +600,7 @@ case 'f': case 'g': case 'G': - _double = va_arg(args, double_t); + _double = (double)va_arg(args, double);
if ( _isnan(_double) ) { ss = L"Nan";