tng 2003/03/07 13:42:37 Modified: c/src/xercesc/framework XMLFormatter.cpp XMLFormatter.hpp Log: [Bug 17589] Refactoring ... . Patch from Jacques Legare. Revision Changes Path 1.8 +82 -237 xml-xerces/c/src/xercesc/framework/XMLFormatter.cpp Index: XMLFormatter.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/XMLFormatter.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- XMLFormatter.cpp 28 Jan 2003 18:32:33 -0000 1.7 +++ XMLFormatter.cpp 7 Mar 2003 21:42:37 -0000 1.8 @@ -144,24 +144,21 @@ , XMLFormatTarget* const target , const EscapeFlags escapeFlags , const UnRepFlags unrepFlags) : - fEscapeFlags(escapeFlags) , fOutEncoding(0) , fTarget(target) , fUnRepFlags(unrepFlags) - , fXCoder(0) - + , fXCoder(0) , fAposRef(0) - , fAmpRef(0) + , fAmpRef(0) , fGTRef(0) , fLTRef(0) , fQuoteRef(0) - , fAposLen(0) - , fAmpLen(0) + , fAmpLen(0) , fGTLen(0) , fLTLen(0) - , fQuoteLen(0) + , fQuoteLen(0) { // Transcode the encoding string fOutEncoding = XMLString::transcode(outEncoding); @@ -277,70 +274,26 @@ } // - // Use that to figure out what I should pass to the transcoder. If we - // are doing character references or failing for unrepresentable chars, - // then we just throw, since we should never get a call for something - // we cannot represent. Else, we tell it to just use the replacement - // char. - // - const XMLTranscoder::UnRepOpts unRepOpts = (actualUnRep == UnRep_Replace) - ? XMLTranscoder::UnRep_RepChar - : XMLTranscoder::UnRep_Throw; - // // If we don't have any escape flags set, then we can do the most // efficient loop, else we have to do it the hard way. // const XMLCh* srcPtr = toFormat; const XMLCh* endPtr = toFormat + count; - unsigned int charsEaten; if (actualEsc == NoEscapes) { // - // Just do a whole buffer at a time into the temp buffer, cap it - // off, and send it to the target. + // Just do a whole buffer at a time into the temp buffer, cap + // it off, and send it to the target. // - while (srcPtr < endPtr) - { - const unsigned int srcCount = endPtr - srcPtr; - const unsigned srcChars = srcCount > kTmpBufSize ? - kTmpBufSize : srcCount; - - const unsigned int outBytes = fXCoder->transcodeTo - ( - srcPtr - , srcChars - , fTmpBuf - , kTmpBufSize - , charsEaten - , unRepOpts - ); - - #if defined(XML_DEBUG) - if ((outBytes > kTmpBufSize) - || (charsEaten > srcCount)) - { - // <TBD> The transcoder is freakin out maaaannn - } - #endif - - // If we get any bytes out, then write them - if (outBytes) - { - fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; - fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; - fTarget->writeChars(fTmpBuf, outBytes, this); - } - - // And bump up our pointer - srcPtr += charsEaten; - } + if (srcPtr < endPtr) + srcPtr += handleUnEscapedChars(srcPtr, endPtr - srcPtr, actualUnRep); } else { // - // Escap chars that require it according tot he scale flags we were - // given. For the others, try to accumulate them and format them in - // as big as bulk as we can. + // Escape chars that require it according tot he scale flags + // we were given. For the others, try to accumulate them and + // format them in as big as bulk as we can. // while (srcPtr < endPtr) { @@ -358,78 +311,40 @@ // out. // if (tmpPtr > srcPtr) - { - unsigned int srcCount = tmpPtr - srcPtr; - - while (srcCount) { + srcPtr += handleUnEscapedChars(srcPtr, tmpPtr - srcPtr, + actualUnRep); - const unsigned srcChars = srcCount > kTmpBufSize ? - kTmpBufSize : srcCount; - - const unsigned int outBytes = fXCoder->transcodeTo - ( - srcPtr - , srcChars - , fTmpBuf - , kTmpBufSize - , charsEaten - , unRepOpts - ); - - #if defined(XML_DEBUG) - if ((outBytes > kTmpBufSize) - || (charsEaten > srcCount)) - { - // <TBD> The transcoder is freakin out maaaannn - } - #endif - - // If we get any bytes out, then write them - if (outBytes) - { - fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; - fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; - fTarget->writeChars(fTmpBuf, outBytes, this); - } - - // And bump up our pointer - srcPtr += charsEaten; - srcCount -= charsEaten; - } - } else if (tmpPtr < endPtr) { // // Ok, so we've hit a char that must be escaped. So do // this one specially. // - const XMLByte * theChars; - unsigned int count = 0; - switch(*srcPtr) - { + const XMLByte * theChars; + switch (*srcPtr) { case chAmpersand : - theChars = getAmpRef(count); - fTarget->writeChars(theChars, count, this); + theChars = getCharRef(fAmpLen, fAmpRef, gAmpRef); + fTarget->writeChars(theChars, fAmpLen, this); break; case chSingleQuote : - theChars = getAposRef(count); - fTarget->writeChars(theChars, count, this); + theChars = getCharRef(fAposLen, fAposRef, gAposRef); + fTarget->writeChars(theChars, fAposLen, this); break; case chDoubleQuote : - theChars = getQuoteRef(count); - fTarget->writeChars(theChars, count, this); + theChars = getCharRef(fQuoteLen, fQuoteRef, gQuoteRef); + fTarget->writeChars(theChars, fQuoteLen, this); break; case chCloseAngle : - theChars = getGTRef(count); - fTarget->writeChars(theChars, count, this); + theChars = getCharRef(fGTLen, fGTRef, gGTRef); + fTarget->writeChars(theChars, fGTLen, this); break; case chOpenAngle : - theChars = getLTRef(count); - fTarget->writeChars(theChars, count, this); + theChars = getCharRef(fLTLen, fLTRef, gLTRef); + fTarget->writeChars(theChars, fLTLen, this); break; default: @@ -442,6 +357,49 @@ } } + +unsigned int +XMLFormatter::handleUnEscapedChars(const XMLCh * srcPtr, + const unsigned int oCount, + const UnRepFlags actualUnRep) +{ + // + // Use that to figure out what I should pass to the transcoder. If we + // are doing character references or failing for unrepresentable chars, + // then we just throw, since we should never get a call for something + // we cannot represent. Else, we tell it to just use the replacement + // char. + // + const XMLTranscoder::UnRepOpts unRepOpts = (actualUnRep == UnRep_Replace) + ? XMLTranscoder::UnRep_RepChar + : XMLTranscoder::UnRep_Throw; + + unsigned int charsEaten; + unsigned int count = oCount; + + while (count) { + const unsigned srcChars + = count > kTmpBufSize ? kTmpBufSize : count; + + const unsigned int outBytes + = fXCoder->transcodeTo(srcPtr, srcChars, + fTmpBuf, kTmpBufSize, + charsEaten, unRepOpts); + + if (outBytes) { + fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; + fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; + fTarget->writeChars(fTmpBuf, outBytes, this); + } + + srcPtr += charsEaten; + count -= charsEaten; + } + + return oCount; // This should be an assertion that count == 0. +} + + XMLFormatter& XMLFormatter::operator<<(const XMLCh* const toFormat) { const unsigned int len = XMLString::stringLen(toFormat); @@ -474,139 +432,26 @@ // --------------------------------------------------------------------------- // XMLFormatter: Private helper methods // --------------------------------------------------------------------------- -const XMLByte* XMLFormatter::getAposRef(unsigned int & count) -{ - if (fAposRef) - { - count = fAposLen; - return fAposRef; - } - - unsigned int charsEaten; - const unsigned int outBytes = fXCoder->transcodeTo - ( - gAposRef - , XMLString::stringLen(gAposRef) - , fTmpBuf - , kTmpBufSize - , charsEaten - , XMLTranscoder::UnRep_Throw - ); - fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; - fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; - - ((XMLFormatter*)this)->fAposRef = new XMLByte[outBytes + 4]; - memcpy(fAposRef, fTmpBuf, outBytes + 4); - count = fAposLen = outBytes; - return fAposRef; -} - -const XMLByte* XMLFormatter::getAmpRef(unsigned int & count) +const XMLByte* XMLFormatter::getCharRef(unsigned int & count, + XMLByte * ref, + const XMLCh * stdRef) { - if (fAmpRef) - { - count = fAmpLen; - return fAmpRef; - } - + if (!ref) { unsigned int charsEaten; - const unsigned int outBytes = fXCoder->transcodeTo - ( - gAmpRef - , XMLString::stringLen(gAmpRef) - , fTmpBuf - , kTmpBufSize - , charsEaten - , XMLTranscoder::UnRep_Throw - ); - fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; - fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; - - ((XMLFormatter*)this)->fAmpRef = new XMLByte[outBytes + 4]; - memcpy(fAmpRef, fTmpBuf, outBytes + 4); - count = fAmpLen = outBytes; - return fAmpRef; -} - -const XMLByte* XMLFormatter::getGTRef(unsigned int & count) -{ - if (fGTRef) - { - count = fGTLen; - return fGTRef; - } + const unsigned int outBytes + = fXCoder->transcodeTo(stdRef, XMLString::stringLen(stdRef), + fTmpBuf, kTmpBufSize, charsEaten, + XMLTranscoder::UnRep_Throw); - unsigned int charsEaten; - const unsigned int outBytes = fXCoder->transcodeTo - ( - gGTRef - , XMLString::stringLen(gGTRef) - , fTmpBuf - , kTmpBufSize - , charsEaten - , XMLTranscoder::UnRep_Throw - ); fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; - ((XMLFormatter*)this)->fGTRef = new XMLByte[outBytes + 4]; - memcpy(fGTRef, fTmpBuf, outBytes + 4); - count = fGTLen = outBytes; - return fGTRef; -} - -const XMLByte* XMLFormatter::getLTRef(unsigned int & count) -{ - if (fLTRef) - { - count = fLTLen; - return fLTRef; + ref = new XMLByte[outBytes + 4]; + memcpy(ref, fTmpBuf, outBytes + 4); + count = outBytes; } - unsigned int charsEaten; - const unsigned int outBytes = fXCoder->transcodeTo - ( - gLTRef - , XMLString::stringLen(gLTRef) - , fTmpBuf - , kTmpBufSize - , charsEaten - , XMLTranscoder::UnRep_Throw - ); - fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; - fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; - - ((XMLFormatter*)this)->fLTRef = new XMLByte[outBytes + 4]; - memcpy(fLTRef, fTmpBuf, outBytes + 4); - count = fLTLen = outBytes; - return fLTRef; -} - -const XMLByte* XMLFormatter::getQuoteRef(unsigned int & count) -{ - if (fQuoteRef) - { - count = fQuoteLen; - return fQuoteRef; - } - - unsigned int charsEaten; - const unsigned int outBytes = fXCoder->transcodeTo - ( - gQuoteRef - , XMLString::stringLen(gQuoteRef) - , fTmpBuf - , kTmpBufSize - , charsEaten - , XMLTranscoder::UnRep_Throw - ); - fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0; - fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0; - - ((XMLFormatter*)this)->fQuoteRef = new XMLByte[outBytes + 4]; - memcpy(fQuoteRef, fTmpBuf, outBytes + 4); - count = fQuoteLen = outBytes; - return fQuoteRef; + return ref; } @@ -658,7 +503,7 @@ } else { - // + // We hit something unrepresentable. So continue forward doing // char refs until we hit something representable again or the // end of input. 1.9 +11 -6 xml-xerces/c/src/xercesc/framework/XMLFormatter.hpp Index: XMLFormatter.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/XMLFormatter.hpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- XMLFormatter.hpp 7 Mar 2003 18:08:10 -0000 1.8 +++ XMLFormatter.hpp 7 Mar 2003 21:42:37 -0000 1.9 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.9 2003/03/07 21:42:37 tng + * [Bug 17589] Refactoring ... . Patch from Jacques Legare. + * * Revision 1.8 2003/03/07 18:08:10 tng * Return a reference instead of void for operator= * @@ -401,11 +404,13 @@ // ----------------------------------------------------------------------- // Private helper methods // ----------------------------------------------------------------------- - const XMLByte* getAposRef(unsigned int & count); - const XMLByte* getAmpRef(unsigned int & count); - const XMLByte* getGTRef(unsigned int & count); - const XMLByte* getLTRef(unsigned int & count); - const XMLByte* getQuoteRef(unsigned int & count); + const XMLByte* getCharRef(unsigned int & count, + XMLByte * ref, + const XMLCh * stdRef); + + unsigned int handleUnEscapedChars(const XMLCh * srcPtr, + unsigned int count, + const UnRepFlags unrepFlags); void specialFormat ( @@ -499,7 +504,7 @@ // ----------------------------------------------------------------------- XMLFormatTarget() {} XMLFormatTarget(const XMLFormatTarget&) {} - XMLFormatTarget& operator=(const XMLFormatTarget&) {return *this;} + void operator=(const XMLFormatTarget&) {} };
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]