include/oox/token/tokenmap.hxx | 1 + oox/source/token/tokenmap.cxx | 14 ++++++++++++++ sax/source/fastparser/fastparser.cxx | 32 +++++++++++++++++++------------- sax/source/fastparser/fastparser.hxx | 14 +++++++++++--- 4 files changed, 45 insertions(+), 16 deletions(-)
New commits: commit 75329f3c8668e06f0829c4c29c8ea3138790d547 Author: Michael Meeks <michael.me...@collabora.com> Date: Fri Oct 11 22:51:44 2013 +0100 oox: special-case single-character a-z token mapping. Change-Id: I58a810cc6062d5b42558dd5c0f37426a8a210f40 diff --git a/include/oox/token/tokenmap.hxx b/include/oox/token/tokenmap.hxx index 84dc70d..fb9ebc5 100644 --- a/include/oox/token/tokenmap.hxx +++ b/include/oox/token/tokenmap.hxx @@ -58,6 +58,7 @@ private: typedef ::std::vector< TokenName > TokenNameVector; TokenNameVector maTokenNames; + sal_Int32 mnAlphaTokens[26]; }; // ============================================================================ diff --git a/oox/source/token/tokenmap.cxx b/oox/source/token/tokenmap.cxx index 5460b7c..ea3e621e 100644 --- a/oox/source/token/tokenmap.cxx +++ b/oox/source/token/tokenmap.cxx @@ -79,6 +79,13 @@ TokenMap::TokenMap() : append( nToken ).append( ", '" ).append( aUtf8Name ).append( '\'' ).getStr() ); } #endif + + for (unsigned char c = 'a'; c <= 'z'; c++) + { + struct xmltoken* pToken = Perfect_Hash::in_word_set( + reinterpret_cast< const char* >( &c ), 1 ); + mnAlphaTokens[ c - 'a' ] = pToken ? pToken->nToken : XML_TOKEN_INVALID; + } } TokenMap::~TokenMap() @@ -108,6 +115,13 @@ Sequence< sal_Int8 > TokenMap::getUtf8TokenName( sal_Int32 nToken ) const sal_Int32 TokenMap::getTokenFromUtf8( const Sequence< sal_Int8 >& rUtf8Name ) const { + // 50% of OOXML tokens are primarily 1 lower-case character, a-z + if( rUtf8Name.getLength() == 1) + { + sal_Char c = rUtf8Name[0]; + if (c >= 'a' && c <= 'z') + return mnAlphaTokens[ c - 'a' ]; + } struct xmltoken* pToken = Perfect_Hash::in_word_set( reinterpret_cast< const char* >( rUtf8Name.getConstArray() ), rUtf8Name.getLength() ); return pToken ? pToken->nToken : XML_TOKEN_INVALID; commit 44b99d6e145df911b026213c581624bdcc2a70f5 Author: Michael Meeks <michael.me...@collabora.com> Date: Fri Oct 11 21:46:45 2013 +0100 fastparser: cache default namespace token for ooxml. Change-Id: Iee98ec92380d6d0404ab236e062ddbc2378cda43 diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx index a114c4e..de16108 100644 --- a/sax/source/fastparser/fastparser.cxx +++ b/sax/source/fastparser/fastparser.cxx @@ -486,10 +486,8 @@ OUString FastSaxParser::GetNamespaceURL( const sal_Char*pPrefix, int nPrefixLen // -------------------------------------------------------------------- -sal_Int32 FastSaxParser::GetTokenWithNamespaceURL( const OUString& rNamespaceURL, const sal_Char* pName, int nNameLen ) +sal_Int32 FastSaxParser::GetTokenWithContextNamespace( sal_Int32 nNamespaceToken, const sal_Char* pName, int nNameLen ) { - sal_Int32 nNamespaceToken = GetNamespaceToken( rNamespaceURL ); - if( nNamespaceToken != FastToken::DONTKNOW ) { sal_Int32 nNameToken = GetToken( pName, nNameLen ); @@ -958,10 +956,14 @@ void FastSaxParser::callbackStartElement( const XML_Char* pwName, const XML_Char sal_Int32 nNameLen, nPrefixLen; const XML_Char *pName; const XML_Char *pPrefix; - OUString aNamespace; + OUString sNamespace; + sal_Int32 nNamespaceToken = FastToken::DONTKNOW; FastAttributeList *pAttributes = new FastAttributeList( rEntity.mxTokenHandler ); if (!rEntity.maNamespaceStack.empty()) - aNamespace = rEntity.maNamespaceStack.top(); + { + sNamespace = rEntity.maNamespaceStack.top().msName; + nNamespaceToken = rEntity.maNamespaceStack.top().mnToken; + } try { @@ -987,8 +989,9 @@ void FastSaxParser::callbackStartElement( const XML_Char* pwName, const XML_Char { if( (nNameLen == 5) && (strcmp( pName, "xmlns" ) == 0) ) { - // namespace of the element found - aNamespace = OUString( awAttributes[i+1], strlen( awAttributes[i+1] ), RTL_TEXTENCODING_UTF8 ); + // default namespace is the attribute value + sNamespace = OUString( awAttributes[i+1], strlen( awAttributes[i+1] ), RTL_TEXTENCODING_UTF8 ); + nNamespaceToken = GetNamespaceToken( sNamespace ); } } } @@ -1026,17 +1029,20 @@ void FastSaxParser::callbackStartElement( const XML_Char* pwName, const XML_Char splitName( pwName, pPrefix, nPrefixLen, pName, nNameLen ); if( nPrefixLen > 0 ) nElementToken = GetTokenWithPrefix( pPrefix, nPrefixLen, pName, nNameLen ); - else if( !aNamespace.isEmpty() ) - nElementToken = GetTokenWithNamespaceURL( aNamespace, pName, nNameLen ); + else if( !sNamespace.isEmpty() ) + nElementToken = GetTokenWithContextNamespace( nNamespaceToken, pName, nNameLen ); else nElementToken = GetToken( pName ); if( nElementToken == FastToken::DONTKNOW ) if( nPrefixLen > 0 ) - aNamespace = GetNamespaceURL( pPrefix, nPrefixLen ); + { + sNamespace = GetNamespaceURL( pPrefix, nPrefixLen ); + nNamespaceToken = GetNamespaceToken( sNamespace ); + } - rEntity.maNamespaceStack.push(aNamespace); - produce(new Event( CallbackType::START_ELEMENT, nElementToken, aNamespace, + rEntity.maNamespaceStack.push( NameWithToken(sNamespace, nNamespaceToken) ); + produce(new Event( CallbackType::START_ELEMENT, nElementToken, sNamespace, OUString(pName, nNameLen, RTL_TEXTENCODING_UTF8), pAttributes )); } catch (const Exception& e) diff --git a/sax/source/fastparser/fastparser.hxx b/sax/source/fastparser/fastparser.hxx index ae328a9..1fb8c7a 100644 --- a/sax/source/fastparser/fastparser.hxx +++ b/sax/source/fastparser/fastparser.hxx @@ -57,6 +57,14 @@ typedef std::vector<Event *> EventList; enum CallbackType { START_ELEMENT, END_ELEMENT, CHARACTERS, DONE, EXCEPTION }; +struct NameWithToken +{ + OUString msName; + sal_Int32 mnToken; + NameWithToken(const OUString& sName, const sal_Int32& nToken): + msName(sName), mnToken(nToken) {} +}; + struct Event { struct argCharacters { OUString msChars; @@ -121,7 +129,7 @@ struct Entity : public ParserData // therefore the exception must be saved somewhere. ::com::sun::star::uno::Any maSavedException; - ::std::stack< OUString > maNamespaceStack; + ::std::stack< NameWithToken > maNamespaceStack; ::std::stack< SaxContextImpl* > maContextStack; // Determines which elements of maNamespaceDefines are valid in current context ::std::stack< sal_uInt32 > maNamespaceCount; @@ -167,7 +175,7 @@ public: void callbackStartElement( const XML_Char* name, const XML_Char** atts ); void callbackEndElement( const XML_Char* name ); void callbackCharacters( const XML_Char* s, int nLen ); - int callbackExternalEntityRef( XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); + int callbackExternalEntityRef( XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); void callbackEntityDecl(const XML_Char *entityName, int is_parameter_entity, const XML_Char *value, int value_length, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, @@ -188,7 +196,7 @@ private: OUString GetNamespaceURL( const OString& rPrefix ) throw (::com::sun::star::xml::sax::SAXException); OUString GetNamespaceURL( const sal_Char*pPrefix, int nPrefixLen ) throw (::com::sun::star::xml::sax::SAXException); sal_Int32 GetNamespaceToken( const OUString& rNamespaceURL ); - sal_Int32 GetTokenWithNamespaceURL( const OUString& rNamespaceURL, const sal_Char* pName, int nNameLen ); + sal_Int32 GetTokenWithContextNamespace( sal_Int32 nNamespaceToken, const sal_Char* pName, int nNameLen ); void DefineNamespace( const OString& rPrefix, const sal_Char* pNamespaceURL ); void pushContext(); commit f8315087aa5cf994c821b0e4176a68c0922bb987 Author: Matúš Kukan <matus.ku...@gmail.com> Date: Sun Oct 13 14:56:46 2013 +0200 fix previous commit Change-Id: I4182391e7967df77d76207b02288dba7e37fd270 diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx index 731097e..a114c4e 100644 --- a/sax/source/fastparser/fastparser.cxx +++ b/sax/source/fastparser/fastparser.cxx @@ -930,7 +930,7 @@ void FastSaxParser::parse() } while( nRead > 0 ); produce(new Event( CallbackType::DONE )); -#ifndef FREE_IN_MAIN_THREAD +#if !FREE_IN_MAIN_THREAD deleteUsedEvents(); #endif }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits