bool Parser::parseProlog( Node *node ) { parseXMLDeclaration( node ); while( parseMisc( node ) ) {} parseDocType( node ); while( parseMisc( node ) ) {} return true; }
static UXMLNODE parseElement(struct UXMLPARSER *parser, UXMLNODE parent, int *type) { UXMLNODE node; UXMLCHAR *name = parser->offset; size_t nameLength; int isEmpty; if (!skipName(parser)) { setError(parser, 0, "Unexpected end of input parsing stag name"); return NULL; } nameLength = (parser->offset - name); switch (*name) { case '!': { if (stringCompare(name, "![CDATA[", 8)) { *type = UXML_NT_CDATA; return parseCDATA(parser, parent); } else if (stringCompare(name, "!--", 3)) { *type = UXML_NT_COMMENT; return parseComment(parser, parent); } else if (stringCompare(name, "!DOCTYPE", 8)) { *type = UXML_NT_DOCTYPE; return parseDocType(parser, parent); } else { setError(parser, 0, "Unexpected ! tag"); return NULL; } break; } case '?': { if (stringCompare(name, "?xml", 4)) { *type = UXML_NT_PROLOG; return parseProlog(parser, parent); } else { setError(parser, 0, "Unexpected prolog tag"); return NULL; } break; } default: { *type = UXML_NT_ELEMENT; node = parser->createElement(parser, parent, name, nameLength); if (!parseAttributes(parser, node, &isEmpty)) { goto ERROR_DESTROY_NODE; } if (isEmpty) { parser->offset ++; if (*(parser->offset) != '>') { setError(parser, 0, "Unexpected end of input parsing stag name"); goto ERROR_DESTROY_NODE; } parser->offset ++; } else { parser->offset ++; if (!parseContent(parser, node, name, nameLength)) { goto ERROR_DESTROY_NODE; } } break; } } return node; ERROR_DESTROY_NODE: parser->destroyNode(parser, node); return NULL; }