[ros-diffs] [gschneider] 46855: [RTL] Revert s(w)printf changes of r44970 See issue #5125 for more details.

gschneider at svn.reactos.org gschneider at svn.reactos.org
Mon Apr 12 22:45:39 CEST 2010


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&r1=46854&r2=46855&view=diff
==============================================================================
--- 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=46855&r1=46854&r2=46855&view=diff
==============================================================================
--- 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";




More information about the Ros-diffs mailing list