📄 qxmlstream_p.h
字号:
return true; } QIODevice *device; bool deleteDevice;#ifndef QT_NO_TEXTCODEC QTextCodec *codec; QTextDecoder *decoder;#endif bool atEnd; /*! \sa setType() */ QXmlStreamReader::TokenType type; QXmlStreamReader::Error error; QString errorString; qint64 lineNumber, lastLineStart, characterOffset; void write(const QString &); void write(const char *); QXmlStreamAttributes attributes; QStringRef namespaceForPrefix(const QStringRef &prefix); void resolveTag(); void resolvePublicNamespaces(); void resolveDtd(); uint resolveCharRef(int symbolIndex); bool checkStartDocument(); void startDocument(const QStringRef &version); void parseError(); void checkPublicLiteral(const QStringRef &publicId); bool scanDtd; QStringRef lastAttributeValue; bool lastAttributeIsCData; struct DtdAttribute { QStringRef tagName; QStringRef attributeQualifiedName; QStringRef attributePrefix; QStringRef attributeName; QStringRef defaultValue; bool isCDATA; }; QXmlStreamSimpleStack<DtdAttribute> dtdAttributes; struct NotationDeclaration { QStringRef name; QStringRef publicId; QStringRef systemId; }; QXmlStreamSimpleStack<NotationDeclaration> notationDeclarations; QXmlStreamNotationDeclarations publicNotationDeclarations; QXmlStreamNamespaceDeclarations publicNamespaceDeclarations; struct EntityDeclaration { QStringRef name; QStringRef notationName; QStringRef publicId; QStringRef systemId; QStringRef value; bool parameter; bool external; inline void clear() { name.clear(); notationName.clear(); publicId.clear(); systemId.clear(); value.clear(); parameter = external = false; } }; QXmlStreamSimpleStack<EntityDeclaration> entityDeclarations; QXmlStreamEntityDeclarations publicEntityDeclarations; QStringRef text; QStringRef prefix, namespaceUri, qualifiedName, name; QStringRef processingInstructionTarget, processingInstructionData; uint isEmptyElement : 1; uint isWhitespace : 1; uint isCDATA : 1; uint standalone : 1; uint hasCheckedStartDocument : 1; uint normalizeLiterals : 1; uint hasSeenTag : 1; uint inParseEntity : 1; uint referenceToUnparsedEntityDetected : 1; uint referenceToParameterEntityDetected : 1; uint hasExternalDtdSubset : 1; uint lockEncoding : 1; uint namespaceProcessing : 1; int resumeReduction; void resume(int rule); inline bool entitiesMustBeDeclared() const { return (!inParseEntity && (standalone || (!referenceToUnparsedEntityDetected && !referenceToParameterEntityDetected // Errata 13 as of 2006-04-25 && !hasExternalDtdSubset))); } // qlalr parser int tos; int stack_size; struct Value { int pos; int len; int prefix; ushort c; }; Value *sym_stack; int *state_stack; inline void reallocateStack(); inline Value &sym(int index) const { return sym_stack[tos + index - 1]; } QString textBuffer; inline void clearTextBuffer() { if (!scanDtd) { textBuffer.resize(0); textBuffer.reserve(256); } } struct Attribute { Value key; Value value; }; QXmlStreamSimpleStack<Attribute> attributeStack; inline QStringRef symString(int index) { const Value &symbol = sym(index); return QStringRef(&textBuffer, symbol.pos + symbol.prefix, symbol.len - symbol.prefix); } inline QStringRef symName(int index) { const Value &symbol = sym(index); return QStringRef(&textBuffer, symbol.pos, symbol.len); } inline QStringRef symString(int index, int offset) { const Value &symbol = sym(index); return QStringRef(&textBuffer, symbol.pos + symbol.prefix + offset, symbol.len - symbol.prefix - offset); } inline QStringRef symPrefix(int index) { const Value &symbol = sym(index); if (symbol.prefix) return QStringRef(&textBuffer, symbol.pos, symbol.prefix - 1); return QStringRef(); } inline QStringRef symString(const Value &symbol) { return QStringRef(&textBuffer, symbol.pos + symbol.prefix, symbol.len - symbol.prefix); } inline QStringRef symName(const Value &symbol) { return QStringRef(&textBuffer, symbol.pos, symbol.len); } inline QStringRef symPrefix(const Value &symbol) { if (symbol.prefix) return QStringRef(&textBuffer, symbol.pos, symbol.prefix - 1); return QStringRef(); } inline void clearSym() { Value &val = sym(1); val.pos = textBuffer.size(); val.len = 0; } short token; ushort token_char; uint filterCarriageReturn(); inline uint getChar(); inline uint peekChar(); inline void putChar(uint c) { putStack.push() = c; } inline void putChar(QChar c) { putStack.push() = c.unicode(); } void putString(const QString &s, int from = 0); void putStringLiteral(const QString &s); void putReplacement(const QString &s); void putReplacementInAttributeValue(const QString &s); ushort getChar_helper(); bool scanUntil(const char *str, short tokenToInject = -1); bool scanString(const char *str, short tokenToInject, bool requireSpace = true); inline void injectToken(ushort tokenToInject) { putChar(int(tokenToInject) << 16); } static bool validateName(const QStringRef &name); void parseEntity(const QString &value); QXmlStreamReaderPrivate *entityParser; bool scanAfterLangleBang(); bool scanPublicOrSystem(); bool scanNData(); bool scanAfterDefaultDecl(); bool scanAttType(); // scan optimization functions. Not strictly necessary but LALR is // not very well suited for scanning fast int fastScanLiteralContent(); int fastScanSpace(); int fastScanContentCharList(); int fastScanName(int *prefix = 0); inline int fastScanNMTOKEN(); bool parse(); inline void consumeRule(int); void raiseError(QXmlStreamReader::Error error, const QString& message = QString()); void raiseWellFormedError(const QString &message);private: /*! \internal Never assign to variable type directly. Instead use this function. This prevents errors from being ignored. */ inline void setType(const QXmlStreamReader::TokenType t) { if(type != QXmlStreamReader::Invalid) type = t; }};bool QXmlStreamReaderPrivate::parse(){ // cleanup currently reported token switch (type) { case QXmlStreamReader::StartElement: name.clear(); prefix.clear(); qualifiedName.clear(); namespaceUri.clear(); if (publicNamespaceDeclarations.size()) publicNamespaceDeclarations.clear(); if (attributes.size()) attributes.resize(0); if (isEmptyElement) { setType(QXmlStreamReader::EndElement); Tag &tag = tagStack_pop(); namespaceUri = tag.namespaceDeclaration.namespaceUri; name = tag.name; qualifiedName = tag.qualifiedName; isEmptyElement = false; return true; } clearTextBuffer(); break; case QXmlStreamReader::EndElement: name.clear(); prefix.clear(); qualifiedName.clear(); namespaceUri.clear(); clearTextBuffer(); break; case QXmlStreamReader::DTD: publicNotationDeclarations.clear(); publicEntityDeclarations.clear(); // fall through case QXmlStreamReader::Comment: case QXmlStreamReader::Characters: isCDATA = isWhitespace = false; text.clear(); clearTextBuffer(); break; case QXmlStreamReader::EntityReference: text.clear(); name.clear(); clearTextBuffer(); break; case QXmlStreamReader::ProcessingInstruction: processingInstructionTarget.clear(); processingInstructionData.clear(); clearTextBuffer(); break; case QXmlStreamReader::NoToken: case QXmlStreamReader::Invalid: break; case QXmlStreamReader::StartDocument: lockEncoding = true;#ifndef QT_NO_TEXTCODEC if(decoder->hasFailure()) { raiseWellFormedError(QXmlStream::tr("Encountered incorrectly encoded content.")); readBuffer.clear(); return false; }#endif // fall through default: clearTextBuffer(); ; } setType(QXmlStreamReader::NoToken); // the main parse loop int act, r; if (resumeReduction) { act = state_stack[tos-1]; r = resumeReduction; resumeReduction = 0; goto ResumeReduction; } act = state_stack[tos]; forever { if (token == -1 && - TERMINAL_COUNT != action_index[act]) { uint cu = getChar(); token = NOTOKEN; token_char = cu; if (cu & 0xff0000) { token = cu >> 16; } else switch (token_char) { case 0xfffe: case 0xffff: token = ERROR; break; case '\r': token = SPACE; if (cu == '\r') { if ((token_char = filterCarriageReturn())) { ++lineNumber; lastLineStart = characterOffset + readBufferPos; break; } } else { break; } // fall through case '\0': { token = EOF_SYMBOL; if (!tagsDone && !inParseEntity) { int a = t_action(act, token); if (a < 0) { raiseError(QXmlStreamReader::PrematureEndOfDocumentError); return false; } } } break; case '\n': ++lineNumber; lastLineStart = characterOffset + readBufferPos; case ' ': case '\t': token = SPACE; break; case '&': token = AMPERSAND; break; case '#': token = HASH; break; case '\'': token = QUOTE; break; case '\"': token = DBLQUOTE; break; case '<': token = LANGLE; break; case '>': token = RANGLE; break; case '[': token = LBRACK; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -