diff --git a/src/internal/XMLScanner.cpp b/src/internal/XMLScanner.cpp index 4f57c94d11f69cf31d1863fdf9c963055ded5c80..e0c147ee26e51ca75050092bf97b2f62f7e75a1c 100644 --- a/src/internal/XMLScanner.cpp +++ b/src/internal/XMLScanner.cpp @@ -3421,3 +3421,61 @@ XMLScanner::resolveQName( const XMLCh* const qName return uriId; } +bool XMLScanner::checkXMLDecl(bool startWithAngle) { + // + // [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' + // [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') + // + // [3] S ::= (#x20 | #x9 | #xD | #xA)+ + // + + if (startWithAngle) { + if (fReaderMgr.peekString(XMLUni::fgXMLDeclString)) { + if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpace) + || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTab) + || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLF) + || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCR)) + { + return true; + } + else if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpaceU) + || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTabU) + || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLFU) + || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCRU)) + { + // + // Just in case, check for upper case. If found, issue + // an error, but keep going. + // + emitError(XMLErrs::XMLDeclMustBeLowerCase); + return true; + } + } + } + else { + if (fReaderMgr.peekString(XMLUni::fgXMLString)) { + if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpace) + || fReaderMgr.skippedString(XMLUni::fgXMLStringHTab) + || fReaderMgr.skippedString(XMLUni::fgXMLStringLF) + || fReaderMgr.skippedString(XMLUni::fgXMLStringCR)) + { + return true; + } + else if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpaceU) + || fReaderMgr.skippedString(XMLUni::fgXMLStringHTabU) + || fReaderMgr.skippedString(XMLUni::fgXMLStringLFU) + || fReaderMgr.skippedString(XMLUni::fgXMLStringCRU)) + { + // + // Just in case, check for upper case. If found, issue + // an error, but keep going. + // + emitError(XMLErrs::XMLDeclMustBeLowerCase); + return true; + } + } + } + + return false; +} + diff --git a/src/internal/XMLScanner.hpp b/src/internal/XMLScanner.hpp index bef1130e9e676e381f55e7f7fd865e2bfddabcad..46dea288dbb988e44867557e697f668a648588cf 100644 --- a/src/internal/XMLScanner.hpp +++ b/src/internal/XMLScanner.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.27 2001/07/13 16:56:48 tng + * ScanId fix. + * * Revision 1.26 2001/07/12 18:50:17 tng * Some performance modification regarding standalone check and xml decl check. * @@ -1124,61 +1127,4 @@ inline void XMLScanner::setDoValidation(const bool validate) fValScheme = Val_Never; } -inline bool XMLScanner::checkXMLDecl(bool startWithAngle) { - // - // [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' - // [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') - // - // [3] S ::= (#x20 | #x9 | #xD | #xA)+ - // - - if (startWithAngle) { - if (fReaderMgr.peekString(XMLUni::fgXMLDeclString)) { - if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpace) - || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTab) - || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLF) - || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCR)) - { - return true; - } - else if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpaceU) - || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTabU) - || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLFU) - || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCRU)) - { - // - // Just in case, check for upper case. If found, issue - // an error, but keep going. - // - emitError(XMLErrs::XMLDeclMustBeLowerCase); - return true; - } - } - } - else { - if (fReaderMgr.peekString(XMLUni::fgXMLString)) { - if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpace) - || fReaderMgr.skippedString(XMLUni::fgXMLStringHTab) - || fReaderMgr.skippedString(XMLUni::fgXMLStringLF) - || fReaderMgr.skippedString(XMLUni::fgXMLStringCR)) - { - return true; - } - else if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpaceU) - || fReaderMgr.skippedString(XMLUni::fgXMLStringHTabU) - || fReaderMgr.skippedString(XMLUni::fgXMLStringLFU) - || fReaderMgr.skippedString(XMLUni::fgXMLStringCRU)) - { - // - // Just in case, check for upper case. If found, issue - // an error, but keep going. - // - emitError(XMLErrs::XMLDeclMustBeLowerCase); - return true; - } - } - } - - return false; -} #endif diff --git a/src/validators/DTD/DTDScanner.cpp b/src/validators/DTD/DTDScanner.cpp index 6e3440e3b30ff9571c906a675057487f3be16798..2305ea631b1a443a36ea78c27c98ea97b2ddb158 100644 --- a/src/validators/DTD/DTDScanner.cpp +++ b/src/validators/DTD/DTDScanner.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.18 2001/07/13 16:57:11 tng + * ScanId fix. + * * Revision 1.17 2001/07/12 20:10:18 tng * Partial Markup in Parameter Entity is validity constraint and thus should be just error, not fatal error. * @@ -2889,18 +2892,19 @@ bool DTDScanner::scanId( XMLBuffer& pubIdToFill if (whatKind == IDType_Public) return true; - // Else lets get the system id - if (!fReaderMgr->skipPastSpaces()) - { - // - // In order to recover best here we need to see if we don't have - // whitespace because the next thing is a quote or because the next - // thing is some non-quote character. - // - const XMLCh chPeek = fReaderMgr->peekNextChar(); - const bool bIsQuote = ((chPeek == chDoubleQuote) - || (chPeek == chSingleQuote)); + // check if there is any space follows + bool hasSpace = fReaderMgr->skipPastSpaces(); + // + // In order to recover best here we need to see if + // the next thing is a quote or not + // + const XMLCh chPeek = fReaderMgr->peekNextChar(); + const bool bIsQuote = ((chPeek == chDoubleQuote) + || (chPeek == chSingleQuote)); + + if (!hasSpace) + { if (whatKind == IDType_External) { // @@ -2931,8 +2935,16 @@ bool DTDScanner::scanId( XMLBuffer& pubIdToFill } } - if (!scanSystemLiteral(sysIdToFill)) + if (bIsQuote) { + // there is a quote coming, scan the system literal + if (!scanSystemLiteral(sysIdToFill)) return false; + } + else { + // no quote, if expecting exteral id, this is an error + if (whatKind == IDType_External) + fScanner->emitError(XMLErrs::ExpectedQuotedString); + } return true; }