peiyongz 2002/08/13 15:11:23 Modified: c/src/xercesc/util XMLBigInteger.hpp XMLBigInteger.cpp XMLBigDecimal.hpp XMLBigDecimal.cpp Log: Fix to Bug#9442 Revision Changes Path 1.3 +15 -2 xml-xerces/c/src/xercesc/util/XMLBigInteger.hpp Index: XMLBigInteger.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLBigInteger.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- XMLBigInteger.hpp 20 Feb 2002 18:17:02 -0000 1.2 +++ XMLBigInteger.hpp 13 Aug 2002 22:11:23 -0000 1.3 @@ -104,7 +104,7 @@ * A leading sign is ALWAYS in place and the caller of this method * is responsible for the de-allocation of the memory. */ - XMLCh* toString() const; + inline XMLCh* toString() const; /** * Compares this object to the specified object. @@ -145,10 +145,15 @@ // fMagnitude // the buffer holding the number. // + // fRawData + // to preserve the original string used to construct this object, + // needed for pattern matching. + // // ----------------------------------------------------------------------- int fSign; XMLCh* fMagnitude; //null terminated + XMLCh* fRawData; }; @@ -170,6 +175,14 @@ inline void XMLBigInteger::setSign(int newSign) { fSign = newSign; +} + +// +// The caller needs to de-allocate the memory allocated by this function +// +inline XMLCh* XMLBigInteger::toString() const +{ + return XMLString::replicate(fRawData); } #endif 1.2 +15 -28 xml-xerces/c/src/xercesc/util/XMLBigInteger.cpp Index: XMLBigInteger.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLBigInteger.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- XMLBigInteger.cpp 1 Feb 2002 22:22:14 -0000 1.1 +++ XMLBigInteger.cpp 13 Aug 2002 22:11:23 -0000 1.2 @@ -56,8 +56,11 @@ /* * $Log$ - * Revision 1.1 2002/02/01 22:22:14 peiyongz - * Initial revision + * Revision 1.2 2002/08/13 22:11:23 peiyongz + * Fix to Bug#9442 + * + * Revision 1.1.1.1 2002/02/01 22:22:14 peiyongz + * sane_include * * Revision 1.7 2001/08/23 11:54:26 tng * Add newline at the end and various typo fixes. @@ -200,7 +203,11 @@ * Any extraneous characters (including whitespace), * inclusive, will result in a NumberFormatException. */ + XMLBigInteger::XMLBigInteger(const XMLCh* const strValue) +:fSign(0) +,fMagnitude(0) +,fRawData(0) { if (!strValue) ThrowXML(NumberFormatException, XMLExcepts::XMLNUM_emptyString); @@ -214,18 +221,25 @@ fMagnitude = XMLString::replicate(XMLUni::fgZeroLenString); else fMagnitude = XMLString::replicate(ret_value); + + fRawData = XMLString::replicate(strValue); } XMLBigInteger::~XMLBigInteger() { delete[] fMagnitude; + if (fRawData) + delete[] fRawData; } XMLBigInteger::XMLBigInteger(const XMLBigInteger& toCopy) +:fSign(toCopy.fSign) +,fMagnitude(0) +,fRawData(0) { - setSign(toCopy.getSign()); fMagnitude = XMLString::replicate(toCopy.fMagnitude); + fRawData = XMLString::replicate(toCopy.fRawData); } /** @@ -324,33 +338,6 @@ delete[] fMagnitude; fMagnitude = tmp; -} - -// -// The caller needs to de-allocate the memory allocated by this function -// return buffer ALWAYS has a leading sign -// -XMLCh* XMLBigInteger::toString() const -{ - - if ( fSign == 0 ) - { - XMLCh* retBuf = new XMLCh[3]; - retBuf[0] = chPlus; - retBuf[1] = chDigit_0; - retBuf[2] = chNull; - return retBuf; - } - - // Add the leading sign here - int strLen = XMLString::stringLen(fMagnitude); - XMLCh* retBuf = new XMLCh[strLen+2]; - - retBuf[0] = (fSign == 1) ? chPlus : chDash; - XMLString::moveChars(&(retBuf[1]), &(fMagnitude[0]), strLen); - retBuf[strLen+1] = chNull; - - return retBuf; } // 1.3 +8 -2 xml-xerces/c/src/xercesc/util/XMLBigDecimal.hpp Index: XMLBigDecimal.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLBigDecimal.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- XMLBigDecimal.hpp 20 Feb 2002 18:17:02 -0000 1.2 +++ XMLBigDecimal.hpp 13 Aug 2002 22:11:23 -0000 1.3 @@ -139,16 +139,22 @@ // fScale // the number of digits to the right of the decimal point // + // fRawData + // to preserve the original string used to construct this object, + // needed for pattern matching. + // // ----------------------------------------------------------------------- XMLBigInteger* fIntVal; unsigned int fScale; - + XMLCh* fRawData; }; inline XMLBigDecimal::~XMLBigDecimal() { delete fIntVal; + if (fRawData) + delete [] fRawData; } inline int XMLBigDecimal::getSign() const 1.2 +20 -34 xml-xerces/c/src/xercesc/util/XMLBigDecimal.cpp Index: XMLBigDecimal.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLBigDecimal.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- XMLBigDecimal.cpp 1 Feb 2002 22:22:14 -0000 1.1 +++ XMLBigDecimal.cpp 13 Aug 2002 22:11:23 -0000 1.2 @@ -56,8 +56,11 @@ /* * $Log$ - * Revision 1.1 2002/02/01 22:22:14 peiyongz - * Initial revision + * Revision 1.2 2002/08/13 22:11:23 peiyongz + * Fix to Bug#9442 + * + * Revision 1.1.1.1 2002/02/01 22:22:14 peiyongz + * sane_include * * Revision 1.8 2001/08/08 18:33:44 peiyongz * fix: unresolved symbol warning for 'pow'. @@ -115,6 +118,7 @@ XMLBigDecimal::XMLBigDecimal(const XMLCh* const strValue) :fIntVal(0) ,fScale(0) +,fRawData(0) { if (!strValue) ThrowXML(NumberFormatException, XMLExcepts::XMLNUM_emptyString); @@ -124,19 +128,23 @@ parseBigDecimal(strValue, ret_value, fScale); fIntVal = new XMLBigInteger(ret_value); + fRawData = XMLString::replicate(strValue); } XMLBigDecimal::XMLBigDecimal(const XMLBigDecimal& toCopy) :fIntVal(0) ,fScale(toCopy.getScale()) +,fRawData(0) { //invoke XMLBigInteger' copy ctor fIntVal = new XMLBigInteger(*(toCopy.getValue())); + fRawData = XMLString::replicate(toCopy.fRawData); } XMLBigDecimal::XMLBigDecimal(const XMLBigDecimal& toCopy, const int addExponent) :fIntVal(0) ,fScale(toCopy.getScale()) +,fRawData(0) { //invoke XMLBigInteger' copy ctor fIntVal = new XMLBigInteger(*(toCopy.getValue())); @@ -160,6 +168,17 @@ fScale -= addExponent; //increase scale } + + // KNOWN defect + // We need to adjust the decimal point with respect to the addExponent. + // + // REVISIT: + // Since this ctor is only invoked by AbstractDoubleFloat::compareValues() + // to generate temporaries for comparison and destructed after that, + // no toString() would be applied to these temporaries, and therefore + // this defect does NOT matter, for now. + // + fRawData = XMLString::replicate(toCopy.fRawData); } /*** @@ -333,43 +352,10 @@ } // -// Add the decimal point as necessary // The caller needs to de-allocate the memory allocated by this function -// Deallocate the memory allocated by XMLBigInteger // XMLCh* XMLBigDecimal::toString() const { - // Retrieve a string (representing the value) from XMLBigInteger - // the returned buffer --ALWAYS-- contain a leading sign (+|-) - XMLCh* tmpBuf = fIntVal->toString(); - - // if no decimal point - if ( fScale == 0 ) - return tmpBuf; - - unsigned int strLen = XMLString::stringLen(tmpBuf); - - // - // Sanity check here, internal error - // fScale = strLen -> .(+|-)1234 invalid - // for now, do not insert decimal point and return - // - if ( fScale >= strLen ) - return tmpBuf; - - // Add decimal point as needed - XMLCh* retBuf = new XMLCh[strLen+2]; - XMLString::moveChars(&(retBuf[0]), &(tmpBuf[0]), strLen - fScale); - retBuf[strLen-fScale] = chPeriod; - XMLString::moveChars(&(retBuf[strLen-fScale+1]), &(tmpBuf[strLen-fScale]), fScale); - retBuf[strLen+1] = chNull; - - // De-allocate the memory allocated by XMLBigInteger - delete[] tmpBuf; - return retBuf; + return XMLString::replicate(fRawData); } - -// -// -//
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]