bool QXmlDefaultHandler_QtDShell::__override_processingInstruction(const QString& target0, const QString& data1, bool static_call) { if (static_call) { return QXmlDefaultHandler::processingInstruction((const QString& )target0, (const QString& )data1); } else { return processingInstruction((const QString& )target0, (const QString& )data1); } }
/*! \internal Treats \a outputItem as a node and calls the appropriate function, e.g., attribute() or comment(), depending on its QXmlNodeModelIndex::NodeKind. This is a helper function that subclasses can use to multiplex Nodes received via item(). */ void QAbstractXmlReceiver::sendAsNode(const QPatternist::Item &outputItem) { Q_ASSERT(outputItem); Q_ASSERT(outputItem.isNode()); const QXmlNodeModelIndex asNode = outputItem.asNode(); switch(asNode.kind()) { case QXmlNodeModelIndex::Attribute: { const QString &v = outputItem.stringValue(); attribute(asNode.name(), QStringRef(&v)); return; } case QXmlNodeModelIndex::Element: { startElement(asNode.name()); /* First the namespaces, then attributes, then the children. */ asNode.sendNamespaces(this); sendFromAxis<QXmlNodeModelIndex::AxisAttribute>(asNode); sendFromAxis<QXmlNodeModelIndex::AxisChild>(asNode); endElement(); return; } case QXmlNodeModelIndex::Text: { const QString &v = asNode.stringValue(); characters(QStringRef(&v)); return; } case QXmlNodeModelIndex::ProcessingInstruction: { processingInstruction(asNode.name(), outputItem.stringValue()); return; } case QXmlNodeModelIndex::Comment: { comment(outputItem.stringValue()); return; } case QXmlNodeModelIndex::Document: { startDocument(); sendFromAxis<QXmlNodeModelIndex::AxisChild>(asNode); endDocument(); return; } case QXmlNodeModelIndex::Namespace: Q_ASSERT_X(false, Q_FUNC_INFO, "Not implemented"); } Q_ASSERT_X(false, Q_FUNC_INFO, QString::fromLatin1("Unknown node type: %1").arg(asNode.kind()).toUtf8().constData()); }
//-------------------------------------------------------------- // parse a char buffer. Characters are assumed UTF-8, but this // is passed through to content and attributes. All we care // about is xml characters (<, >, =", etc.) void mgXMLScanner::parse( int len, const char* buffer) { int posn = 0; while (true) { // read a char, possibly pushed back char c; if (m_lastChar != '\0') { c = m_lastChar; m_lastChar = '\0'; } else { // if buffer empty if (posn >= len) break; c = buffer[posn++]; // track line and col nums for error messages if (c == '\n') { m_lineNum++; m_colNum = 0; } else if (c != '\r') m_colNum++; } // process against state machine switch (m_state) { case START_STATE: if (c == '<') { if (m_token.length() > 0) { content(m_token, m_token.length()); m_token.empty(); } m_state = OPEN_STATE; } else if (c == '&') { if (m_token.length() > 0) { content(m_token, m_token.length()); m_token.empty(); } m_state = AMPER_STATE; } else { if (m_token.length() > CONTENT_CHUNK_MAX) { content(m_token, m_token.length()); m_token.empty(); } m_token += c; } break; case OPEN_STATE: // '<' seen if (c == '?') m_state = PROCESS_STATE; else if (c == '!') m_state = TAGEXP_STATE; else if (c == '/') m_state = TAGCLOSE_STATE; else { m_state = TAGOPEN_STATE; m_lastChar = c; } break; case PROCESS_STATE: // <? seen if (c == '?') m_state = PROCESS_END_STATE; else m_token += c; break; case PROCESS_END_STATE: // <? ... ? seen if (c == '>') { processingInstruction(m_token); m_token.empty(); m_state = START_STATE; } else { m_token += '?'; m_lastChar = c; m_state = PROCESS_STATE; } break; case TAGEXP_STATE: // <! seen if (c == '-') m_state = TAGEXP_DASH_STATE; else if (c == '[') m_state = CDATA_OPEN_STATE; else errorMsg("xmlBadString", "string", "<!%c", c); break; case TAGEXP_DASH_STATE: // <!- seen if (c == '-') m_state = COMMENT_STATE; else errorMsg("xmlBadString", "string", "<!-%c", c); break; case COMMENT_STATE: // <!-- seen if (c == '-') m_state = COMMENT_END_STATE; else m_token += c; break; case COMMENT_END_STATE: // <!-- ... - seen if (c == '-') m_state = COMMENT_END2_STATE; else { m_token += '-'; m_lastChar = c; m_state = COMMENT_STATE; } break; case COMMENT_END2_STATE: // <!-- ... -- seen if (c == '>') { comment(m_token); m_token.empty(); m_state = START_STATE; } else { m_token += "--"; m_lastChar = c; m_state = COMMENT_STATE; } break; case CDATA_OPEN_STATE: // <![ seen if (c == 'C') m_state = CDATA_OPEN2_STATE; else errorMsg("xmlBadString", "string", "<![%c", c); break; case CDATA_OPEN2_STATE: // <![C seen if (c == 'D') m_state = CDATA_OPEN3_STATE; else errorMsg("xmlBadString", "string", "<![C%c", c); break; case CDATA_OPEN3_STATE: // <![CD seen if (c == 'A') m_state = CDATA_OPEN4_STATE; else errorMsg("xmlBadString", "string", "<![CD%c", c); break; case CDATA_OPEN4_STATE: // <![CDA seen if (c == 'T') m_state = CDATA_OPEN5_STATE; else errorMsg("xmlBadString", "string", "<![CDA%c", c); break; case CDATA_OPEN5_STATE: // <![CDAT seen if (c == 'A') m_state = CDATA_OPEN6_STATE; else errorMsg("xmlBadString", "string", "<![CDAT%c", c); break; case CDATA_OPEN6_STATE: // <![CDATA seen if (c == '[') m_state = CDATA_STATE; else errorMsg("xmlBadString", "string", "<![CDATA%c", c); break; case CDATA_STATE: // <![CDATA[ ... seen if (c == ']') m_state = CDATA_END_STATE; else { // break this into chunks if (m_token.length() > CONTENT_CHUNK_MAX) { CDATAContent(m_token, m_token.length()); m_token.empty(); } m_token += c; } break; case CDATA_END_STATE: // <![CDATA[ ... ] seen if (c == ']') m_state = CDATA_END2_STATE; else { m_state = CDATA_STATE; m_token += ']'; m_lastChar = c; } break; case CDATA_END2_STATE: // <![CDATA[ ... ]] seen if (c == '>') { CDATAContent(m_token, m_token.length()); m_token.empty(); m_state = START_STATE; } else { m_state = CDATA_STATE; m_token += "]]"; m_lastChar = c; } break; case TAGOPEN_STATE: // <x... seen if (c == '>') { tagOpen(m_token); endAttrs(); m_token.empty(); m_state = START_STATE; } else if (c == '/') { tagOpen(m_token); m_token.empty(); endAttrs(); tagNoContent(); m_state = TAGCLOSE_BLANK_STATE; } else if (isspace(c)) { tagOpen(m_token); m_token.empty(); m_state = ATTR_START_STATE; } else m_token += c; break; case TAGCLOSE_STATE: // </ seen if (c == '>') { tagClose(m_token); m_token.empty(); m_state = START_STATE; } else if (isspace(c)) { tagClose(m_token); m_token.empty(); m_state = TAGCLOSE_BLANK_STATE; } else m_token += c; break; case TAGCLOSE_BLANK_STATE: // </tag ' ' seen if (c == '>') m_state = START_STATE; else if (!isspace(c)) errorMsg("xmlBadClose", "", ""); break; case ATTR_START_STATE: // <tag ' ' seen, or attr=value seen if (c == '>') { if (m_token.length() > 0) { tagOpen(m_token); m_token.empty(); } endAttrs(); m_state = START_STATE; } else if (c == '/') { if (m_token.length() > 0) { tagOpen(m_token); m_token.empty(); } endAttrs(); tagNoContent(); m_state = TAGCLOSE_BLANK_STATE; } else if (!isspace(c)) { m_state = ATTR_NAME_STATE; m_lastChar = c; } break; case ATTR_NAME_STATE: // <tag ... 'letter' a seen if (iswalnum(c) || c == '_' || c == '.' || c == '-') m_token += c; else if (c == '=') { attrName(m_token); m_token.empty(); m_state = VALUE_START_STATE; } else if (isspace(c)) { attrName(m_token); m_token.empty(); m_state = EQUAL_START_STATE; } else errorMsg("xmlMissingEquals", "", ""); break; case EQUAL_START_STATE: if (c == '=') m_state = VALUE_START_STATE; else if (!isspace(c)) errorMsg("xmlMissingEquals", "", ""); break; case VALUE_START_STATE: if (c == '"') { m_state = VALUE_STATE; m_valueDelim = '"'; } else if (c == '\'') { m_state = VALUE_STATE; m_valueDelim = '\''; } else if (!isspace(c)) errorMsg("xmlMissingQuote", "", ""); break; case VALUE_STATE: if (c == m_valueDelim) { attrValue(m_token); m_token.empty(); m_state = ATTR_START_STATE; } else if (c == '&') m_state = VALUE_AMPER_STATE; else m_token += c; break; case VALUE_AMPER_STATE: // & seen in attribute value if (c == ';') { mgString value; entityRef(m_entityRef, value); m_token += value; m_entityRef.empty(); m_state = VALUE_STATE; } else if (isspace(c)) errorMsg("xmlMissingSemi", "", ""); else m_entityRef += c; break; case AMPER_STATE: // & seen in content if (c == ';') { mgString value; entityRef(m_entityRef, value); m_token += value; m_entityRef.empty(); m_state = START_STATE; } else if (isspace(c)) errorMsg("xmlMissingSemi", "", ""); else m_entityRef += c; break; } } }