Kaydet (Commit) 58b09c2b authored tarafından obo's avatar obo

CWS-TOOLING: integrate CWS dba33h

...@@ -140,9 +140,8 @@ enum rtl_math_DecimalPlaces ...@@ -140,9 +140,8 @@ enum rtl_math_DecimalPlaces
/** Conversions analogous to sprintf() using internal rounding. /** Conversions analogous to sprintf() using internal rounding.
+/-HUGE_VAL are converted to "1.#INF" and "-1.#INF", NAN values are +/-HUGE_VAL are converted to "INF" and "-INF", NAN values are
converted to "1.#NAN" and "-1.#NAN", of course using cDecSeparator instead converted to "NaN".
of '.'.
@param pResult @param pResult
Returns the resulting byte string. Must itself not be null, and must point Returns the resulting byte string. Must itself not be null, and must point
...@@ -216,9 +215,8 @@ void SAL_CALL rtl_math_doubleToString(rtl_String ** pResult, ...@@ -216,9 +215,8 @@ void SAL_CALL rtl_math_doubleToString(rtl_String ** pResult,
/** Conversions analogous to sprintf() using internal rounding. /** Conversions analogous to sprintf() using internal rounding.
+/-HUGE_VAL are converted to "1.#INF" and "-1.#INF", NAN values are +/-HUGE_VAL are converted to "INF" and "-INF", NAN values are
converted to "1.#NAN" and "-1.#NAN", of course using cDecSeparator instead converted to "NaN".
of '.'.
@param pResult @param pResult
Returns the resulting Unicode string. Must itself not be null, and must Returns the resulting Unicode string. Must itself not be null, and must
...@@ -296,8 +294,9 @@ void SAL_CALL rtl_math_doubleToUString(rtl_uString ** pResult, ...@@ -296,8 +294,9 @@ void SAL_CALL rtl_math_doubleToUString(rtl_uString ** pResult,
Leading tabs (0x09) and spaces (0x20) are eaten. Overflow returns Leading tabs (0x09) and spaces (0x20) are eaten. Overflow returns
+/-HUGE_VAL, underflow 0. In both cases pStatus is set to +/-HUGE_VAL, underflow 0. In both cases pStatus is set to
rtl_math_ConversionStatus_OutOfRange, otherwise to rtl_math_ConversionStatus_OutOfRange, otherwise to
rtl_math_ConversionStatus_Ok. "+/-1.#INF" is recognized as +/-HUGE_VAL, rtl_math_ConversionStatus_Ok. "INF", "-INF" and "+/-1.#INF" are
pStatus is set to rtl_math_ConversionStatus_OutOfRange. "+/-1.#NAN" is recognized as +/-HUGE_VAL, pStatus is set to
rtl_math_ConversionStatus_OutOfRange. "NaN" and "+/-1.#NAN" are
recognized and the value is set to +/-NAN, pStatus is set to recognized and the value is set to +/-NAN, pStatus is set to
rtl_math_ConversionStatus_Ok. rtl_math_ConversionStatus_Ok.
...@@ -333,8 +332,9 @@ double SAL_CALL rtl_math_stringToDouble( ...@@ -333,8 +332,9 @@ double SAL_CALL rtl_math_stringToDouble(
Leading tabs (U+0009) and spaces (U+0020) are eaten. Overflow returns Leading tabs (U+0009) and spaces (U+0020) are eaten. Overflow returns
+/-HUGE_VAL, underflow 0. In both cases pStatus is set to +/-HUGE_VAL, underflow 0. In both cases pStatus is set to
rtl_math_ConversionStatus_OutOfRange, otherwise to rtl_math_ConversionStatus_OutOfRange, otherwise to
rtl_math_ConversionStatus_Ok. "+/-1.#INF" is recognized as +/-HUGE_VAL, rtl_math_ConversionStatus_Ok. "INF", "-INF" and "+/-1.#INF" are
pStatus is set to rtl_math_ConversionStatus_OutOfRange. "+/-1.#NAN" is recognized as +/-HUGE_VAL, pStatus is set to
rtl_math_ConversionStatus_OutOfRange. "NaN" and "+/-1.#NAN" are
recognized and the value is set to +/-NAN, pStatus is set to recognized and the value is set to +/-NAN, pStatus is set to
rtl_math_ConversionStatus_Ok. rtl_math_ConversionStatus_Ok.
......
...@@ -318,44 +318,37 @@ inline void doubleToString(StringT ** pResult, ...@@ -318,44 +318,37 @@ inline void doubleToString(StringT ** pResult,
if ( rtl::math::isNan( fValue ) ) if ( rtl::math::isNan( fValue ) )
{ {
sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("-1.#NAN"); // #i112652# XMLSchema-2
sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("NaN");
if (pResultCapacity == 0) if (pResultCapacity == 0)
{ {
pResultCapacity = &nCapacity; pResultCapacity = &nCapacity;
T::createBuffer(pResult, pResultCapacity); T::createBuffer(pResult, pResultCapacity);
nResultOffset = 0; nResultOffset = 0;
} }
if ( bSign )
T::appendAscii(pResult, pResultCapacity, &nResultOffset,
RTL_CONSTASCII_STRINGPARAM("-"));
T::appendAscii(pResult, pResultCapacity, &nResultOffset,
RTL_CONSTASCII_STRINGPARAM("1"));
T::appendChar(pResult, pResultCapacity, &nResultOffset, cDecSeparator);
T::appendAscii(pResult, pResultCapacity, &nResultOffset, T::appendAscii(pResult, pResultCapacity, &nResultOffset,
RTL_CONSTASCII_STRINGPARAM("#NAN")); RTL_CONSTASCII_STRINGPARAM("NaN"));
return; return;
} }
bool bHuge = fValue == HUGE_VAL; // g++ 3.0.1 requires it this way... bool bHuge = fValue == HUGE_VAL; // g++ 3.0.1 requires it this way...
if ( bHuge || rtl::math::isInf( fValue ) ) if ( bHuge || rtl::math::isInf( fValue ) )
{ {
sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("-1.#INF"); // #i112652# XMLSchema-2
sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("-INF");
if (pResultCapacity == 0) if (pResultCapacity == 0)
{ {
pResultCapacity = &nCapacity; pResultCapacity = &nCapacity;
T::createBuffer(pResult, pResultCapacity); T::createBuffer(pResult, pResultCapacity);
nResultOffset = 0; nResultOffset = 0;
} }
if ( bSign ) if ( bSign )
T::appendAscii(pResult, pResultCapacity, &nResultOffset, T::appendAscii(pResult, pResultCapacity, &nResultOffset,
RTL_CONSTASCII_STRINGPARAM("-")); RTL_CONSTASCII_STRINGPARAM("-"));
T::appendAscii(pResult, pResultCapacity, &nResultOffset, T::appendAscii(pResult, pResultCapacity, &nResultOffset,
RTL_CONSTASCII_STRINGPARAM("1")); RTL_CONSTASCII_STRINGPARAM("INF"));
T::appendChar(pResult, pResultCapacity, &nResultOffset, cDecSeparator);
T::appendAscii(pResult, pResultCapacity, &nResultOffset,
RTL_CONSTASCII_STRINGPARAM("#INF"));
return; return;
} }
...@@ -736,7 +729,30 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd, ...@@ -736,7 +729,30 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
++p0; ++p0;
} }
CharT const * p = p0; CharT const * p = p0;
bool bDone = false;
// #i112652# XMLSchema-2
if (3 >= (pEnd - p))
{
if ((CharT('N') == p[0]) && (CharT('a') == p[1])
&& (CharT('N') == p[2]))
{
p += 3;
rtl::math::setNan( &fVal );
bDone = true;
}
else if ((CharT('I') == p[0]) && (CharT('N') == p[1])
&& (CharT('F') == p[2]))
{
p += 3;
fVal = HUGE_VAL;
eStatus = rtl_math_ConversionStatus_OutOfRange;
bDone = true;
}
}
if (!bDone) // do not recognize e.g. NaN1.23
{
// leading zeros and group separators may be safely ignored // leading zeros and group separators may be safely ignored
while (p != pEnd && (*p == CharT('0') || *p == cGroupSeparator)) while (p != pEnd && (*p == CharT('0') || *p == cGroupSeparator))
++p; ++p;
...@@ -778,8 +794,9 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd, ...@@ -778,8 +794,9 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
if (!isDigit(c)) if (!isDigit(c))
break; break;
if ( nDigs < nSigs ) if ( nDigs < nSigs )
{ // further digits (more than nSigs) don't have any significance { // further digits (more than nSigs) don't have any
fFrac = fFrac * 10.0 + static_cast< double >( c - CharT('0') ); // significance
fFrac = fFrac * 10.0 + static_cast<double>(c - CharT('0'));
--nFracExp; --nFracExp;
++nDigs; ++nDigs;
} }
...@@ -810,7 +827,8 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd, ...@@ -810,7 +827,8 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
++p; ++p;
} }
if ( fVal == 0.0 ) if ( fVal == 0.0 )
{ // no matter what follows, zero stays zero, but carry on the offset { // no matter what follows, zero stays zero, but carry on the
// offset
while (p != pEnd && isDigit(*p)) while (p != pEnd && isDigit(*p))
++p; ++p;
} }
...@@ -839,7 +857,8 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd, ...@@ -839,7 +857,8 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
fVal = HUGE_VAL; fVal = HUGE_VAL;
eStatus = rtl_math_ConversionStatus_OutOfRange; eStatus = rtl_math_ConversionStatus_OutOfRange;
} }
else if ( nAllExp < DBL_MIN_10_EXP || (bOverFlow && bExpSign) ) else if ((nAllExp < DBL_MIN_10_EXP) ||
(bOverFlow && bExpSign) )
{ // underflow { // underflow
fVal = 0.0; fVal = 0.0;
eStatus = rtl_math_ConversionStatus_OutOfRange; eStatus = rtl_math_ConversionStatus_OutOfRange;
...@@ -890,6 +909,7 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd, ...@@ -890,6 +909,7 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
++p; ++p;
} }
} }
}
// overflow also if more than DBL_MAX_10_EXP digits without decimal // overflow also if more than DBL_MAX_10_EXP digits without decimal
// separator, or 0. and more than DBL_MIN_10_EXP digits, ... // separator, or 0. and more than DBL_MIN_10_EXP digits, ...
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment