diff options
author | Michele Calgaro <michele.calgaro@yahoo.it> | 2019-04-21 23:22:20 +0900 |
---|---|---|
committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2019-04-21 23:22:20 +0900 |
commit | dba036816b279bc1539a9f3894fbc414665d2bce (patch) | |
tree | 29e4bf00bafe515e7afdd02168d65a47a3f9fbc0 /tqtinterface/qt4/src/xml/tqxml.cpp | |
parent | 6f1b4f0c7505a049d992a33f6e409b7c75732d4b (diff) | |
download | experimental-dba036816b279bc1539a9f3894fbc414665d2bce.tar.gz experimental-dba036816b279bc1539a9f3894fbc414665d2bce.zip |
Removed unnecessary and/or TDE-unrelated code.
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
Diffstat (limited to 'tqtinterface/qt4/src/xml/tqxml.cpp')
-rw-r--r-- | tqtinterface/qt4/src/xml/tqxml.cpp | 7635 |
1 files changed, 0 insertions, 7635 deletions
diff --git a/tqtinterface/qt4/src/xml/tqxml.cpp b/tqtinterface/qt4/src/xml/tqxml.cpp deleted file mode 100644 index 8f4a4e3..0000000 --- a/tqtinterface/qt4/src/xml/tqxml.cpp +++ /dev/null @@ -1,7635 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQXmlSimpleReader and related classes. -** -** Created : 000518 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the xml module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqxml.h" -#include "tqtextcodec.h" -#include "tqbuffer.h" -#include "tqregexp.h" -#include "tqptrstack.h" -#include "tqmap.h" -#include "tqvaluestack.h" - -// needed for TQT_TRANSLATE_NOOP: -#include "tqobject.h" - -#ifndef TQT_NO_XML - -//#define TQT_TQXML_DEBUG - -// Error strings for the XML reader -#define XMLERR_OK TQT_TRANSLATE_NOOP( "TQXml", "no error occurred" ) -#define XMLERR_ERRORBYCONSUMER TQT_TRANSLATE_NOOP( "TQXml", "error triggered by consumer" ) -#define XMLERR_UNEXPECTEDEOF TQT_TRANSLATE_NOOP( "TQXml", "unexpected end of file" ) -#define XMLERR_MORETHANONEDOCTYPE TQT_TRANSLATE_NOOP( "TQXml", "more than one document type definition" ) -#define XMLERR_ERRORPARSINGELEMENT TQT_TRANSLATE_NOOP( "TQXml", "error occurred while parsing element" ) -#define XMLERR_TAGMISMATCH TQT_TRANSLATE_NOOP( "TQXml", "tag mismatch" ) -#define XMLERR_ERRORPARSINGCONTENT TQT_TRANSLATE_NOOP( "TQXml", "error occurred while parsing content" ) -#define XMLERR_UNEXPECTEDCHARACTER TQT_TRANSLATE_NOOP( "TQXml", "unexpected character" ) -#define XMLERR_INVALIDNAMEFORPI TQT_TRANSLATE_NOOP( "TQXml", "invalid name for processing instruction" ) -#define XMLERR_VERSIONEXPECTED TQT_TRANSLATE_NOOP( "TQXml", "version expected while reading the XML declaration" ) -#define XMLERR_WRONGVALUEFORSDECL TQT_TRANSLATE_NOOP( "TQXml", "wrong value for standalone declaration" ) -#define XMLERR_EDECLORSDDECLEXPECTED TQT_TRANSLATE_NOOP( "TQXml", "encoding declaration or standalone declaration expected while reading the XML declaration" ) -#define XMLERR_SDDECLEXPECTED TQT_TRANSLATE_NOOP( "TQXml", "standalone declaration expected while reading the XML declaration" ) -#define XMLERR_ERRORPARSINGDOCTYPE TQT_TRANSLATE_NOOP( "TQXml", "error occurred while parsing document type definition" ) -#define XMLERR_LETTEREXPECTED TQT_TRANSLATE_NOOP( "TQXml", "letter is expected" ) -#define XMLERR_ERRORPARSINGCOMMENT TQT_TRANSLATE_NOOP( "TQXml", "error occurred while parsing comment" ) -#define XMLERR_ERRORPARSINGREFERENCE TQT_TRANSLATE_NOOP( "TQXml", "error occurred while parsing reference" ) -#define XMLERR_INTERNALGENERALENTITYINDTD TQT_TRANSLATE_NOOP( "TQXml", "internal general entity reference not allowed in DTD" ) -#define XMLERR_EXTERNALGENERALENTITYINAV TQT_TRANSLATE_NOOP( "TQXml", "external parsed general entity reference not allowed in attribute value" ) -#define XMLERR_EXTERNALGENERALENTITYINDTD TQT_TRANSLATE_NOOP( "TQXml", "external parsed general entity reference not allowed in DTD" ) -#define XMLERR_UNPARSEDENTITYREFERENCE TQT_TRANSLATE_NOOP( "TQXml", "unparsed entity reference in wrong context" ) -#define XMLERR_RECURSIVEENTITIES TQT_TRANSLATE_NOOP( "TQXml", "recursive entities" ) -#define XMLERR_ERRORINTEXTDECL TQT_TRANSLATE_NOOP( "TQXml", "error in the text declaration of an external entity" ) - -// the constants for the lookup table -static const signed char cltWS = 0; // white space -static const signed char cltPer = 1; // % -static const signed char cltAmp = 2; // & -static const signed char cltGt = 3; // > -static const signed char cltLt = 4; // < -static const signed char cltSlash = 5; // / -static const signed char cltQm = 6; // ? -static const signed char cltEm = 7; // ! -static const signed char cltDash = 8; // - -static const signed char cltCB = 9; // ] -static const signed char cltOB = 10; // [ -static const signed char cltEq = 11; // = -static const signed char cltDq = 12; // " -static const signed char cltSq = 13; // ' -static const signed char cltUnknown = 14; - -// character lookup table -static const signed char charLookupTable[256]={ - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x00 - 0x07 - cltUnknown, // 0x08 - cltWS, // 0x09 \t - cltWS, // 0x0A \n - cltUnknown, // 0x0B - cltUnknown, // 0x0C - cltWS, // 0x0D \r - cltUnknown, // 0x0E - cltUnknown, // 0x0F - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x17 - 0x16 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x18 - 0x1F - cltWS, // 0x20 Space - cltEm, // 0x21 ! - cltDq, // 0x22 " - cltUnknown, // 0x23 - cltUnknown, // 0x24 - cltPer, // 0x25 % - cltAmp, // 0x26 & - cltSq, // 0x27 ' - cltUnknown, // 0x28 - cltUnknown, // 0x29 - cltUnknown, // 0x2A - cltUnknown, // 0x2B - cltUnknown, // 0x2C - cltDash, // 0x2D - - cltUnknown, // 0x2E - cltSlash, // 0x2F / - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x30 - 0x37 - cltUnknown, // 0x38 - cltUnknown, // 0x39 - cltUnknown, // 0x3A - cltUnknown, // 0x3B - cltLt, // 0x3C < - cltEq, // 0x3D = - cltGt, // 0x3E > - cltQm, // 0x3F ? - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x40 - 0x47 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x48 - 0x4F - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x50 - 0x57 - cltUnknown, // 0x58 - cltUnknown, // 0x59 - cltUnknown, // 0x5A - cltOB, // 0x5B [ - cltUnknown, // 0x5C - cltCB, // 0x5D ] - cltUnknown, // 0x5E - cltUnknown, // 0x5F - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x60 - 0x67 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x68 - 0x6F - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x70 - 0x77 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x78 - 0x7F - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x80 - 0x87 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x88 - 0x8F - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x90 - 0x97 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x98 - 0x9F - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA0 - 0xA7 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA8 - 0xAF - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB0 - 0xB7 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB8 - 0xBF - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC0 - 0xC7 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC8 - 0xCF - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD0 - 0xD7 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD8 - 0xDF - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE0 - 0xE7 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE8 - 0xEF - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xF0 - 0xF7 - cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown // 0xF8 - 0xFF -}; - - -// -// local helper functions -// - -/* - This function strips the TextDecl [77] ("<?xml ...?>") from the string \a - str. The stripped version is stored in \a str. If this function finds an - invalid TextDecl, it returns FALSE, otherwise TRUE. - - This function is used for external entities since those can include an - TextDecl that must be stripped before inserting the entity. -*/ -static bool stripTextDecl( TQString& str ) -{ - TQString textDeclStart( "<?xml" ); - if ( str.startsWith( textDeclStart ) ) { - TQRegExp textDecl(TQString::tqfromLatin1( - "^<\\?xml\\s+" - "(version\\s*=\\s*((['\"])[-a-zA-Z0-9_.:]+\\3))?" - "\\s*" - "(encoding\\s*=\\s*((['\"])[A-Za-z][-a-zA-Z0-9_.]*\\6))?" - "\\s*\\?>" - )); - TQString strTmp = str.replace( textDecl, "" ); - if ( strTmp.length() != str.length() ) - return FALSE; // external entity has wrong TextDecl - str = strTmp; - } - return TRUE; -} - - -class TQXmlAttributesPrivate -{ -}; -class TQXmlInputSourcePrivate -{ -}; -class TQXmlParseExceptionPrivate -{ -}; -class TQXmlLocatorPrivate -{ -}; -class TQXmlDefaultHandlerPrivate -{ -}; - -/*! - \class TQXmlParseException tqxml.h - \reentrant - \brief The TQXmlParseException class is used to report errors with - the TQXmlErrorHandler interface. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - The XML subsystem constructs an instance of this class when it - detects an error. You can retrieve the place where the error - occurred using systemId(), publicId(), lineNumber() and - columnNumber(), along with the error message(). - - \sa TQXmlErrorHandler TQXmlReader -*/ - -/*! - \fn TQXmlParseException::TQXmlParseException( const TQString& name, int c, int l, const TQString& p, const TQString& s ) - - Constructs a parse exception with the error string \a name for - column \a c and line \a l for the public identifier \a p and the - system identifier \a s. -*/ - -/*! - Returns the error message. -*/ -TQString TQXmlParseException::message() const -{ - return msg; -} -/*! - Returns the column number where the error occurred. -*/ -int TQXmlParseException::columnNumber() const -{ - return column; -} -/*! - Returns the line number where the error occurred. -*/ -int TQXmlParseException::lineNumber() const -{ - return line; -} -/*! - Returns the public identifier where the error occurred. -*/ -TQString TQXmlParseException::publicId() const -{ - return pub; -} -/*! - Returns the system identifier where the error occurred. -*/ -TQString TQXmlParseException::systemId() const -{ - return sys; -} - - -/*! - \class TQXmlLocator tqxml.h - \reentrant - \brief The TQXmlLocator class provides the XML handler classes with - information about the parsing position within a file. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - The reader reports a TQXmlLocator to the content handler before it - starts to parse the document. This is done with the - TQXmlContentHandler::setDocumentLocator() function. The handler - classes can now use this locator to get the position (lineNumber() - and columnNumber()) that the reader has reached. -*/ - -/*! - Constructor. -*/ -TQXmlLocator::TQXmlLocator() -{ -} - -/*! - Destructor. -*/ -TQXmlLocator::~TQXmlLocator() -{ -} - -/*! - \fn int TQXmlLocator::columnNumber() - - Returns the column number (starting at 1) or -1 if there is no - column number available. -*/ - -/*! - \fn int TQXmlLocator::lineNumber() - - Returns the line number (starting at 1) or -1 if there is no line - number available. -*/ - -class TQXmlSimpleReaderLocator : public TQXmlLocator -{ -public: - TQXmlSimpleReaderLocator( TQXmlSimpleReader* parent ) - { - reader = parent; - } - ~TQXmlSimpleReaderLocator() - { - } - - int columnNumber() - { - return ( reader->columnNr == -1 ? -1 : reader->columnNr + 1 ); - } - int lineNumber() - { - return ( reader->lineNr == -1 ? -1 : reader->lineNr + 1 ); - } -// TQString getPublicId() -// TQString getSystemId() - -private: - TQXmlSimpleReader *reader; -}; - -/********************************************* - * - * TQXmlNamespaceSupport - * - *********************************************/ - -typedef TQMap<TQString, TQString> NamespaceMap; - -class TQXmlNamespaceSupportPrivate -{ -public: - TQXmlNamespaceSupportPrivate() - { - ns.insert( "xml", "http://www.w3.org/XML/1998/namespace" ); // the XML namespace - } - - ~TQXmlNamespaceSupportPrivate() - { - } - - TQValueStack<NamespaceMap> nsStack; - NamespaceMap ns; -}; - -/*! - \class TQXmlNamespaceSupport tqxml.h - \reentrant - \brief The TQXmlNamespaceSupport class is a helper class for XML - readers which want to include namespace support. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - You can set the prefix for the current namespace with setPrefix(), - and get the list of current prefixes (or those for a given URI) - with prefixes(). The namespace URI is available from uri(). Use - pushContext() to start a new namespace context, and popContext() - to return to the previous namespace context. Use splitName() or - processName() to split a name into its prefix and local name. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ - -/*! - Constructs a TQXmlNamespaceSupport. -*/ -TQXmlNamespaceSupport::TQXmlNamespaceSupport() -{ - d = new TQXmlNamespaceSupportPrivate; -} - -/*! - Destroys a TQXmlNamespaceSupport. -*/ -TQXmlNamespaceSupport::~TQXmlNamespaceSupport() -{ - delete d; -} - -/*! - This function declares a prefix \a pre in the current namespace - context to be the namespace URI \a uri. The prefix remains in - force until this context is popped, unless it is shadowed in a - descendant context. - - Note that there is an asymmetry in this library. prefix() does not - return the default "" prefix, even if you have declared one; to - check for a default prefix, you must look it up explicitly using - uri(). This asymmetry exists to make it easier to look up prefixes - for attribute names, where the default prefix is not allowed. -*/ -void TQXmlNamespaceSupport::setPrefix( const TQString& pre, const TQString& uri ) -{ - if( pre.isNull() ) { - d->ns.insert( "", uri ); - } else { - d->ns.insert( pre, uri ); - } -} - -/*! - Returns one of the prefixes mapped to the namespace URI \a uri. - - If more than one prefix is currently mapped to the same URI, this - function makes an arbitrary selection; if you want all of the - prefixes, use prefixes() instead. - - Note: to check for a default prefix, use the uri() function with - an argument of "". -*/ -TQString TQXmlNamespaceSupport::prefix( const TQString& uri ) const -{ - NamespaceMap::const_iterator itc, it = d->ns.constBegin(); - while ( (itc=it) != d->ns.constEnd() ) { - ++it; - if ( itc.data() == uri && !itc.key().isEmpty() ) - return itc.key(); - } - return ""; -} - -/*! - Looks up the prefix \a prefix in the current context and returns - the currently-mapped namespace URI. Use the empty string ("") for - the default namespace. -*/ -TQString TQXmlNamespaceSupport::uri( const TQString& prefix ) const -{ - return d->ns[prefix]; -} - -/*! - Splits the name \a qname at the ':' and returns the prefix in \a - prefix and the local name in \a localname. - - \sa processName() -*/ -void TQXmlNamespaceSupport::splitName( const TQString& qname, - TQString& prefix, TQString& localname ) const -{ - int pos = qname.find(':'); - if (pos == -1) - pos = qname.length(); - - prefix = qname.left( pos ); - localname = qname.mid( pos+1 ); -} - -/*! - Processes a raw XML 1.0 name in the current context by removing - the prefix and looking it up among the prefixes currently - declared. - - \a qname is the raw XML 1.0 name to be processed. \a isAttribute - is TRUE if the name is an attribute name. - - This function stores the namespace URI in \a nsuri (which will be - set to TQString::null if the raw name has an undeclared prefix), - and stores the local name (without prefix) in \a localname (which - will be set to TQString::null if no namespace is in use). - - Note that attribute names are processed differently than element - names: an unprefixed element name gets the default namespace (if - any), while an unprefixed element name does not. -*/ -void TQXmlNamespaceSupport::processName( const TQString& qname, - bool isAttribute, - TQString& nsuri, TQString& localname ) const -{ - int len = qname.length(); - const TQChar *data = qname.tqunicode(); - for (int pos = 0; pos < len; ++pos) { - if (data[pos].tqunicode() == ':') { - nsuri = uri(qname.left(pos)); - localname = qname.mid(pos + 1); - return; - } - } - // there was no ':' - nsuri = TQString::null; - // attributes don't take default namespace - if (!isAttribute && !d->ns.isEmpty()) { - /* - We want to access d->ns.value(""), but as an optimization - we use the fact that "" compares less than any other - string, so it's either first in the map or not there. - */ - NamespaceMap::const_iterator first = d->ns.constBegin(); - if (first.key().isEmpty()) - nsuri = first.data(); // get default namespace - } - localname = qname; -} - -/*! - Returns a list of all the prefixes currently declared. - - If there is a default prefix, this function does not return it in - the list; check for the default prefix using uri() with an - argument of "". - - Note that if you want to iterate over the list, you should iterate - over a copy, e.g. - \code - TQStringList list = myXmlNamespaceSupport.prefixes(); - TQStringList::iterator it = list.begin(); - while ( it != list.end() ) { - myProcessing( *it ); - ++it; - } - \endcode -*/ -TQStringList TQXmlNamespaceSupport::prefixes() const -{ - TQStringList list; - - NamespaceMap::const_iterator itc, it = d->ns.constBegin(); - while ( (itc=it) != d->ns.constEnd() ) { - ++it; - if ( !itc.key().isEmpty() ) - list.append( itc.key() ); - } - return list; -} - -/*! - \overload - - Returns a list of all prefixes currently declared for the - namespace URI \a uri. - - The "xml:" prefix is included. If you only want one prefix that is - mapped to the namespace URI, and you don't care which one you get, - use the prefix() function instead. - - Note: the empty (default) prefix is never included in this list; - to check for the presence of a default namespace, use uri() with - an argument of "". - - Note that if you want to iterate over the list, you should iterate - over a copy, e.g. - \code - TQStringList list = myXmlNamespaceSupport.prefixes( "" ); - TQStringList::Iterator it = list.begin(); - while( it != list.end() ) { - myProcessing( *it ); - ++it; - } - \endcode -*/ -TQStringList TQXmlNamespaceSupport::prefixes( const TQString& uri ) const -{ - TQStringList list; - - NamespaceMap::const_iterator itc, it = d->ns.constBegin(); - while ( (itc=it) != d->ns.constEnd() ) { - ++it; - if ( itc.data() == uri && !itc.key().isEmpty() ) - list.append( itc.key() ); - } - return list; -} - -/*! - Starts a new namespace context. - - Normally, you should push a new context at the beginning of each - XML element: the new context automatically inherits the - declarations of its parent context, and it also keeps track of - which declarations were made within this context. - - \sa popContext() -*/ -void TQXmlNamespaceSupport::pushContext() -{ - d->nsStack.push(d->ns); -} - -/*! - Reverts to the previous namespace context. - - Normally, you should pop the context at the end of each XML - element. After popping the context, all namespace prefix mappings - that were previously in force are restored. - - \sa pushContext() -*/ -void TQXmlNamespaceSupport::popContext() -{ - d->ns.clear(); - if( !d->nsStack.isEmpty() ) - d->ns = d->nsStack.pop(); -} - -/*! - Resets this namespace support object ready for reuse. -*/ -void TQXmlNamespaceSupport::reset() -{ - delete d; - d = new TQXmlNamespaceSupportPrivate; -} - - - -/********************************************* - * - * TQXmlAttributes - * - *********************************************/ - -/*! - \class TQXmlAttributes tqxml.h - \reentrant - \brief The TQXmlAttributes class provides XML attributes. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - If attributes are reported by TQXmlContentHandler::startElement() - this class is used to pass the attribute values. - - Use index() to locate the position of an attribute in the list, - count() to retrieve the number of attributes, and clear() to - remove the attributes. New attributes can be added with append(). - Use type() to get an attribute's type and value() to get its - value. The attribute's name is available from localName() or - qName(), and its namespace URI from uri(). - -*/ - -/*! - \fn TQXmlAttributes::TQXmlAttributes() - - Constructs an empty attribute list. -*/ - -/*! - \fn TQXmlAttributes::~TQXmlAttributes() - - Destroys the attributes object. -*/ - -/*! - Looks up the index of an attribute by the qualified name \a qName. - - Returns the index of the attribute or -1 if it wasn't found. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ -int TQXmlAttributes::index( const TQString& qName ) const -{ - return qnameList.findIndex( qName ); -} - -/*! - \overload - - Looks up the index of an attribute by a namespace name. - - \a uri specifies the namespace URI, or an empty string if the name - has no namespace URI. \a localPart specifies the attribute's local - name. - - Returns the index of the attribute, or -1 if it wasn't found. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ -int TQXmlAttributes::index( const TQString& uri, const TQString& localPart ) const -{ - TQString uriTmp; - if ( uri.isEmpty() ) - uriTmp = TQString::null; - else - uriTmp = uri; - uint count = (uint)uriList.count(); // ### size_t/int cast - for ( uint i=0; i<count; i++ ) { - if ( uriList[i] == uriTmp && localnameList[i] == localPart ) - return i; - } - return -1; -} - -/*! - Returns the number of attributes in the list. - - \sa count() -*/ -int TQXmlAttributes::length() const -{ - return (int)valueList.count(); -} - -/*! - \fn int TQXmlAttributes::count() const - - Returns the number of attributes in the list. This function is - equivalent to length(). -*/ - -/*! - Looks up an attribute's local name for the attribute at position - \a index. If no namespace processing is done, the local name is - TQString::null. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ -TQString TQXmlAttributes::localName( int index ) const -{ - return localnameList[index]; -} - -/*! - Looks up an attribute's XML 1.0 qualified name for the attribute - at position \a index. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ -TQString TQXmlAttributes::qName( int index ) const -{ - return qnameList[index]; -} - -/*! - Looks up an attribute's namespace URI for the attribute at - position \a index. If no namespace processing is done or if the - attribute has no namespace, the namespace URI is TQString::null. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ -TQString TQXmlAttributes::uri( int index ) const -{ - return uriList[index]; -} - -/*! - Looks up an attribute's type for the attribute at position \a - index. - - Currently only "CDATA" is returned. -*/ -TQString TQXmlAttributes::type( int ) const -{ - return "CDATA"; -} - -/*! - \overload - - Looks up an attribute's type for the qualified name \a qName. - - Currently only "CDATA" is returned. -*/ -TQString TQXmlAttributes::type( const TQString& ) const -{ - return "CDATA"; -} - -/*! - \overload - - Looks up an attribute's type by namespace name. - - \a uri specifies the namespace URI and \a localName specifies the - local name. If the name has no namespace URI, use an empty string - for \a uri. - - Currently only "CDATA" is returned. -*/ -TQString TQXmlAttributes::type( const TQString&, const TQString& ) const -{ - return "CDATA"; -} - -/*! - Looks up an attribute's value for the attribute at position \a - index. -*/ -TQString TQXmlAttributes::value( int index ) const -{ - return valueList[index]; -} - -/*! - \overload - - Looks up an attribute's value for the qualified name \a qName. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ -TQString TQXmlAttributes::value( const TQString& qName ) const -{ - int i = index( qName ); - if ( i == -1 ) - return TQString::null; - return valueList[ i ]; -} - -/*! - \overload - - Looks up an attribute's value by namespace name. - - \a uri specifies the namespace URI, or an empty string if the name - has no namespace URI. \a localName specifies the attribute's local - name. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. -*/ -TQString TQXmlAttributes::value( const TQString& uri, const TQString& localName ) const -{ - int i = index( uri, localName ); - if ( i == -1 ) - return TQString::null; - return valueList[ i ]; -} - -/*! - Clears the list of attributes. - - \sa append() -*/ -void TQXmlAttributes::clear() -{ - qnameList.clear(); - uriList.clear(); - localnameList.clear(); - valueList.clear(); -} - -/*! - Appends a new attribute entry to the list of attributes. The - qualified name of the attribute is \a qName, the namespace URI is - \a uri and the local name is \a localPart. The value of the - attribute is \a value. - - \sa qName() uri() localName() value() -*/ -void TQXmlAttributes::append( const TQString &qName, const TQString &uri, const TQString &localPart, const TQString &value ) -{ - qnameList.append( qName ); - uriList.append( uri ); - localnameList.append( localPart); - valueList.append( value ); -} - - -/********************************************* - * - * TQXmlInputSource - * - *********************************************/ - -/*! - \class TQXmlInputSource tqxml.h - \reentrant - \brief The TQXmlInputSource class provides the input data for the - TQXmlReader subclasses. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - All subclasses of TQXmlReader read the input XML document from this - class. - - This class recognizes the encoding of the data by reading the - encoding declaration in the XML file if it finds one, and reading - the data using the corresponding encoding. If it does not find an - encoding declaration, then it assumes that the data is either in - UTF-8 or UTF-16, depending on whether it can find a byte-order - mark. - - There are two ways to populate the input source with data: you can - construct it with a TQIODevice* so that the input source reads the - data from that tqdevice. Or you can set the data explicitly with one - of the setData() functions. - - Usually you either construct a TQXmlInputSource that works on a - TQIODevice* or you construct an empty TQXmlInputSource and set the - data with setData(). There are only rare occasions where you would - want to mix both methods. - - The TQXmlReader subclasses use the next() function to read the - input character by character. If you want to start from the - beginning again, use reset(). - - The functions data() and fetchData() are useful if you want to do - something with the data other than parsing, e.g. displaying the - raw XML file. The benefit of using the TQXmlInputClass in such - cases is that it tries to use the correct encoding. - - \sa TQXmlReader TQXmlSimpleReader -*/ - -// the following two are guaranteed not to be a character -const TQChar TQXmlInputSource::EndOfData = TQChar((ushort)0xfffe); -const TQChar TQXmlInputSource::EndOfDocument = TQChar((ushort)0xffff); - -/* - Common part of the constructors. -*/ -void TQXmlInputSource::init() -{ - inputDevice = 0; - inputStream = 0; - - setData( TQString::null ); - encMapper = 0; -} - -/*! - Constructs an input source which contains no data. - - \sa setData() -*/ -TQXmlInputSource::TQXmlInputSource() -{ - init(); -} - -/*! - Constructs an input source and gets the data from tqdevice \a dev. - If \a dev is not open, it is opened in read-only mode. If \a dev - is 0 or it is not possible to read from the tqdevice, the input - source will contain no data. - - \sa setData() fetchData() TQIODevice -*/ -TQXmlInputSource::TQXmlInputSource( TQIODevice *dev ) -{ - init(); - inputDevice = dev; - fetchData(); -} - -/*! \obsolete - Constructs an input source and gets the data from the text stream \a stream. -*/ -TQXmlInputSource::TQXmlInputSource( TQTextStream& stream ) -{ - init(); - inputStream = &stream; - fetchData(); -} - -/*! \obsolete - Constructs an input source and gets the data from the file \a file. If the - file cannot be read the input source is empty. -*/ -TQXmlInputSource::TQXmlInputSource( TQFile& file ) -{ - init(); - inputDevice = TQT_TQIODEVICE(&file); - fetchData(); -} - -/*! - Destructor. -*/ -TQXmlInputSource::~TQXmlInputSource() -{ - delete encMapper; -} - -/*! - Returns the next character of the input source. If this function - reaches the end of available data, it returns - TQXmlInputSource::EndOfData. If you call next() after that, it - tries to fetch more data by calling fetchData(). If the - fetchData() call results in new data, this function returns the - first character of that data; otherwise it returns - TQXmlInputSource::EndOfDocument. - - \sa reset() fetchData() TQXmlSimpleReader::parse() TQXmlSimpleReader::parseContinue() -*/ -TQChar TQXmlInputSource::next() -{ - if ( pos >= length ) { - if ( nextReturnedEndOfData ) { - nextReturnedEndOfData = FALSE; - fetchData(); - if ( pos >= length ) { - return EndOfDocument; - } - return next(); - } - nextReturnedEndOfData = TRUE; - return EndOfData; - } - return tqunicode[pos++]; -} - -/*! - This function sets the position used by next() to the beginning of - the data returned by data(). This is useful if you want to use the - input source for more than one parse. - - \sa next() -*/ -void TQXmlInputSource::reset() -{ - nextReturnedEndOfData = FALSE; - pos = 0; -} - -/*! - Returns the data the input source contains or TQString::null if the - input source does not contain any data. - - \sa setData() TQXmlInputSource() fetchData() -*/ -TQString TQXmlInputSource::data() -{ - return str; -} - -/*! - Sets the data of the input source to \a dat. - - If the input source already contains data, this function deletes - that data first. - - \sa data() -*/ -void TQXmlInputSource::setData( const TQString& dat ) -{ - str = dat; - tqunicode = str.tqunicode(); - pos = 0; - length = str.length(); - nextReturnedEndOfData = FALSE; -} - -/*! - \overload - - The data \a dat is passed through the correct text-codec, before - it is set. -*/ -void TQXmlInputSource::setData( const TQByteArray& dat ) -{ - setData( fromRawData( dat ) ); -} - -/*! - This function reads more data from the tqdevice that was set during - construction. If the input source already contained data, this - function deletes that data first. - - This object contains no data after a call to this function if the - object was constructed without a tqdevice to read data from or if - this function was not able to get more data from the tqdevice. - - There are two occasions where a fetch is done implicitly by - another function call: during construction (so that the object - starts out with some initial data where available), and during a - call to next() (if the data had run out). - - You don't normally need to use this function if you use next(). - - \sa data() next() TQXmlInputSource() -*/ -void TQXmlInputSource::fetchData() -{ - TQByteArray rawData; - - if ( inputDevice != 0 ) { - if ( inputDevice->isOpen() || inputDevice->open( IO_ReadOnly ) ) - rawData = inputDevice->readAll(); - } else if ( inputStream != 0 ) { - if ( inputStream->tqdevice()->isDirectAccess() ) { - rawData = inputStream->tqdevice()->readAll(); - } else { - int nread = 0; - const int bufsize = 512; - while ( !inputStream->tqdevice()->atEnd() ) { - rawData.resize( nread + bufsize ); - nread += inputStream->tqdevice()->readBlock( rawData.data()+nread, bufsize ); - } - rawData.resize( nread ); - } - } - setData( fromRawData( rawData ) ); -} - -/*! - This function reads the XML file from \a data and tries to - recognize the encoding. It converts the raw data \a data into a - TQString and returns it. It tries its best to get the correct - encoding for the XML file. - - If \a beginning is TRUE, this function assumes that the data - starts at the beginning of a new XML document and looks for an - encoding declaration. If \a beginning is FALSE, it converts the - raw data using the encoding determined from prior calls. -*/ -TQString TQXmlInputSource::fromRawData( const TQByteArray &data, bool beginning ) -{ - if ( data.size() == 0 ) - return TQString::null; - if ( beginning ) { - delete encMapper; - encMapper = 0; - } - if ( encMapper == 0 ) { - TQTextCodec *codec = 0; - // look for byte order mark and read the first 5 characters - if ( data.size() >= 2 && - ( ((uchar)data.at(0)==(uchar)0xfe && - (uchar)data.at(1)==(uchar)0xff ) || - ((uchar)data.at(0)==(uchar)0xff && - (uchar)data.at(1)==(uchar)0xfe ) )) { - codec = TQTextCodec::codecForMib( 1000 ); // UTF-16 - } else { - codec = TQTextCodec::codecForMib( 106 ); // UTF-8 - } - if ( !codec ) - return TQString::null; - - encMapper = codec->makeDecoder(); - TQString input = encMapper->toUnicode( data.data(), data.size() ); - // ### unexpected EOF? (for incremental parsing) - // starts the document with an XML declaration? - if ( input.find("<?xml") == 0 ) { - // try to find out if there is an encoding - int endPos = input.find( ">" ); - int pos = input.find( "encoding" ); - if ( pos < endPos && pos != -1 ) { - TQString encoding; - do { - pos++; - if ( pos > endPos ) { - return input; - } - } while( input[pos] != '"' && input[pos] != '\'' ); - pos++; - while( input[pos] != '"' && input[pos] != '\'' ) { - encoding += input[pos]; - pos++; - if ( pos > endPos ) { - return input; - } - } - - codec = TQTextCodec::codecForName( encoding ); - if ( codec == 0 ) { - return input; - } - delete encMapper; - encMapper = codec->makeDecoder(); - return encMapper->toUnicode( data.data(), data.size() ); - } - } - return input; - } - return encMapper->toUnicode( data.data(), data.size() ); -} - - -/********************************************* - * - * TQXmlDefaultHandler - * - *********************************************/ - -/*! - \class TQXmlContentHandler tqxml.h - \reentrant - \brief The TQXmlContentHandler class provides an interface to - report the logical content of XML data. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - If the application needs to be informed of basic parsing events, - it can implement this interface and activate it using - TQXmlReader::setContentHandler(). The reader can then report basic - document-related events like the start and end of elements and - character data through this interface. - - The order of events in this interface is very important, and - mirrors the order of information in the document itself. For - example, all of an element's content (character data, processing - instructions, and sub-elements) appears, in order, between the - startElement() event and the corresponding endElement() event. - - The class TQXmlDefaultHandler provides a default implementation for - this interface; subclassing from the TQXmlDefaultHandler class is - very convenient if you only want to be informed of some parsing - events. - - The startDocument() function is called at the start of the - document, and endDocument() is called at the end. Before parsing - begins setDocumentLocator() is called. For each element - startElement() is called, with endElement() being called at the - end of each element. The characters() function is called with - chunks of character data; ignorableWhitespace() is called with - chunks of whitespace and processingInstruction() is called with - processing instructions. If an entity is skipped skippedEntity() - is called. At the beginning of prefix-URI scopes - startPrefixMapping() is called. - - See also the \link xml.html#sax2Intro Introduction to SAX2\endlink. - - \sa TQXmlDTDHandler TQXmlDeclHandler TQXmlEntityResolver TQXmlErrorHandler - TQXmlLexicalHandler -*/ - -/*! - \fn void TQXmlContentHandler::setDocumentLocator( TQXmlLocator* locator ) - - The reader calls this function before it starts parsing the - document. The argument \a locator is a pointer to a TQXmlLocator - which allows the application to get the parsing position within - the document. - - Do not destroy the \a locator; it is destroyed when the reader is - destroyed. (Do not use the \a locator after the reader is - destroyed). -*/ - -/*! - \fn bool TQXmlContentHandler::startDocument() - - The reader calls this function when it starts parsing the - document. The reader calls this function just once, after the call - to setDocumentLocator(), and before any other functions in this - class or in the TQXmlDTDHandler class are called. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - \sa endDocument() -*/ - -/*! - \fn bool TQXmlContentHandler::endDocument() - - The reader calls this function after it has finished parsing. It - is called just once, and is the last handler function called. It - is called after the reader has read all input or has abandoned - parsing because of a fatal error. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - \sa startDocument() -*/ - -/*! - \fn bool TQXmlContentHandler::startPrefixMapping( const TQString& prefix, const TQString& uri ) - - The reader calls this function to signal the begin of a prefix-URI - namespace mapping scope. This information is not necessary for - normal namespace processing since the reader automatically - replaces prefixes for element and attribute names. - - Note that startPrefixMapping() and endPrefixMapping() calls are - not guaranteed to be properly nested relative to each other: all - startPrefixMapping() events occur before the corresponding - startElement() event, and all endPrefixMapping() events occur - after the corresponding endElement() event, but their order is not - otherwise guaranteed. - - The argument \a prefix is the namespace prefix being declared and - the argument \a uri is the namespace URI the prefix is mapped to. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. - - \sa endPrefixMapping() -*/ - -/*! - \fn bool TQXmlContentHandler::endPrefixMapping( const TQString& prefix ) - - The reader calls this function to signal the end of a prefix - mapping for the prefix \a prefix. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. - - \sa startPrefixMapping() -*/ - -/*! - \fn bool TQXmlContentHandler::startElement( const TQString& namespaceURI, const TQString& localName, const TQString& qName, const TQXmlAttributes& atts ) - - The reader calls this function when it has parsed a start element - tag. - - There is a corresponding endElement() call when the corresponding - end element tag is read. The startElement() and endElement() calls - are always nested correctly. Empty element tags (e.g. \c{<x/>}) - cause a startElement() call to be immediately followed by an - endElement() call. - - The attribute list provided only contains attributes with explicit - values. The attribute list contains attributes used for namespace - declaration (i.e. attributes starting with xmlns) only if the - namespace-prefix property of the reader is TRUE. - - The argument \a namespaceURI is the namespace URI, or - TQString::null if the element has no namespace URI or if no - namespace processing is done. \a localName is the local name - (without prefix), or TQString::null if no namespace processing is - done, \a qName is the qualified name (with prefix) and \a atts are - the attributes attached to the element. If there are no - attributes, \a atts is an empty attributes object. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. - - \sa endElement() -*/ - -/*! - \fn bool TQXmlContentHandler::endElement( const TQString& namespaceURI, const TQString& localName, const TQString& qName ) - - The reader calls this function when it has parsed an end element - tag with the qualified name \a qName, the local name \a localName - and the namespace URI \a namespaceURI. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - See also the \link xml.html#sax2Namespaces namespace description\endlink. - - \sa startElement() -*/ - -/*! - \fn bool TQXmlContentHandler::characters( const TQString& ch ) - - The reader calls this function when it has parsed a chunk of - character data (either normal character data or character data - inside a CDATA section; if you need to distinguish between those - two types you must use TQXmlLexicalHandler::startCDATA() and - TQXmlLexicalHandler::endCDATA()). The character data is reported in - \a ch. - - Some readers report whitespace in element content using the - ignorableWhitespace() function rather than using this one. - - A reader may report the character data of an element in more than - one chunk; e.g. a reader might want to report "a\<b" in three - characters() events ("a ", "\<" and " b"). - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlContentHandler::ignorableWhitespace( const TQString& ch ) - - Some readers may use this function to report each chunk of - whitespace in element content. The whitespace is reported in \a ch. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlContentHandler::processingInstruction( const TQString& target, const TQString& data ) - - The reader calls this function when it has parsed a processing - instruction. - - \a target is the target name of the processing instruction and \a - data is the data in the processing instruction. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlContentHandler::skippedEntity( const TQString& name ) - - Some readers may skip entities if they have not seen the - declarations (e.g. because they are in an external DTD). If they - do so they report that they skipped the entity called \a name by - calling this function. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn TQString TQXmlContentHandler::errorString() - - The reader calls this function to get an error string, e.g. if any - of the handler functions returns FALSE. -*/ - - -/*! - \class TQXmlErrorHandler tqxml.h - \reentrant - \brief The TQXmlErrorHandler class provides an interface to report - errors in XML data. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - If you want your application to report errors to the user or to - perform customized error handling, you should subclass this class. - - You can set the error handler with TQXmlReader::setErrorHandler(). - - Errors can be reported using warning(), error() and fatalError(), - with the error text being reported with errorString(). - - See also the \link xml.html#sax2Intro Introduction to SAX2\endlink. - - \sa TQXmlDTDHandler TQXmlDeclHandler TQXmlContentHandler TQXmlEntityResolver - TQXmlLexicalHandler -*/ - -/*! - \fn bool TQXmlErrorHandler::warning( const TQXmlParseException& exception ) - - A reader might use this function to report a warning. Warnings are - conditions that are not errors or fatal errors as defined by the - XML 1.0 specification. Details of the warning are stored in \a - exception. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlErrorHandler::error( const TQXmlParseException& exception ) - - A reader might use this function to report a recoverable error. A - recoverable error corresponds to the definiton of "error" in - section 1.2 of the XML 1.0 specification. Details of the error are - stored in \a exception. - - The reader must continue to provide normal parsing events after - invoking this function. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlErrorHandler::fatalError( const TQXmlParseException& exception ) - - A reader must use this function to report a non-recoverable error. - Details of the error are stored in \a exception. - - If this function returns TRUE the reader might try to go on - parsing and reporting further errors; but no regular parsing - events are reported. -*/ - -/*! - \fn TQString TQXmlErrorHandler::errorString() - - The reader calls this function to get an error string if any of - the handler functions returns FALSE. -*/ - - -/*! - \class TQXmlDTDHandler tqxml.h - \reentrant - \brief The TQXmlDTDHandler class provides an interface to report - DTD content of XML data. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - If an application needs information about notations and unparsed - entities, it can implement this interface and register an instance - with TQXmlReader::setDTDHandler(). - - Note that this interface includes only those DTD events that the - XML recommendation requires processors to report, i.e. notation - and unparsed entity declarations using notationDecl() and - unparsedEntityDecl() respectively. - - See also the \link xml.html#sax2Intro Introduction to SAX2\endlink. - - \sa TQXmlDeclHandler TQXmlContentHandler TQXmlEntityResolver TQXmlErrorHandler - TQXmlLexicalHandler -*/ - -/*! - \fn bool TQXmlDTDHandler::notationDecl( const TQString& name, const TQString& publicId, const TQString& systemId ) - - The reader calls this function when it has parsed a notation - declaration. - - The argument \a name is the notation name, \a publicId is the - notation's public identifier and \a systemId is the notation's - system identifier. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlDTDHandler::unparsedEntityDecl( const TQString& name, const TQString& publicId, const TQString& systemId, const TQString& notationName ) - - The reader calls this function when it finds an unparsed entity - declaration. - - The argument \a name is the unparsed entity's name, \a publicId is - the entity's public identifier, \a systemId is the entity's system - identifier and \a notationName is the name of the associated - notation. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn TQString TQXmlDTDHandler::errorString() - - The reader calls this function to get an error string if any of - the handler functions returns FALSE. -*/ - - -/*! - \class TQXmlEntityResolver tqxml.h - \reentrant - \brief The TQXmlEntityResolver class provides an interface to - resolve external entities contained in XML data. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - If an application needs to implement customized handling for - external entities, it must implement this interface, i.e. - resolveEntity(), and register it with - TQXmlReader::setEntityResolver(). - - See also the \link xml.html#sax2Intro Introduction to SAX2\endlink. - - \sa TQXmlDTDHandler TQXmlDeclHandler TQXmlContentHandler TQXmlErrorHandler - TQXmlLexicalHandler -*/ - -/*! - \fn bool TQXmlEntityResolver::resolveEntity( const TQString& publicId, const TQString& systemId, TQXmlInputSource*& ret ) - - The reader calls this function before it opens any external - entity, except the top-level document entity. The application may - request the reader to resolve the entity itself (\a ret is 0) or - to use an entirely different input source (\a ret points to the - input source). - - The reader deletes the input source \a ret when it no longer needs - it, so you should allocate it on the heap with \c new. - - The argument \a publicId is the public identifier of the external - entity, \a systemId is the system identifier of the external - entity and \a ret is the return value of this function. If \a ret - is 0 the reader should resolve the entity itself, if it is - non-zero it must point to an input source which the reader uses - instead. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn TQString TQXmlEntityResolver::errorString() - - The reader calls this function to get an error string if any of - the handler functions returns FALSE. -*/ - - -/*! - \class TQXmlLexicalHandler tqxml.h - \reentrant - \brief The TQXmlLexicalHandler class provides an interface to - report the lexical content of XML data. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - The events in the lexical handler apply to the entire document, - not just to the document element, and all lexical handler events - appear between the content handler's startDocument and endDocument - events. - - You can set the lexical handler with - TQXmlReader::setLexicalHandler(). - - This interface's design is based on the the SAX2 extension - LexicalHandler. - - The interface provides the startDTD(), endDTD(), startEntity(), - endEntity(), startCDATA(), endCDATA() and comment() functions. - - See also the \link xml.html#sax2Intro Introduction to SAX2\endlink. - - \sa TQXmlDTDHandler TQXmlDeclHandler TQXmlContentHandler TQXmlEntityResolver - TQXmlErrorHandler -*/ - -/*! - \fn bool TQXmlLexicalHandler::startDTD( const TQString& name, const TQString& publicId, const TQString& systemId ) - - The reader calls this function to report the start of a DTD - declaration, if any. It reports the name of the document type in - \a name, the public identifier in \a publicId and the system - identifier in \a systemId. - - If the public identifier is missing, \a publicId is set to - TQString::null. If the system identifier is missing, \a systemId is - set to TQString::null. Note that it is not valid XML to have a - public identifier but no system identifier; in such cases a parse - error will occur. - - All declarations reported through TQXmlDTDHandler or - TQXmlDeclHandler appear between the startDTD() and endDTD() calls. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - \sa endDTD() -*/ - -/*! - \fn bool TQXmlLexicalHandler::endDTD() - - The reader calls this function to report the end of a DTD - declaration, if any. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - \sa startDTD() -*/ - -/*! - \fn bool TQXmlLexicalHandler::startEntity( const TQString& name ) - - The reader calls this function to report the start of an entity - called \a name. - - Note that if the entity is unknown, the reader reports it through - TQXmlContentHandler::skippedEntity() and not through this - function. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - \sa endEntity() TQXmlSimpleReader::setFeature() -*/ - -/*! - \fn bool TQXmlLexicalHandler::endEntity( const TQString& name ) - - The reader calls this function to report the end of an entity - called \a name. - - For every startEntity() call, there is a corresponding endEntity() - call. The calls to startEntity() and endEntity() are properly - nested. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - \sa startEntity() TQXmlContentHandler::skippedEntity() TQXmlSimpleReader::setFeature() -*/ - -/*! - \fn bool TQXmlLexicalHandler::startCDATA() - - The reader calls this function to report the start of a CDATA - section. The content of the CDATA section is reported through the - TQXmlContentHandler::characters() function. This function is - intended only to report the boundary. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. - - \sa endCDATA() -*/ - -/*! - \fn bool TQXmlLexicalHandler::endCDATA() - - The reader calls this function to report the end of a CDATA - section. - - If this function returns FALSE the reader stops parsing and reports - an error. The reader uses the function errorString() to get the error - message. - - \sa startCDATA() TQXmlContentHandler::characters() -*/ - -/*! - \fn bool TQXmlLexicalHandler::comment( const TQString& ch ) - - The reader calls this function to report an XML comment anywhere - in the document. It reports the text of the comment in \a ch. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn TQString TQXmlLexicalHandler::errorString() - - The reader calls this function to get an error string if any of - the handler functions returns FALSE. -*/ - - -/*! - \class TQXmlDeclHandler tqxml.h - \reentrant - \brief The TQXmlDeclHandler class provides an interface to report declaration - content of XML data. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - You can set the declaration handler with - TQXmlReader::setDeclHandler(). - - This interface is based on the SAX2 extension DeclHandler. - - The interface provides attributeDecl(), internalEntityDecl() and - externalEntityDecl() functions. - - See also the \link xml.html#sax2Intro Introduction to SAX2\endlink. - - \sa TQXmlDTDHandler TQXmlContentHandler TQXmlEntityResolver TQXmlErrorHandler - TQXmlLexicalHandler -*/ - -/*! - \fn bool TQXmlDeclHandler::attributeDecl( const TQString& eName, const TQString& aName, const TQString& type, const TQString& valueDefault, const TQString& value ) - - The reader calls this function to report an attribute type - declaration. Only the effective (first) declaration for an - attribute is reported. - - The reader passes the name of the associated element in \a eName - and the name of the attribute in \a aName. It passes a string that - represents the attribute type in \a type and a string that - represents the attribute default in \a valueDefault. This string - is one of "#IMPLIED", "#RETQUIRED", "#FIXED" or TQString::null (if - none of the others applies). The reader passes the attribute's - default value in \a value. If no default value is specified in the - XML file, \a value is TQString::null. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlDeclHandler::internalEntityDecl( const TQString& name, const TQString& value ) - - The reader calls this function to report an internal entity - declaration. Only the effective (first) declaration is reported. - - The reader passes the name of the entity in \a name and the value - of the entity in \a value. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn bool TQXmlDeclHandler::externalEntityDecl( const TQString& name, const TQString& publicId, const TQString& systemId ) - - The reader calls this function to report a parsed external entity - declaration. Only the effective (first) declaration for each - entity is reported. - - The reader passes the name of the entity in \a name, the public - identifier in \a publicId and the system identifier in \a - systemId. If there is no public identifier specified, it passes - TQString::null in \a publicId. - - If this function returns FALSE the reader stops parsing and - reports an error. The reader uses the function errorString() to - get the error message. -*/ - -/*! - \fn TQString TQXmlDeclHandler::errorString() - - The reader calls this function to get an error string if any of - the handler functions returns FALSE. -*/ - - -/*! - \class TQXmlDefaultHandler tqxml.h - \reentrant - \brief The TQXmlDefaultHandler class provides a default implementation of all - the XML handler classes. -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - Very often we are only interested in parts of the things that the - reader reports. This class implements a default behaviour for the - handler classes (i.e. most of the time do nothing). Usually this - is the class you subclass for implementing your own customized - handler. - - See also the \link xml.html#sax2Intro Introduction to SAX2\endlink. - - \sa TQXmlDTDHandler TQXmlDeclHandler TQXmlContentHandler TQXmlEntityResolver - TQXmlErrorHandler TQXmlLexicalHandler -*/ - -/*! - \fn TQXmlDefaultHandler::TQXmlDefaultHandler() - - Constructor. -*/ -/*! - \fn TQXmlDefaultHandler::~TQXmlDefaultHandler() - - Destructor. -*/ - -/*! - \reimp - - Does nothing. -*/ -void TQXmlDefaultHandler::setDocumentLocator( TQXmlLocator* ) -{ -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::startDocument() -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::endDocument() -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::startPrefixMapping( const TQString&, const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::endPrefixMapping( const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::startElement( const TQString&, const TQString&, - const TQString&, const TQXmlAttributes& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::endElement( const TQString&, const TQString&, - const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::characters( const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::ignorableWhitespace( const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::processingInstruction( const TQString&, - const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::skippedEntity( const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::warning( const TQXmlParseException& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::error( const TQXmlParseException& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::fatalError( const TQXmlParseException& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::notationDecl( const TQString&, const TQString&, - const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::unparsedEntityDecl( const TQString&, const TQString&, - const TQString&, const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Sets \a ret to 0, so that the reader uses the system identifier - provided in the XML document. -*/ -bool TQXmlDefaultHandler::resolveEntity( const TQString&, const TQString&, - TQXmlInputSource*& ret ) -{ - ret = 0; - return TRUE; -} - -/*! - \reimp - - Returns the default error string. -*/ -TQString TQXmlDefaultHandler::errorString() -{ - return TQString( XMLERR_ERRORBYCONSUMER ); -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::startDTD( const TQString&, const TQString&, const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::endDTD() -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::startEntity( const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::endEntity( const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::startCDATA() -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::endCDATA() -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::comment( const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::attributeDecl( const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::internalEntityDecl( const TQString&, const TQString& ) -{ - return TRUE; -} - -/*! - \reimp - - Does nothing. -*/ -bool TQXmlDefaultHandler::externalEntityDecl( const TQString&, const TQString&, const TQString& ) -{ - return TRUE; -} - - -/********************************************* - * - * TQXmlSimpleReaderPrivate - * - *********************************************/ - -class TQXmlSimpleReaderPrivate -{ -private: - // functions - inline TQXmlSimpleReaderPrivate() - { - parseStack = 0; - undefEntityInAttrHack = FALSE; - } - - inline ~TQXmlSimpleReaderPrivate() - { - delete parseStack; - } - - inline void initIncrementalParsing() - { - delete parseStack; - parseStack = new TQValueStack<ParseState>; - } - - // used to determine if elements are correctly nested - TQValueStack<TQString> tags; - - // used for entity declarations - struct ExternParameterEntity - { - ExternParameterEntity( ) {} - ExternParameterEntity( const TQString &p, const TQString &s ) - : publicId(p), systemId(s) {} - TQString publicId; - TQString systemId; - - TQ_DUMMY_COMPARISON_OPERATOR(ExternParameterEntity) - }; - struct ExternEntity - { - ExternEntity( ) {} - ExternEntity( const TQString &p, const TQString &s, const TQString &n ) - : publicId(p), systemId(s), notation(n) {} - TQString publicId; - TQString systemId; - TQString notation; - TQ_DUMMY_COMPARISON_OPERATOR(ExternEntity) - }; - TQMap<TQString,ExternParameterEntity> externParameterEntities; - TQMap<TQString,TQString> parameterEntities; - TQMap<TQString,ExternEntity> externEntities; - TQMap<TQString,TQString> entities; - - // used for parsing of entity references - TQValueStack<TQString> xmlRef; - TQValueStack<TQString> xmlRefName; - - // used for standalone declaration - enum Standalone { Yes, No, Unknown }; - - TQString doctype; // only used for the doctype - TQString xmlVersion; // only used to store the version information - TQString encoding; // only used to store the encoding - Standalone standalone; // used to store the value of the standalone declaration - - TQString publicId; // used by parseExternalID() to store the public ID - TQString systemId; // used by parseExternalID() to store the system ID - TQString attDeclEName; // use by parseAttlistDecl() - TQString attDeclAName; // use by parseAttlistDecl() - - // flags for some features support - bool useNamespaces; - bool useNamespacePrefixes; - bool reportWhitespaceCharData; - bool reportEntities; - - // used to build the attribute list - TQXmlAttributes attList; - - // used in TQXmlSimpleReader::parseContent() to decide whether character - // data was read - bool contentCharDataRead; - - // helper classes - TQXmlLocator *locator; - TQXmlNamespaceSupport namespaceSupport; - - // error string - TQString error; - - // arguments for parse functions (this is needed to allow incremental - // parsing) - bool parsePI_xmldecl; - bool parseName_useRef; - bool parseReference_charDataRead; - TQXmlSimpleReader::EntityRecognitionContext parseReference_context; - bool parseExternalID_allowPublicID; - TQXmlSimpleReader::EntityRecognitionContext parsePEReference_context; - TQString parseString_s; - - // for incremental parsing - struct ParseState { - typedef bool (TQXmlSimpleReader::*ParseFunction) (); - ParseFunction function; - int state; - }; - TQValueStack<ParseState> *parseStack; - - // used in parseProlog() - bool xmldecl_possible; - bool doctype_read; - - // used in parseDoctype() - bool startDTDwasReported; - - // used in parseString() - signed char Done; - - bool undefEntityInAttrHack; - - int nameValueLen; - int refValueLen; - int stringValueLen; - - // friend declarations - friend class TQXmlSimpleReader; -}; - - -/********************************************* - * - * TQXmlSimpleReader - * - *********************************************/ - -/*! - \class TQXmlReader tqxml.h - \reentrant - \brief The TQXmlReader class provides an interface for XML readers (i.e. - parsers). -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - - This abstract class provides an interface for all of TQt's XML - readers. Currently there is only one implementation of a reader - included in TQt's XML module: TQXmlSimpleReader. In future releases - there might be more readers with different properties available - (e.g. a validating parser). - - The design of the XML classes follows the \link - http://www.saxproject.org/ SAX2 Java interface\endlink, with - the names adapted to fit TQt naming conventions. It should be very - easy for anybody who has worked with SAX2 to get started with the - TQt XML classes. - - All readers use the class TQXmlInputSource to read the input - document. Since you are normally interested in particular content - in the XML document, the reader reports the content through - special handler classes (TQXmlDTDHandler, TQXmlDeclHandler, - TQXmlContentHandler, TQXmlEntityResolver, TQXmlErrorHandler and - TQXmlLexicalHandler), which you must subclass, if you want to - process the contents. - - Since the handler classes only describe interfaces you must - implement all the functions. We provide the TQXmlDefaultHandler - class to make this easier: it implements a default behaviour (do - nothing) for all functions, so you can subclass it and just - implement the functions you are interested in. - - Features and properties of the reader can be set with setFeature() - and setProperty() respectively. You can set the reader to use your - own subclasses with setEntityResolver(), setDTDHandler(), - setContentHandler(), setErrorHandler(), setLexicalHandler() and - setDeclHandler(). The parse itself is started with a call to - parse(). - - \sa TQXmlSimpleReader -*/ - -/*! - \fn bool TQXmlReader::feature( const TQString& name, bool *ok ) const - - If the reader has the feature called \a name, the feature's value - is returned. If no such feature exists the return value is - undefined. - - If \a ok is not 0: \a *ok is set to TRUE if the reader has the - feature called \a name; otherwise \a *ok is set to FALSE. - - \sa setFeature() hasFeature() -*/ - -/*! - \fn void TQXmlReader::setFeature( const TQString& name, bool value ) - - Sets the feature called \a name to the given \a value. If the - reader doesn't have the feature nothing happens. - - \sa feature() hasFeature() -*/ - -/*! - \fn bool TQXmlReader::hasFeature( const TQString& name ) const - - Returns \c TRUE if the reader has the feature called \a name; - otherwise returns FALSE. - - \sa feature() setFeature() -*/ - -/*! - \fn void* TQXmlReader::property( const TQString& name, bool *ok ) const - - If the reader has the property \a name, this function returns the - value of the property; otherwise the return value is undefined. - - If \a ok is not 0: if the reader has the \a name property \a *ok - is set to TRUE; otherwise \a *ok is set to FALSE. - - \sa setProperty() hasProperty() -*/ - -/*! - \fn void TQXmlReader::setProperty( const TQString& name, void* value ) - - Sets the property \a name to \a value. If the reader doesn't have - the property nothing happens. - - \sa property() hasProperty() -*/ - -/*! - \fn bool TQXmlReader::hasProperty( const TQString& name ) const - - Returns TRUE if the reader has the property \a name; otherwise - returns FALSE. - - \sa property() setProperty() -*/ - -/*! - \fn void TQXmlReader::setEntityResolver( TQXmlEntityResolver* handler ) - - Sets the entity resolver to \a handler. - - \sa entityResolver() -*/ - -/*! - \fn TQXmlEntityResolver* TQXmlReader::entityResolver() const - - Returns the entity resolver or 0 if none was set. - - \sa setEntityResolver() -*/ - -/*! - \fn void TQXmlReader::setDTDHandler( TQXmlDTDHandler* handler ) - - Sets the DTD handler to \a handler. - - \sa DTDHandler() -*/ - -/*! - \fn TQXmlDTDHandler* TQXmlReader::DTDHandler() const - - Returns the DTD handler or 0 if none was set. - - \sa setDTDHandler() -*/ - -/*! - \fn void TQXmlReader::setContentHandler( TQXmlContentHandler* handler ) - - Sets the content handler to \a handler. - - \sa contentHandler() -*/ - -/*! - \fn TQXmlContentHandler* TQXmlReader::contentHandler() const - - Returns the content handler or 0 if none was set. - - \sa setContentHandler() -*/ - -/*! - \fn void TQXmlReader::setErrorHandler( TQXmlErrorHandler* handler ) - - Sets the error handler to \a handler. Clears the error handler if - \a handler is 0. - - \sa errorHandler() -*/ - -/*! - \fn TQXmlErrorHandler* TQXmlReader::errorHandler() const - - Returns the error handler or 0 if none is set. - - \sa setErrorHandler() -*/ - -/*! - \fn void TQXmlReader::setLexicalHandler( TQXmlLexicalHandler* handler ) - - Sets the lexical handler to \a handler. - - \sa lexicalHandler() -*/ - -/*! - \fn TQXmlLexicalHandler* TQXmlReader::lexicalHandler() const - - Returns the lexical handler or 0 if none was set. - - \sa setLexicalHandler() -*/ - -/*! - \fn void TQXmlReader::setDeclHandler( TQXmlDeclHandler* handler ) - - Sets the declaration handler to \a handler. - - \sa declHandler() -*/ - -/*! - \fn TQXmlDeclHandler* TQXmlReader::declHandler() const - - Returns the declaration handler or 0 if none was set. - - \sa setDeclHandler() -*/ - -/*! - \fn bool TQXmlReader::parse( const TQXmlInputSource& input ) - - \obsolete -*/ - -/*! - \fn bool TQXmlReader::parse( const TQXmlInputSource* input ) - - Reads an XML document from \a input and parses it. Returns TRUE if - the parsing was successful; otherwise returns FALSE. -*/ - - -/*! - \class TQXmlSimpleReader tqxml.h - \reentrant - \brief The TQXmlSimpleReader class provides an implementation of a - simple XML reader (parser). -\if defined(commercial) - It is part of the <a href="commercialeditions.html">TQt Enterprise Edition</a>. -\endif - - \module XML - \ingroup xml-tools - \mainclass - - This XML reader is sufficient for simple parsing tasks. The reader: - \list - \i provides a well-formed parser; - \i does not parse any external entities; - \i can do namespace processing. - \endlist - - Documents are parsed with a call to parse(). - -*/ - -static inline bool is_S(TQChar ch) -{ - ushort uc = ch.tqunicode(); - return (uc == ' ' || uc == '\t' || uc == '\n' || uc == '\r'); -} - -enum NameChar { NameBeginning, NameNotBeginning, NotName }; - -static const char Begi = (char)NameBeginning; -static const char NtBg = (char)NameNotBeginning; -static const char NotN = (char)NotName; - -static const char nameCharTable[128] = -{ -// 0x00 - NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN, - NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN, -// 0x10 - NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN, - NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN, -// 0x20 (0x2D is '-', 0x2E is '.') - NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN, - NotN, NotN, NotN, NotN, NotN, NtBg, NtBg, NotN, -// 0x30 (0x30..0x39 are '0'..'9', 0x3A is ':') - NtBg, NtBg, NtBg, NtBg, NtBg, NtBg, NtBg, NtBg, - NtBg, NtBg, Begi, NotN, NotN, NotN, NotN, NotN, -// 0x40 (0x41..0x5A are 'A'..'Z') - NotN, Begi, Begi, Begi, Begi, Begi, Begi, Begi, - Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi, -// 0x50 (0x5F is '_') - Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi, - Begi, Begi, Begi, NotN, NotN, NotN, NotN, Begi, -// 0x60 (0x61..0x7A are 'a'..'z') - NotN, Begi, Begi, Begi, Begi, Begi, Begi, Begi, - Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi, -// 0x70 - Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi, - Begi, Begi, Begi, NotN, NotN, NotN, NotN, NotN -}; - -static inline NameChar fastDetermineNameChar(TQChar ch) -{ - ushort uc = ch.tqunicode(); - if (!(uc & ~0x7f)) // uc < 128 - return (NameChar)nameCharTable[uc]; - - TQChar::Category cat = ch.category(); - // ### some these categories might be slightly wrong - if ((cat >= TQChar::Letter_Uppercase && cat <= TQChar::Letter_Other) - || cat == TQChar::Number_Letter) - return NameBeginning; - if ((cat >= TQChar::Number_DecimalDigit && cat <= TQChar::Number_Other) - || (cat >= TQChar::Mark_NonSpacing && cat <= TQChar::Mark_Enclosing)) - return NameNotBeginning; - return NotName; -} - -static NameChar determineNameChar(TQChar ch) -{ - return fastDetermineNameChar(ch); -} - -inline void TQXmlSimpleReader::nameClear() -{ - d->nameValueLen = 0; nameArrayPos = 0; -} - -inline void TQXmlSimpleReader::refClear() -{ - d->refValueLen = 0; refArrayPos = 0; -} - -/*! - Constructs a simple XML reader with the following feature settings: - \table - \header \i Feature \i Setting - \row \i \e http://xml.org/sax/features/namespaces \i TRUE - \row \i \e http://xml.org/sax/features/namespace-prefixes \i FALSE - \row \i \e http://trolltech.com/xml/features/report-whitespace-only-CharData - \i TRUE - \row \i \e http://trolltech.com/xml/features/report-start-end-entity \i FALSE - \endtable - - More information about features can be found in the \link - xml.html#sax2Features TQt SAX2 overview. \endlink - - \sa setFeature() -*/ - -TQXmlSimpleReader::TQXmlSimpleReader() -{ - d = new TQXmlSimpleReaderPrivate(); - d->locator = new TQXmlSimpleReaderLocator( this ); - - entityRes = 0; - dtdHnd = 0; - contentHnd = 0; - errorHnd = 0; - lexicalHnd = 0; - declHnd = 0; - - // default feature settings - d->useNamespaces = TRUE; - d->useNamespacePrefixes = FALSE; - d->reportWhitespaceCharData = TRUE; - d->reportEntities = FALSE; -} - -/*! - Destroys the simple XML reader. -*/ -TQXmlSimpleReader::~TQXmlSimpleReader() -{ - delete d->locator; - delete d; -} - -/*! - \reimp -*/ -bool TQXmlSimpleReader::feature( const TQString& name, bool *ok ) const -{ - if ( ok != 0 ) - *ok = TRUE; - if ( name == "http://xml.org/sax/features/namespaces" ) { - return d->useNamespaces; - } else if ( name == "http://xml.org/sax/features/namespace-prefixes" ) { - return d->useNamespacePrefixes; - } else if ( name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) { - return d->reportWhitespaceCharData; - } else if ( name == "http://trolltech.com/xml/features/report-start-end-entity" ) { - return d->reportEntities; - } else { - qWarning( "Unknown feature %s", name.latin1() ); - if ( ok != 0 ) - *ok = FALSE; - } - return FALSE; -} - -/*! - Sets the state of the feature \a name to \a value: - - If the feature is not recognized, it is ignored. - - The following features are supported: - \table - \header \i Feature \i Notes - \row \i \e http://xml.org/sax/features/namespaces - \i If this feature is TRUE, namespace processing is - performed. - \row \i \e http://xml.org/sax/features/namespace-prefixes - \i If this feature is TRUE, the the original prefixed names - and attributes used for namespace declarations are - reported. - \row \i \e http://trolltech.com/xml/features/report-whitespace-only-CharData - \i If this feature is TRUE, CharData that only contain - whitespace are not ignored, but are reported via - TQXmlContentHandler::characters(). - \row \i \e http://trolltech.com/xml/features/report-start-end-entity - \i If this feature is TRUE, the parser reports - TQXmlContentHandler::startEntity() and - TQXmlContentHandler::endEntity() events. So character data - might be reported in chunks. If this feature is FALSE, the - parser does not report those events, but rather silently - substitutes the entities and reports the character data in - one chunk. - \endtable - - \quotefile xml/tagreader-with-features/tagreader.cpp - \skipto reader - \printline reader - \skipto setFeature - \printline setFeature - \printline TRUE - - (Code taken from xml/tagreader-with-features/tagreader.cpp) - - \sa feature() hasFeature() -*/ -void TQXmlSimpleReader::setFeature( const TQString& name, bool value ) -{ - if ( name == "http://xml.org/sax/features/namespaces" ) { - d->useNamespaces = value; - } else if ( name == "http://xml.org/sax/features/namespace-prefixes" ) { - d->useNamespacePrefixes = value; - } else if ( name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) { - d->reportWhitespaceCharData = value; - } else if ( name == "http://trolltech.com/xml/features/report-start-end-entity" ) { - d->reportEntities = value; - } else { - qWarning( "Unknown feature %s", name.latin1() ); - } -} - -/*! \reimp -*/ -bool TQXmlSimpleReader::hasFeature( const TQString& name ) const -{ - if ( name == "http://xml.org/sax/features/namespaces" - || name == "http://xml.org/sax/features/namespace-prefixes" - || name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" - || name == "http://trolltech.com/xml/features/report-start-end-entity" ) { - return TRUE; - } else { - return FALSE; - } -} - -/*! \reimp -*/ -void* TQXmlSimpleReader::property( const TQString&, bool *ok ) const -{ - if ( ok != 0 ) - *ok = FALSE; - return 0; -} - -/*! \reimp -*/ -void TQXmlSimpleReader::setProperty( const TQString&, void* ) -{ -} - -/*! - \reimp -*/ -bool TQXmlSimpleReader::hasProperty( const TQString& ) const -{ - return FALSE; -} - -/*! - \reimp -*/ -void TQXmlSimpleReader::setEntityResolver( TQXmlEntityResolver* handler ) -{ entityRes = handler; } - -/*! - \reimp -*/ -TQXmlEntityResolver* TQXmlSimpleReader::entityResolver() const -{ return entityRes; } - -/*! - \reimp -*/ -void TQXmlSimpleReader::setDTDHandler( TQXmlDTDHandler* handler ) -{ dtdHnd = handler; } - -/*! - \reimp -*/ -TQXmlDTDHandler* TQXmlSimpleReader::DTDHandler() const -{ return dtdHnd; } - -/*! - \reimp -*/ -void TQXmlSimpleReader::setContentHandler( TQXmlContentHandler* handler ) -{ contentHnd = handler; } - -/*! - \reimp -*/ -TQXmlContentHandler* TQXmlSimpleReader::contentHandler() const -{ return contentHnd; } - -/*! - \reimp -*/ -void TQXmlSimpleReader::setErrorHandler( TQXmlErrorHandler* handler ) -{ errorHnd = handler; } - -/*! - \reimp -*/ -TQXmlErrorHandler* TQXmlSimpleReader::errorHandler() const -{ return errorHnd; } - -/*! - \reimp -*/ -void TQXmlSimpleReader::setLexicalHandler( TQXmlLexicalHandler* handler ) -{ lexicalHnd = handler; } - -/*! - \reimp -*/ -TQXmlLexicalHandler* TQXmlSimpleReader::lexicalHandler() const -{ return lexicalHnd; } - -/*! - \reimp -*/ -void TQXmlSimpleReader::setDeclHandler( TQXmlDeclHandler* handler ) -{ declHnd = handler; } - -/*! - \reimp -*/ -TQXmlDeclHandler* TQXmlSimpleReader::declHandler() const -{ return declHnd; } - - - -/*! - \reimp -*/ -bool TQXmlSimpleReader::parse( const TQXmlInputSource& input ) -{ - return parse( &input, FALSE ); -} - -/*! - \reimp -*/ -bool TQXmlSimpleReader::parse( const TQXmlInputSource* input ) -{ - return parse( input, FALSE ); -} - -/*! - Reads an XML document from \a input and parses it. Returns FALSE - if the parsing detects an error; otherwise returns TRUE. - - If \a incremental is TRUE, the parser does not return FALSE when - it reaches the end of the \a input without reaching the end of the - XML file. Instead it stores the state of the parser so that - parsing can be continued at a later stage when more data is - available. You can use the function parseContinue() to continue - with parsing. This class stores a pointer to the input source \a - input and the parseContinue() function tries to read from that - input souce. This means that you should not delete the input - source \a input until you've finished your calls to - parseContinue(). If you call this function with \a incremental - TRUE whilst an incremental parse is in progress a new parsing - session will be started and the previous session lost. - - If \a incremental is FALSE, this function behaves like the normal - parse function, i.e. it returns FALSE when the end of input is - reached without reaching the end of the XML file and the parsing - cannot be continued. - - \sa parseContinue() TQSocket -*/ -bool TQXmlSimpleReader::parse( const TQXmlInputSource *input, bool incremental ) -{ - init( input ); - if ( incremental ) { - d->initIncrementalParsing(); - } else { - delete d->parseStack; - d->parseStack = 0; - } - // call the handler - if ( contentHnd ) { - contentHnd->setDocumentLocator( d->locator ); - if ( !contentHnd->startDocument() ) { - reportParseError( contentHnd->errorString() ); - d->tags.clear(); - return FALSE; - } - } - return parseBeginOrContinue( 0, incremental ); -} - -/*! - Continues incremental parsing; this function reads the input from - the TQXmlInputSource that was specified with the last parse() - command. To use this function, you \e must have called parse() - with the incremental argument set to TRUE. - - Returns FALSE if a parsing error occurs; otherwise returns TRUE. - - If the input source returns an empty string for the function - TQXmlInputSource::data(), then this means that the end of the XML - file has been reached; this is quite important, especially if you - want to use the reader to parse more than one XML file. - - The case of the end of the XML file being reached without having - finished parsing is not considered to be an error: you can - continue parsing at a later stage by calling this function again - when there is more data available to parse. - - This function assumes that the end of the XML document is reached - if the TQXmlInputSource::next() function returns - TQXmlInputSource::EndOfDocument. If the parser has not finished - parsing when it encounters this symbol, it is an error and FALSE - is returned. - - \sa parse() TQXmlInputSource::next() -*/ -bool TQXmlSimpleReader::parseContinue() -{ - if ( d->parseStack == 0 || d->parseStack->isEmpty() ) - return FALSE; - initData(); - int state = d->parseStack->pop().state; - return parseBeginOrContinue( state, TRUE ); -} - -/* - Common part of parse() and parseContinue() -*/ -bool TQXmlSimpleReader::parseBeginOrContinue( int state, bool incremental ) -{ - bool atEndOrig = atEnd(); - - if ( state==0 ) { - if ( !parseProlog() ) { - if ( incremental && d->error.isNull() ) { - pushParseState( 0, 0 ); - return TRUE; - } else { - d->tags.clear(); - return FALSE; - } - } - state = 1; - } - if ( state==1 ) { - if ( !parseElement() ) { - if ( incremental && d->error.isNull() ) { - pushParseState( 0, 1 ); - return TRUE; - } else { - d->tags.clear(); - return FALSE; - } - } - state = 2; - } - // parse Misc* - while ( !atEnd() ) { - if ( !parseMisc() ) { - if ( incremental && d->error.isNull() ) { - pushParseState( 0, 2 ); - return TRUE; - } else { - d->tags.clear(); - return FALSE; - } - } - } - if ( !atEndOrig && incremental ) { - // we parsed something at all, so be prepared to come back later - pushParseState( 0, 2 ); - return TRUE; - } - // is stack empty? - if ( !d->tags.isEmpty() && !d->error.isNull() ) { - reportParseError( XMLERR_UNEXPECTEDEOF ); - d->tags.clear(); - return FALSE; - } - // call the handler - if ( contentHnd ) { - delete d->parseStack; - d->parseStack = 0; - if ( !contentHnd->endDocument() ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - return TRUE; -} - -// -// The following private parse functions have another semantics for the return -// value: They return TRUE iff parsing has finished successfully (i.e. the end -// of the XML file must be reached!). If one of these functions return FALSE, -// there is only an error when d->error.isNULL() is also FALSE. -// - -/* - For the incremental parsing, it is very important that the parse...() - functions have a certain structure. Since it might be hard to understand how - they work, here is a description of the tqlayout of these functions: - - bool TQXmlSimpleReader::parse...() - { -(1) const signed char Init = 0; - ... - -(2) const signed char Inp... = 0; - ... - -(3) static signed char table[3][2] = { - ... - }; - signed char state; - signed char input; - -(4) if (d->parseStack == 0 || d->parseStack->isEmpty()) { -(4a) ... - } else { -(4b) ... - } - - for ( ; ; ) { -(5) switch ( state ) { - ... - } - -(6) -(6a) if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseNmtoken, state ); - return FALSE; - } -(6b) if (determineNameChar(c) != NotName) { - ... - } -(7) state = table[state][input]; - -(8) switch ( state ) { - ... - } - } - } - - Explanation: - ad 1: constants for the states (used in the transition table) - ad 2: constants for the input (used in the transition table) - ad 3: the transition table for the state machine - ad 4: test if we are in a parseContinue() step - a) if no, do inititalizations - b) if yes, restore the state and call parse functions recursively - ad 5: Do some actions according to the state; from the logical execution - order, this code belongs after 8 (see there for an explanation) - ad 6: Check the character that is at the actual "cursor" position: - a) If we reached the EOF, report either error or push the state (in the - case of incremental parsing). - b) Otherwise, set the input character constant for the transition - table. - ad 7: Get the new state according to the input that was read. - ad 8: Do some actions according to the state. The last line in every case - statement reads new data (i.e. it move the cursor). This can also be - done by calling another parse...() funtion. If you need processing for - this state after that, you have to put it into the switch statement 5. - This ensures that you have a well defined re-entry point, when you ran - out of data. -*/ - -/* - Parses the prolog [22]. -*/ -bool TQXmlSimpleReader::parseProlog() -{ - const signed char Init = 0; - const signed char EatWS = 1; // eat white spaces - const signed char Lt = 2; // '<' read - const signed char Em = 3; // '!' read - const signed char DocType = 4; // read doctype - const signed char Comment = 5; // read comment - const signed char CommentR = 6; // same as Comment, but already reported - const signed char PInstr = 7; // read PI - const signed char PInstrR = 8; // same as PInstr, but already reported - const signed char Done = 9; - - const signed char InpWs = 0; - const signed char InpLt = 1; // < - const signed char InpQm = 2; // ? - const signed char InpEm = 3; // ! - const signed char InpD = 4; // D - const signed char InpDash = 5; // - - const signed char InpUnknown = 6; - - static const signed char table[9][7] = { - /* InpWs InpLt InpQm InpEm InpD InpDash InpUnknown */ - { EatWS, Lt, -1, -1, -1, -1, -1 }, // Init - { -1, Lt, -1, -1, -1, -1, -1 }, // EatWS - { -1, -1, PInstr,Em, Done, -1, Done }, // Lt - { -1, -1, -1, -1, DocType, Comment, -1 }, // Em - { EatWS, Lt, -1, -1, -1, -1, -1 }, // DocType - { EatWS, Lt, -1, -1, -1, -1, -1 }, // Comment - { EatWS, Lt, -1, -1, -1, -1, -1 }, // CommentR - { EatWS, Lt, -1, -1, -1, -1, -1 }, // PInstr - { EatWS, Lt, -1, -1, -1, -1, -1 } // PInstrR - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - d->xmldecl_possible = TRUE; - d->doctype_read = FALSE; - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseProlog (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseProlog, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case DocType: - if ( d->doctype_read ) { - reportParseError( XMLERR_MORETHANONEDOCTYPE ); - return FALSE; - } else { - d->doctype_read = FALSE; - } - break; - case Comment: - if ( lexicalHnd ) { - if ( !lexicalHnd->comment( string() ) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - state = CommentR; - break; - case PInstr: - // call the handler - if ( contentHnd ) { - if ( d->xmldecl_possible && !d->xmlVersion.isEmpty() ) { - TQString value( "version = '" ); - value += d->xmlVersion; - value += "'"; - if ( !d->encoding.isEmpty() ) { - value += " encoding = '"; - value += d->encoding; - value += "'"; - } - if ( d->standalone == TQXmlSimpleReaderPrivate::Yes ) { - value += " standalone = 'yes'"; - } else if ( d->standalone == TQXmlSimpleReaderPrivate::No ) { - value += " standalone = 'no'"; - } - if ( !contentHnd->processingInstruction( "xml", value ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } else { - if ( !contentHnd->processingInstruction( name(), string() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } - // XML declaration only on first position possible - d->xmldecl_possible = FALSE; - state = PInstrR; - break; - case Done: - return TRUE; - case -1: - reportParseError( XMLERR_ERRORPARSINGELEMENT ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseProlog, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '<' ) { - input = InpLt; - } else if ( c.tqunicode() == '?' ) { - input = InpQm; - } else if ( c.tqunicode() == '!' ) { - input = InpEm; - } else if ( c.tqunicode() == 'D' ) { - input = InpD; - } else if ( c.tqunicode() == '-' ) { - input = InpDash; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case EatWS: - // XML declaration only on first position possible - d->xmldecl_possible = FALSE; - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseProlog, state ); - return FALSE; - } - break; - case Lt: - next(); - break; - case Em: - // XML declaration only on first position possible - d->xmldecl_possible = FALSE; - next(); - break; - case DocType: - if ( !parseDoctype() ) { - parseFailed( &TQXmlSimpleReader::parseProlog, state ); - return FALSE; - } - break; - case Comment: - case CommentR: - if ( !parseComment() ) { - parseFailed( &TQXmlSimpleReader::parseProlog, state ); - return FALSE; - } - break; - case PInstr: - case PInstrR: - d->parsePI_xmldecl = d->xmldecl_possible; - if ( !parsePI() ) { - parseFailed( &TQXmlSimpleReader::parseProlog, state ); - return FALSE; - } - break; - } - } -} - -/* - Parse an element [39]. - - Precondition: the opening '<' is already read. -*/ -bool TQXmlSimpleReader::parseElement() -{ - const int Init = 0; - const int ReadName = 1; - const int Ws1 = 2; - const int STagEnd = 3; - const int STagEnd2 = 4; - const int ETagBegin = 5; - const int ETagBegin2 = 6; - const int Ws2 = 7; - const int EmptyTag = 8; - const int Attrib = 9; - const int AttribPro = 10; // like Attrib, but processAttribute was already called - const int Ws3 = 11; - const int Done = 12; - - const int InpWs = 0; // whitespace - const int InpNameBe = 1; // is_NameBeginning() - const int InpGt = 2; // > - const int InpSlash = 3; // / - const int InpUnknown = 4; - - static const int table[12][5] = { - /* InpWs InpNameBe InpGt InpSlash InpUnknown */ - { -1, ReadName, -1, -1, -1 }, // Init - { Ws1, Attrib, STagEnd, EmptyTag, -1 }, // ReadName - { -1, Attrib, STagEnd, EmptyTag, -1 }, // Ws1 - { STagEnd2, STagEnd2, STagEnd2, STagEnd2, STagEnd2 }, // STagEnd - { -1, -1, -1, ETagBegin, -1 }, // STagEnd2 - { -1, ETagBegin2, -1, -1, -1 }, // ETagBegin - { Ws2, -1, Done, -1, -1 }, // ETagBegin2 - { -1, -1, Done, -1, -1 }, // Ws2 - { -1, -1, Done, -1, -1 }, // EmptyTag - { Ws3, Attrib, STagEnd, EmptyTag, -1 }, // Attrib - { Ws3, Attrib, STagEnd, EmptyTag, -1 }, // AttribPro - { -1, Attrib, STagEnd, EmptyTag, -1 } // Ws3 - }; - int state; - int input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseElement (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseElement, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case ReadName: - // store it on the stack - d->tags.push( name() ); - // empty the attributes - d->attList.clear(); - if ( d->useNamespaces ) - d->namespaceSupport.pushContext(); - break; - case ETagBegin2: - if ( !processElementETagBegin2() ) - return FALSE; - break; - case Attrib: - if ( !processElementAttribute() ) - return FALSE; - state = AttribPro; - break; - case Done: - return TRUE; - case -1: - reportParseError( XMLERR_ERRORPARSINGELEMENT ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseElement, state ); - return FALSE; - } - - if (fastDetermineNameChar(c) == NameBeginning) { - input = InpNameBe; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else if (is_S(c)) { - input = InpWs; - } else if (c.tqunicode() == '/') { - input = InpSlash; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case ReadName: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseElement, state ); - return FALSE; - } - break; - case Ws1: - case Ws2: - case Ws3: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElement, state ); - return FALSE; - } - break; - case STagEnd: - // call the handler - if ( contentHnd ) { - const TQString &tagsTop = d->tags.top(); - if ( d->useNamespaces ) { - TQString uri, lname; - d->namespaceSupport.processName(tagsTop, FALSE, uri, lname); - if (!contentHnd->startElement(uri, lname, tagsTop, d->attList)) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } else { - if (!contentHnd->startElement(TQString::null, TQString::null, tagsTop, d->attList)) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } - next(); - break; - case STagEnd2: - if ( !parseContent() ) { - parseFailed( &TQXmlSimpleReader::parseElement, state ); - return FALSE; - } - break; - case ETagBegin: - next(); - break; - case ETagBegin2: - // get the name of the tag - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseElement, state ); - return FALSE; - } - break; - case EmptyTag: - if ( d->tags.isEmpty() ) { - reportParseError( XMLERR_TAGMISMATCH ); - return FALSE; - } - if ( !processElementEmptyTag() ) - return FALSE; - next(); - break; - case Attrib: - case AttribPro: - // get name and value of attribute - if ( !parseAttribute() ) { - parseFailed( &TQXmlSimpleReader::parseElement, state ); - return FALSE; - } - break; - case Done: - next(); - break; - } - } -} -/* - Helper to break down the size of the code in the case statement. - Return FALSE on error, otherwise TRUE. -*/ -bool TQXmlSimpleReader::processElementEmptyTag() -{ - TQString uri, lname; - // pop the stack and call the handler - if ( contentHnd ) { - if ( d->useNamespaces ) { - // report startElement first... - d->namespaceSupport.processName( d->tags.top(), FALSE, uri, lname ); - if ( !contentHnd->startElement( uri, lname, d->tags.top(), d->attList ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - // ... followed by endElement... - if ( !contentHnd->endElement( uri, lname, d->tags.pop() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - // ... followed by endPrefixMapping - TQStringList prefixesBefore, prefixesAfter; - if ( contentHnd ) { - prefixesBefore = d->namespaceSupport.prefixes(); - } - d->namespaceSupport.popContext(); - // call the handler for prefix mapping - prefixesAfter = d->namespaceSupport.prefixes(); - for ( TQStringList::Iterator it = prefixesBefore.begin(); it != prefixesBefore.end(); ++it ) { - if ( prefixesAfter.contains(*it) == 0 ) { - if ( !contentHnd->endPrefixMapping( *it ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } - } else { - // report startElement first... - if ( !contentHnd->startElement( TQString::null, TQString::null, d->tags.top(), d->attList ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - // ... followed by endElement - if ( !contentHnd->endElement( TQString::null, TQString::null, d->tags.pop() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } else { - d->tags.pop_back(); - d->namespaceSupport.popContext(); - } - return TRUE; -} -/* - Helper to break down the size of the code in the case statement. - Return FALSE on error, otherwise TRUE. -*/ -bool TQXmlSimpleReader::processElementETagBegin2() -{ - const TQString &name = TQXmlSimpleReader::name(); - - // pop the stack and compare it with the name - if ( d->tags.pop() != name ) { - reportParseError( XMLERR_TAGMISMATCH ); - return FALSE; - } - // call the handler - if ( contentHnd ) { - TQString uri, lname; - - if (d->useNamespaces) - d->namespaceSupport.processName(name, FALSE, uri, lname); - if (!contentHnd->endElement(uri, lname, name)) { - reportParseError(contentHnd->errorString()); - return FALSE; - } - } - if ( d->useNamespaces ) { - NamespaceMap prefixesBefore, prefixesAfter; - if (contentHnd) - prefixesBefore = d->namespaceSupport.d->ns; - - d->namespaceSupport.popContext(); - // call the handler for prefix mapping - if ( contentHnd ) { - prefixesAfter = d->namespaceSupport.d->ns; - if (prefixesBefore.size() != prefixesAfter.size()) { - for (NamespaceMap::const_iterator it = prefixesBefore.constBegin(); it != prefixesBefore.constEnd(); ++it) { - if (!it.key().isEmpty() && !prefixesAfter.contains(it.key())) { - if (!contentHnd->endPrefixMapping(it.key())) { - reportParseError(contentHnd->errorString()); - return FALSE; - } - } - } - } - } - } - return TRUE; -} -/* - Helper to break down the size of the code in the case statement. - Return FALSE on error, otherwise TRUE. -*/ -bool TQXmlSimpleReader::processElementAttribute() -{ - TQString uri, lname, prefix; - const TQString &name = TQXmlSimpleReader::name(); - const TQString &string = TQXmlSimpleReader::string(); - - // add the attribute to the list - if ( d->useNamespaces ) { - // is it a namespace declaration? - d->namespaceSupport.splitName(name, prefix, lname); - if (prefix == "xmlns") { - // namespace declaration - d->namespaceSupport.setPrefix( lname, string ); - if ( d->useNamespacePrefixes ) { - // according to http://www.w3.org/2000/xmlns/, the "prefix" - // xmlns maps to the namespace name - // http://www.w3.org/2000/xmlns/ - d->attList.append( name, "http://www.w3.org/2000/xmlns/", lname, string ); - } - // call the handler for prefix mapping - if ( contentHnd ) { - if ( !contentHnd->startPrefixMapping( lname, string ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } else { - // no namespace delcaration - d->namespaceSupport.processName( name, TRUE, uri, lname ); - d->attList.append( name, uri, lname, string ); - } - } else { - // no namespace support - d->attList.append( name, TQString::null, TQString::null, string ); - } - return TRUE; -} - -/* - Parse a content [43]. - - A content is only used between tags. If a end tag is found the < is already - read and the head stand on the '/' of the end tag '</name>'. -*/ -bool TQXmlSimpleReader::parseContent() -{ - const signed char Init = 0; - const signed char ChD = 1; // CharData - const signed char ChD1 = 2; // CharData help state - const signed char ChD2 = 3; // CharData help state - const signed char Ref = 4; // Reference - const signed char Lt = 5; // '<' read - const signed char PInstr = 6; // PI - const signed char PInstrR = 7; // same as PInstr, but already reported - const signed char Elem = 8; // Element - const signed char Em = 9; // '!' read - const signed char Com = 10; // Comment - const signed char ComR = 11; // same as Com, but already reported - const signed char CDS = 12; // CDSect - const signed char CDS1 = 13; // read a CDSect - const signed char CDS2 = 14; // read a CDSect (help state) - const signed char CDS3 = 15; // read a CDSect (help state) - const signed char Done = 16; // finished reading content - - const signed char InpLt = 0; // < - const signed char InpGt = 1; // > - const signed char InpSlash = 2; // / - const signed char InpTQMark = 3; // ? - const signed char InpEMark = 4; // ! - const signed char InpAmp = 5; // & - const signed char InpDash = 6; // - - const signed char InpOpenB = 7; // [ - const signed char InpCloseB = 8; // ] - const signed char InpUnknown = 9; - - static const signed char mapCLT2FSMChar[] = { - InpUnknown, // white space - InpUnknown, // % - InpAmp, // & - InpGt, // > - InpLt, // < - InpSlash, // / - InpTQMark, // ? - InpEMark, // ! - InpDash, // - - InpCloseB, // ] - InpOpenB, // [ - InpUnknown, // = - InpUnknown, // " - InpUnknown, // ' - InpUnknown // unknown - }; - - static const signed char table[16][10] = { - /* InpLt InpGt InpSlash InpTQMark InpEMark InpAmp InpDash InpOpenB InpCloseB InpUnknown */ - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // Init - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // ChD - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD1 - { Lt, -1, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD2 - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Ref (same as Init) - { -1, -1, Done, PInstr, Em, -1, -1, -1, -1, Elem }, // Lt - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // PInstr (same as Init) - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // PInstrR - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Elem (same as Init) - { -1, -1, -1, -1, -1, -1, Com, CDS, -1, -1 }, // Em - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Com (same as Init) - { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // ComR - { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS - { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS1 - { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 }, // CDS2 - { CDS1, Init, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 } // CDS3 - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - d->contentCharDataRead = FALSE; - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseContent (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Ref: - if ( !d->contentCharDataRead) - d->contentCharDataRead = d->parseReference_charDataRead; - break; - case PInstr: - if ( contentHnd ) { - if ( !contentHnd->processingInstruction(name(),string()) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - state = PInstrR; - break; - case Com: - if ( lexicalHnd ) { - if ( !lexicalHnd->comment( string() ) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - state = ComR; - break; - case CDS: - stringClear(); - break; - case CDS2: - if ( !atEnd() && c.tqunicode() != ']' ) - stringAddC( ']' ); - break; - case CDS3: - // test if this skipping was legal - if ( !atEnd() ) { - if ( c.tqunicode() == '>' ) { - // the end of the CDSect - if ( lexicalHnd ) { - if ( !lexicalHnd->startCDATA() ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - if ( contentHnd ) { - if ( !contentHnd->characters( string() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - if ( lexicalHnd ) { - if ( !lexicalHnd->endCDATA() ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - } else if (c.tqunicode() == ']') { - // three or more ']' - stringAddC( ']' ); - } else { - // after ']]' comes another character - stringAddC( ']' ); - stringAddC( ']' ); - } - } - break; - case Done: - // call the handler for CharData - if ( contentHnd ) { - if ( d->contentCharDataRead ) { - if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) { - if ( !contentHnd->characters( string() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } - } - // Done - return TRUE; - case -1: - // Error - reportParseError( XMLERR_ERRORPARSINGCONTENT ); - return FALSE; - } - - // get input (use lookup-table instead of nested ifs for performance - // reasons) - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - if ( c.row() ) { - input = InpUnknown; - } else { - input = mapCLT2FSMChar[ charLookupTable[ c.cell() ] ]; - } - state = table[state][input]; - - switch ( state ) { - case Init: - // skip the ending '>' of a CDATASection - next(); - break; - case ChD: - // on first call: clear string - if ( !d->contentCharDataRead ) { - d->contentCharDataRead = TRUE; - stringClear(); - } - stringAddC(); - if ( d->reportEntities ) { - if ( !reportEndEntities() ) - return FALSE; - } - next(); - break; - case ChD1: - // on first call: clear string - if ( !d->contentCharDataRead ) { - d->contentCharDataRead = TRUE; - stringClear(); - } - stringAddC(); - if ( d->reportEntities ) { - if ( !reportEndEntities() ) - return FALSE; - } - next(); - break; - case ChD2: - stringAddC(); - if ( d->reportEntities ) { - if ( !reportEndEntities() ) - return FALSE; - } - next(); - break; - case Ref: - if ( !d->contentCharDataRead) { - // reference may be CharData; so clear string to be safe - stringClear(); - d->parseReference_context = InContent; - if ( !parseReference() ) { - parseFailed( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - } else { - if ( d->reportEntities ) { - // report character data in chunks - if ( contentHnd ) { - if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) { - if ( !contentHnd->characters( string() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } - stringClear(); - } - d->parseReference_context = InContent; - if ( !parseReference() ) { - parseFailed( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - } - break; - case Lt: - // call the handler for CharData - if ( contentHnd ) { - if ( d->contentCharDataRead ) { - if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) { - if ( !contentHnd->characters( string() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } - } - d->contentCharDataRead = FALSE; - next(); - break; - case PInstr: - case PInstrR: - d->parsePI_xmldecl = FALSE; - if ( !parsePI() ) { - parseFailed( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - break; - case Elem: - if ( !parseElement() ) { - parseFailed( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - break; - case Em: - next(); - break; - case Com: - case ComR: - if ( !parseComment() ) { - parseFailed( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - break; - case CDS: - d->parseString_s = "[CDATA["; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseContent, state ); - return FALSE; - } - break; - case CDS1: - stringAddC(); - next(); - break; - case CDS2: - // skip ']' - next(); - break; - case CDS3: - // skip ']'... - next(); - break; - } - } -} -bool TQXmlSimpleReader::reportEndEntities() -{ - int count = (int)d->xmlRef.count(); - while ( count != 0 && d->xmlRef.top().isEmpty() ) { - if ( contentHnd ) { - if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) { - if ( !contentHnd->characters( string() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } - stringClear(); - if ( lexicalHnd ) { - if ( !lexicalHnd->endEntity(d->xmlRefName.top()) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - d->xmlRef.pop_back(); - d->xmlRefName.pop_back(); - count--; - } - return TRUE; -} - -/* - Parse Misc [27]. -*/ -bool TQXmlSimpleReader::parseMisc() -{ - const signed char Init = 0; - const signed char Lt = 1; // '<' was read - const signed char Comment = 2; // read comment - const signed char eatWS = 3; // eat whitespaces - const signed char PInstr = 4; // read PI - const signed char Comment2 = 5; // read comment - - const signed char InpWs = 0; // S - const signed char InpLt = 1; // < - const signed char InpQm = 2; // ? - const signed char InpEm = 3; // ! - const signed char InpUnknown = 4; - - static const signed char table[3][5] = { - /* InpWs InpLt InpQm InpEm InpUnknown */ - { eatWS, Lt, -1, -1, -1 }, // Init - { -1, -1, PInstr,Comment, -1 }, // Lt - { -1, -1, -1, -1, Comment2 } // Comment - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseMisc (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseMisc, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case eatWS: - return TRUE; - case PInstr: - if ( contentHnd ) { - if ( !contentHnd->processingInstruction(name(),string()) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - return TRUE; - case Comment2: - if ( lexicalHnd ) { - if ( !lexicalHnd->comment( string() ) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - return TRUE; - case -1: - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseMisc, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '<' ) { - input = InpLt; - } else if ( c.tqunicode() == '?' ) { - input = InpQm; - } else if ( c.tqunicode() == '!' ) { - input = InpEm; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case eatWS: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseMisc, state ); - return FALSE; - } - break; - case Lt: - next(); - break; - case PInstr: - d->parsePI_xmldecl = FALSE; - if ( !parsePI() ) { - parseFailed( &TQXmlSimpleReader::parseMisc, state ); - return FALSE; - } - break; - case Comment: - next(); - break; - case Comment2: - if ( !parseComment() ) { - parseFailed( &TQXmlSimpleReader::parseMisc, state ); - return FALSE; - } - break; - } - } -} - -/* - Parse a processing instruction [16]. - - If xmldec is TRUE, it tries to parse a PI or a XML declaration [23]. - - Precondition: the beginning '<' of the PI is already read and the head stand - on the '?' of '<?'. - - If this funktion was successful, the head-position is on the first - character after the PI. -*/ -bool TQXmlSimpleReader::parsePI() -{ - const signed char Init = 0; - const signed char QmI = 1; // ? was read - const signed char Name = 2; // read Name - const signed char XMLDecl = 3; // read XMLDecl - const signed char Ws1 = 4; // eat ws after "xml" of XMLDecl - const signed char PInstr = 5; // read PI - const signed char Ws2 = 6; // eat ws after Name of PI - const signed char Version = 7; // read versionInfo - const signed char Ws3 = 8; // eat ws after versionInfo - const signed char EorSD = 9; // read EDecl or SDDecl - const signed char Ws4 = 10; // eat ws after EDecl or SDDecl - const signed char SD = 11; // read SDDecl - const signed char Ws5 = 12; // eat ws after SDDecl - const signed char ADone = 13; // almost done - const signed char Char = 14; // Char was read - const signed char Qm = 15; // Qm was read - const signed char Done = 16; // finished reading content - - const signed char InpWs = 0; // whitespace - const signed char InpNameBe = 1; // NameBeginning() - const signed char InpGt = 2; // > - const signed char InpQm = 3; // ? - const signed char InpUnknown = 4; - - static const signed char table[16][5] = { - /* InpWs, InpNameBe InpGt InpQm InpUnknown */ - { -1, -1, -1, QmI, -1 }, // Init - { -1, Name, -1, -1, -1 }, // QmI - { -1, -1, -1, -1, -1 }, // Name (this state is left not through input) - { Ws1, -1, -1, -1, -1 }, // XMLDecl - { -1, Version, -1, -1, -1 }, // Ws1 - { Ws2, -1, -1, Qm, -1 }, // PInstr - { Char, Char, Char, Qm, Char }, // Ws2 - { Ws3, -1, -1, ADone, -1 }, // Version - { -1, EorSD, -1, ADone, -1 }, // Ws3 - { Ws4, -1, -1, ADone, -1 }, // EorSD - { -1, SD, -1, ADone, -1 }, // Ws4 - { Ws5, -1, -1, ADone, -1 }, // SD - { -1, -1, -1, ADone, -1 }, // Ws5 - { -1, -1, Done, -1, -1 }, // ADone - { Char, Char, Char, Qm, Char }, // Char - { Char, Char, Done, Qm, Char }, // Qm - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parsePI (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parsePI, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Name: - // test what name was read and determine the next state - // (not very beautiful, I admit) - if ( name().lower() == "xml" ) { - if ( d->parsePI_xmldecl && name()=="xml" ) { - state = XMLDecl; - } else { - reportParseError( XMLERR_INVALIDNAMEFORPI ); - return FALSE; - } - } else { - state = PInstr; - stringClear(); - } - break; - case Version: - // get version (syntax like an attribute) - if ( name() != "version" ) { - reportParseError( XMLERR_VERSIONEXPECTED ); - return FALSE; - } - d->xmlVersion = string(); - break; - case EorSD: - // get the EDecl or SDDecl (syntax like an attribute) - if ( name() == "standalone" ) { - if ( string()=="yes" ) { - d->standalone = TQXmlSimpleReaderPrivate::Yes; - } else if ( string()=="no" ) { - d->standalone = TQXmlSimpleReaderPrivate::No; - } else { - reportParseError( XMLERR_WRONGVALUEFORSDECL ); - return FALSE; - } - } else if ( name() == "encoding" ) { - d->encoding = string(); - } else { - reportParseError( XMLERR_EDECLORSDDECLEXPECTED ); - return FALSE; - } - break; - case SD: - if ( name() != "standalone" ) { - reportParseError( XMLERR_SDDECLEXPECTED ); - return FALSE; - } - if ( string()=="yes" ) { - d->standalone = TQXmlSimpleReaderPrivate::Yes; - } else if ( string()=="no" ) { - d->standalone = TQXmlSimpleReaderPrivate::No; - } else { - reportParseError( XMLERR_WRONGVALUEFORSDECL ); - return FALSE; - } - break; - case Qm: - // test if the skipping was legal - if ( !atEnd() && c.tqunicode() != '>' ) - stringAddC( '?' ); - break; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parsePI, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if (determineNameChar(c) == NameBeginning) { - input = InpNameBe; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else if ( c.tqunicode() == '?' ) { - input = InpQm; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case QmI: - next(); - break; - case Name: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parsePI, state ); - return FALSE; - } - break; - case Ws1: - case Ws2: - case Ws3: - case Ws4: - case Ws5: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parsePI, state ); - return FALSE; - } - break; - case Version: - if ( !parseAttribute() ) { - parseFailed( &TQXmlSimpleReader::parsePI, state ); - return FALSE; - } - break; - case EorSD: - if ( !parseAttribute() ) { - parseFailed( &TQXmlSimpleReader::parsePI, state ); - return FALSE; - } - break; - case SD: - // get the SDDecl (syntax like an attribute) - if ( d->standalone != TQXmlSimpleReaderPrivate::Unknown ) { - // already parsed the standalone declaration - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - if ( !parseAttribute() ) { - parseFailed( &TQXmlSimpleReader::parsePI, state ); - return FALSE; - } - break; - case ADone: - next(); - break; - case Char: - stringAddC(); - next(); - break; - case Qm: - // skip the '?' - next(); - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a document type definition (doctypedecl [28]). - - Precondition: the beginning '<!' of the doctype is already read the head - stands on the 'D' of '<!DOCTYPE'. - - If this funktion was successful, the head-position is on the first - character after the document type definition. -*/ -bool TQXmlSimpleReader::parseDoctype() -{ - const signed char Init = 0; - const signed char Doctype = 1; // read the doctype - const signed char Ws1 = 2; // eat_ws - const signed char Doctype2 = 3; // read the doctype, part 2 - const signed char Ws2 = 4; // eat_ws - const signed char Sys = 5; // read SYSTEM or PUBLIC - const signed char Ws3 = 6; // eat_ws - const signed char MP = 7; // markupdecl or PEReference - const signed char MPR = 8; // same as MP, but already reported - const signed char PER = 9; // PERReference - const signed char Mup = 10; // markupdecl - const signed char Ws4 = 11; // eat_ws - const signed char MPE = 12; // end of markupdecl or PEReference - const signed char Done = 13; - - const signed char InpWs = 0; - const signed char InpD = 1; // 'D' - const signed char InpS = 2; // 'S' or 'P' - const signed char InpOB = 3; // [ - const signed char InpCB = 4; // ] - const signed char InpPer = 5; // % - const signed char InpGt = 6; // > - const signed char InpUnknown = 7; - - static const signed char table[13][8] = { - /* InpWs, InpD InpS InpOB InpCB InpPer InpGt InpUnknown */ - { -1, Doctype, -1, -1, -1, -1, -1, -1 }, // Init - { Ws1, -1, -1, -1, -1, -1, -1, -1 }, // Doctype - { -1, Doctype2, Doctype2, -1, -1, -1, -1, Doctype2 }, // Ws1 - { Ws2, -1, Sys, MP, -1, -1, Done, -1 }, // Doctype2 - { -1, -1, Sys, MP, -1, -1, Done, -1 }, // Ws2 - { Ws3, -1, -1, MP, -1, -1, Done, -1 }, // Sys - { -1, -1, -1, MP, -1, -1, Done, -1 }, // Ws3 - { -1, -1, -1, -1, MPE, PER, -1, Mup }, // MP - { -1, -1, -1, -1, MPE, PER, -1, Mup }, // MPR - { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // PER - { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // Mup - { -1, -1, -1, -1, MPE, PER, -1, Mup }, // Ws4 - { -1, -1, -1, -1, -1, -1, Done, -1 } // MPE - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - d->startDTDwasReported = FALSE; - d->systemId = TQString::null; - d->publicId = TQString::null; - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseDoctype (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Doctype2: - d->doctype = name(); - break; - case MP: - if ( !d->startDTDwasReported && lexicalHnd ) { - d->startDTDwasReported = TRUE; - if ( !lexicalHnd->startDTD( d->doctype, d->publicId, d->systemId ) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - state = MPR; - break; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_ERRORPARSINGDOCTYPE ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == 'D' ) { - input = InpD; - } else if ( c.tqunicode() == 'S' ) { - input = InpS; - } else if ( c.tqunicode() == 'P' ) { - input = InpS; - } else if ( c.tqunicode() == '[' ) { - input = InpOB; - } else if ( c.tqunicode() == ']' ) { - input = InpCB; - } else if ( c.tqunicode() == '%' ) { - input = InpPer; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Doctype: - d->parseString_s = "DOCTYPE"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case Ws1: - case Ws2: - case Ws3: - case Ws4: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case Doctype2: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case Sys: - d->parseExternalID_allowPublicID = FALSE; - if ( !parseExternalID() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case MP: - case MPR: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case PER: - d->parsePEReference_context = InDTD; - if ( !parsePEReference() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case Mup: - if ( !parseMarkupdecl() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case MPE: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseDoctype, state ); - return FALSE; - } - break; - case Done: - if ( lexicalHnd ) { - if ( !d->startDTDwasReported ) { - d->startDTDwasReported = TRUE; - if ( !lexicalHnd->startDTD( d->doctype, d->publicId, d->systemId ) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - if ( !lexicalHnd->endDTD() ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - next(); - break; - } - } -} - -/* - Parse a ExternalID [75]. - - If allowPublicID is TRUE parse ExternalID [75] or PublicID [83]. -*/ -bool TQXmlSimpleReader::parseExternalID() -{ - const signed char Init = 0; - const signed char Sys = 1; // parse 'SYSTEM' - const signed char SysWS = 2; // parse the whitespace after 'SYSTEM' - const signed char SysSQ = 3; // parse SystemLiteral with ' - const signed char SysSQ2 = 4; // parse SystemLiteral with ' - const signed char SysDQ = 5; // parse SystemLiteral with " - const signed char SysDQ2 = 6; // parse SystemLiteral with " - const signed char Pub = 7; // parse 'PUBLIC' - const signed char PubWS = 8; // parse the whitespace after 'PUBLIC' - const signed char PubSQ = 9; // parse PubidLiteral with ' - const signed char PubSQ2 = 10; // parse PubidLiteral with ' - const signed char PubDQ = 11; // parse PubidLiteral with " - const signed char PubDQ2 = 12; // parse PubidLiteral with " - const signed char PubE = 13; // finished parsing the PubidLiteral - const signed char PubWS2 = 14; // parse the whitespace after the PubidLiteral - const signed char PDone = 15; // done if allowPublicID is TRUE - const signed char Done = 16; - - const signed char InpSQ = 0; // ' - const signed char InpDQ = 1; // " - const signed char InpS = 2; // S - const signed char InpP = 3; // P - const signed char InpWs = 4; // white space - const signed char InpUnknown = 5; - - static const signed char table[15][6] = { - /* InpSQ InpDQ InpS InpP InpWs InpUnknown */ - { -1, -1, Sys, Pub, -1, -1 }, // Init - { -1, -1, -1, -1, SysWS, -1 }, // Sys - { SysSQ, SysDQ, -1, -1, -1, -1 }, // SysWS - { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ - { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ2 - { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ - { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ2 - { -1, -1, -1, -1, PubWS, -1 }, // Pub - { PubSQ, PubDQ, -1, -1, -1, -1 }, // PubWS - { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ - { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ2 - { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ - { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ2 - { PDone, PDone, PDone, PDone, PubWS2, PDone }, // PubE - { SysSQ, SysDQ, PDone, PDone, PDone, PDone } // PubWS2 - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - d->systemId = TQString::null; - d->publicId = TQString::null; - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseExternalID (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseExternalID, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case PDone: - if ( d->parseExternalID_allowPublicID ) { - d->publicId = string(); - return TRUE; - } else { - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseExternalID, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '\'' ) { - input = InpSQ; - } else if ( c.tqunicode() == '"' ) { - input = InpDQ; - } else if ( c.tqunicode() == 'S' ) { - input = InpS; - } else if ( c.tqunicode() == 'P' ) { - input = InpP; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Sys: - d->parseString_s = "SYSTEM"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseExternalID, state ); - return FALSE; - } - break; - case SysWS: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseExternalID, state ); - return FALSE; - } - break; - case SysSQ: - case SysDQ: - stringClear(); - next(); - break; - case SysSQ2: - case SysDQ2: - stringAddC(); - next(); - break; - case Pub: - d->parseString_s = "PUBLIC"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseExternalID, state ); - return FALSE; - } - break; - case PubWS: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseExternalID, state ); - return FALSE; - } - break; - case PubSQ: - case PubDQ: - stringClear(); - next(); - break; - case PubSQ2: - case PubDQ2: - stringAddC(); - next(); - break; - case PubE: - next(); - break; - case PubWS2: - d->publicId = string(); - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseExternalID, state ); - return FALSE; - } - break; - case Done: - d->systemId = string(); - next(); - break; - } - } -} - -/* - Parse a markupdecl [29]. -*/ -bool TQXmlSimpleReader::parseMarkupdecl() -{ - const signed char Init = 0; - const signed char Lt = 1; // < was read - const signed char Em = 2; // ! was read - const signed char CE = 3; // E was read - const signed char Qm = 4; // ? was read - const signed char Dash = 5; // - was read - const signed char CA = 6; // A was read - const signed char CEL = 7; // EL was read - const signed char CEN = 8; // EN was read - const signed char CN = 9; // N was read - const signed char Done = 10; - - const signed char InpLt = 0; // < - const signed char InpQm = 1; // ? - const signed char InpEm = 2; // ! - const signed char InpDash = 3; // - - const signed char InpA = 4; // A - const signed char InpE = 5; // E - const signed char InpL = 6; // L - const signed char InpN = 7; // N - const signed char InpUnknown = 8; - - static const signed char table[4][9] = { - /* InpLt InpQm InpEm InpDash InpA InpE InpL InpN InpUnknown */ - { Lt, -1, -1, -1, -1, -1, -1, -1, -1 }, // Init - { -1, Qm, Em, -1, -1, -1, -1, -1, -1 }, // Lt - { -1, -1, -1, Dash, CA, CE, -1, CN, -1 }, // Em - { -1, -1, -1, -1, -1, -1, CEL, CEN, -1 } // CE - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseMarkupdecl (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Qm: - if ( contentHnd ) { - if ( !contentHnd->processingInstruction(name(),string()) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - return TRUE; - case Dash: - if ( lexicalHnd ) { - if ( !lexicalHnd->comment( string() ) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - return TRUE; - case CA: - return TRUE; - case CEL: - return TRUE; - case CEN: - return TRUE; - case CN: - return TRUE; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - if ( c.tqunicode() == '<' ) { - input = InpLt; - } else if ( c.tqunicode() == '?' ) { - input = InpQm; - } else if ( c.tqunicode() == '!' ) { - input = InpEm; - } else if ( c.tqunicode() == '-' ) { - input = InpDash; - } else if ( c.tqunicode() == 'A' ) { - input = InpA; - } else if ( c.tqunicode() == 'E' ) { - input = InpE; - } else if ( c.tqunicode() == 'L' ) { - input = InpL; - } else if ( c.tqunicode() == 'N' ) { - input = InpN; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Lt: - next(); - break; - case Em: - next(); - break; - case CE: - next(); - break; - case Qm: - d->parsePI_xmldecl = FALSE; - if ( !parsePI() ) { - parseFailed( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - break; - case Dash: - if ( !parseComment() ) { - parseFailed( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - break; - case CA: - if ( !parseAttlistDecl() ) { - parseFailed( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - break; - case CEL: - if ( !parseElementDecl() ) { - parseFailed( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - break; - case CEN: - if ( !parseEntityDecl() ) { - parseFailed( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - break; - case CN: - if ( !parseNotationDecl() ) { - parseFailed( &TQXmlSimpleReader::parseMarkupdecl, state ); - return FALSE; - } - break; - } - } -} - -/* - Parse a PEReference [69] -*/ -bool TQXmlSimpleReader::parsePEReference() -{ - const signed char Init = 0; - const signed char Next = 1; - const signed char Name = 2; - const signed char NameR = 3; // same as Name, but already reported - const signed char Done = 4; - - const signed char InpSemi = 0; // ; - const signed char InpPer = 1; // % - const signed char InpUnknown = 2; - - static const signed char table[4][3] = { - /* InpSemi InpPer InpUnknown */ - { -1, Next, -1 }, // Init - { -1, -1, Name }, // Next - { Done, -1, -1 }, // Name - { Done, -1, -1 } // NameR - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parsePEReference (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parsePEReference, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Name: - { - bool skipIt = TRUE; - TQString xmlRefString; - - TQMap<TQString,TQString>::Iterator it; - it = d->parameterEntities.find( ref() ); - if ( it != d->parameterEntities.end() ) { - skipIt = FALSE; - xmlRefString = it.data(); - } else if ( entityRes ) { - TQMap<TQString,TQXmlSimpleReaderPrivate::ExternParameterEntity>::Iterator it2; - it2 = d->externParameterEntities.find( ref() ); - TQXmlInputSource *ret = 0; - if ( it2 != d->externParameterEntities.end() ) { - if ( !entityRes->resolveEntity( it2.data().publicId, it2.data().systemId, ret ) ) { - delete ret; - reportParseError( entityRes->errorString() ); - return FALSE; - } - if ( ret ) { - xmlRefString = ret->data(); - delete ret; - if ( !stripTextDecl( xmlRefString ) ) { - reportParseError( XMLERR_ERRORINTEXTDECL ); - return FALSE; - } - skipIt = FALSE; - } - } - } - - if ( skipIt ) { - if ( contentHnd ) { - if ( !contentHnd->skippedEntity( TQString("%") + ref() ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; - } - } - } else { - if ( d->parsePEReference_context == InEntityValue ) { - // Included in literal - if ( !insertXmlRef( xmlRefString, ref(), TRUE ) ) - return FALSE; - } else if ( d->parsePEReference_context == InDTD ) { - // Included as PE - if ( !insertXmlRef( TQString(" ")+xmlRefString+TQString(" "), ref(), FALSE ) ) - return FALSE; - } - } - } - state = NameR; - break; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parsePEReference, state ); - return FALSE; - } - if ( c.tqunicode() == ';' ) { - input = InpSemi; - } else if ( c.tqunicode() == '%' ) { - input = InpPer; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Next: - next(); - break; - case Name: - case NameR: - d->parseName_useRef = TRUE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parsePEReference, state ); - return FALSE; - } - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a AttlistDecl [52]. - - Precondition: the beginning '<!' is already read and the head - stands on the 'A' of '<!ATTLIST' -*/ -bool TQXmlSimpleReader::parseAttlistDecl() -{ - const signed char Init = 0; - const signed char Attlist = 1; // parse the string "ATTLIST" - const signed char Ws = 2; // whitespace read - const signed char Name = 3; // parse name - const signed char Ws1 = 4; // whitespace read - const signed char Attdef = 5; // parse the AttDef - const signed char Ws2 = 6; // whitespace read - const signed char Atttype = 7; // parse the AttType - const signed char Ws3 = 8; // whitespace read - const signed char DDecH = 9; // DefaultDecl with # - const signed char DefReq = 10; // parse the string "RETQUIRED" - const signed char DefImp = 11; // parse the string "IMPLIED" - const signed char DefFix = 12; // parse the string "FIXED" - const signed char Attval = 13; // parse the AttValue - const signed char Ws4 = 14; // whitespace read - const signed char Done = 15; - - const signed char InpWs = 0; // white space - const signed char InpGt = 1; // > - const signed char InpHash = 2; // # - const signed char InpA = 3; // A - const signed char InpI = 4; // I - const signed char InpF = 5; // F - const signed char InpR = 6; // R - const signed char InpUnknown = 7; - - static const signed char table[15][8] = { - /* InpWs InpGt InpHash InpA InpI InpF InpR InpUnknown */ - { -1, -1, -1, Attlist, -1, -1, -1, -1 }, // Init - { Ws, -1, -1, -1, -1, -1, -1, -1 }, // Attlist - { -1, -1, -1, Name, Name, Name, Name, Name }, // Ws - { Ws1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Name - { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Ws1 - { Ws2, -1, -1, -1, -1, -1, -1, -1 }, // Attdef - { -1, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype }, // Ws2 - { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // Attype - { -1, Attval, DDecH, Attval, Attval, Attval, Attval, Attval }, // Ws3 - { -1, -1, -1, -1, DefImp, DefFix, DefReq, -1 }, // DDecH - { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefReq - { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefImp - { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // DefFix - { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // Attval - { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef } // Ws4 - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseAttlistDecl (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Name: - d->attDeclEName = name(); - break; - case Attdef: - d->attDeclAName = name(); - break; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else if ( c.tqunicode() == '#' ) { - input = InpHash; - } else if ( c.tqunicode() == 'A' ) { - input = InpA; - } else if ( c.tqunicode() == 'I' ) { - input = InpI; - } else if ( c.tqunicode() == 'F' ) { - input = InpF; - } else if ( c.tqunicode() == 'R' ) { - input = InpR; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Attlist: - d->parseString_s = "ATTLIST"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case Ws: - case Ws1: - case Ws2: - case Ws3: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case Name: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case Attdef: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case Atttype: - if ( !parseAttType() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case DDecH: - next(); - break; - case DefReq: - d->parseString_s = "RETQUIRED"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case DefImp: - d->parseString_s = "IMPLIED"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case DefFix: - d->parseString_s = "FIXED"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case Attval: - if ( !parseAttValue() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case Ws4: - if ( declHnd ) { - // ### not all values are computed yet... - if ( !declHnd->attributeDecl( d->attDeclEName, d->attDeclAName, "", "", "" ) ) { - reportParseError( declHnd->errorString() ); - return FALSE; - } - } - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttlistDecl, state ); - return FALSE; - } - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a AttType [54] -*/ -bool TQXmlSimpleReader::parseAttType() -{ - const signed char Init = 0; - const signed char ST = 1; // StringType - const signed char TTI = 2; // TokenizedType starting with 'I' - const signed char TTI2 = 3; // TokenizedType helpstate - const signed char TTI3 = 4; // TokenizedType helpstate - const signed char TTE = 5; // TokenizedType starting with 'E' - const signed char TTEY = 6; // TokenizedType starting with 'ENTITY' - const signed char TTEI = 7; // TokenizedType starting with 'ENTITI' - const signed char N = 8; // N read (TokenizedType or Notation) - const signed char TTNM = 9; // TokenizedType starting with 'NM' - const signed char TTNM2 = 10; // TokenizedType helpstate - const signed char NO = 11; // Notation - const signed char NO2 = 12; // Notation helpstate - const signed char NO3 = 13; // Notation helpstate - const signed char NOName = 14; // Notation, read name - const signed char NO4 = 15; // Notation helpstate - const signed char EN = 16; // Enumeration - const signed char ENNmt = 17; // Enumeration, read Nmtoken - const signed char EN2 = 18; // Enumeration helpstate - const signed char ADone = 19; // almost done (make next and accept) - const signed char Done = 20; - - const signed char InpWs = 0; // whitespace - const signed char InpOp = 1; // ( - const signed char InpCp = 2; // ) - const signed char InpPipe = 3; // | - const signed char InpC = 4; // C - const signed char InpE = 5; // E - const signed char InpI = 6; // I - const signed char InpM = 7; // M - const signed char InpN = 8; // N - const signed char InpO = 9; // O - const signed char InpR = 10; // R - const signed char InpS = 11; // S - const signed char InpY = 12; // Y - const signed char InpUnknown = 13; - - static const signed char table[19][14] = { - /* InpWs InpOp InpCp InpPipe InpC InpE InpI InpM InpN InpO InpR InpS InpY InpUnknown */ - { -1, EN, -1, -1, ST, TTE, TTI, -1, N, -1, -1, -1, -1, -1 }, // Init - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // ST - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI2, Done, Done, Done }, // TTI - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI3, Done, Done }, // TTI2 - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTI3 - { -1, -1, -1, -1, -1, -1, TTEI, -1, -1, -1, -1, -1, TTEY, -1 }, // TTE - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEY - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEI - { -1, -1, -1, -1, -1, -1, -1, TTNM, -1, NO, -1, -1, -1, -1 }, // N - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTNM2, Done, Done }, // TTNM - { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTNM2 - { NO2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO - { -1, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO2 - { NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName }, // NO3 - { NO4, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NOName - { -1, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO4 - { -1, -1, ENNmt, -1, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt }, // EN - { EN2, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // ENNmt - { -1, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // EN2 - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseAttType (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case ADone: - return TRUE; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '(' ) { - input = InpOp; - } else if ( c.tqunicode() == ')' ) { - input = InpCp; - } else if ( c.tqunicode() == '|' ) { - input = InpPipe; - } else if ( c.tqunicode() == 'C' ) { - input = InpC; - } else if ( c.tqunicode() == 'E' ) { - input = InpE; - } else if ( c.tqunicode() == 'I' ) { - input = InpI; - } else if ( c.tqunicode() == 'M' ) { - input = InpM; - } else if ( c.tqunicode() == 'N' ) { - input = InpN; - } else if ( c.tqunicode() == 'O' ) { - input = InpO; - } else if ( c.tqunicode() == 'R' ) { - input = InpR; - } else if ( c.tqunicode() == 'S' ) { - input = InpS; - } else if ( c.tqunicode() == 'Y' ) { - input = InpY; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case ST: - d->parseString_s = "CDATA"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case TTI: - d->parseString_s = "ID"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case TTI2: - d->parseString_s = "REF"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case TTI3: - next(); // S - break; - case TTE: - d->parseString_s = "ENTIT"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case TTEY: - next(); // Y - break; - case TTEI: - d->parseString_s = "IES"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case N: - next(); // N - break; - case TTNM: - d->parseString_s = "MTOKEN"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case TTNM2: - next(); // S - break; - case NO: - d->parseString_s = "OTATION"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case NO2: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case NO3: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case NOName: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case NO4: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case EN: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case ENNmt: - if ( !parseNmtoken() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case EN2: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttType, state ); - return FALSE; - } - break; - case ADone: - next(); - break; - } - } -} - -/* - Parse a AttValue [10] - - Precondition: the head stands on the beginning " or ' - - If this function was successful, the head stands on the first - character after the closing " or ' and the value of the attribute - is in string(). -*/ -bool TQXmlSimpleReader::parseAttValue() -{ - const signed char Init = 0; - const signed char Dq = 1; // double quotes were read - const signed char DqRef = 2; // read references in double quotes - const signed char DqC = 3; // signed character read in double quotes - const signed char Sq = 4; // single quotes were read - const signed char SqRef = 5; // read references in single quotes - const signed char SqC = 6; // signed character read in single quotes - const signed char Done = 7; - - const signed char InpDq = 0; // " - const signed char InpSq = 1; // ' - const signed char InpAmp = 2; // & - const signed char InpLt = 3; // < - const signed char InpUnknown = 4; - - static const signed char table[7][5] = { - /* InpDq InpSq InpAmp InpLt InpUnknown */ - { Dq, Sq, -1, -1, -1 }, // Init - { Done, DqC, DqRef, -1, DqC }, // Dq - { Done, DqC, DqRef, -1, DqC }, // DqRef - { Done, DqC, DqRef, -1, DqC }, // DqC - { SqC, Done, SqRef, -1, SqC }, // Sq - { SqC, Done, SqRef, -1, SqC }, // SqRef - { SqC, Done, SqRef, -1, SqC } // SqRef - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseAttValue (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseAttValue, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseAttValue, state ); - return FALSE; - } - if ( c.tqunicode() == '"' ) { - input = InpDq; - } else if ( c.tqunicode() == '\'' ) { - input = InpSq; - } else if ( c.tqunicode() == '&' ) { - input = InpAmp; - } else if ( c.tqunicode() == '<' ) { - input = InpLt; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Dq: - case Sq: - stringClear(); - next(); - break; - case DqRef: - case SqRef: - d->parseReference_context = InAttributeValue; - if ( !parseReference() ) { - parseFailed( &TQXmlSimpleReader::parseAttValue, state ); - return FALSE; - } - break; - case DqC: - case SqC: - stringAddC(); - next(); - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a elementdecl [45]. - - Precondition: the beginning '<!E' is already read and the head - stands on the 'L' of '<!ELEMENT' -*/ -bool TQXmlSimpleReader::parseElementDecl() -{ - const signed char Init = 0; - const signed char Elem = 1; // parse the beginning string - const signed char Ws1 = 2; // whitespace required - const signed char Nam = 3; // parse Name - const signed char Ws2 = 4; // whitespace required - const signed char Empty = 5; // read EMPTY - const signed char Any = 6; // read ANY - const signed char Cont = 7; // read contentspec (except ANY or EMPTY) - const signed char Mix = 8; // read Mixed - const signed char Mix2 = 9; // - const signed char Mix3 = 10; // - const signed char MixN1 = 11; // - const signed char MixN2 = 12; // - const signed char MixN3 = 13; // - const signed char MixN4 = 14; // - const signed char Cp = 15; // parse cp - const signed char Cp2 = 16; // - const signed char WsD = 17; // eat whitespace before Done - const signed char Done = 18; - - const signed char InpWs = 0; - const signed char InpGt = 1; // > - const signed char InpPipe = 2; // | - const signed char InpOp = 3; // ( - const signed char InpCp = 4; // ) - const signed char InpHash = 5; // # - const signed char InpQm = 6; // ? - const signed char InpAst = 7; // * - const signed char InpPlus = 8; // + - const signed char InpA = 9; // A - const signed char InpE = 10; // E - const signed char InpL = 11; // L - const signed char InpUnknown = 12; - - static const signed char table[18][13] = { - /* InpWs InpGt InpPipe InpOp InpCp InpHash InpQm InpAst InpPlus InpA InpE InpL InpUnknown */ - { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Elem, -1 }, // Init - { Ws1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Elem - { -1, -1, -1, -1, -1, -1, -1, -1, -1, Nam, Nam, Nam, Nam }, // Ws1 - { Ws2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Nam - { -1, -1, -1, Cont, -1, -1, -1, -1, -1, Any, Empty, -1, -1 }, // Ws2 - { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Empty - { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Any - { -1, -1, -1, Cp, Cp, Mix, -1, -1, -1, Cp, Cp, Cp, Cp }, // Cont - { Mix2, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix - { -1, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix2 - { WsD, Done, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // Mix3 - { -1, -1, -1, -1, -1, -1, -1, -1, -1, MixN2, MixN2, MixN2, MixN2 }, // MixN1 - { MixN3, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN2 - { -1, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN3 - { -1, -1, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // MixN4 - { WsD, Done, -1, -1, -1, -1, Cp2, Cp2, Cp2, -1, -1, -1, -1 }, // Cp - { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Cp2 - { -1, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // WsD - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseElementDecl (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Done: - return TRUE; - case -1: - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else if ( c.tqunicode() == '|' ) { - input = InpPipe; - } else if ( c.tqunicode() == '(' ) { - input = InpOp; - } else if ( c.tqunicode() == ')' ) { - input = InpCp; - } else if ( c.tqunicode() == '#' ) { - input = InpHash; - } else if ( c.tqunicode() == '?' ) { - input = InpQm; - } else if ( c.tqunicode() == '*' ) { - input = InpAst; - } else if ( c.tqunicode() == '+' ) { - input = InpPlus; - } else if ( c.tqunicode() == 'A' ) { - input = InpA; - } else if ( c.tqunicode() == 'E' ) { - input = InpE; - } else if ( c.tqunicode() == 'L' ) { - input = InpL; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Elem: - d->parseString_s = "LEMENT"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Ws1: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Nam: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Ws2: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Empty: - d->parseString_s = "EMPTY"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Any: - d->parseString_s = "ANY"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Cont: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Mix: - d->parseString_s = "#PCDATA"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Mix2: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Mix3: - next(); - break; - case MixN1: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case MixN2: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case MixN3: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case MixN4: - next(); - break; - case Cp: - if ( !parseChoiceSeq() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Cp2: - next(); - break; - case WsD: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseElementDecl, state ); - return FALSE; - } - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a NotationDecl [82]. - - Precondition: the beginning '<!' is already read and the head - stands on the 'N' of '<!NOTATION' -*/ -bool TQXmlSimpleReader::parseNotationDecl() -{ - const signed char Init = 0; - const signed char Not = 1; // read NOTATION - const signed char Ws1 = 2; // eat whitespaces - const signed char Nam = 3; // read Name - const signed char Ws2 = 4; // eat whitespaces - const signed char ExtID = 5; // parse ExternalID - const signed char ExtIDR = 6; // same as ExtID, but already reported - const signed char Ws3 = 7; // eat whitespaces - const signed char Done = 8; - - const signed char InpWs = 0; - const signed char InpGt = 1; // > - const signed char InpN = 2; // N - const signed char InpUnknown = 3; - - static const signed char table[8][4] = { - /* InpWs InpGt InpN InpUnknown */ - { -1, -1, Not, -1 }, // Init - { Ws1, -1, -1, -1 }, // Not - { -1, -1, Nam, Nam }, // Ws1 - { Ws2, Done, -1, -1 }, // Nam - { -1, Done, ExtID, ExtID }, // Ws2 - { Ws3, Done, -1, -1 }, // ExtID - { Ws3, Done, -1, -1 }, // ExtIDR - { -1, Done, -1, -1 } // Ws3 - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseNotationDecl (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case ExtID: - // call the handler - if ( dtdHnd ) { - if ( !dtdHnd->notationDecl( name(), d->publicId, d->systemId ) ) { - reportParseError( dtdHnd->errorString() ); - return FALSE; - } - } - state = ExtIDR; - break; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else if ( c.tqunicode() == 'N' ) { - input = InpN; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Not: - d->parseString_s = "NOTATION"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - break; - case Ws1: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - break; - case Nam: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - break; - case Ws2: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - break; - case ExtID: - case ExtIDR: - d->parseExternalID_allowPublicID = TRUE; - if ( !parseExternalID() ) { - parseFailed( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - break; - case Ws3: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseNotationDecl, state ); - return FALSE; - } - break; - case Done: - next(); - break; - } - } -} - -/* - Parse choice [49] or seq [50]. - - Precondition: the beginning '('S? is already read and the head - stands on the first non-whitespace character after it. -*/ -bool TQXmlSimpleReader::parseChoiceSeq() -{ - const signed char Init = 0; - const signed char Ws1 = 1; // eat whitespace - const signed char CorS = 2; // choice or set - const signed char Ws2 = 3; // eat whitespace - const signed char More = 4; // more cp to read - const signed char Name = 5; // read name - const signed char Done = 6; // - - const signed char InpWs = 0; // S - const signed char InpOp = 1; // ( - const signed char InpCp = 2; // ) - const signed char InpQm = 3; // ? - const signed char InpAst = 4; // * - const signed char InpPlus = 5; // + - const signed char InpPipe = 6; // | - const signed char InpComm = 7; // , - const signed char InpUnknown = 8; - - static const signed char table[6][9] = { - /* InpWs InpOp InpCp InpQm InpAst InpPlus InpPipe InpComm InpUnknown */ - { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // Init - { -1, CorS, -1, -1, -1, -1, -1, -1, CorS }, // Ws1 - { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 }, // CorS - { -1, -1, Done, -1, -1, -1, More, More, -1 }, // Ws2 - { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // More (same as Init) - { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 } // Name (same as CorS) - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseChoiceSeq (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseChoiceSeq, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseChoiceSeq, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '(' ) { - input = InpOp; - } else if ( c.tqunicode() == ')' ) { - input = InpCp; - } else if ( c.tqunicode() == '?' ) { - input = InpQm; - } else if ( c.tqunicode() == '*' ) { - input = InpAst; - } else if ( c.tqunicode() == '+' ) { - input = InpPlus; - } else if ( c.tqunicode() == '|' ) { - input = InpPipe; - } else if ( c.tqunicode() == ',' ) { - input = InpComm; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Ws1: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseChoiceSeq, state ); - return FALSE; - } - break; - case CorS: - if ( !parseChoiceSeq() ) { - parseFailed( &TQXmlSimpleReader::parseChoiceSeq, state ); - return FALSE; - } - break; - case Ws2: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseChoiceSeq, state ); - return FALSE; - } - break; - case More: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseChoiceSeq, state ); - return FALSE; - } - break; - case Name: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseChoiceSeq, state ); - return FALSE; - } - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a EntityDecl [70]. - - Precondition: the beginning '<!E' is already read and the head - stand on the 'N' of '<!ENTITY' -*/ -bool TQXmlSimpleReader::parseEntityDecl() -{ - const signed char Init = 0; - const signed char Ent = 1; // parse "ENTITY" - const signed char Ws1 = 2; // white space read - const signed char Name = 3; // parse name - const signed char Ws2 = 4; // white space read - const signed char EValue = 5; // parse entity value - const signed char EValueR = 6; // same as EValue, but already reported - const signed char ExtID = 7; // parse ExternalID - const signed char Ws3 = 8; // white space read - const signed char Ndata = 9; // parse "NDATA" - const signed char Ws4 = 10; // white space read - const signed char NNam = 11; // parse name - const signed char NNamR = 12; // same as NNam, but already reported - const signed char PEDec = 13; // parse PEDecl - const signed char Ws6 = 14; // white space read - const signed char PENam = 15; // parse name - const signed char Ws7 = 16; // white space read - const signed char PEVal = 17; // parse entity value - const signed char PEValR = 18; // same as PEVal, but already reported - const signed char PEEID = 19; // parse ExternalID - const signed char PEEIDR = 20; // same as PEEID, but already reported - const signed char WsE = 21; // white space read - const signed char Done = 22; - const signed char EDDone = 23; // done, but also report an external, unparsed entity decl - - const signed char InpWs = 0; // white space - const signed char InpPer = 1; // % - const signed char InpQuot = 2; // " or ' - const signed char InpGt = 3; // > - const signed char InpN = 4; // N - const signed char InpUnknown = 5; - - static const signed char table[22][6] = { - /* InpWs InpPer InpQuot InpGt InpN InpUnknown */ - { -1, -1, -1, -1, Ent, -1 }, // Init - { Ws1, -1, -1, -1, -1, -1 }, // Ent - { -1, PEDec, -1, -1, Name, Name }, // Ws1 - { Ws2, -1, -1, -1, -1, -1 }, // Name - { -1, -1, EValue, -1, -1, ExtID }, // Ws2 - { WsE, -1, -1, Done, -1, -1 }, // EValue - { WsE, -1, -1, Done, -1, -1 }, // EValueR - { Ws3, -1, -1, EDDone,-1, -1 }, // ExtID - { -1, -1, -1, EDDone,Ndata, -1 }, // Ws3 - { Ws4, -1, -1, -1, -1, -1 }, // Ndata - { -1, -1, -1, -1, NNam, NNam }, // Ws4 - { WsE, -1, -1, Done, -1, -1 }, // NNam - { WsE, -1, -1, Done, -1, -1 }, // NNamR - { Ws6, -1, -1, -1, -1, -1 }, // PEDec - { -1, -1, -1, -1, PENam, PENam }, // Ws6 - { Ws7, -1, -1, -1, -1, -1 }, // PENam - { -1, -1, PEVal, -1, -1, PEEID }, // Ws7 - { WsE, -1, -1, Done, -1, -1 }, // PEVal - { WsE, -1, -1, Done, -1, -1 }, // PEValR - { WsE, -1, -1, Done, -1, -1 }, // PEEID - { WsE, -1, -1, Done, -1, -1 }, // PEEIDR - { -1, -1, -1, Done, -1, -1 } // WsE - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseEntityDecl (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case EValue: - if ( !entityExist( name() ) ) { - d->entities.insert( name(), string() ); - if ( declHnd ) { - if ( !declHnd->internalEntityDecl( name(), string() ) ) { - reportParseError( declHnd->errorString() ); - return FALSE; - } - } - } - state = EValueR; - break; - case NNam: - if ( !entityExist( name() ) ) { - d->externEntities.insert( name(), TQXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, ref() ) ); - if ( dtdHnd ) { - if ( !dtdHnd->unparsedEntityDecl( name(), d->publicId, d->systemId, ref() ) ) { - reportParseError( declHnd->errorString() ); - return FALSE; - } - } - } - state = NNamR; - break; - case PEVal: - if ( !entityExist( name() ) ) { - d->parameterEntities.insert( name(), string() ); - if ( declHnd ) { - if ( !declHnd->internalEntityDecl( TQString("%")+name(), string() ) ) { - reportParseError( declHnd->errorString() ); - return FALSE; - } - } - } - state = PEValR; - break; - case PEEID: - if ( !entityExist( name() ) ) { - d->externParameterEntities.insert( name(), TQXmlSimpleReaderPrivate::ExternParameterEntity( d->publicId, d->systemId ) ); - if ( declHnd ) { - if ( !declHnd->externalEntityDecl( TQString("%")+name(), d->publicId, d->systemId ) ) { - reportParseError( declHnd->errorString() ); - return FALSE; - } - } - } - state = PEEIDR; - break; - case EDDone: - if ( !entityExist( name() ) ) { - d->externEntities.insert( name(), TQXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, TQString::null ) ); - if ( declHnd ) { - if ( !declHnd->externalEntityDecl( name(), d->publicId, d->systemId ) ) { - reportParseError( declHnd->errorString() ); - return FALSE; - } - } - } - return TRUE; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - if ( is_S(c) ) { - input = InpWs; - } else if ( c.tqunicode() == '%' ) { - input = InpPer; - } else if ( c.tqunicode() == '"' || c.tqunicode() == '\'' ) { - input = InpQuot; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else if ( c.tqunicode() == 'N' ) { - input = InpN; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Ent: - d->parseString_s = "NTITY"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case Ws1: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case Name: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case Ws2: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case EValue: - case EValueR: - if ( !parseEntityValue() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case ExtID: - d->parseExternalID_allowPublicID = FALSE; - if ( !parseExternalID() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case Ws3: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case Ndata: - d->parseString_s = "NDATA"; - if ( !parseString() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case Ws4: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case NNam: - case NNamR: - d->parseName_useRef = TRUE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case PEDec: - next(); - break; - case Ws6: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case PENam: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case Ws7: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case PEVal: - case PEValR: - if ( !parseEntityValue() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case PEEID: - case PEEIDR: - d->parseExternalID_allowPublicID = FALSE; - if ( !parseExternalID() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case WsE: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseEntityDecl, state ); - return FALSE; - } - break; - case EDDone: - next(); - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a EntityValue [9] -*/ -bool TQXmlSimpleReader::parseEntityValue() -{ - const signed char Init = 0; - const signed char Dq = 1; // EntityValue is double quoted - const signed char DqC = 2; // signed character - const signed char DqPER = 3; // PERefence - const signed char DqRef = 4; // Reference - const signed char Sq = 5; // EntityValue is double quoted - const signed char SqC = 6; // signed character - const signed char SqPER = 7; // PERefence - const signed char SqRef = 8; // Reference - const signed char Done = 9; - - const signed char InpDq = 0; // " - const signed char InpSq = 1; // ' - const signed char InpAmp = 2; // & - const signed char InpPer = 3; // % - const signed char InpUnknown = 4; - - static const signed char table[9][5] = { - /* InpDq InpSq InpAmp InpPer InpUnknown */ - { Dq, Sq, -1, -1, -1 }, // Init - { Done, DqC, DqRef, DqPER, DqC }, // Dq - { Done, DqC, DqRef, DqPER, DqC }, // DqC - { Done, DqC, DqRef, DqPER, DqC }, // DqPER - { Done, DqC, DqRef, DqPER, DqC }, // DqRef - { SqC, Done, SqRef, SqPER, SqC }, // Sq - { SqC, Done, SqRef, SqPER, SqC }, // SqC - { SqC, Done, SqRef, SqPER, SqC }, // SqPER - { SqC, Done, SqRef, SqPER, SqC } // SqRef - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseEntityValue (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseEntityValue, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseEntityValue, state ); - return FALSE; - } - if ( c.tqunicode() == '"' ) { - input = InpDq; - } else if ( c.tqunicode() == '\'' ) { - input = InpSq; - } else if ( c.tqunicode() == '&' ) { - input = InpAmp; - } else if ( c.tqunicode() == '%' ) { - input = InpPer; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Dq: - case Sq: - stringClear(); - next(); - break; - case DqC: - case SqC: - stringAddC(); - next(); - break; - case DqPER: - case SqPER: - d->parsePEReference_context = InEntityValue; - if ( !parsePEReference() ) { - parseFailed( &TQXmlSimpleReader::parseEntityValue, state ); - return FALSE; - } - break; - case DqRef: - case SqRef: - d->parseReference_context = InEntityValue; - if ( !parseReference() ) { - parseFailed( &TQXmlSimpleReader::parseEntityValue, state ); - return FALSE; - } - break; - case Done: - next(); - break; - } - } -} - -/* - Parse a comment [15]. - - Precondition: the beginning '<!' of the comment is already read and the head - stands on the first '-' of '<!--'. - - If this funktion was successful, the head-position is on the first - character after the comment. -*/ -bool TQXmlSimpleReader::parseComment() -{ - const signed char Init = 0; - const signed char Dash1 = 1; // the first dash was read - const signed char Dash2 = 2; // the second dash was read - const signed char Com = 3; // read comment - const signed char Com2 = 4; // read comment (help state) - const signed char ComE = 5; // finished reading comment - const signed char Done = 6; - - const signed char InpDash = 0; // - - const signed char InpGt = 1; // > - const signed char InpUnknown = 2; - - static const signed char table[6][3] = { - /* InpDash InpGt InpUnknown */ - { Dash1, -1, -1 }, // Init - { Dash2, -1, -1 }, // Dash1 - { Com2, Com, Com }, // Dash2 - { Com2, Com, Com }, // Com - { ComE, Com, Com }, // Com2 - { -1, Done, -1 } // ComE - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseComment (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseComment, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Dash2: - stringClear(); - break; - case Com2: - // if next character is not a dash than don't skip it - if ( !atEnd() && c.tqunicode() != '-' ) - stringAddC( '-' ); - break; - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_ERRORPARSINGCOMMENT ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseComment, state ); - return FALSE; - } - if ( c.tqunicode() == '-' ) { - input = InpDash; - } else if ( c.tqunicode() == '>' ) { - input = InpGt; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case Dash1: - next(); - break; - case Dash2: - next(); - break; - case Com: - stringAddC(); - next(); - break; - case Com2: - next(); - break; - case ComE: - next(); - break; - case Done: - next(); - break; - } - } -} - -/* - Parse an Attribute [41]. - - Precondition: the head stands on the first character of the name - of the attribute (i.e. all whitespaces are already parsed). - - The head stand on the next character after the end quotes. The - variable name contains the name of the attribute and the variable - string contains the value of the attribute. -*/ -bool TQXmlSimpleReader::parseAttribute() -{ - const int Init = 0; - const int PName = 1; // parse name - const int Ws = 2; // eat ws - const int Eq = 3; // the '=' was read - const int Quotes = 4; // " or ' were read - - const int InpNameBe = 0; - const int InpEq = 1; // = - const int InpDq = 2; // " - const int InpSq = 3; // ' - const int InpUnknown = 4; - - static const int table[4][5] = { - /* InpNameBe InpEq InpDq InpSq InpUnknown */ - { PName, -1, -1, -1, -1 }, // Init - { -1, Eq, -1, -1, Ws }, // PName - { -1, Eq, -1, -1, -1 }, // Ws - { -1, -1, Quotes, Quotes, -1 } // Eq - }; - int state; - int input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseAttribute (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseAttribute, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Quotes: - // Done - return TRUE; - case -1: - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseAttribute, state ); - return FALSE; - } - if ( determineNameChar(c) == NameBeginning ) { - input = InpNameBe; - } else if ( c.tqunicode() == '=' ) { - input = InpEq; - } else if ( c.tqunicode() == '"' ) { - input = InpDq; - } else if ( c.tqunicode() == '\'' ) { - input = InpSq; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case PName: - d->parseName_useRef = FALSE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseAttribute, state ); - return FALSE; - } - break; - case Ws: - if ( !eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttribute, state ); - return FALSE; - } - break; - case Eq: - if ( !next_eat_ws() ) { - parseFailed( &TQXmlSimpleReader::parseAttribute, state ); - return FALSE; - } - break; - case Quotes: - if ( !parseAttValue() ) { - parseFailed( &TQXmlSimpleReader::parseAttribute, state ); - return FALSE; - } - break; - } - } -} - -/* - Parse a Name [5] and store the name in name or ref (if useRef is TRUE). -*/ -bool TQXmlSimpleReader::parseName() -{ - const int Init = 0; - const int Name1 = 1; // parse first signed character of the name - const int Name = 2; // parse name - const int Done = 3; - - const int InpNameBe = 0; // name beginning signed characters - const int InpNameCh = 1; // NameChar without InpNameBe - const int InpUnknown = 2; - - TQ_ASSERT(InpNameBe == (int)NameBeginning); - TQ_ASSERT(InpNameCh == (int)NameNotBeginning); - TQ_ASSERT(InpUnknown == (int)NotName); - - static const int table[3][3] = { - /* InpNameBe InpNameCh InpUnknown */ - { Name1, -1, -1 }, // Init - { Name, Name, Done }, // Name1 - { Name, Name, Done } // Name - }; - int state; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseName (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseName, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseName, state ); - return FALSE; - } - - // we can safely do the (int) cast thanks to the TQ_ASSERTs earlier in this function - state = table[state][(int)fastDetermineNameChar(c)]; - - switch ( state ) { - case Name1: - if ( d->parseName_useRef ) { - refClear(); - refAddC(); - } else { - nameClear(); - nameAddC(); - } - next(); - break; - case Name: - if ( d->parseName_useRef ) { - refAddC(); - } else { - nameAddC(); - } - next(); - break; - } - } -} - -/* - Parse a Nmtoken [7] and store the name in name. -*/ -bool TQXmlSimpleReader::parseNmtoken() -{ - const signed char Init = 0; - const signed char NameF = 1; - const signed char Name = 2; - const signed char Done = 3; - - const signed char InpNameCh = 0; // NameChar without InpNameBe - const signed char InpUnknown = 1; - - static const signed char table[3][2] = { - /* InpNameCh InpUnknown */ - { NameF, -1 }, // Init - { Name, Done }, // NameF - { Name, Done } // Name - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseNmtoken (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseNmtoken, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case Done: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_LETTEREXPECTED ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseNmtoken, state ); - return FALSE; - } - if (determineNameChar(c) == NotName) { - input = InpUnknown; - } else { - input = InpNameCh; - } - state = table[state][input]; - - switch ( state ) { - case NameF: - nameClear(); - nameAddC(); - next(); - break; - case Name: - nameAddC(); - next(); - break; - } - } -} - -/* - Parse a Reference [67]. - - parseReference_charDataRead is set to TRUE if the reference must not be - parsed. The character(s) which the reference mapped to are appended to - string. The head stands on the first character after the reference. - - parseReference_charDataRead is set to FALSE if the reference must be parsed. - The charachter(s) which the reference mapped to are inserted at the reference - position. The head stands on the first character of the replacement). -*/ -bool TQXmlSimpleReader::parseReference() -{ - // temporary variables (only used in very local context, so they don't - // interfere with incremental parsing) - uint tmp; - bool ok; - - const signed char Init = 0; - const signed char SRef = 1; // start of a reference - const signed char ChRef = 2; // parse CharRef - const signed char ChDec = 3; // parse CharRef decimal - const signed char ChHexS = 4; // start CharRef hexadecimal - const signed char ChHex = 5; // parse CharRef hexadecimal - const signed char Name = 6; // parse name - const signed char DoneD = 7; // done CharRef decimal - const signed char DoneH = 8; // done CharRef hexadecimal - const signed char DoneN = 9; // done EntityRef - - const signed char InpAmp = 0; // & - const signed char InpSemi = 1; // ; - const signed char InpHash = 2; // # - const signed char InpX = 3; // x - const signed char InpNum = 4; // 0-9 - const signed char InpHex = 5; // a-f A-F - const signed char InpUnknown = 6; - - static const signed char table[8][7] = { - /* InpAmp InpSemi InpHash InpX InpNum InpHex InpUnknown */ - { SRef, -1, -1, -1, -1, -1, -1 }, // Init - { -1, -1, ChRef, Name, Name, Name, Name }, // SRef - { -1, -1, -1, ChHexS, ChDec, -1, -1 }, // ChRef - { -1, DoneD, -1, -1, ChDec, -1, -1 }, // ChDec - { -1, -1, -1, -1, ChHex, ChHex, -1 }, // ChHexS - { -1, DoneH, -1, -1, ChHex, ChHex, -1 }, // ChHex - { -1, DoneN, -1, -1, -1, -1, -1 } // Name - }; - signed char state; - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - d->parseReference_charDataRead = FALSE; - state = Init; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseReference (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseReference, state ); - return FALSE; - } - } - } - - for (;;) { - switch ( state ) { - case DoneD: - return TRUE; - case DoneH: - return TRUE; - case DoneN: - return TRUE; - case -1: - // Error - reportParseError( XMLERR_ERRORPARSINGREFERENCE ); - return FALSE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseReference, state ); - return FALSE; - } - if ( c.row() ) { - input = InpUnknown; - } else if ( c.cell() == '&' ) { - input = InpAmp; - } else if ( c.cell() == ';' ) { - input = InpSemi; - } else if ( c.cell() == '#' ) { - input = InpHash; - } else if ( c.cell() == 'x' ) { - input = InpX; - } else if ( '0' <= c.cell() && c.cell() <= '9' ) { - input = InpNum; - } else if ( 'a' <= c.cell() && c.cell() <= 'f' ) { - input = InpHex; - } else if ( 'A' <= c.cell() && c.cell() <= 'F' ) { - input = InpHex; - } else { - input = InpUnknown; - } - state = table[state][input]; - - switch ( state ) { - case SRef: - refClear(); - next(); - break; - case ChRef: - next(); - break; - case ChDec: - refAddC(); - next(); - break; - case ChHexS: - next(); - break; - case ChHex: - refAddC(); - next(); - break; - case Name: - // read the name into the ref - d->parseName_useRef = TRUE; - if ( !parseName() ) { - parseFailed( &TQXmlSimpleReader::parseReference, state ); - return FALSE; - } - break; - case DoneD: - tmp = ref().toUInt( &ok, 10 ); - if ( ok ) { - stringAddC( TQChar(tmp) ); - } else { - reportParseError( XMLERR_ERRORPARSINGREFERENCE ); - return FALSE; - } - d->parseReference_charDataRead = TRUE; - next(); - break; - case DoneH: - tmp = ref().toUInt( &ok, 16 ); - if ( ok ) { - stringAddC( TQChar(tmp) ); - } else { - reportParseError( XMLERR_ERRORPARSINGREFERENCE ); - return FALSE; - } - d->parseReference_charDataRead = TRUE; - next(); - break; - case DoneN: - if ( !processReference() ) - return FALSE; - next(); - break; - } - } -} - -/* This private function is only called by TQDom. It avoids a data corruption bug - whereby undefined entities in attribute values would be appended after the - element that contained them. - - The solution is not perfect - the undefined entity reference is replaced by - an empty string. The propper fix will come in TQt4, when SAX will be extended - so that attribute values can be made up of multiple tqchildren, rather than just - a single string value. -*/ -void TQXmlSimpleReader::setUndefEntityInAttrHack(bool b) -{ - d->undefEntityInAttrHack = b; -} - -/* - Helper function for parseReference() -*/ -bool TQXmlSimpleReader::processReference() -{ - TQString reference = ref(); - if ( reference == "amp" ) { - if ( d->parseReference_context == InEntityValue ) { - // Bypassed - stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'm' ); stringAddC( 'p' ); stringAddC( ';' ); - } else { - // Included or Included in literal - stringAddC( '&' ); - } - d->parseReference_charDataRead = TRUE; - } else if ( reference == "lt" ) { - if ( d->parseReference_context == InEntityValue ) { - // Bypassed - stringAddC( '&' ); stringAddC( 'l' ); stringAddC( 't' ); stringAddC( ';' ); - } else { - // Included or Included in literal - stringAddC( '<' ); - } - d->parseReference_charDataRead = TRUE; - } else if ( reference == "gt" ) { - if ( d->parseReference_context == InEntityValue ) { - // Bypassed - stringAddC( '&' ); stringAddC( 'g' ); stringAddC( 't' ); stringAddC( ';' ); - } else { - // Included or Included in literal - stringAddC( '>' ); - } - d->parseReference_charDataRead = TRUE; - } else if ( reference == "apos" ) { - if ( d->parseReference_context == InEntityValue ) { - // Bypassed - stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'p' ); stringAddC( 'o' ); stringAddC( 's' ); stringAddC( ';' ); - } else { - // Included or Included in literal - stringAddC( '\'' ); - } - d->parseReference_charDataRead = TRUE; - } else if ( reference == "quot" ) { - if ( d->parseReference_context == InEntityValue ) { - // Bypassed - stringAddC( '&' ); stringAddC( 'q' ); stringAddC( 'u' ); stringAddC( 'o' ); stringAddC( 't' ); stringAddC( ';' ); - } else { - // Included or Included in literal - stringAddC( '"' ); - } - d->parseReference_charDataRead = TRUE; - } else { - TQMap<TQString,TQString>::Iterator it; - it = d->entities.find( reference ); - if ( it != d->entities.end() ) { - // "Internal General" - switch ( d->parseReference_context ) { - case InContent: - // Included - if ( !insertXmlRef( it.data(), reference, FALSE ) ) - return FALSE; - d->parseReference_charDataRead = FALSE; - break; - case InAttributeValue: - // Included in literal - if ( !insertXmlRef( it.data(), reference, TRUE ) ) - return FALSE; - d->parseReference_charDataRead = FALSE; - break; - case InEntityValue: - { - // Bypassed - stringAddC( '&' ); - for ( int i=0; i<(int)reference.length(); i++ ) { - stringAddC( reference[i] ); - } - stringAddC( ';'); - d->parseReference_charDataRead = TRUE; - } - break; - case InDTD: - // Forbidden - d->parseReference_charDataRead = FALSE; - reportParseError( XMLERR_INTERNALGENERALENTITYINDTD ); - return FALSE; - } - } else { - TQMap<TQString,TQXmlSimpleReaderPrivate::ExternEntity>::Iterator itExtern; - itExtern = d->externEntities.find( reference ); - if ( itExtern == d->externEntities.end() ) { - // entity not declared - // ### check this case for conformance - if ( d->parseReference_context == InEntityValue ) { - // Bypassed - stringAddC( '&' ); - for ( int i=0; i<(int)reference.length(); i++ ) { - stringAddC( reference[i] ); - } - stringAddC( ';'); - d->parseReference_charDataRead = TRUE; - } else { - if ( contentHnd && !(d->parseReference_context == InAttributeValue - && d->undefEntityInAttrHack)) { - if ( !contentHnd->skippedEntity( reference ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; // error - } - } - } - } else if ( (*itExtern).notation.isNull() ) { - // "External Parsed General" - switch ( d->parseReference_context ) { - case InContent: - { - // Included if validating - bool skipIt = TRUE; - if ( entityRes ) { - TQXmlInputSource *ret = 0; - if ( !entityRes->resolveEntity( itExtern.data().publicId, itExtern.data().systemId, ret ) ) { - delete ret; - reportParseError( entityRes->errorString() ); - return FALSE; - } - if ( ret ) { - TQString xmlRefString = ret->data(); - delete ret; - if ( !stripTextDecl( xmlRefString ) ) { - reportParseError( XMLERR_ERRORINTEXTDECL ); - return FALSE; - } - if ( !insertXmlRef( xmlRefString, reference, FALSE ) ) - return FALSE; - skipIt = FALSE; - } - } - if ( skipIt && contentHnd ) { - if ( !contentHnd->skippedEntity( reference ) ) { - reportParseError( contentHnd->errorString() ); - return FALSE; // error - } - } - d->parseReference_charDataRead = FALSE; - } break; - case InAttributeValue: - // Forbidden - d->parseReference_charDataRead = FALSE; - reportParseError( XMLERR_EXTERNALGENERALENTITYINAV ); - return FALSE; - case InEntityValue: - { - // Bypassed - stringAddC( '&' ); - for ( int i=0; i<(int)reference.length(); i++ ) { - stringAddC( reference[i] ); - } - stringAddC( ';'); - d->parseReference_charDataRead = TRUE; - } - break; - case InDTD: - // Forbidden - d->parseReference_charDataRead = FALSE; - reportParseError( XMLERR_EXTERNALGENERALENTITYINDTD ); - return FALSE; - } - } else { - // "Unparsed" - // ### notify for "Occurs as Attribute Value" missing (but this is no refence, anyway) - // Forbidden - d->parseReference_charDataRead = FALSE; - reportParseError( XMLERR_UNPARSEDENTITYREFERENCE ); - return FALSE; // error - } - } - } - return TRUE; // no error -} - - -/* - Parses over a simple string. - - After the string was successfully parsed, the head is on the first - character after the string. -*/ -bool TQXmlSimpleReader::parseString() -{ - const signed char InpCharExpected = 0; // the character that was expected - const signed char InpUnknown = 1; - - signed char state; // state in this function is the position in the string s - signed char input; - - if ( d->parseStack==0 || d->parseStack->isEmpty() ) { - d->Done = d->parseString_s.length(); - state = 0; - } else { - state = d->parseStack->pop().state; -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: parseString (cont) in state %d", state ); -#endif - if ( !d->parseStack->isEmpty() ) { - ParseFunction function = d->parseStack->top().function; - if ( function == &TQXmlSimpleReader::eat_ws ) { - d->parseStack->pop(); -#if defined(TQT_TQXML_DEBUG) - qDebug( "TQXmlSimpleReader: eat_ws (cont)" ); -#endif - } - if ( !(this->*function)() ) { - parseFailed( &TQXmlSimpleReader::parseString, state ); - return FALSE; - } - } - } - - for (;;) { - if ( state == d->Done ) { - return TRUE; - } - - if ( atEnd() ) { - unexpectedEof( &TQXmlSimpleReader::parseString, state ); - return FALSE; - } - if ( c == d->parseString_s[(int)state] ) { - input = InpCharExpected; - } else { - input = InpUnknown; - } - if ( input == InpCharExpected ) { - state++; - } else { - // Error - reportParseError( XMLERR_UNEXPECTEDCHARACTER ); - return FALSE; - } - - next(); - } -} - -/* - This private function inserts and reports an entity substitution. The - substituted string is \a data and the name of the entity reference is \a - name. If \a inLiteral is TRUE, the entity is IncludedInLiteral (i.e., " and ' - must be quoted. Otherwise they are not quoted. - - This function returns FALSE on error. -*/ -bool TQXmlSimpleReader::insertXmlRef( const TQString &data, const TQString &name, bool inLiteral ) -{ - if ( inLiteral ) { - TQString tmp = data; - d->xmlRef.push( TQT_TQSTRING(tmp.replace( "\"", """ )).replace( "'", "'" ) ); - } else { - d->xmlRef.push( data ); - } - d->xmlRefName.push( name ); - uint n = (uint)TQMAX( d->parameterEntities.count(), d->entities.count() ); - if ( d->xmlRefName.count() > n+1 ) { - // recursive entities - reportParseError( XMLERR_RECURSIVEENTITIES ); - return FALSE; - } - if ( d->reportEntities && lexicalHnd ) { - if ( !lexicalHnd->startEntity( name ) ) { - reportParseError( lexicalHnd->errorString() ); - return FALSE; - } - } - return TRUE; -} - -/* - This private function moves the cursor to the next character. -*/ -void TQXmlSimpleReader::next() -{ - int count = (int)d->xmlRef.count(); - while ( count != 0 ) { - if ( d->xmlRef.top().isEmpty() ) { - d->xmlRef.pop_back(); - d->xmlRefName.pop_back(); - count--; - } else { - c = d->xmlRef.top().constref( 0 ); - d->xmlRef.top().remove( (uint)0, 1 ); - return; - } - } - // the following could be written nicer, but since it is a time-critical - // function, rather optimize for speed - ushort uc = c.tqunicode(); - if (uc == '\n') { - c = inputSource->next(); - lineNr++; - columnNr = -1; - } else if ( uc == '\r' ) { - c = inputSource->next(); - if ( c.tqunicode() != '\n' ) { - lineNr++; - columnNr = -1; - } - } else { - c = inputSource->next(); - } - ++columnNr; -} - -/* - This private function moves the cursor to the next non-whitespace character. - This function does not move the cursor if the actual cursor position is a - non-whitespace charcter. - - Returns FALSE when you use incremental parsing and this function reaches EOF - with reading only whitespace characters. In this case it also poplulates the - parseStack with useful information. In all other cases, this function returns - TRUE. -*/ -bool TQXmlSimpleReader::eat_ws() -{ - while ( !atEnd() ) { - if ( !is_S(c) ) { - return TRUE; - } - next(); - } - if ( d->parseStack != 0 ) { - unexpectedEof( &TQXmlSimpleReader::eat_ws, 0 ); - return FALSE; - } - return TRUE; -} - -bool TQXmlSimpleReader::next_eat_ws() -{ - next(); - return eat_ws(); -} - - -/* - This private function initializes the reader. \a i is the input source to - read the data from. -*/ -void TQXmlSimpleReader::init( const TQXmlInputSource *i ) -{ - lineNr = 0; - columnNr = -1; - inputSource = (TQXmlInputSource *)i; - initData(); - - d->externParameterEntities.clear(); - d->parameterEntities.clear(); - d->externEntities.clear(); - d->entities.clear(); - - d->tags.clear(); - - d->doctype = ""; - d->xmlVersion = ""; - d->encoding = ""; - d->standalone = TQXmlSimpleReaderPrivate::Unknown; - d->error = TQString::null; -} - -/* - This private function initializes the XML data related variables. Especially, - it reads the data from the input source. -*/ -void TQXmlSimpleReader::initData() -{ - c = TQXmlInputSource::EndOfData; - d->xmlRef.clear(); - next(); -} - -/* - Returns TRUE if a entity with the name \a e exists, - otherwise returns FALSE. -*/ -bool TQXmlSimpleReader::entityExist( const TQString& e ) const -{ - if ( d->parameterEntities.find(e) == d->parameterEntities.end() && - d->externParameterEntities.find(e) == d->externParameterEntities.end() && - d->externEntities.find(e) == d->externEntities.end() && - d->entities.find(e) == d->entities.end() ) { - return FALSE; - } else { - return TRUE; - } -} - -void TQXmlSimpleReader::reportParseError( const TQString& error ) -{ - d->error = error; - if ( errorHnd ) { - if ( d->error.isNull() ) { - errorHnd->fatalError( TQXmlParseException( XMLERR_OK, columnNr+1, lineNr+1 ) ); - } else { - errorHnd->fatalError( TQXmlParseException( d->error, columnNr+1, lineNr+1 ) ); - } - } -} - -/* - This private function is called when a parsing function encounters an - unexpected EOF. It decides what to do (depending on incremental parsing or - not). \a where is a pointer to the function where the error occurred and \a - state is the parsing state in this function. -*/ -void TQXmlSimpleReader::unexpectedEof( ParseFunction where, int state ) -{ - if ( d->parseStack == 0 ) { - reportParseError( XMLERR_UNEXPECTEDEOF ); - } else { - if ( c == TQXmlInputSource::EndOfDocument ) { - reportParseError( XMLERR_UNEXPECTEDEOF ); - } else { - pushParseState( where, state ); - } - } -} - -/* - This private function is called when a parse...() function returned FALSE. It - determines if there was an error or if incremental parsing simply went out of - data and does the right thing for the case. \a where is a pointer to the - function where the error occurred and \a state is the parsing state in this - function. -*/ -void TQXmlSimpleReader::parseFailed( ParseFunction where, int state ) -{ - if ( d->parseStack!=0 && d->error.isNull() ) { - pushParseState( where, state ); - } -} - -/* - This private function pushes the function pointer \a function and state \a - state to the parse stack. This is used when you are doing an incremental - parsing and reach the end of file too early. - - Only call this function when d->parseStack!=0. -*/ -void TQXmlSimpleReader::pushParseState( ParseFunction function, int state ) -{ - TQXmlSimpleReaderPrivate::ParseState ps; - ps.function = function; - ps.state = state; - d->parseStack->push( ps ); -} - -inline static void updateValue(TQString &value, const TQChar *array, int &arrayPos, int &valueLen) -{ - value.setLength(valueLen + arrayPos); - memcpy(const_cast<TQChar*>(value.tqunicode()) + valueLen, array, arrayPos * sizeof(TQChar)); - valueLen += arrayPos; - arrayPos = 0; -} - -// use buffers instead of TQString::operator+= when single characters are read -const TQString& TQXmlSimpleReader::string() -{ - updateValue(stringValue, stringArray, stringArrayPos, d->stringValueLen); - return stringValue; -} - -const TQString& TQXmlSimpleReader::name() -{ - updateValue(nameValue, nameArray, nameArrayPos, d->nameValueLen); - return nameValue; -} - -const TQString& TQXmlSimpleReader::ref() -{ - updateValue(refValue, refArray, refArrayPos, d->refValueLen); - return refValue; -} - -void TQXmlSimpleReader::stringAddC(const TQChar &ch) -{ - if (stringArrayPos == 256) - updateValue(stringValue, stringArray, stringArrayPos, d->stringValueLen); - stringArray[stringArrayPos++] = ch; -} -void TQXmlSimpleReader::nameAddC(const TQChar &ch) -{ - if (nameArrayPos == 256) - updateValue(nameValue, nameArray, nameArrayPos, d->nameValueLen); - nameArray[nameArrayPos++] = ch; -} - -void TQXmlSimpleReader::refAddC(const TQChar &ch) -{ - if (refArrayPos == 256) - updateValue(refValue, refArray, refArrayPos, d->refValueLen); - refArray[refArrayPos++] = ch; -} - -void TQXmlSimpleReader::stringClear() -{ - d->stringValueLen = 0; stringArrayPos = 0; -} - - -#endif //TQT_NO_XML |