peiyongz 2004/06/03 08:38:28
Modified: c/src/xercesc/internal ReaderMgr.cpp ReaderMgr.hpp
XMLReader.cpp XMLReader.hpp XMLScanner.cpp
Log:
XML1.1: The characters #x85 and #x2028 cannot be reliably recognized
and translated until an entity's encoding declaration (if present) has been
read. Therefore, it is a fatal error to use them within the XML declaration or
text declaration.
Revision Changes Path
1.24 +24 -1 xml-xerces/c/src/xercesc/internal/ReaderMgr.cpp
Index: ReaderMgr.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/ReaderMgr.cpp,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- ReaderMgr.cpp 25 May 2004 18:09:51 -0000 1.23
+++ ReaderMgr.cpp 3 Jun 2004 15:38:27 -0000 1.24
@@ -310,6 +310,29 @@
return (tmpFlag || skippedSomething);
}
+bool ReaderMgr::skipPastSpacesInDecl()
+{
+ bool skippedSomething = false;
+ bool tmpFlag;
+ while (true)
+ {
+ //
+ // Skip all the spaces in the current reader. If it returned because
+ // it hit a non-space, break out. Else we have to pop another entity
+ // and keep going.
+ //
+ if (fCurReader->skipSpacesInDecl(tmpFlag))
+ break;
+
+ if (tmpFlag)
+ skippedSomething = true;
+
+ // Try to pop another enitity. If we can't then we are done
+ if (!popReader())
+ break;
+ }
+ return (tmpFlag || skippedSomething);
+}
void ReaderMgr::skipQuotedString(const XMLCh quoteCh)
{
1.12 +4 -0 xml-xerces/c/src/xercesc/internal/ReaderMgr.hpp
Index: ReaderMgr.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/ReaderMgr.hpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ReaderMgr.hpp 29 Jan 2004 11:46:30 -0000 1.11
+++ ReaderMgr.hpp 3 Jun 2004 15:38:27 -0000 1.12
@@ -56,6 +56,12 @@
/*
* $Log$
+ * Revision 1.12 2004/06/03 15:38:27 peiyongz
+ * XML1.1: The characters #x85 and #x2028 cannot be reliably recognized
+ * and translated until an entity's encoding declaration (if present) has been
+ * read. Therefore, it is a fatal error to use them within the XML declaration or
+ * text declaration.
+ *
* Revision 1.11 2004/01/29 11:46:30 cargilld
* Code cleanup changes to get rid of various compiler diagnostic messages.
*
@@ -218,6 +224,7 @@
bool skipIfQuote(XMLCh& chGotten);
void skipPastChar(const XMLCh toSkip);
bool skipPastSpaces();
+ bool skipPastSpacesInDecl();
void skipToChar(const XMLCh toSkipTo);
bool skippedChar(const XMLCh toSkip);
bool skippedSpace();
1.20 +102 -1 xml-xerces/c/src/xercesc/internal/XMLReader.cpp
Index: XMLReader.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLReader.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- XMLReader.cpp 29 Jan 2004 11:46:30 -0000 1.19
+++ XMLReader.cpp 3 Jun 2004 15:38:27 -0000 1.20
@@ -924,6 +924,107 @@
return false;
}
+/***
+ * XML1.1
+ *
+ * 2.11 End-of-Line Handling
+ * ...
+ * The characters #x85 and #x2028 cannot be reliably recognized and translated
+ * until an entity's encoding declaration (if present) has been read.
+ * Therefore, it is a fatal error to use them within the XML declaration or
+ * text declaration.
+ *
+***/
+bool XMLReader::skipSpacesInDecl(bool& skippedSomething)
+{
+ // Remember the current line and column
+ XMLSSize_t orgLine = fCurLine;
+ XMLSSize_t orgCol = fCurCol;
+
+ // We enter a loop where we skip over spaces until we hit the end of
+ // this reader or a non-space value. The return indicates whether we
+ // hit the non-space (true) or the end (false).
+ while (true)
+ {
+ // Loop through the current chars in the buffer
+ while (fCharIndex < fCharsAvail)
+ {
+ // See if its a white space char. If so, then process it. Else
+ // we've hit a non-space and need to return.
+ if (isWhitespace(fCharBuf[fCharIndex]))
+ {
+ // Get the current char out of the buffer and eat it
+ XMLCh curCh = fCharBuf[fCharIndex++];
+
+ // Ok, we've got some whitespace here. So we have to store
+ // it. But we have to normalize it and update the line and
+ // column info along the way.
+ if (curCh == chCR)
+ {
+ fCurCol = 1;
+ fCurLine++;
+
+ // If not already internalized, then convert it to an
+ // LF and eat any following LF.
+ if (fSource == Source_External)
+ {
+ if ((fCharIndex < fCharsAvail) || refreshCharBuffer())
+ {
+ if (fCharBuf[fCharIndex] == chLF
+ || ((fCharBuf[fCharIndex] == chNEL) && fNEL))
+ fCharIndex++;
+ }
+ }
+ }
+ else if (curCh == chLF)
+ {
+ fCurCol = 1;
+ fCurLine++;
+ }
+ else if (curCh == chNEL || curCh == chLineSeparator)
+ {
+ if (fXMLVersion == XMLVersion::XMLV1_1)
+ {
+ ThrowXMLwithMemMgr1
+ (
+ TranscodingException
+ , XMLExcepts::Reader_NelLsepinDecl
+ , fSystemId
+ , fMemoryManager
+ );
+ }
+ else //XMLVersion::XMLV1_0
+ {
+ if (fNEL)
+ {
+ fCurCol = 1;
+ fCurLine++;
+ }
+ }
+ }
+ else
+ {
+ fCurCol++;
+ }
+ }
+ else
+ {
+ skippedSomething = (orgLine != fCurLine) || (orgCol != fCurCol);
+ return true;
+ }
+ }
+
+ // We've eaten up the current buffer, so lets try to reload it. If
+ // we don't get anything new, then break out. If we do, then we go
+ // back to the top to keep getting spaces.
+ if (!refreshCharBuffer())
+ break;
+ }
+
+ // We never hit any non-space and ate up the whole reader
+ skippedSomething = (orgLine != fCurLine) || (orgCol != fCurCol);
+ return false;
+}
bool XMLReader::skippedChar(const XMLCh toSkip)
{
1.16 +4 -0 xml-xerces/c/src/xercesc/internal/XMLReader.hpp
Index: XMLReader.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLReader.hpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- XMLReader.hpp 29 Jan 2004 11:46:30 -0000 1.15
+++ XMLReader.hpp 3 Jun 2004 15:38:27 -0000 1.16
@@ -56,6 +56,12 @@
/*
* $Log$
+ * Revision 1.16 2004/06/03 15:38:27 peiyongz
+ * XML1.1: The characters #x85 and #x2028 cannot be reliably recognized
+ * and translated until an entity's encoding declaration (if present) has been
+ * read. Therefore, it is a fatal error to use them within the XML declaration or
+ * text declaration.
+ *
* Revision 1.15 2004/01/29 11:46:30 cargilld
* Code cleanup changes to get rid of various compiler diagnostic messages.
*
@@ -328,6 +334,7 @@
bool peekNextChar(XMLCh& chGotten);
bool skipIfQuote(XMLCh& chGotten);
bool skipSpaces(bool& skippedSomething);
+ bool skipSpacesInDecl(bool& skippedSomething);
bool skippedChar(const XMLCh toSkip);
bool skippedSpace();
bool skippedString(const XMLCh* const toSkip);
1.66 +4 -4 xml-xerces/c/src/xercesc/internal/XMLScanner.cpp
Index: XMLScanner.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLScanner.cpp,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -r1.65 -r1.66
--- XMLScanner.cpp 26 Apr 2004 21:17:54 -0000 1.65
+++ XMLScanner.cpp 3 Jun 2004 15:38:27 -0000 1.66
@@ -1340,7 +1340,7 @@
while (true)
{
// Skip any spaces
- const unsigned int spaceCount = fReaderMgr.skipPastSpaces();
+ const unsigned int spaceCount = fReaderMgr.skipPastSpacesInDecl();
// If we are looking at a question mark, then break out
if (fReaderMgr.lookingAtChar(chQuestion))
@@ -2170,10 +2170,10 @@
// just makes the calling code cleaner by eating whitespace.
bool XMLScanner::scanEq()
{
- fReaderMgr.skipPastSpaces();
+ fReaderMgr.skipPastSpacesInDecl();
if (fReaderMgr.skippedChar(chEqual))
{
- fReaderMgr.skipPastSpaces();
+ fReaderMgr.skipPastSpacesInDecl();
return true;
}
return false;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]