You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2003/11/13 19:46:00 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl XML11EntityScanner.java XMLScanner.java XMLEntityScanner.java XMLVersionDetector.java XML11DocumentScannerImpl.java
mrglavas 2003/11/13 10:46:00
Modified: java/src/org/apache/xerces/util XML11Char.java
java/src/org/apache/xerces/impl XML11EntityScanner.java
XMLScanner.java XMLEntityScanner.java
XMLVersionDetector.java
XML11DocumentScannerImpl.java
Log:
Made necessary changes to align our XML 1.1 implementation with
the PR for XML 1.1: http://www.w3.org/TR/2003/PR-xml11-20031105/
The PR for XML 1.1 introduced the following changes: removal of some
characters from NameChar, allowing control characters to appear as
literals in internal entities, and disallowing NEL and LSEP from appearing
in XMLDecls or TextDecls.
Updated productions in XML11Char for NameChar.
Added new method called isInternalEntityContent to XML11Char which
returns whether or not a character can be interpreted as content in an
internal entity.
Modified XML11EntityScanner so that it will accept control characters as
literals in internal entities.
Added a new method to XMLEntityScanner called skipDeclSpaces which
only skips characters that would match non-terminal S before end of line
normalization.
Modified XMLVersionDetector so that it always uses the XML 1.0 scanner.
Skips spaces using new skipDeclSpaces method.
Modified XMLScanner so that it skips spaces in an XMLDecl or
TextDecl using new skipDeclSpaces method. This prevents NEL and
LSEP from being matched as S in XML 1.1 entities.
Removed scanXMLDeclorTextDecl method in XML11DocumentScannerImpl
which had bugs and furthermore was never called by the parser.
Revision Changes Path
1.3 +39 -17 xml-xerces/java/src/org/apache/xerces/util/XML11Char.java
Index: XML11Char.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/util/XML11Char.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XML11Char.java 10 Apr 2003 19:54:12 -0000 1.2
+++ XML11Char.java 13 Nov 2003 18:45:59 -0000 1.3
@@ -101,7 +101,7 @@
/** XML 1.1 control character mask */
public static final int MASK_XML11_CONTROL = 0x10;
- /** XML 1.1 content (valid - "special" chars) */
+ /** XML 1.1 content for external entities (valid - "special" chars - control chars) */
public static final int MASK_XML11_CONTENT = 0x20;
/** XML namespaces 1.1 NCNameStart */
@@ -109,6 +109,9 @@
/** XML namespaces 1.1 NCName */
public static final int MASK_XML11_NCNAME = 0x80;
+
+ /** XML 1.1 content for internal entities (valid - "special" chars) */
+ public static final int MASK_XML11_CONTENT_INTERNAL = MASK_XML11_CONTROL | MASK_XML11_CONTENT;
//
// Static initialization
@@ -120,11 +123,13 @@
* XML 1.1 initialization.
*/
- // [2]: Char ::= #x9 | #xA | #xD | [#x20-#x7E] | #x85 | [#xA0-#xD7FF]
- // | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ // [2]: Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ //
+ // NOTE: This range is Char - (RestrictedChar | S | #x85 | #x2028).
int xml11NonWhitespaceRange [] = {
0x21, 0x7E, 0xA0, 0x2027, 0x2029, 0xD7FF, 0xE000, 0xFFFD,
};
+
// NOTE: this does *NOT* correspond to the S production
// from XML 1.0. Rather, it corresponds to S+chars that are
// involved in whitespace normalization. It's handy
@@ -133,23 +138,28 @@
int xml11WhitespaceChars [] = {
0x9, 0xA, 0xD, 0x20, 0x85, 0x2028,
};
+
+ // [2a]: RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] |
+ // [#x7F-#x84] | [#x86-#x9F]
int xml11ControlCharRange [] = {
0x1, 0x8, 0xB, 0xC, 0xE, 0x1F, 0x7f, 0x84, 0x86, 0x9f,
};
-
- // [4]: NameStartChar := ":" | [A-Z] | "_" | [a-z] |
- // [#xC0-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] |
- // [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] |
- // [#x3001-#xD7FF]
- // | ([#xF900-#xEFFFF])??? [#xF900-#xFFFD
+
+ // [4]: NameStartChar ::= ":" | [A-Z] | "_" | [a-z] |
+ // [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] |
+ // [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] |
+ // [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] |
+ // [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
int xml11NameStartCharRange [] = {
- ':', ':', 'A', 'Z', '_', '_',
- 'a', 'z', 0xC0, 0x2FF, 0x370, 0x37D, 0x37F, 0x1FFF,
- 0x200C, 0x200D, 0x2070, 0x218F, 0x2C00, 0x2FEF,
- 0x3001, 0xD7FF, 0xF900, 0xFFFD,
+ ':', ':', 'A', 'Z', '_', '_', 'a', 'z',
+ 0xC0, 0xD6, 0xD8, 0xF6, 0xF8, 0x2FF,
+ 0x370, 0x37D, 0x37F, 0x1FFF, 0x200C, 0x200D,
+ 0x2070, 0x218F, 0x2C00, 0x2FEF, 0x3001, 0xD7FF,
+ 0xF900, 0xFDCF, 0xFDF0, 0xFFFD,
};
- // [4a]: NameChar := NameStartChar | "-" | "." | [0-9] | #xB7 |
- // [#x0300-#x036F] | [#x203F-#x2040]
+
+ // [4a]: NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 |
+ // [#x0300-#x036F] | [#x203F-#x2040]
int xml11NameCharRange [] = {
'-', '-', '.', '.', '0', '9', 0xB7, 0xB7,
0x0300, 0x036F, 0x203F, 0x2040,
@@ -249,7 +259,8 @@
} // isXML11ValidLiteral(int):boolean
/**
- * Returns true if the specified character can be considered content.
+ * Returns true if the specified character can be considered
+ * content in an external parsed entity.
*
* @param c The character to check.
*/
@@ -257,6 +268,17 @@
return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT) != 0) ||
(0x10000 <= c && c <= 0x10FFFF);
} // isXML11Content(int):boolean
+
+ /**
+ * Returns true if the specified character can be considered
+ * content in an internal parsed entity.
+ *
+ * @param c The character to check.
+ */
+ public static boolean isXML11InternalEntityContent(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT_INTERNAL) != 0) ||
+ (0x10000 <= c && c <= 0x10FFFF);
+ } // isXML11InternalEntityContent(int):boolean
/**
* Returns true if the specified character is a valid name start
1.9 +104 -40 xml-xerces/java/src/org/apache/xerces/impl/XML11EntityScanner.java
Index: XML11EntityScanner.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XML11EntityScanner.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XML11EntityScanner.java 7 Nov 2003 21:00:27 -0000 1.8
+++ XML11EntityScanner.java 13 Nov 2003 18:45:59 -0000 1.9
@@ -70,6 +70,7 @@
* Implements the entity scanner methods in
* the context of XML 1.1.
*
+ * @author Michael Glavassevich, IBM
* @author Neil Graham, IBM
* @version $Id$
*/
@@ -552,11 +553,23 @@
}
// inner loop, scanning for content
- while (fCurrentEntity.position < fCurrentEntity.count) {
- c = fCurrentEntity.ch[fCurrentEntity.position++];
- if (!XML11Char.isXML11Content(c) || ((c == 0x85 || c == 0x2028) && external)) {
- fCurrentEntity.position--;
- break;
+ if (external) {
+ while (fCurrentEntity.position < fCurrentEntity.count) {
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ if (!XML11Char.isXML11Content(c) || c == 0x85 || c == 0x2028) {
+ fCurrentEntity.position--;
+ break;
+ }
+ }
+ }
+ else {
+ while (fCurrentEntity.position < fCurrentEntity.count) {
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ // In internal entities control characters are allowed to appear unescaped.
+ if (!XML11Char.isXML11InternalEntityContent(c)) {
+ fCurrentEntity.position--;
+ break;
+ }
}
}
int length = fCurrentEntity.position - offset;
@@ -677,14 +690,25 @@
}
// scan literal value
- while (fCurrentEntity.position < fCurrentEntity.count) {
- c = fCurrentEntity.ch[fCurrentEntity.position++];
- if ((c == quote &&
- (!fCurrentEntity.literal || external))
- || c == '%' || !XML11Char.isXML11Content(c)
- || ((c == 0x85 || c == 0x2028) && external)) {
- fCurrentEntity.position--;
- break;
+ if (external) {
+ while (fCurrentEntity.position < fCurrentEntity.count) {
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ if (c == quote || c == '%' || !XML11Char.isXML11Content(c)
+ || c == 0x85 || c == 0x2028) {
+ fCurrentEntity.position--;
+ break;
+ }
+ }
+ }
+ else {
+ while (fCurrentEntity.position < fCurrentEntity.count) {
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ // In internal entities control characters are allowed to appear unescaped.
+ if ((c == quote && !fCurrentEntity.literal)
+ || c == '%' || !XML11Char.isXML11InternalEntityContent(c)) {
+ fCurrentEntity.position--;
+ break;
+ }
}
}
int length = fCurrentEntity.position - offset;
@@ -833,38 +857,78 @@
}
// iterate over buffer looking for delimiter
- OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {
- c = fCurrentEntity.ch[fCurrentEntity.position++];
- if (c == charAt0) {
- // looks like we just hit the delimiter
- int delimOffset = fCurrentEntity.position - 1;
- for (int i = 1; i < delimLen; i++) {
- if (fCurrentEntity.position == fCurrentEntity.count) {
- fCurrentEntity.position -= i;
- break OUTER;
+ if (external) {
+ OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ if (c == charAt0) {
+ // looks like we just hit the delimiter
+ int delimOffset = fCurrentEntity.position - 1;
+ for (int i = 1; i < delimLen; i++) {
+ if (fCurrentEntity.position == fCurrentEntity.count) {
+ fCurrentEntity.position -= i;
+ break OUTER;
+ }
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ if (delimiter.charAt(i) != c) {
+ fCurrentEntity.position--;
+ break;
+ }
+ }
+ if (fCurrentEntity.position == delimOffset + delimLen) {
+ done = true;
+ break;
+ }
+ }
+ else if (c == '\n' || c == '\r' || c == 0x85 || c == 0x2028) {
+ fCurrentEntity.position--;
+ break;
+ }
+ // In external entities control characters cannot appear
+ // as literals so do not skip over them.
+ else if (!XML11Char.isXML11ValidLiteral(c)) {
+ fCurrentEntity.position--;
+ int length = fCurrentEntity.position - offset;
+ fCurrentEntity.columnNumber += length - newlines;
+ buffer.append(fCurrentEntity.ch, offset, length);
+ return true;
+ }
+ }
+ }
+ else {
+ OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ if (c == charAt0) {
+ // looks like we just hit the delimiter
+ int delimOffset = fCurrentEntity.position - 1;
+ for (int i = 1; i < delimLen; i++) {
+ if (fCurrentEntity.position == fCurrentEntity.count) {
+ fCurrentEntity.position -= i;
+ break OUTER;
+ }
+ c = fCurrentEntity.ch[fCurrentEntity.position++];
+ if (delimiter.charAt(i) != c) {
+ fCurrentEntity.position--;
+ break;
+ }
}
- c = fCurrentEntity.ch[fCurrentEntity.position++];
- if (delimiter.charAt(i) != c) {
- fCurrentEntity.position--;
+ if (fCurrentEntity.position == delimOffset + delimLen) {
+ done = true;
break;
}
}
- if (fCurrentEntity.position == delimOffset + delimLen) {
- done = true;
+ else if (c == '\n') {
+ fCurrentEntity.position--;
break;
}
- }
- else if (c == '\n' || (external && (c == '\r' || c == 0x85 || c == 0x2028))) {
- fCurrentEntity.position--;
- break;
- }
- // note that we should not skip over control characters!
- else if (!XML11Char.isXML11ValidLiteral(c)) {
- fCurrentEntity.position--;
- int length = fCurrentEntity.position - offset;
- fCurrentEntity.columnNumber += length - newlines;
- buffer.append(fCurrentEntity.ch, offset, length);
- return true;
+ // Control characters are allowed to appear as literals
+ // in internal entities.
+ else if (!XML11Char.isXML11Valid(c)) {
+ fCurrentEntity.position--;
+ int length = fCurrentEntity.position - offset;
+ fCurrentEntity.columnNumber += length - newlines;
+ buffer.append(fCurrentEntity.ch, offset, length);
+ return true;
+ }
}
}
int length = fCurrentEntity.position - offset;
1.38 +20 -5 xml-xerces/java/src/org/apache/xerces/impl/XMLScanner.java
Index: XMLScanner.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLScanner.java,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- XMLScanner.java 7 Nov 2003 00:26:17 -0000 1.37
+++ XMLScanner.java 13 Nov 2003 18:45:59 -0000 1.38
@@ -404,7 +404,7 @@
int state = STATE_VERSION;
boolean dataFoundForTarget = false;
- boolean sawSpace = fEntityScanner.skipSpaces();
+ boolean sawSpace = fEntityScanner.skipDeclSpaces();
// since pseudoattributes are *not* attributes,
// their quotes don't need to be preserved in external parameter entities.
// the XMLEntityScanner#scanLiteral method will continue to
@@ -507,7 +507,7 @@
reportFatalError("NoMorePseudoAttributes", null);
}
}
- sawSpace = fEntityScanner.skipSpaces();
+ sawSpace = fEntityScanner.skipDeclSpaces();
}
// restore original literal value
if(currLiteral)
@@ -565,17 +565,29 @@
XMLString value)
throws IOException, XNIException {
+ // REVISIT: This method is used for generic scanning of
+ // pseudo attributes, but since there are only three such
+ // attributes: version, encoding, and standalone there are
+ // for performant ways of scanning them. Every decl must
+ // have a version, and in TextDecls this version must
+ // be followed by an encoding declaration. Also the
+ // methods we invoke on the scanners allow non-ASCII
+ // characters to be parsed in the decls, but since
+ // we don't even know what the actual encoding of the
+ // document is until we scan the encoding declaration
+ // you cannot reliably read any characters outside
+ // of the ASCII range here. -- mrglavas
String name = fEntityScanner.scanName();
XMLEntityManager.print(fEntityManager.getCurrentEntity());
if (name == null) {
reportFatalError("PseudoAttrNameExpected", null);
}
- fEntityScanner.skipSpaces();
+ fEntityScanner.skipDeclSpaces();
if (!fEntityScanner.skipChar('=')) {
reportFatalError(scanningTextDecl ? "EqRequiredInTextDecl"
: "EqRequiredInXMLDecl", new Object[]{name});
}
- fEntityScanner.skipSpaces();
+ fEntityScanner.skipDeclSpaces();
int quote = fEntityScanner.peekChar();
if (quote != '\'' && quote != '"') {
reportFatalError(scanningTextDecl ? "QuoteRequiredInTextDecl"
@@ -591,6 +603,9 @@
if (c == '&' || c == '%' || c == '<' || c == ']') {
fStringBuffer2.append((char)fEntityScanner.scanChar());
}
+ // REVISIT: Even if you could reliably read non-ASCII chars
+ // why bother scanning for surrogates here? Only ASCII chars
+ // match the productions in XMLDecls and TextDecls. -- mrglavas
else if (XMLChar.isHighSurrogate(c)) {
scanSurrogates(fStringBuffer2);
}
1.19 +92 -1 xml-xerces/java/src/org/apache/xerces/impl/XMLEntityScanner.java
Index: XMLEntityScanner.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLEntityScanner.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- XMLEntityScanner.java 7 Nov 2003 21:00:27 -0000 1.18
+++ XMLEntityScanner.java 13 Nov 2003 18:45:59 -0000 1.19
@@ -1322,6 +1322,97 @@
} // skipSpaces():boolean
/**
+ * Skips space characters appearing immediately on the input that would
+ * match non-terminal S (0x09, 0x0A, 0x0D, 0x20) before end of line
+ * normalization is performed. This is useful when scanning structures
+ * such as the XMLDecl and TextDecl that can only contain US-ASCII
+ * characters.
+ * <p>
+ * <strong>Note:</strong> The characters are consumed only if they would
+ * match non-terminal S before end of line normalization is performed.
+ *
+ * @return Returns true if at least one space character was skipped.
+ *
+ * @throws IOException Thrown if i/o error occurs.
+ * @throws EOFException Thrown on end of file.
+ *
+ * @see org.apache.xerces.util.XMLChar#isSpace
+ */
+ public boolean skipDeclSpaces() throws IOException {
+ if (DEBUG_BUFFER) {
+ System.out.print("(skipDeclSpaces: ");
+ XMLEntityManager.print(fCurrentEntity);
+ System.out.println();
+ }
+
+ // load more characters, if needed
+ if (fCurrentEntity.position == fCurrentEntity.count) {
+ load(0, true);
+ }
+
+ // skip spaces
+ int c = fCurrentEntity.ch[fCurrentEntity.position];
+ if (XMLChar.isSpace(c)) {
+ boolean external = fCurrentEntity.isExternal();
+ do {
+ boolean entityChanged = false;
+ // handle newlines
+ if (c == '\n' || (external && c == '\r')) {
+ fCurrentEntity.lineNumber++;
+ fCurrentEntity.columnNumber = 1;
+ if (fCurrentEntity.position == fCurrentEntity.count - 1) {
+ fCurrentEntity.ch[0] = (char)c;
+ entityChanged = load(1, true);
+ if (!entityChanged)
+ // the load change the position to be 1,
+ // need to restore it when entity not changed
+ fCurrentEntity.position = 0;
+ }
+ if (c == '\r' && external) {
+ // REVISIT: Does this need to be updated to fix the
+ // #x0D ^#x0A newline normalization problem? -Ac
+ if (fCurrentEntity.ch[++fCurrentEntity.position] != '\n') {
+ fCurrentEntity.position--;
+ }
+ }
+ /*** NEWLINE NORMALIZATION ***
+ else {
+ if (fCurrentEntity.ch[fCurrentEntity.position + 1] == '\r'
+ && external) {
+ fCurrentEntity.position++;
+ }
+ }
+ /***/
+ }
+ else {
+ fCurrentEntity.columnNumber++;
+ }
+ // load more characters, if needed
+ if (!entityChanged)
+ fCurrentEntity.position++;
+ if (fCurrentEntity.position == fCurrentEntity.count) {
+ load(0, true);
+ }
+ } while (XMLChar.isSpace(c = fCurrentEntity.ch[fCurrentEntity.position]));
+ if (DEBUG_BUFFER) {
+ System.out.print(")skipDeclSpaces: ");
+ XMLEntityManager.print(fCurrentEntity);
+ System.out.println(" -> true");
+ }
+ return true;
+ }
+
+ // no spaces were found
+ if (DEBUG_BUFFER) {
+ System.out.print(")skipDeclSpaces: ");
+ XMLEntityManager.print(fCurrentEntity);
+ System.out.println(" -> false");
+ }
+ return false;
+
+ } // skipDeclSpaces():boolean
+
+ /**
* Skips the specified string appearing immediately on the input.
* <p>
* <strong>Note:</strong> The characters are consumed only if they are
1.10 +7 -7 xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java
Index: XMLVersionDetector.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- XMLVersionDetector.java 2 Nov 2003 12:25:33 -0000 1.9
+++ XMLVersionDetector.java 13 Nov 2003 18:45:59 -0000 1.10
@@ -183,16 +183,16 @@
public short determineDocVersion(XMLInputSource inputSource) throws IOException {
fEncoding = fEntityManager.setupCurrentEntity(fXMLSymbol, inputSource, false, true);
- // must assume 1.1 at this stage so that whitespace
- // handling is correct in the XML decl...
- fEntityManager.setScannerVersion(Constants.XML_VERSION_1_1);
+ // Must use XML 1.0 scanner to handle whitespace correctly
+ // in the XML declaration.
+ fEntityManager.setScannerVersion(Constants.XML_VERSION_1_0);
XMLEntityScanner scanner = fEntityManager.getEntityScanner();
try {
if (!scanner.skipString("<?xml")) {
// definitely not a well-formed 1.1 doc!
return Constants.XML_VERSION_1_0;
}
- if (!scanner.skipSpaces()) {
+ if (!scanner.skipDeclSpaces()) {
fixupCurrentEntity(fEntityManager, fExpectedVersionString, 5);
return Constants.XML_VERSION_1_0;
}
@@ -200,14 +200,14 @@
fixupCurrentEntity(fEntityManager, fExpectedVersionString, 6);
return Constants.XML_VERSION_1_0;
}
- scanner.skipSpaces();
+ scanner.skipDeclSpaces();
// Check if the next character is '='. If it is then consume it.
if (scanner.peekChar() != '=') {
fixupCurrentEntity(fEntityManager, fExpectedVersionString, 13);
return Constants.XML_VERSION_1_0;
}
scanner.scanChar();
- scanner.skipSpaces();
+ scanner.skipDeclSpaces();
int quoteChar = scanner.scanChar();
fExpectedVersionString[14] = (char) quoteChar;
for (int versionPos = 0; versionPos < XML11_VERSION.length; versionPos++) {
1.13 +1 -172 xml-xerces/java/src/org/apache/xerces/impl/XML11DocumentScannerImpl.java
Index: XML11DocumentScannerImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XML11DocumentScannerImpl.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- XML11DocumentScannerImpl.java 25 Jul 2003 19:41:10 -0000 1.12
+++ XML11DocumentScannerImpl.java 13 Nov 2003 18:45:59 -0000 1.13
@@ -176,177 +176,6 @@
} // scanContent():int
/**
- * Scans an XML or text declaration.
- * <p>
- * <pre>
- * [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
- * [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")
- * [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" )
- * [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
- * [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'")
- * | ('"' ('yes' | 'no') '"'))
- *
- * [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
- * </pre>
- * <p> this was overridden to allow for version="1.1"</p>
- *
- * @param scanningTextDecl True if a text declaration is to
- * be scanned instead of an XML
- * declaration.
- * @param pseudoAttributeValues An array of size 3 to return the version,
- * encoding and standalone pseudo attribute values
- * (in that order).
- *
- * <strong>Note:</strong> This method uses fString, anything in it
- * at the time of calling is lost.
- */
- protected void scanXMLDeclOrTextDecl(boolean scanningTextDecl,
- String[] pseudoAttributeValues)
- throws IOException, XNIException {
-
- // pseudo-attribute values
- String version = null;
- String encoding = null;
- String standalone = null;
-
- // scan pseudo-attributes
- final int STATE_VERSION = 0;
- final int STATE_ENCODING = 1;
- final int STATE_STANDALONE = 2;
- final int STATE_DONE = 3;
- int state = STATE_VERSION;
-
- boolean dataFoundForTarget = false;
- boolean sawSpace = fEntityScanner.skipSpaces();
- while (fEntityScanner.peekChar() != '?') {
- dataFoundForTarget = true;
- String name = scanPseudoAttribute(scanningTextDecl, fString);
- switch (state) {
- case STATE_VERSION: {
- if (name == fVersionSymbol) {
- if (!sawSpace) {
- reportFatalError(scanningTextDecl
- ? "SpaceRequiredBeforeVersionInTextDecl"
- : "SpaceRequiredBeforeVersionInXMLDecl",
- null);
- }
- version = fString.toString();
- state = STATE_ENCODING;
- if (!version.equals("1.0") || !version.equals("1.1")) {
- // REVISIT: XML REC says we should throw an error in such cases.
- // some may object the throwing of fatalError.
- reportFatalError("VersionNotSupported",
- new Object[]{version});
- }
- }
- else if (name == fEncodingSymbol) {
- if (!scanningTextDecl) {
- reportFatalError("VersionInfoRequired", null);
- }
- if (!sawSpace) {
- reportFatalError(scanningTextDecl
- ? "SpaceRequiredBeforeEncodingInTextDecl"
- : "SpaceRequiredBeforeEncodingInXMLDecl",
- null);
- }
- encoding = fString.toString();
- state = scanningTextDecl ? STATE_DONE : STATE_STANDALONE;
- }
- else {
- if (scanningTextDecl) {
- reportFatalError("EncodingDeclRequired", null);
- }
- else {
- reportFatalError("VersionInfoRequired", null);
- }
- }
- break;
- }
- case STATE_ENCODING: {
- if (name == fEncodingSymbol) {
- if (!sawSpace) {
- reportFatalError(scanningTextDecl
- ? "SpaceRequiredBeforeEncodingInTextDecl"
- : "SpaceRequiredBeforeEncodingInXMLDecl",
- null);
- }
- encoding = fString.toString();
- state = scanningTextDecl ? STATE_DONE : STATE_STANDALONE;
- }
- else if (!scanningTextDecl && name == fStandaloneSymbol) {
- if (!sawSpace) {
- reportFatalError("SpaceRequiredBeforeStandalone",
- null);
- }
- standalone = fString.toString();
- state = STATE_DONE;
- if (!standalone.equals("yes") && !standalone.equals("no")) {
- reportFatalError("SDDeclInvalid", new Object[] {standalone});
- }
- }
- else {
- reportFatalError("EncodingDeclRequired", new Object[] {standalone});
- }
- break;
- }
- case STATE_STANDALONE: {
- if (name == fStandaloneSymbol) {
- if (!sawSpace) {
- reportFatalError("SpaceRequiredBeforeStandalone",
- null);
- }
- standalone = fString.toString();
- state = STATE_DONE;
- if (!standalone.equals("yes") && !standalone.equals("no")) {
- reportFatalError("SDDeclInvalid", new Object[] {standalone});
- }
- }
- else {
- reportFatalError("EncodingDeclRequired", null);
- }
- break;
- }
- default: {
- reportFatalError("NoMorePseudoAttributes", null);
- }
- }
- sawSpace = fEntityScanner.skipSpaces();
- }
- // REVISIT: should we remove this error reporting?
- if (scanningTextDecl && state != STATE_DONE) {
- reportFatalError("MorePseudoAttributes", null);
- }
-
- // If there is no data in the xml or text decl then we fail to report error
- // for version or encoding info above.
- if (scanningTextDecl) {
- if (!dataFoundForTarget && encoding == null) {
- reportFatalError("EncodingDeclRequired", null);
- }
- }
- else {
- if (!dataFoundForTarget && version == null) {
- reportFatalError("VersionInfoRequired", null);
- }
- }
-
- // end
- if (!fEntityScanner.skipChar('?')) {
- reportFatalError("XMLDeclUnterminated", null);
- }
- if (!fEntityScanner.skipChar('>')) {
- reportFatalError("XMLDeclUnterminated", null);
-
- }
-
- // fill in return array
- pseudoAttributeValues[0] = version;
- pseudoAttributeValues[1] = encoding;
- pseudoAttributeValues[2] = standalone;
-
- } // scanXMLDeclOrTextDecl(boolean)
-
- /**
* Scans an attribute value and normalizes whitespace converting all
* whitespace characters to space characters.
*
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org