Author: tkreuzer
Date: Wed Jan 6 00:02:08 2010
New Revision: 44968
URL:
http://svn.reactos.org/svn/reactos?rev=44968&view=rev
Log:
[RTL]
Patch by Stefan Ginsberg:
Don't use double in rtl's sprintf / swprintf, use double_t union instead. Minor
modifications by me.
Modified:
branches/ros-amd64-bringup/reactos/lib/rtl/sprintf.c
branches/ros-amd64-bringup/reactos/lib/rtl/swprintf.c
Modified: branches/ros-amd64-bringup/reactos/lib/rtl/sprintf.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/r…
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/rtl/sprintf.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/lib/rtl/sprintf.c [iso-8859-1] Wed Jan 6 00:02:08
2010
@@ -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)
-{
- union
- {
- double* __x;
- double_t* x;
- } x;
-
- x.__x = &__x;
- return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 &&
x.x->mantissal == 0 ));
+_isinf(double_t x)
+{
+ return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0
));
}
static
__inline
int
-_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 ));
-}
-#endif
+_isnan(double_t x)
+{
+ return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 ));
+}
+
static
__inline
@@ -180,16 +172,14 @@
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 @@
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 @@
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 @@
}
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 len;
unsigned long long num;
-// double _double;
+ double_t _double;
int base;
char *str, *end;
@@ -597,14 +582,13 @@
}
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 @@
} 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':
Modified: branches/ros-amd64-bringup/reactos/lib/rtl/swprintf.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/lib/r…
==============================================================================
--- branches/ros-amd64-bringup/reactos/lib/rtl/swprintf.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/lib/rtl/swprintf.c [iso-8859-1] Wed Jan 6 00:02:08
2010
@@ -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)
-{
- union
- {
- double* __x;
- double_t* x;
- } x;
-
- x.__x = &__x;
- return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 &&
x.x->mantissal == 0 ));
+_isinf(double_t x)
+{
+ return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0
));
}
static
__inline
int
-_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 ));
-}
-#endif
+_isnan(double_t x)
+{
+ return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 ));
+}
+
static
__inline
@@ -178,16 +171,14 @@
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 @@
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 @@
size--;
}
i = 0;
- if (num == 0)
+ if (num.AsLongLong == 0)
tmp[i++] = L'0';
- 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
+ else while (num.AsLongLong != 0)
+ {
+ tmp[i++] = digits[do_div(&num.AsLongLong,base)];
}
if (i > precision)
precision = i;
@@ -284,7 +271,6 @@
}
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 @@
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 @@
*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 @@
}
continue;
-#endif
+
/* integer number formats - set up the flags and "break" */