VarParseNumFromStr, VarNumFromParseNum fixes

Walt Ogburn reuben at ugcs.caltech.edu
Wed Oct 20 22:53:53 CDT 2004


ChangeLog:

VarParseNumFromStr: Keep zeros after decimal point,
correctly keep track of trailing zeros in a decimal number
VarNumFromParseNum: Don't error on decimal expressions for zero

Tests to verify these fixes

- Walter Ogburn



Index: dlls/oleaut32/variant.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
retrieving revision 1.104
diff -u -r1.104 variant.c
--- dlls/oleaut32/variant.c	19 Oct 2004 21:08:40 -0000	1.104
+++ dlls/oleaut32/variant.c	21 Oct 2004 03:43:20 -0000
@@ -1743,6 +1743,7 @@
           dwState |= B_LEADING_ZERO;
           cchUsed++;
           lpszStr++;
+          pNumprs->nPwr10--;
         }
       }
     }
@@ -1823,11 +1824,7 @@
       } else {
         while (pNumprs->cDig > 1 && !rgbTmp[pNumprs->cDig - 1])
         {
-          if (pNumprs->dwOutFlags & NUMPRS_DECIMAL)
-            pNumprs->nPwr10--;
-          else
-            pNumprs->nPwr10++;
-
+          pNumprs->nPwr10++;
           pNumprs->cDig--;
         }
       }
@@ -1837,11 +1834,7 @@
     /* Remove trailing zeros from the last (whole number or decimal) part */
     while (pNumprs->cDig > 1 && !rgbTmp[pNumprs->cDig - 1])
     {
-      if (pNumprs->dwOutFlags & NUMPRS_DECIMAL)
-        pNumprs->nPwr10--;
-      else
-        pNumprs->nPwr10++;
-
+      pNumprs->nPwr10++;
       pNumprs->cDig--;
     }
   }
@@ -2339,7 +2332,7 @@

     while (divisor10 > 10)
     {
-      if (whole < dblMinimums[10])
+      if (whole < dblMinimums[10] && whole != 0)
       {
         dwVtBits &= ~(VTBIT_R4|VTBIT_R8|VTBIT_CY); /* Underflow */
         bOverflow = TRUE;
@@ -2350,7 +2343,7 @@
     }
     if (divisor10)
     {
-      if (whole < dblMinimums[divisor10])
+      if (whole < dblMinimums[divisor10] && whole != 0)
       {
         dwVtBits &= ~(VTBIT_R4|VTBIT_R8|VTBIT_CY); /* Underflow */
         bOverflow = TRUE;
Index: dlls/oleaut32/tests/vartest.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/tests/vartest.c,v
retrieving revision 1.32
diff -u -r1.32 vartest.c
--- dlls/oleaut32/tests/vartest.c	19 Oct 2004 21:08:40 -0000	1.32
+++ dlls/oleaut32/tests/vartest.c	21 Oct 2004 03:43:21 -0000
@@ -1050,10 +1050,20 @@
   EXPECT2(5,1);

   /* Keep trailing zeros on whole number part of a decimal */
-  CONVERT("40.1", NUMPRS_STD);
+  CONVERT("10.1", NUMPRS_STD);
   EXPECT(3,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-1);
-  EXPECT2(4,0);
+  EXPECT2(1,0);
   EXPECTRGB(2,1);
+
+  /* Zeros after decimal sign */
+  CONVERT("0.01", NUMPRS_STD);
+  EXPECT(1,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-2);
+  EXPECT2(1,FAILDIG);
+
+  /* Trailing zeros after decimal part */
+  CONVERT("0.10", NUMPRS_STD);
+  EXPECT(1,NUMPRS_STD,NUMPRS_DECIMAL,4,0,-1);
+  EXPECT2(1,0);
 }

 static HRESULT (WINAPI *pVarNumFromParseNum)(NUMPARSE*,BYTE*,ULONG,VARIANT*);
@@ -1160,6 +1170,11 @@
   /* Except that rounding is done first, so -0.5 to 0 are accepted as 0 */
   /* -0.5 */
   SETRGB(0, 5); CONVERT(1,0,NUMPRS_NEG,1,0,~0u, VTBIT_UI1); EXPECT_UI1(0);
+
+  /* Floating point zero is OK */
+  /* 0.00000000E0 */
+  SETRGB(0, 0); CONVERT(1,0,NUMPRS_DECIMAL|NUMPRS_EXPONENT,12,0,-8, VTBIT_R8);
+  EXPECT_R8(0.0);

   /* Float is acceptable for an integer input value */
   SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_R4); EXPECT_R4(1.0f);




More information about the wine-patches mailing list