home *** CD-ROM | disk | FTP | other *** search
Wrap
package com.ms.xml.parser; import com.ms.xml.om.Element; import com.ms.xml.om.ElementFactory; import com.ms.xml.util.EnumWrapper; import com.ms.xml.util.Name; import com.ms.xml.util.QualifiedName; import com.ms.xml.util.XMLInputStream; import com.ms.xml.util.XMLOutputStream; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.net.URL; import java.util.Enumeration; import java.util.Hashtable; import java.util.Stack; import java.util.Vector; public class Parser { static final int TAGSTART = 60; static final int TAGEND = 62; static final int SLASH = 47; // $FF: renamed from: EQ int static final int field_0 = 61; static final int LPAREN = 40; static final int RPAREN = 41; static final int BANG = 33; static final int QMARK = 63; static final int DASH = 45; static final int PERCENT = 37; static final int AMP = 38; static final int LEFTSQB = 91; static final int RIGHTSQB = 93; static final int QUOTE = 39; // $FF: renamed from: OR int static final int field_1 = 124; static final int ASTERISK = 42; static final int PLUS = 43; static final int HASH = 35; static final int COMMA = 44; static final int INVALIDTOKEN = 0; static final int EOF = -1; static final int WHITESPACE = -2; static final int WORDCHAR = -3; static final int NAME = -4; static final int TEXT = -5; static final int PITAGSTART = -6; static final int PITAGEND = -7; static final int DECLTAGSTART = -8; static final int CLOSETAGSTART = -9; static final int EMPTYTAGEND = -10; static final int COMMENT = -11; static final int DOCTYPE = -12; static final int SYSTEM = -13; static final int CDATATAGSTART = -14; static final int ELEMENT = -15; static final int EMPTY = -16; static final int ANY = -17; static final int PCDATA = -18; static final int ATTLIST = -19; static final int CDATA = -20; // $FF: renamed from: ID int static final int field_2 = -21; static final int IDREF = -22; static final int IDREFS = -23; static final int ENTITY = -24; static final int ENTITIES = -25; static final int NMTOKEN = -26; static final int NMTOKENS = -27; static final int NOTATION = -28; static final int ENUMERATION = -29; static final int FIXED = -30; static final int REQUIRED = -31; static final int IMPLIED = -32; static final int NDATA = -33; static final int INCLUDE = -34; static final int INCLUDETAGSTART = -35; static final int IGNORE = -36; static final int IGNORETAGSTART = -37; static final int NAMESPACE = -38; static final int PUBLIC = -100; ElementFactory factory; DTD dtd; Element root; Stack contexts = new Stack(); Context current; EntityReader reader; XMLInputStream xmlIn; boolean inTag; int lookahead; char quote; char[] chars = new char[8192]; int charAt; char[] buf = new char[8192]; int bufAt; int nameappend; static Hashtable tokens; int token; int keyword; int nouppercase; int substitution; int breakText; int nametoken; int simplename; int inEntityRef; boolean expandNamedEntities; static boolean jdk11; Name name; String text; URL url; Name docType; boolean internalSubset; static ElementDecl XMLDecl; static int RMD_ALL; static int RMD_NONE = 1; static int RMD_INTERNAL = 2; int rmd; static int[] chartype = new int[256]; static char[] charupper = new char[256]; static final int FWHITESPACE = 1; static final int FDIGIT = 2; static final int FLETTER = 4; static final int FMISCNAME = 8; static final int FSTARTNAME = 16; static Name nameComment = Name.create("--"); static Name nameCDATA = Name.create("[CDATA["); static Name namePCDATA = Name.create("PCDATA"); static Name nameINCLUDE = Name.create("[INCLUDE["); static Name nameIGNORE = Name.create("[IGNORE["); static Name nameVERSION = Name.create("VERSION"); static Name nameENCODING = Name.create("ENCODING"); static Name nameDOCTYPE = Name.create("DOCTYPE"); static Name nameXML = Name.create("XML"); static Name nameRMD = Name.create("RMD"); static Name nameNONE = Name.create("NONE"); static Name nameINTERNAL = Name.create("INTERNAL"); static Name nameALL = Name.create("ALL"); static Name nameURL = Name.create("URL"); static Name namePUBLICID = Name.create("PUBLICID"); static Name nameNAME = Name.create("NAME"); static Name nameXMLSpace = Name.create("XML-SPACE"); static Name nameXMLAS = QualifiedName.create(Name.create("AS"), Name.create("XML")); static Name nameXMLHREF = QualifiedName.create(Name.create("HREF"), Name.create("XML")); static Name nameXMLNameSpace = QualifiedName.create(Name.create("NAMESPACE"), Name.create("XML")); static final boolean isWhiteSpaceChar(char var0) { if (var0 < 256) { return (chartype[var0] & 1) != 0; } else if (jdk11) { return Character.isWhitespace(var0); } else { return Character.isSpace(var0) || var0 == '\r'; } } static final boolean isNameSpaceSeparatorChar(char var0) { return var0 == ':'; } final String scanUrl() throws ParseException { this.parseToken(39, "Url"); this.scanString(this.quote, 65535, 65535, 65535); return this.text; } public final void parse(URL var1, ElementFactory var2, DTD var3, Element var4) throws ParseException { this.dtd = var3; this.root = var4; this.setURL(var1); this.setFactory(var2); this.parseDocument(); } public final void parse(InputStream var1, ElementFactory var2, DTD var3, Element var4) throws ParseException { this.dtd = var3; this.url = null; this.root = var4; this.setInputStream(var1); this.setFactory(var2); this.parseDocument(); } final ElementDecl createElementDecl(Vector var1) throws ParseException { if (this.token != -4) { this.error("Expected " + this.tokenString(-4) + " instead of " + this.tokenString(this.token)); } if (this.dtd.findElementDecl(this.name) != null) { this.error("Element '" + this.name + "' already declared."); } ElementDecl var2 = new ElementDecl(this.name); this.dtd.addElementDecl(var2); var1.addElement(var2); return var2; } final void parseAttributes(Element var1) throws ParseException { Hashtable var2 = new Hashtable(); while(this.nextToken() == -4) { Name var3 = this.name; if (var2.contains(this.name)) { this.error("An attribute cannot appear more than once in the same start tag"); } var2.put(this.name, this.name); this.parseToken(61, "="); if (this.current.ed != null) { this.current.ed.parseAttribute(var1, this.name, this); } else { this.parseToken(39, "string"); this.scanString(this.quote, 38, 38, 60); var1.setAttribute(var3, this.text); } if (this.isXMLSpaceAtt(var3)) { Object var4 = var1.getAttribute(var3); if (var4 != null) { String var5 = null; if (var4 instanceof String) { var5 = (String)var4; } else if (var4 instanceof QualifiedName) { var5 = ((QualifiedName)var4).getName().toString(); } else if (var4 instanceof Name) { var5 = var4.toString(); } if (var5 != null && var5.equalsIgnoreCase("preserve")) { this.current.preserveWS = true; } else if (var5 != null && var5.equalsIgnoreCase("default")) { this.current.preserveWS = false; } else { this.error("Invalid value '" + var5 + "' for XML-SPACE attribute."); } } } } if (this.current.ed != null) { this.current.ed.checkAttributes(var1, this); } } final Element parseNameSpaceDecl(boolean var1, boolean var2) throws ParseException { Element var3 = this.factory.createElement(10, this.name); this.current.e.addChild(var3, (Element)null); this.push(var3); this.parseAttributes(var3); this.pop(); if (var2 && this.token != -7) { this.error("Expected PI tag end '?>' instead of " + this.tokenString(this.token)); } else if (!var2 && this.token != -10) { this.error("Expected " + this.tokenString(-10) + " instead of " + this.tokenString(this.token)); } Object var4 = var3.getAttribute(nameXMLAS); Object var5 = var3.getAttribute(nameXMLHREF); if (var4 == null || var5 == null) { this.error("Missing attribute 'AS' or 'HREF'"); } Name var6 = Name.create(var4.toString().toUpperCase()); Name var7 = Name.create(var5.toString().toUpperCase()); if (DTD.isReservedNameSpace(var6)) { this.error(var6.toString() + " is a reserved name space."); } this.addNameSpace(var6, var7, var1); if (this.rmd == RMD_ALL) { try { if (this.dtd.findLoadedNameSpace(var7) == null) { this.dtd.addLoadedNameSpace(var7); this.loadExternalDTD(var7.toString(), var7); } } catch (IOException var8) { this.error("Couldn't find name space '" + var7.toString() + "'"); } } return var3; } final void parseDocument() throws ParseException { this.expandNamedEntities = true; this.rmd = RMD_NONE; this.internalSubset = false; this.current = new Context(this.root, false, (Name)null, (Hashtable)null); this.parseProlog(); this.parseRootElement(); if (this.lookahead != -1) { this.nextToken(); this.tryMisc(); if (this.lookahead != -1) { this.error("Expected comments, PI, or EOF instead of " + this.tokenString(this.token)); } } this.dtd.checkIDs(); } private final boolean isXMLSpaceAtt(Name var1) { if (var1 == nameXMLSpace) { return true; } else if (var1 instanceof QualifiedName) { return ((QualifiedName)var1).getName() == nameXMLSpace; } else { return false; } } private final void setInputStream(InputStream var1) throws ParseException { this.xmlIn = new XMLInputStream(var1); this.reader = new EntityReader(this.xmlIn, 1, 1, (EntityReader)null, this); this.advance(); } public final void report(ParseException var1, OutputStream var2) { PrintStream var3 = new PrintStream(var2); String var4 = null; if (var1.owner instanceof Parser) { URL var5 = ((Parser)var1.owner).url; if (var5 != null) { var4 = var5.toString(); } } else if (var1.owner instanceof Entity) { var4 = "Parsing <" + ((Entity)var1.owner).name + ">"; } else { var4 = "Parsing"; } var3.println("Error: " + var4 + "(" + var1.line + "," + var1.column + ")"); var3.print("Context: "); Enumeration var6 = this.contexts.elements(); while(var6.hasMoreElements()) { var3.print(" - <" + ((Context)var6.nextElement()).e.getTagName() + ">"); } var3.print(" - <"); if (this.current != null) { var3.print(this.current.e.getTagName()); } var3.print(">"); var3.println(""); ((Throwable)var1).printStackTrace(var3); } final int parseNames(Vector var1, int var2, StringBuffer var3) throws ParseException { int var4 = 0; this.bufAt = 0; if (var3 != null) { ++this.nameappend; } while(this.nextToken() == -4) { if (var4 > 0) { this.buf[this.bufAt++] = ' '; } var1.addElement(this.name); ++var4; if (var2 != 0 && this.nextToken() != 124) { break; } } if (var3 != null) { var3.append(this.buf, 0, this.bufAt); this.nameappend += -1; } return var4; } final void advance() throws ParseException { for(this.lookahead = this.reader.read(); this.lookahead == -1 && this.reader.owner != this; this.lookahead = this.reader.read()) { if (((Entity)this.reader.owner).url != null && this.charAt != 0) { this.text = new String(this.chars, 0, this.charAt); this.addPCDATA(this.text); } this.reader = this.reader.prev; this.pop(); if (!this.inTag) { this.charAt = 0; } } } private void addNameSpace(Name var1, Name var2, boolean var3) throws ParseException { if (var1 instanceof QualifiedName) { if (((QualifiedName)var1).getNameSpace() != this.current.defaultNameSpace) { this.error("Name space syntax error."); } var1 = ((QualifiedName)var1).getName(); } if (DTD.isReservedNameSpace(var1)) { this.error(var1.toString() + " is a reserved name space."); } if (var3) { Name var4 = this.dtd.findShortNameSpace(var2); if (var4 == null) { var4 = this.dtd.findLongNameSpace(var1); if (var4 != null) { this.error("Short reference '" + var1.toString() + "' is used by name space '" + var4.toString() + "'"); } this.dtd.addNameSpace(var1, var2); return; } if (var4 != var1) { this.error("Cannot give two short references '" + var4.toString() + "' and '" + var1.toString() + "' to the same name space: '" + var2.toString() + "'"); return; } } else { this.current.addNameSpace(var1, var2); } } final boolean match(String var1) throws ParseException { int var2 = 0; int var3 = var1.length(); while(var3 > 0 && this.lookahead == var1.charAt(var2++)) { --var3; this.advance(); } return var3 == 0; } public final XMLOutputStream createOutputStream(OutputStream var1) { return this.xmlIn != null ? this.xmlIn.createOutputStream(var1) : null; } final Element addPCDATA(String var1) throws ParseException { if (var1.length() > 0) { Element var2 = this.factory.createElement(1, (Name)null); var2.setText(var1); if (this.current.ed != null) { this.current.ed.checkContent(this.current, var2, this); } this.current.e.addChild(var2, (Element)null); return var2; } else { return null; } } final Element finishPI() throws ParseException { Element var1 = this.factory.createElement(5, this.name); this.current.e.addChild(var1, (Element)null); this.charAt = 0; boolean var2 = false; while(this.lookahead != -1) { this.chars[this.charAt++] = (char)this.lookahead; if (this.lookahead == 63) { this.advance(); if (this.lookahead == 62) { this.charAt += -1; var2 = true; } } else { this.advance(); } if (this.charAt == this.chars.length || var2) { Element var3 = this.factory.createElement(6, (Name)null); var1.addChild(var3, (Element)null); var3.setText(new String(this.chars, 0, this.charAt)); this.charAt = 0; if (var2) { break; } } } this.parseToken(62, "PI end"); return var1; } public Parser() { String var1 = System.getProperty("java.version"); jdk11 = var1.equals("1.1"); } static final boolean isNameChar(char var0) { if (var0 < 256) { return (chartype[var0] & 14) != 0; } else { return Character.isLetter(var0) || Character.isDigit(var0) || var0 == '-' || var0 == '_' || var0 == '.'; } } final char toUpperCase(char var1) { if (this.nouppercase != 0) { return var1; } else { return var1 < 256 ? charupper[var1] : Character.toUpperCase(var1); } } final void parseXMLDecl() throws ParseException { if (this.token == -6) { this.parseToken(-4, "XML"); if (this.name != nameXML) { if (this.name == nameXMLNameSpace) { this.parseNameSpaceDecl(true, true); } else { this.finishPI(); } this.nextToken(); return; } this.rmd = RMD_ALL; Element var1 = this.factory.createElement(5, this.name); this.current.e.addChild(var1, (Element)null); this.push(var1); ElementDecl var2 = this.current.ed; this.current.ed = XMLDecl; this.nextToken(); if (this.token != -4) { this.error("Expected " + nameVERSION + " tag instead of " + this.tokenString(this.token)); } else if (this.name != nameVERSION) { this.error("Expected " + nameVERSION + " tag instead of " + this.name.toString()); } this.parseToken(61, "="); this.parseToken(39, "string"); this.scanString(this.quote, 65535, 65535, 65535); if (!this.text.equals("1.0")) { this.error("Expected version 1.0 instead of " + this.text); } var1.setAttribute(nameVERSION, this.text); this.nextToken(); String var3 = null; if (this.token == -4 && this.name == nameENCODING) { this.parseToken(61, "="); this.parseToken(39, "string"); this.scanString(this.quote, 65535, 65535, 65535); var1.setAttribute(nameENCODING, this.text); var3 = this.text; this.nextToken(); } if (this.token == -4 && this.name == nameRMD) { this.parseToken(61, "="); this.parseToken(39, "string"); this.scanString(this.quote, 65535, 65535, 65535); Name var4 = Name.create(this.text.toUpperCase()); if (var4 == nameNONE) { this.rmd = RMD_NONE; } else if (var4 == nameINTERNAL) { this.rmd = RMD_INTERNAL; } else if (var4 == nameALL) { this.rmd = RMD_ALL; } else { this.error("Expected NONE, INTERNAL, or ALL instead of " + var4); } var1.setAttribute(nameRMD, var4.toString()); this.nextToken(); } if (var3 != null) { try { this.xmlIn.setEncoding(var3); } catch (IOException var5) { this.error("Unsupported XML encoding: \"" + var3 + "\""); } } if (this.token != -7) { this.error("Expected " + this.tokenString(-7) + " instead of " + this.tokenString(this.token)); } this.current.ed = var2; this.nextToken(); this.pop(); } } final void parseProlog() throws ParseException { if (this.lookahead != -1) { this.nextToken(); this.parseXMLDecl(); } this.tryMisc(); this.tryDocTypeDecl(); this.tryMisc(); } final ElementDecl findElementDecl(Vector var1) throws ParseException { if (this.token != -4) { this.error("Expected " + this.tokenString(-4) + " instead of " + this.tokenString(this.token)); } ElementDecl var2 = this.dtd.findElementDecl(this.name); if (var2 == null) { this.error("Missing Element declaration '" + this.name + "'"); } var1.addElement(var2); return var2; } final void parseAttListDecl() throws ParseException { Vector var1 = new Vector(); this.nextToken(); ElementDecl var2 = this.findElementDecl(var1); this.push(var2); var2.parseAttList(this); this.checkToken(62, ">"); this.pop(); } final void scanCharRef() throws ParseException { int var1 = 0; if (this.lookahead == 35) { this.advance(); if (this.lookahead != 120 && this.lookahead != 88) { while(this.lookahead >= 48 && this.lookahead <= 57) { var1 = var1 * 10 + this.lookahead - 48; this.advance(); } } else { this.advance(); int var2 = 0; do { if (this.lookahead >= 48 && this.lookahead <= 57) { var1 = var1 * 16 + this.lookahead - 48; } else if (this.lookahead >= 97 && this.lookahead <= 102) { var1 = var1 * 16 + this.lookahead - 97 + 10; } else if (this.lookahead >= 65 && this.lookahead <= 70) { var1 = var1 * 16 + this.lookahead - 65 + 10; } else { this.error("Bad character reference syntax. Expecting x;"); } this.advance(); ++var2; } while(var2 < 4); } } if (this.lookahead != 59) { this.error("Bad character reference syntax. Expecting x;"); } else { this.chars[this.charAt++] = (char)var1; } this.advance(); } final void parseCDATA() throws ParseException { this.charAt = 0; boolean var1 = false; while(this.lookahead != -1) { this.chars[this.charAt++] = (char)this.lookahead; if (this.lookahead == 93) { this.advance(); if (this.lookahead == 93) { this.advance(); if (this.lookahead == 62) { this.charAt += -1; var1 = true; } else { this.reader.push((char)this.lookahead); this.reader.push((char)this.lookahead); this.lookahead = 93; } } } else { this.advance(); } if (this.charAt == this.chars.length || var1) { Element var2 = this.factory.createElement(6, nameCDATA); this.current.e.addChild(var2, (Element)null); var2.setText(new String(this.chars, 0, this.charAt)); this.charAt = 0; if (var1) { break; } } } this.parseToken(62, "CDATA end"); } private final void setFactory(ElementFactory var1) { this.factory = var1; } final void scanText(int var1, int var2, boolean var3) throws ParseException { this.charAt = 0; boolean var4 = false; while(this.lookahead != -1 && this.lookahead != 60 && this.lookahead != this.breakText && this.charAt < this.chars.length) { if (this.lookahead == var2) { if (var4) { this.chars[this.charAt++] = ' '; var4 = false; } this.advance(); if (this.lookahead == 35) { this.scanCharRef(); } else if (isNameChar((char)this.lookahead)) { this.scanEntityRef(false); } else { this.chars[this.charAt++] = (char)var2; } } else if (this.lookahead == var1) { if (var4) { this.chars[this.charAt++] = ' '; var4 = false; } this.advance(); if (isNameChar((char)this.lookahead)) { this.scanEntityRef(var1 == 37); } else { this.chars[this.charAt++] = (char)var2; } } else { if (var3 && isWhiteSpaceChar((char)this.lookahead)) { var4 = true; } else { if (var4) { this.chars[this.charAt++] = ' '; var4 = false; } this.chars[this.charAt++] = (char)this.lookahead; } this.advance(); } } this.text = new String(this.chars, 0, this.charAt); this.token = -5; } final void pop() { this.current = (Context)this.contexts.pop(); } final void tryMisc() throws ParseException { while(true) { switch (this.token) { case -11: this.parseComment(); break; case -10: case -9: case -8: case -7: default: return; case -6: this.parsePI(true); } if (this.lookahead == -1) { this.token = -1; return; } this.nextToken(); } } final int nextToken() throws ParseException { if (this.inTag || !this.current.preserveWS) { while(isWhiteSpaceChar((char)this.lookahead)) { this.advance(); } } if (this.inTag) { switch (this.lookahead) { case -1: this.token = -1; break; case 34: case 39: this.quote = (char)this.lookahead; this.token = 39; this.advance(); break; case 35: case 40: case 41: case 42: case 43: case 44: case 61: case 91: case 93: case 124: this.token = this.lookahead; this.advance(); break; case 37: this.advance(); if (this.substitution > 0 && isNameChar((char)this.lookahead)) { this.scanEntityRef(true); return this.nextToken(); } this.token = 37; break; case 47: this.advance(); if (this.lookahead == 62) { this.token = -10; this.inTag = false; this.advance(); } break; case 62: this.token = 62; this.inTag = false; this.advance(); break; case 63: this.advance(); if (this.current.e.getType() == 9) { this.token = 63; } else if (this.lookahead == 62) { this.token = -7; this.inTag = false; this.advance(); } else { this.token = 63; } break; default: if (!isNameChar((char)this.lookahead) && !isNameSpaceSeparatorChar((char)this.lookahead)) { this.error("Unexpected token '" + (char)this.lookahead + "' inside tag <" + this.current.e.getTagName() + ">"); } else { this.scanName("name"); if (this.keyword > 0) { if (this.name instanceof QualifiedName) { this.token = this.lookup(((QualifiedName)this.name).getName()); } else { this.token = this.lookup(this.name); } } } } } else { switch (this.lookahead) { case -1: this.token = -1; break; case 60: this.inTag = true; this.advance(); switch (this.lookahead) { case 33: this.token = -8; this.advance(); if (this.lookahead == 45) { this.advance(); if (this.lookahead == 45) { this.token = -11; this.advance(); } else { this.error("Bad comment start syntax. Expected '<!--'"); } return this.token; } else { if (this.lookahead == 91) { if (this.match(nameCDATA.toString())) { this.token = -14; } else { this.error("Bad start tag: <!["); } return this.token; } return this.token; } case 47: this.token = -9; this.advance(); return this.token; case 63: this.token = -6; this.advance(); return this.token; default: this.token = 60; return this.token; } case 93: if (this.breakText == this.lookahead) { this.token = 93; this.advance(); break; } default: this.token = -5; } } return this.token; } final void parseInternalSubset() throws ParseException { ++this.substitution; while(true) { switch (this.nextToken()) { case -37: case -35: this.error("Conditional sections are not processed !"); break; case -11: this.parseComment(); break; case -8: this.parseKeyword(0, "ENTITY|..."); switch (this.token) { case -28: this.parseNotation(); continue; case -24: this.parseEntityDecl(); continue; case -19: this.parseAttListDecl(); continue; case -15: this.parseElementDecl(); continue; default: this.error("Unknown DTD keyword " + this.name); continue; } case -6: this.parsePI(true); break; case -5: if (this.lookahead != 37) { this.substitution += -1; return; } this.advance(); this.scanEntityRef(true); break; default: this.substitution += -1; return; } } } final String tokenString(int var1) { return this.tokenString(var1, (String)null); } final String tokenString(int var1, String var2) { switch (var1) { case -100: return "PUBLIC"; case -38: return "NAMESPACE"; case -37: return "IGNORETAGSTART"; case -36: return "IGNORE"; case -35: return "INCLUDETAGSTART"; case -34: return "INCLUDE"; case -33: return "NDATA"; case -32: return "IMPLIED"; case -31: return "REQUIRED"; case -30: return "FIXED"; case -29: return "ENUMERATION"; case -28: return "NOTATION"; case -27: return "NMTOKENS"; case -26: return "NMTOKEN"; case -25: return "ENTITIES"; case -24: return "ENTITY"; case -23: return "IDREFS"; case -22: return "IDREF"; case -21: return "ID"; case -20: return "CDATA"; case -19: return "ATTLIST"; case -18: return "PCDATA"; case -17: return "ANY"; case -16: return "EMPTY"; case -15: return "ELEMENT"; case -14: return "<![CDATA"; case -13: return "SYSTEM"; case -12: return "DOCTYPE"; case -11: return "<!--"; case -10: return "/>"; case -9: return "</"; case -8: return "<!"; case -7: return "?>"; case -6: return "<?"; case -5: return "TEXT '" + this.text + "'"; case -4: if (var2 != null) { return var2; } return "NAME '" + this.name + "'"; case -3: return "word character"; case -2: return "whitespace"; case -1: return "EOF"; case 0: return "invalidtoken"; case 33: return "!"; case 35: return "#"; case 37: return "percent(%)"; case 38: return "&"; case 39: return "quote(' or \")"; case 40: return "("; case 41: return ")"; case 42: return "*"; case 43: return "+"; case 44: return ","; case 45: return "-"; case 47: return "/"; case 60: return "start tag(<)"; case 61: return "="; case 62: return "tag end(>)"; case 63: return "question mark(?)"; case 91: return "["; case 93: return "]"; case 124: return "|"; default: return var2; } } final void loadExternalDTD(String var1, Name var2) throws ParseException { try { URL var3 = new URL(this.url, var1); Parser var4 = new Parser(); var4.dtd = this.dtd; var4.setURL(var3); var4.setFactory(this.factory); Element var5 = this.factory.createElement(0, QualifiedName.create(nameDOCTYPE, nameXML)); var4.current = new Context(var5, false, var2, this.current.spaceTable); var4.parseInternalSubset(); } catch (IOException var6) { this.error("Couldn't find external DTD '" + var1 + "'"); } } final Element parseComment() throws ParseException { Element var1 = this.factory.createElement(2, nameComment); this.current.e.addChild(var1, (Element)null); this.charAt = 0; boolean var2 = false; while(this.lookahead != -1) { this.chars[this.charAt++] = (char)this.lookahead; if (this.lookahead == 45) { this.advance(); if (this.lookahead == 45) { this.advance(); if (this.lookahead == 62) { this.charAt += -1; var2 = true; } else { this.reader.push((char)this.lookahead); this.lookahead = 45; } } } else { this.advance(); } if (this.charAt == this.chars.length || var2) { Element var3 = this.factory.createElement(6, (Name)null); var1.addChild(var3, (Element)null); var3.setText(new String(this.chars, 0, this.charAt)); this.charAt = 0; if (var2) { break; } } } this.parseToken(62, "comment end"); return var1; } final void parseKeyword(int var1, String var2) throws ParseException { ++this.keyword; if (var1 == 0) { this.nextToken(); } else { this.parseToken(var1, var2); } this.keyword += -1; } private void reportMismatch(int var1) throws ParseException { String var2 = null; if (this.current.ed == null) { this.error("Content mismatch. Stoped at state " + var1); } Vector var3 = this.current.ed.expectedElements(var1); int var4 = 0; Enumeration var5 = var3.elements(); while(var5.hasMoreElements()) { ++var4; if (var2 == null) { var2 = new String("'" + ((Name)var5.nextElement()).toString() + "'"); } else if (var4 > 1 && var4 == var3.size()) { var2 = new String(var2 + ", or '" + ((Name)var5.nextElement()).toString() + "'"); } else { var2 = new String(var2 + ", '" + ((Name)var5.nextElement()).toString() + "'"); } } this.error("Content mismatch. Expected " + var2); } final int scanSimpleName(int var1, String var2) throws ParseException { boolean var3; if (this.lookahead < 256) { var3 = (chartype[this.lookahead] & 20) != 0; } else { var3 = Character.isLetter((char)this.lookahead) || this.lookahead == 95; } if (!var3 && (this.nametoken <= 0 || !Character.isDigit((char)this.lookahead))) { this.error("Expecting " + var2 + " instead of '" + (char)this.lookahead + "'"); } this.buf[var1++] = this.toUpperCase((char)this.lookahead); this.advance(); while(isNameChar((char)this.lookahead)) { this.buf[var1++] = this.toUpperCase((char)this.lookahead); this.advance(); } return var1; } final void parseEntityDecl() throws ParseException { boolean var1 = false; ++this.nouppercase; if (this.nextToken() == 37) { var1 = true; this.parseToken(-4, "Entity name"); } else if (this.token != -4) { this.error("Expected entity name instead of " + this.tokenString(this.token)); } this.nouppercase += -1; Entity var2 = this.dtd.findEntity(this.name); if (var2 != null) { System.err.println("Warning: Entity <" + this.name + "> already defined, using the first definition."); } else { var2 = new Entity(this.name, var1); this.dtd.addEntity(var2); if (this.internalSubset) { this.current.e.addChild(var2, (Element)null); } } this.push(var2); this.parseKeyword(0, "String or SYSTEM"); if (this.token == -100) { this.parseKeyword(0, "String"); if (this.token == 39) { this.expandNamedEntities = false; this.scanString(this.quote, 65535, 65535, 65535); this.expandNamedEntities = true; var2.pubid = this.text; this.token = -13; } else { this.error("Expected " + this.tokenString(39) + " instead of " + this.tokenString(this.token)); } } switch (this.token) { case -13: var2.setURL(this.scanUrl()); this.parseKeyword(0, "ndata"); if (this.token == -33) { this.parseToken(-4, "ndata name"); Notation var5 = this.dtd.findNotation(this.name); if (var5 == null) { this.error("Notation: " + this.name + " has not been declared yet"); } var2.setNDATA(this.name); this.nextToken(); } break; case 39: int var3 = this.reader.line; int var4 = this.reader.column; this.expandNamedEntities = false; this.scanString(this.quote, 37, 38, 65535); this.expandNamedEntities = true; var2.setText(this.text); var2.setPosition(var3, var4); this.nextToken(); break; default: this.error("Expected " + this.tokenString(39) + " or " + this.tokenString(-13) + " instead of " + this.tokenString(this.token)); } this.checkToken(62, ">"); this.pop(); } final void push(Element var1) { this.contexts.push(this.current); this.current = new Context(var1, this.current.preserveWS, this.current.nameSpace, this.current.spaceTable); } final void checkToken(int var1, String var2) throws ParseException { if (this.token != var1) { this.error("Expected " + this.tokenString(var1, var2) + " instead of " + this.tokenString(this.token)); } } final void scanString(int var1, int var2, int var3, int var4) throws ParseException { this.charAt = 0; while(this.lookahead != -1 && this.lookahead != var1) { if (this.lookahead == var4) { this.error("Illegal character in string " + (char)this.lookahead); } else if (this.lookahead == var3) { this.advance(); if (this.lookahead == 35) { this.scanCharRef(); } else if (isNameChar((char)this.lookahead)) { if (this.expandNamedEntities) { this.scanEntityRef(false); } else { this.chars[this.charAt++] = (char)var3; } } else { this.chars[this.charAt++] = (char)this.lookahead; } } else if (this.lookahead == var2) { this.advance(); if (isNameChar((char)this.lookahead)) { if (this.expandNamedEntities) { this.scanEntityRef(var2 == 37); } else { this.chars[this.charAt++] = (char)var2; } } else { this.chars[this.charAt++] = (char)this.lookahead; } } else { this.chars[this.charAt++] = (char)this.lookahead; this.advance(); } } if (this.lookahead == var1) { this.advance(); } else { this.error("Unterminated string"); } this.text = new String(this.chars, 0, this.charAt); } static { XMLDecl = new ElementDecl(nameXML); XMLDecl.addAttDef(new AttDef(nameVERSION, 0, "1.0", 3)); XMLDecl.addAttDef(new AttDef(nameENCODING, 0, "UTF-8", 2)); Vector var0 = new Vector(3); var0.addElement(nameNONE); var0.addElement(nameINTERNAL); var0.addElement(nameALL); XMLDecl.addAttDef(new AttDef(nameRMD, 9, (Name)var0.elementAt(0), 2, var0)); tokens = new Hashtable(); tokens.put(Name.create("DOCTYPE"), new Integer(-12)); tokens.put(Name.create("SYSTEM"), new Integer(-13)); tokens.put(Name.create("PUBLIC"), new Integer(-100)); tokens.put(Name.create("ENTITY"), new Integer(-24)); tokens.put(Name.create("ELEMENT"), new Integer(-15)); tokens.put(Name.create("EMPTY"), new Integer(-16)); tokens.put(Name.create("ANY"), new Integer(-17)); tokens.put(Name.create("PCDATA"), new Integer(-18)); tokens.put(Name.create("ATTLIST"), new Integer(-19)); tokens.put(Name.create("CDATA"), new Integer(-20)); tokens.put(Name.create("ID"), new Integer(-21)); tokens.put(Name.create("IDREF"), new Integer(-22)); tokens.put(Name.create("IDREFS"), new Integer(-23)); tokens.put(Name.create("ENTITY"), new Integer(-24)); tokens.put(Name.create("ENTITIES"), new Integer(-25)); tokens.put(Name.create("NMTOKEN"), new Integer(-26)); tokens.put(Name.create("NMTOKENS"), new Integer(-27)); tokens.put(Name.create("FIXED"), new Integer(-30)); tokens.put(Name.create("REQUIRED"), new Integer(-31)); tokens.put(Name.create("IMPLIED"), new Integer(-32)); tokens.put(Name.create("NDATA"), new Integer(-33)); tokens.put(Name.create("NOTATION"), new Integer(-28)); tokens.put(Name.create("INCLUDE"), new Integer(-34)); tokens.put(Name.create("IGNORE"), new Integer(-36)); tokens.put(QualifiedName.create(Name.create("NAMESPACE"), Name.create("XML")), new Integer(-38)); int var1 = 0; do { char var2 = (char)var1; chartype[var1] = 0; if (jdk11 && Character.isWhitespace(var2) || Character.isSpace(var2) || var2 == '\r') { chartype[var1] = 1; } if (Character.isLetter(var2)) { int[] var10000 = chartype; var10000[var1] |= 4; } if (Character.isDigit(var2)) { int[] var3 = chartype; var3[var1] |= 2; } charupper[var1] = Character.toUpperCase(var2); ++var1; } while(var1 < 256); int[] var4 = chartype; var4[46] |= 8; var4 = chartype; var4[45] |= 8; var4 = chartype; var4[95] |= 24; var4 = chartype; var4[183] |= 8; } final void scanEntityRef(boolean var1) throws ParseException { ++this.nouppercase; ++this.inEntityRef; this.scanName("entity ref"); this.inEntityRef += -1; this.nouppercase += -1; if (this.lookahead != 59) { this.error("Entity reference syntax error " + this.name); } Entity var2 = this.dtd.findEntity(this.name); if (var2 == null) { this.error("Missing entity '" + this.name + "' or RMD should not be 'NONE'."); } if (var1 != var2.par) { if (var1) { this.error("Entity '" + this.name + "' is not a parameter entity."); } else { this.error("Entity '" + this.name + "' is a parameter entity."); } } if (var1) { if (!this.inTag) { Element var3 = this.factory.createElement(11, this.name); this.current.e.addChild(var3, (Element)null); } if (var2.getURL() == null) { this.push(var2); this.reader = var2.getReader(this.reader); } else { if (var2.ndata != null) { this.error("Binary parameter entity " + this.name.toString() + "cannot be used in DTD"); } if (this.rmd == RMD_ALL) { this.loadExternalDTD(var2.getURL(), this.current.defaultNameSpace); } } } else if (var2.getLength() == -1) { this.lookahead = this.chars[this.charAt++] = var2.getChar(0); } else { if (!this.inTag) { this.text = new String(this.chars, 0, this.charAt); this.addPCDATA(this.text); this.charAt = 0; Element var5 = this.factory.createElement(11, this.name); this.current.e.addChild(var5, (Element)null); } if (!var2.parsed) { if (var2.getURL() == null) { var2.parsed = true; this.push(var2); this.reader = var2.getReader(this.reader); } else if (var2.ndata == null && this.rmd == RMD_ALL) { var2.parsed = true; this.push(var2); try { URL var6 = new URL(this.url, var2.getURL()); this.reader = new EntityReader(var6.openStream(), this.reader.line, this.reader.column, this.reader, var2); } catch (Exception var4) { this.error("Cannot load external text entity: " + this.name.toString()); } } } } this.advance(); } final Element parsePI(boolean var1) throws ParseException { this.scanName("PI name"); if (this.name == nameXML) { this.error("An XML declaration can only appear in the beginning of the document."); } else if (this.name == nameXMLNameSpace) { return this.parseNameSpaceDecl(var1, true); } return this.finishPI(); } final Element parseText(int var1, int var2) throws ParseException { this.scanText(var1, var2, !this.current.preserveWS); return this.addPCDATA(this.text); } final void tryDocTypeDecl() throws ParseException { if (this.token == -8) { this.parseKeyword(-12, "Doctype"); Element var1 = this.factory.createElement(4, nameDOCTYPE); this.current.e.addChild(var1, (Element)null); this.parseToken(-4, "Doctype name"); this.docType = this.name; var1.setAttribute(nameNAME, this.docType.toString()); this.parseKeyword(0, "ExternalID"); switch (this.token) { case -100: this.parseKeyword(0, "String"); if (this.token == 39) { this.expandNamedEntities = false; this.scanString(this.quote, 65535, 65535, 65535); this.expandNamedEntities = true; var1.setAttribute(namePUBLICID, this.text); } else { this.error("Expected " + this.tokenString(39) + " instead of " + this.tokenString(this.token)); } var1.setAttribute(nameURL, this.scanUrl()); this.nextToken(); break; case -13: var1.setAttribute(nameURL, this.scanUrl()); this.nextToken(); } if (this.token == 91) { this.inTag = false; this.breakText = 93; this.internalSubset = true; this.push(var1); this.parseInternalSubset(); if (this.token != 93) { this.error("Expected " + this.tokenString(93)); } if (this.rmd == RMD_NONE) { this.dtd.clear(); } this.inTag = true; this.internalSubset = false; this.breakText = 0; this.pop(); this.nextToken(); } Object var2 = var1.getAttribute(nameURL); if (var2 != null && this.rmd == RMD_ALL) { this.loadExternalDTD(var2.toString(), (Name)null); } if (this.token != 62) { this.error("Expected " + this.tokenString(62) + " instead of " + this.tokenString(this.token)); } if (this.lookahead != -1) { this.nextToken(); } } } final void parseElementDecl() throws ParseException { Vector var1 = new Vector(); this.nextToken(); ElementDecl var2 = this.createElementDecl(var1); if (this.internalSubset) { this.current.e.addChild(var2, (Element)null); } this.push(var2); var2.parseModel(this); this.checkToken(62, ">"); this.pop(); } final void parseNotation() throws ParseException { this.parseToken(-4, "Notation name"); Notation var1 = this.dtd.findNotation(this.name); if (var1 != null) { this.error("Notation already declared " + this.name); } var1 = new Notation(this.name); this.dtd.addNotation(var1); if (this.internalSubset) { this.current.e.addChild(var1, (Element)null); } this.push(var1); this.parseKeyword(0, "SYSTEM or PUBLIC"); if (this.token != -13 && this.token != -100) { this.error("Expected " + this.tokenString(-13) + " or " + this.tokenString(-100) + " instead of " + this.tokenString(this.token)); } var1.type = this.token; if (var1.type == -100) { this.parseKeyword(0, "String"); if (this.token == 39) { this.expandNamedEntities = false; this.scanString(this.quote, 65535, 65535, 65535); this.expandNamedEntities = true; var1.pubid = this.text; } else { this.error("Expected " + this.tokenString(39) + " instead of " + this.tokenString(this.token)); } } var1.setURL(this.scanUrl()); this.parseToken(62, ">"); this.pop(); } private final void setURL(URL var1) throws ParseException { this.url = var1; InputStream var2; try { var2 = var1.openStream(); } catch (IOException var5) { throw new ParseException("Error opening input stream for \"" + this.url.toString() + "\": " + ((Throwable)var5).toString()); } this.setInputStream(new BufferedInputStream(var2)); } final int lookup(Name var1) { Object var2 = tokens.get(var1); if (var2 != null) { this.token = (Integer)var2; } else { this.token = -4; } return this.token; } final void parseToken(int var1, String var2) throws ParseException { if (this.nextToken() != var1) { this.error("Expected " + this.tokenString(var1, var2) + " instead of " + this.tokenString(this.token)); } } final void parseElement() throws ParseException { boolean var1 = false; while(true) { if (var1 && this.token != -9) { this.error("Expected " + this.tokenString(-9) + " instead of " + this.tokenString(this.token)); } var1 = false; switch (this.token) { case -14: this.parseCDATA(); break; case -11: this.parseComment(); break; case -9: if (!this.current.matched) { this.reportMismatch(this.current.state); } if (this.lookahead != 62) { if (this.lookahead == 47) { this.advance(); } else { this.scanName("element close tag"); if (this.name != this.current.e.getTagName()) { this.error("Close tag " + this.name + " does not match start tag " + this.current.e.getTagName()); } } } this.parseToken(62, ">"); this.factory.parsed(this.current.e); this.pop(); break; case -6: this.parsePI(false); break; case -5: this.parseText(38, 38); break; case -1: if (this.contexts.size() == 1) { this.error("Expected the end of root element instead of end of file."); break; } default: this.error("Bad token in element content: " + this.tokenString(this.token)); break; case 60: this.scanName("element tag"); if (this.lookup(this.name) == -38) { this.parseNameSpaceDecl(false, false); } else { ElementDecl var2 = this.dtd.findElementDecl(this.name); Element var3 = this.factory.createElement(0, this.name); if (this.current.ed != null) { this.current.ed.checkContent(this.current, var3, this); } this.current.e.addChild(var3, (Element)null); this.push(var3); if (var2 != null) { if (var2.getContent().type == 1) { var1 = true; } var2.initContent(this.current, this); } else { this.current.matched = true; } this.parseAttributes(var3); if (this.token == -10) { if (var2 != null && !var2.acceptEmpty()) { this.reportMismatch(0); } this.factory.parsed(this.current.e); this.pop(); var1 = false; } else if (this.token != 62) { this.error("Expected " + this.tokenString(62) + " instead of " + this.tokenString(this.token)); } else if (this.lookahead != 60 && var1) { this.error("Expected " + this.tokenString(62) + " instead of '" + (char)this.lookahead + "'"); } } } if (this.contexts.size() == 0) { return; } this.nextToken(); } } final void parseRootElement() throws ParseException { if (this.token != 60) { this.error("Start of root element expected instead of " + this.tokenString(this.token)); } this.scanName("element tag"); if (this.docType != null) { Name var1 = this.name; if (this.name instanceof QualifiedName) { var1 = ((QualifiedName)this.name).getName(); } if (var1 != this.docType) { this.error("Root element name must match the DOCTYPE name"); } } if (this.lookup(this.name) == -38) { this.parseNameSpaceDecl(false, false); } else { ElementDecl var4 = this.dtd.findElementDecl(this.name); Element var2 = this.factory.createElement(0, this.name); this.current.e.addChild(var2, (Element)null); this.push(var2); boolean var3 = false; if (var4 != null) { if (var4.getContent().type == 1) { var3 = true; } var4.initContent(this.current, this); } else { this.current.matched = true; } this.parseAttributes(var2); if (this.token == -10) { if (var4 != null && !var4.acceptEmpty()) { this.reportMismatch(0); } var3 = true; } else if (this.token != 62) { if (var2.getAttributes() == EnumWrapper.emptyEnumeration) { this.error("No attribute is declared for element '" + var2.getTagName() + "', expected " + this.tokenString(62)); } this.error("Expected " + this.tokenString(62) + " instead of " + this.tokenString(this.token)); } if (var3) { this.pop(); this.nextToken(); } else { this.nextToken(); this.parseElement(); } } } final void parseContent(Element var1) throws ParseException { while(this.nextToken() != -9) { switch (this.token) { case -14: this.parseCDATA(); break; case -11: this.parseComment(); break; case -8: this.parseElement(); break; case -6: this.parsePI(false); break; case -5: this.parseText(38, 38); break; case 60: this.parseElement(); break; default: this.error("Bad token in element content: " + this.tokenString(this.token)); } } if (!this.current.matched) { this.error("Content mismatch, stopped at state " + this.current.state); } if (this.lookahead != 62) { this.scanName("element close tag"); if (this.name != this.current.e.getTagName()) { this.error("Close tag mismatch: " + this.name + " instead of " + this.current.e.getTagName()); } } this.parseToken(62, ">"); } final void error(String var1) throws ParseException { int var2 = 1; if (this.token == -4) { var2 = this.name.toString().length(); } throw new ParseException(var1, this.reader.line, this.reader.column - 1 - var2, this.reader.owner); } final void scanName(String var1) throws ParseException { Name var2 = null; Name var3 = null; boolean var4 = false; if (this.nameappend == 0) { this.bufAt = 0; } int var5 = this.bufAt; if (!isNameSpaceSeparatorChar((char)this.lookahead)) { this.bufAt = this.scanSimpleName(this.bufAt, var1); var4 = true; } if (this.nametoken == 0 && this.simplename == 0 && isNameSpaceSeparatorChar((char)this.lookahead)) { ++this.bufAt; this.advance(); if (isNameSpaceSeparatorChar((char)this.lookahead)) { ++this.bufAt; this.advance(); if (var4) { var2 = Name.create((new String(this.buf, var5, this.bufAt - var5 - 2)).toUpperCase()); if (DTD.isReservedNameSpace(var2)) { var3 = var2; } else { var3 = this.current.findNameSpace(var2); if (var3 == null) { var3 = this.dtd.findLongNameSpace(var2); if (var3 == null) { this.error("Missing name space '" + var2 + "'"); } } } } var5 = this.bufAt; this.bufAt = this.scanSimpleName(this.bufAt, var1); var2 = Name.create(new String(this.buf, var5, this.bufAt - var5)); } else { this.error("Expecting namespace separator ':' instead of '" + (char)this.lookahead + "'"); } } else { if (this.nametoken == 0 && this.simplename == 0) { var3 = this.current.defaultNameSpace; } var2 = Name.create(new String(this.buf, var5, this.bufAt - var5)); } if (this.nametoken == 0 && this.simplename == 0) { this.current.nameSpace = var3; } if ((this.keyword <= 0 || this.inEntityRef != 0) && var3 != null) { this.name = QualifiedName.create(var2, var3); } else { this.name = var2; } this.token = -4; } }