📄 parser.cpp
字号:
ACEXML_Char* systemId = 0; if (this->parse_external_id (publicId, systemId ACEXML_ENV_ARG_PARAMETER) != 0) { this->fatal_error (ACE_TEXT ("Error in parsing ExternalID") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } if (this->validate_) { ACEXML_Char* uri = this->normalize_systemid (systemId); ACE_Auto_Basic_Array_Ptr<ACEXML_Char> cleanup_uri (uri); ACEXML_InputSource* ip = 0; if (this->entity_resolver_) { ip = this->entity_resolver_->resolveEntity (publicId, (uri ? uri : systemId) ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } if (ip) { if (this->switch_input (ip, (uri ? uri : systemId), publicId) != 0) return -1; } else { ACEXML_StreamFactory factory; ACEXML_CharStream* cstream = factory.create_stream (uri ? uri: systemId); if (!cstream) { this->fatal_error (ACE_TEXT ("Invalid input source") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } if (this->switch_input (cstream, systemId, publicId) != 0) return -1; } this->parse_external_subset (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } return 0;}intACEXML_Parser::parse_external_subset (ACEXML_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((ACEXML_SAXException)){ this->ref_state_ = ACEXML_ParserInt::IN_EXT_DTD; this->external_subset_ = 1; int nrelems = 0; ACEXML_Char nextch = this->skip_whitespace(); do { switch (nextch) { case '<': nextch = this->get(); switch (nextch) { case '!': nextch = this->peek(); if (nextch == '[') this->parse_conditional_section (ACEXML_ENV_SINGLE_ARG_PARAMETER); else this->parse_markup_decl (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; case '?': nextch = this->peek(); if (nextch == 'x') this->parse_text_decl (ACEXML_ENV_SINGLE_ARG_PARAMETER); else this->parse_processing_instruction (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; default: this->fatal_error (ACE_TEXT ("Invalid content in external DTD") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } break; case '%': this->parse_PE_reference (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; case 0: nrelems = this->pop_context (0 ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); if (nrelems == 1) return 0; break; default: this->fatal_error (ACE_TEXT ("Invalid content in external DTD") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } nextch = this->skip_whitespace(); } while (1);}intACEXML_Parser::parse_conditional_section (ACEXML_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((ACEXML_SAXException)){ ACEXML_Char ch = this->get (); int include = 0; if (ch != '[') { this->fatal_error(ACE_TEXT ("Internal Parser Error") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } ch = this->skip_whitespace(); if (ch == '%') { this->parse_PE_reference (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); ch = this->skip_whitespace(); } if (ch == 'I') { ch = this->get(); switch (ch) { case 'N': if (this->parse_token (ACE_TEXT ("CLUDE")) < 0) { this->fatal_error (ACE_TEXT ("Expecting keyword INCLUDE in ") ACE_TEXT ("conditionalSect") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } include = 1; break; case 'G': if (this->parse_token (ACE_TEXT ("GNORE")) < 0) { this->fatal_error (ACE_TEXT ("Expecting keyword IGNORE in ") ACE_TEXT ("conditionalSect") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } include = 0; break; default: this->fatal_error (ACE_TEXT ("Invalid conditionalSect") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } ACEXML_Char fwd = '\xFF'; this->skip_whitespace_count (&fwd); if (fwd == 0) { this->get(); // Consume the 0 this->pop_context (0 ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } } else { this->fatal_error (ACE_TEXT ("Invalid conditionalSect") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } if (this->skip_whitespace() != '[') { this->fatal_error (ACE_TEXT ("Expecting '[' in conditionalSect") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } if (include) this->parse_includesect (ACEXML_ENV_SINGLE_ARG_PARAMETER); else this->parse_ignoresect (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); return 0;}intACEXML_Parser::parse_ignoresect (ACEXML_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((ACEXML_SAXException)){ ACEXML_Char nextch = this->skip_whitespace(); int count = 0; int done = 0; do { switch (nextch) { case '<': if (this->peek() == '!') { this->get(); if (this->peek() == '[') { this->get(); count++; } } break; case ']': if (this->peek() == ']') { this->get(); if (this->peek() == '>') { this->get(); if (count) { --count; break; } done = 1; } } break; case 0: // [VC: Proper Conditional Section/PE Nesting] if (count != 0) { this->fatal_error (ACE_TEXT ("Invalid Conditional Section/PE ") ACE_TEXT ("Nesting ") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } default: break; } if (done) break; nextch = this->get(); } while (1); return 0;}intACEXML_Parser::parse_includesect (ACEXML_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((ACEXML_SAXException)){ ACEXML_Char nextch = this->skip_whitespace(); do { switch (nextch) { case '<': nextch = this->get(); switch (nextch) { case '!': nextch = this->peek(); if (nextch == '[') this->parse_conditional_section (ACEXML_ENV_SINGLE_ARG_PARAMETER); else this->parse_markup_decl (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; case '?': nextch = this->peek(); this->parse_processing_instruction (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; default: this->fatal_error (ACE_TEXT ("Invalid includeSect") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } break; case '%': this->parse_PE_reference (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; case 0: // [VC: Proper Conditional Section/PE Nesting] this->fatal_error (ACE_TEXT ("Invalid Conditional Section/PE ") ACE_TEXT ("Nesting ") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); case ']': if (this->peek() == ']') { nextch = this->get(); if (this->peek() == '>') { nextch = this->get(); return 0; } } default: this->fatal_error (ACE_TEXT ("Invalid includeSect") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } nextch = this->skip_whitespace(); } while (1);}intACEXML_Parser::parse_markup_decl (ACEXML_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((ACEXML_SAXException)){ ACEXML_Char nextch = this->peek (); switch (nextch) { case 'E': // An ELEMENT or ENTITY decl this->get (); nextch = this->peek (); switch (nextch) { case 'L': this->parse_element_decl (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; case 'N': this->parse_entity_decl (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; default: this->fatal_error(ACE_TEXT ("Expecting keyword ELEMENT/ENTITY") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } break; case 'A': // An ATTLIST decl this->parse_attlist_decl (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; case 'N': // A NOTATION decl this->parse_notation_decl (ACEXML_ENV_SINGLE_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); break; case '-': // a comment. if (this->parse_comment () < 0) { this->fatal_error(ACE_TEXT ("Invalid comment") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } break; case 0: // [VC: Proper Declaration/PE Nesting] this->fatal_error (ACE_TEXT ("Unexpected end-of-file") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); default: this->fatal_error (ACE_TEXT ("Invalid markupDecl") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } return 0;}intACEXML_Parser::parse_external_id (ACEXML_Char *&publicId, ACEXML_Char *&systemId ACEXML_ENV_ARG_DECL) ACE_THROW_SPEC ((ACEXML_SAXException)){ publicId = systemId = 0; ACEXML_Char nextch = this->get (); ACEXML_Char fwd = 0; switch (nextch) { case 'S': // External SYSTEM id. if (this->parse_token (ACE_TEXT ("YSTEM")) < 0 || this->skip_whitespace_count () < 1) { this->fatal_error(ACE_TEXT ("Expecting keyword SYSTEM") ACEXML_ENV_ARG_PARAMETER); ACEXML_CHECK_RETURN (-1); } if (this->parse_system_literal (systemId) != 0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -