From ef9b8f7942baf51797c2c726216bf4b3e441e958 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 5 Jan 2010 23:02:08 +0000 Subject: [PATCH] [RTL] Patch by Stefan Ginsberg: Don't use double in rtl's sprintf / swprintf, use double_t union instead. Minor modifications by me. svn path=/branches/ros-amd64-bringup/; revision=44968 --- reactos/lib/rtl/sprintf.c | 68 ++++++++++++++----------------------- reactos/lib/rtl/swprintf.c | 69 ++++++++++++++------------------------ 2 files changed, 52 insertions(+), 85 deletions(-) diff --git a/reactos/lib/rtl/sprintf.c b/reactos/lib/rtl/sprintf.c index 0b6b8ca77d4..c6d651af98d 100644 --- a/reactos/lib/rtl/sprintf.c +++ b/reactos/lib/rtl/sprintf.c @@ -27,43 +27,35 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; +typedef union { + struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; + }; + long long AsLongLong; } double_t; -#if 0 +/* We depend on this being true */ +C_ASSERT(sizeof(double_t) == sizeof(double)); + static __inline int -_isinf(double __x) +_isinf(double_t x) { - union - { - double* __x; - double_t* x; - } x; - - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); } static __inline int -_isnan(double __x) +_isnan(double_t x) { - union - { - double* __x; - double_t* x; - } x; - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); } -#endif + static __inline @@ -180,16 +172,14 @@ number(char * buf, char * end, long long num, int base, int size, int precision, return buf; } -#if 0 static char * -numberf(char * buf, char * end, double num, int base, int size, int precision, int type) +numberf(char * buf, char * end, double_t 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 @@ -203,9 +193,9 @@ numberf(char * buf, char * end, double num, int base, int size, int precision, i c = (type & ZEROPAD) ? '0' : ' '; sign = 0; if (type & SIGN) { - if (num < 0) { + if (num.sign) { sign = '-'; - num = -num; + num.sign = 0; size--; } else if (type & PLUS) { sign = '+'; @@ -222,15 +212,11 @@ numberf(char * buf, char * end, double num, int base, int size, int precision, i size--; } i = 0; - if (num == 0) + if (num.AsLongLong == 0) tmp[i++] = '0'; - else while (num != 0) + else while (num.AsLongLong != 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 + tmp[i++] = digits[do_div(&num.AsLongLong,base)]; } if (i > precision) precision = i; @@ -285,7 +271,6 @@ numberf(char * buf, char * end, double num, int base, int size, int precision, i } return buf; } -#endif static char* string(char* buf, char* end, const char* s, int len, int field_width, int precision, int flags) @@ -392,7 +377,7 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) { int len; unsigned long long num; -// double _double; + double_t _double; int base; char *str, *end; @@ -597,14 +582,13 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) } continue; -#if 0 /* float number formats - set up the flags and "break" */ case 'e': case 'E': case 'f': case 'g': case 'G': - _double = (double)va_arg(args, double); + _double = va_arg(args, double_t); if ( _isnan(_double) ) { s = "Nan"; len = 3; @@ -635,11 +619,11 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) } else { if ( precision == -1 ) precision = 6; - str = numberf(str, end, (int)_double, base, field_width, precision, flags); + str = numberf(str, end, _double, base, field_width, precision, flags); } continue; -#endif + /* integer number formats - set up the flags and "break" */ case 'o': diff --git a/reactos/lib/rtl/swprintf.c b/reactos/lib/rtl/swprintf.c index e6823e4d729..8ac75cad4e9 100644 --- a/reactos/lib/rtl/swprintf.c +++ b/reactos/lib/rtl/swprintf.c @@ -27,42 +27,35 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; +typedef union { + struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; + }; + long long AsLongLong; } double_t; -#if 0 + +/* We depend on this being true */ +C_ASSERT(sizeof(double_t) == sizeof(double)); + static __inline int -_isinf(double __x) +_isinf(double_t x) { - union - { - double* __x; - double_t* x; - } x; - - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); } static __inline int -_isnan(double __x) +_isnan(double_t x) { - union - { - double* __x; - double_t* x; - } x; - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); } -#endif + static __inline @@ -178,16 +171,14 @@ number(wchar_t * buf, wchar_t * end, long long num, int base, int size, int prec return buf; } -#if 0 static wchar_t * -numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precision, int type) +numberf(wchar_t * buf, wchar_t * end, double_t 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 @@ -202,9 +193,9 @@ numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precis c = (type & ZEROPAD) ? L'0' : L' '; sign = 0; if (type & SIGN) { - if (num < 0) { + if (num.sign) { sign = L'-'; - num = -num; + num.sign = 0; size--; } else if (type & PLUS) { sign = L'+'; @@ -221,15 +212,11 @@ numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precis size--; } i = 0; - if (num == 0) + if (num.AsLongLong == 0) tmp[i++] = L'0'; - else while (num != 0) + else while (num.AsLongLong != 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 + tmp[i++] = digits[do_div(&num.AsLongLong,base)]; } if (i > precision) precision = i; @@ -284,7 +271,6 @@ numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precis } return buf; } -#endif static wchar_t* string(wchar_t* buf, wchar_t* end, const char* s, int len, int field_width, int precision, int flags) @@ -395,10 +381,8 @@ int __cdecl _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list ar wchar_t * str, * end; const char *s; const wchar_t *sw; -#if 0 const wchar_t *ss; - double _double; -#endif + double_t _double; int flags; /* flags to number() */ @@ -595,14 +579,13 @@ int __cdecl _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list ar *ip = (str - buf); } continue; -#if 0 /* float number formats - set up the flags and "break" */ case 'e': case 'E': case 'f': case 'g': case 'G': - _double = (double)va_arg(args, double); + _double = va_arg(args, double_t); if ( _isnan(_double) ) { ss = L"Nan"; @@ -638,7 +621,7 @@ int __cdecl _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list ar } continue; -#endif + /* integer number formats - set up the flags and "break" */