Author: amassari
Date: Sat Feb 18 07:24:33 2006
New Revision: 378729
URL: http://svn.apache.org/viewcvs?rev=378729&view=rev
Log:
If an encoding has been forced on a InputSource, ignore a compatible BOM found
in the stream (jira# 1284)
Modified:
xerces/c/trunk/src/xercesc/framework/XMLRecognizer.cpp
xerces/c/trunk/src/xercesc/internal/XMLReader.cpp
Modified: xerces/c/trunk/src/xercesc/framework/XMLRecognizer.cpp
URL:
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/framework/XMLRecognizer.cpp?rev=378729&r1=378728&r2=378729&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/framework/XMLRecognizer.cpp (original)
+++ xerces/c/trunk/src/xercesc/framework/XMLRecognizer.cpp Sat Feb 18 07:24:33
2006
@@ -205,42 +205,50 @@
// !!NOTE: Note that we don't handle EBCDIC here because we don't handle
// that one ourselves. It is allowed to fall into 'other'.
//
- if (encName == XMLUni::fgXMLChEncodingString ||
+ if (encName == XMLUni::fgXMLChEncodingString ||
!XMLString::compareString(encName, XMLUni::fgXMLChEncodingString))
- {
+ {
return XMLRecognizer::XERCES_XMLCH;
- }
- else if (!XMLString::compareString(encName, XMLUni::fgUTF8EncodingString)
- || !XMLString::compareString(encName, XMLUni::fgUTF8EncodingString2))
+ }
+ else if (!XMLString::compareString(encName, XMLUni::fgUTF8EncodingString)
+ || !XMLString::compareString(encName, XMLUni::fgUTF8EncodingString2))
{
return XMLRecognizer::UTF_8;
}
- else if (!XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString)
- || !XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString2)
- || !XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString3)
- || !XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString4))
+ else if (!XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString)
+ || !XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString2)
+ || !XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString3)
+ || !XMLString::compareString(encName,
XMLUni::fgUSASCIIEncodingString4))
{
return XMLRecognizer::US_ASCII;
}
- else if (!XMLString::compareString(encName,
XMLUni::fgUTF16LEncodingString)
- || !XMLString::compareString(encName,
XMLUni::fgUTF16LEncodingString2))
+ else if (!XMLString::compareString(encName, XMLUni::fgUTF16LEncodingString)
+ || !XMLString::compareString(encName,
XMLUni::fgUTF16LEncodingString2))
{
return XMLRecognizer::UTF_16L;
}
- else if (!XMLString::compareString(encName,
XMLUni::fgUTF16BEncodingString)
- || !XMLString::compareString(encName,
XMLUni::fgUTF16BEncodingString2))
+ else if (!XMLString::compareString(encName, XMLUni::fgUTF16BEncodingString)
+ || !XMLString::compareString(encName,
XMLUni::fgUTF16BEncodingString2))
{
return XMLRecognizer::UTF_16B;
}
- else if (!XMLString::compareString(encName, XMLUni::fgUCS4LEncodingString)
- || !XMLString::compareString(encName,
XMLUni::fgUCS4LEncodingString2))
+ else if (!XMLString::compareString(encName, XMLUni::fgUTF16EncodingString))
+ {
+ return
XMLPlatformUtils::fgXMLChBigEndian?XMLRecognizer::UTF_16B:XMLRecognizer::UTF_16L;
+ }
+ else if (!XMLString::compareString(encName, XMLUni::fgUCS4LEncodingString)
+ || !XMLString::compareString(encName,
XMLUni::fgUCS4LEncodingString2))
{
return XMLRecognizer::UCS_4L;
}
- else if (!XMLString::compareString(encName, XMLUni::fgUCS4BEncodingString)
- || !XMLString::compareString(encName,
XMLUni::fgUCS4BEncodingString2))
+ else if (!XMLString::compareString(encName, XMLUni::fgUCS4BEncodingString)
+ || !XMLString::compareString(encName,
XMLUni::fgUCS4BEncodingString2))
{
return XMLRecognizer::UCS_4B;
+ }
+ else if (!XMLString::compareString(encName, XMLUni::fgUCS4EncodingString))
+ {
+ return
XMLPlatformUtils::fgXMLChBigEndian?XMLRecognizer::UCS_4B:XMLRecognizer::UCS_4L;
}
// Return 'other' since we don't recognizer it
Modified: xerces/c/trunk/src/xercesc/internal/XMLReader.cpp
URL:
http://svn.apache.org/viewcvs/xerces/c/trunk/src/xercesc/internal/XMLReader.cpp?rev=378729&r1=378728&r2=378729&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/XMLReader.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/XMLReader.cpp Sat Feb 18 07:24:33 2006
@@ -219,6 +219,49 @@
//
fEncoding = XMLRecognizer::encodingForName(fEncodingStr);
+ // test the presence of the BOM and remove it from the source
+ switch(fEncoding)
+ {
+ case XMLRecognizer::UCS_4B :
+ case XMLRecognizer::UCS_4L :
+ {
+ if (fRawBytesAvail > 4 &&
+ ((fRawByteBuf[0] == 0x00) && (fRawByteBuf[1] == 0x00) &&
(fRawByteBuf[2] == 0xFE) && (fRawByteBuf[3] == 0xFF)) ||
+ ((fRawByteBuf[0] == 0xFF) && (fRawByteBuf[1] == 0xFE) &&
(fRawByteBuf[2] == 0x00) && (fRawByteBuf[3] == 0x00)) )
+ {
+ fRawBufIndex += 4;
+ }
+ break;
+ }
+ case XMLRecognizer::UTF_8 :
+ {
+ // Look at the raw buffer as short chars
+ const char* asChars = (const char*)fRawByteBuf;
+
+ if (fRawBytesAvail > XMLRecognizer::fgUTF8BOMLen &&
+ XMLString::compareNString( asChars
+ , XMLRecognizer::fgUTF8BOM
+ , XMLRecognizer::fgUTF8BOMLen) ==
0)
+ {
+ fRawBufIndex += XMLRecognizer::fgUTF8BOMLen;
+ }
+ break;
+ }
+ case XMLRecognizer::UTF_16B :
+ case XMLRecognizer::UTF_16L :
+ {
+ if (fRawBytesAvail < 2)
+ break;
+
+ const UTF16Ch* asUTF16 = (const
UTF16Ch*)&fRawByteBuf[fRawBufIndex];
+ if ((*asUTF16 == chUnicodeMarker) || (*asUTF16 ==
chSwappedUnicodeMarker))
+ {
+ fRawBufIndex += sizeof(UTF16Ch);
+ }
+ break;
+ }
+ }
+
// Check whether the fSwapped flag should be set or not
checkForSwapped();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]