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