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]

Reply via email to