reduce time in strlen when parsing xml prefix
Change-Id: Ieac59782b502cf90cbc4c939b14317ac7c637c99 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183754 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Jenkins
This commit is contained in:
parent
8009183a7a
commit
ed1f295018
@ -280,7 +280,7 @@ private:
|
||||
|
||||
sal_Int32 GetToken( const xmlChar* pName );
|
||||
/// @throws css::xml::sax::SAXException
|
||||
sal_Int32 GetTokenWithPrefix( const xmlChar* pPrefix, const xmlChar* pName );
|
||||
sal_Int32 GetTokenWithPrefix( std::string_view sPrefix, const xmlChar* pName );
|
||||
/// @throws css::xml::sax::SAXException
|
||||
OUString const & GetNamespaceURL( std::string_view rPrefix );
|
||||
sal_Int32 GetNamespaceToken( const OUString& rNamespaceURL );
|
||||
@ -704,13 +704,12 @@ sal_Int32 FastSaxParserImpl::GetToken(const xmlChar* pName)
|
||||
XML_CAST( pName ) ); // uses utf-8
|
||||
}
|
||||
|
||||
sal_Int32 FastSaxParserImpl::GetTokenWithPrefix( const xmlChar* pPrefix, const xmlChar* pName )
|
||||
sal_Int32 FastSaxParserImpl::GetTokenWithPrefix( std::string_view sPrefix, const xmlChar* pName )
|
||||
{
|
||||
Entity& rEntity = getEntity();
|
||||
if (rEntity.maNamespaceCount.empty())
|
||||
return FastToken::DONTKNOW;
|
||||
|
||||
std::string_view sPrefix(XML_CAST(pPrefix));
|
||||
sal_uInt32 nNamespace = rEntity.maNamespaceCount.top();
|
||||
while( nNamespace-- )
|
||||
{
|
||||
@ -1191,6 +1190,9 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm
|
||||
First, process all namespaces, second, process the attributes after namespaces
|
||||
have been initialized. */
|
||||
|
||||
std::string_view sPrefix; // convert to string_view so we only do strlen() once.
|
||||
if (prefix != nullptr)
|
||||
sPrefix = XML_CAST(prefix);
|
||||
// #158414# first: get namespaces
|
||||
for (int i = 0; i < numNamespaces * 2; i += 2)
|
||||
{
|
||||
@ -1224,7 +1226,7 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm
|
||||
// attributes[] is ( localname / prefix / nsURI / valueBegin / valueEnd )
|
||||
if( attributes[ i + 1 ] != nullptr )
|
||||
{
|
||||
sal_Int32 nAttributeToken = GetTokenWithPrefix(attributes[ i + 1 ], attributes[ i ]);
|
||||
sal_Int32 nAttributeToken = GetTokenWithPrefix(XML_CAST(attributes[ i + 1 ]), attributes[ i ]);
|
||||
if( nAttributeToken != FastToken::DONTKNOW )
|
||||
rEvent.mxAttributes->add( nAttributeToken, std::string_view(XML_CAST( attributes[ i + 3 ] ), attributes[ i + 4 ] - attributes[ i + 3 ]) );
|
||||
else
|
||||
@ -1245,8 +1247,8 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm
|
||||
}
|
||||
}
|
||||
|
||||
if( prefix != nullptr )
|
||||
rEvent.mnElementToken = GetTokenWithPrefix(prefix, localName);
|
||||
if( !sPrefix.empty() )
|
||||
rEvent.mnElementToken = GetTokenWithPrefix(sPrefix, localName);
|
||||
else if( !sNamespace.isEmpty() )
|
||||
rEvent.mnElementToken = GetTokenWithContextNamespace(nNamespaceToken, localName);
|
||||
else
|
||||
@ -1269,9 +1271,9 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm
|
||||
if( rEvent.mnElementToken == FastToken::DONTKNOW )
|
||||
{
|
||||
OUString aElementPrefix;
|
||||
if( prefix != nullptr )
|
||||
if( !sPrefix.empty() )
|
||||
{
|
||||
aElementPrefix = OUString( XML_CAST( prefix ), strlen( XML_CAST( prefix )), RTL_TEXTENCODING_UTF8 );
|
||||
aElementPrefix = OUString( sPrefix.data(), sPrefix.size(), RTL_TEXTENCODING_UTF8 );
|
||||
if ( URI != nullptr )
|
||||
sNamespace = OUString( XML_CAST( URI ), strlen( XML_CAST( URI )), RTL_TEXTENCODING_UTF8 );
|
||||
else if ( m_bIgnoreMissingNSDecl )
|
||||
|
Loading…
x
Reference in New Issue
Block a user