tdf#133835 speedup calc autofilter (4)
Tweak INetURLObject::parseHost so it doesn't need its own
OUStringBuffer, and can just use the callers'
Saves 5%
Change-Id: I481fabd4272bc9f172dd751a7019090b95a65e2d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125599
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/include/tools/urlobj.hxx b/include/tools/urlobj.hxx
index 6b9dece..ede630b 100644
--- a/include/tools/urlobj.hxx
+++ b/include/tools/urlobj.hxx
@@ -1037,7 +1037,7 @@ private:
TOOLS_DLLPRIVATE static bool parseHost(
sal_Unicode const *& rBegin, sal_Unicode const * pEnd,
OUString & rCanonic);
OUStringBuffer* pCanonic);
TOOLS_DLLPRIVATE static bool parseHostOrNetBiosName(
sal_Unicode const * pBegin, sal_Unicode const * pEnd,
diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx
index 6b07418..8b2882b 100644
--- a/tools/source/fsys/urlobj.cxx
+++ b/tools/source/fsys/urlobj.cxx
@@ -1370,16 +1370,15 @@ bool INetURLObject::setAbsURIRef(OUString const & rTheAbsURIRef,
}
break;
}
OUStringBuffer aSynHost(64);
sal_Int32 nLenBeforeHost = aSynAbsURIRef.getLength();
if (!parseHostOrNetBiosName(
pHostPortBegin, pPort, eMechanism, eCharset,
bNetBiosName, &aSynHost))
bNetBiosName, &aSynAbsURIRef))
{
setInvalid();
return false;
}
m_aHost.set(aSynAbsURIRef, aSynHost.makeStringAndClear(),
aSynAbsURIRef.getLength());
m_aHost = SubString(nLenBeforeHost, aSynAbsURIRef.getLength() - nLenBeforeHost);
if (pPort != pHostPortEnd)
{
aSynAbsURIRef.append(':');
@@ -2329,7 +2328,7 @@ bool INetURLObject::setPassword(std::u16string_view rThePassword,
// static
bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * pEnd,
OUString & rCanonic)
OUStringBuffer* pCanonic)
{
// RFC 2373 is inconsistent about how to write an IPv6 address in which an
// IPv4 address directly follows the abbreviating "::". The ABNF in
@@ -2343,19 +2342,20 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
STATE_IP6_HEXSEQ1_MAYBE_IP4, STATE_IP6_HEXSEQ2,
STATE_IP6_HEXSEQ2_COLON, STATE_IP6_HEXSEQ2_MAYBE_IP4,
STATE_IP6_IP4, STATE_IP6_IP4_DOT, STATE_IP6_DONE };
OUStringBuffer aTheCanonic(32);
sal_uInt32 nNumber = 0;
int nDigits = 0;
int nOctets = 0;
State eState = STATE_INITIAL;
sal_Unicode const * p = rBegin;
sal_Int32 nOriginalCanonicLength = pCanonic ? pCanonic->getLength() : 0;
for (; p != pEnd; ++p)
switch (eState)
{
case STATE_INITIAL:
if (*p == '[')
{
aTheCanonic.append('[');
if (pCanonic)
pCanonic->append('[');
eState = STATE_IP6;
}
else if (rtl::isAsciiAlpha(*p) || *p == '_')
@@ -2425,8 +2425,11 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
if (*p == '.')
if (nOctets < 4)
{
aTheCanonic.append(static_cast<sal_Int64>(nNumber));
aTheCanonic.append( '.' );
if (pCanonic)
{
pCanonic->append(static_cast<sal_Int64>(nNumber));
pCanonic->append( '.' );
}
++nOctets;
eState = STATE_IP4_DOT;
}
@@ -2477,7 +2480,8 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
case STATE_IP6_COLON:
if (*p == ':')
{
aTheCanonic.append("::");
if (pCanonic)
pCanonic->append("::");
eState = STATE_IP6_2COLON;
}
else
@@ -2489,7 +2493,8 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
eState = STATE_IP6_DONE;
else if (*p == ':')
{
aTheCanonic.append(':');
if (pCanonic)
pCanonic->append(':');
eState = STATE_IP6_3COLON;
}
else if (rtl::isAsciiDigit(*p))
@@ -2523,15 +2528,19 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
case STATE_IP6_HEXSEQ1:
if (*p == ']')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
if (pCanonic)
pCanonic->append(
OUString::number(nNumber, 16));
eState = STATE_IP6_DONE;
}
else if (*p == ':')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
aTheCanonic.append(':');
if (pCanonic)
{
pCanonic->append(
OUString::number(nNumber, 16));
pCanonic->append(':');
}
eState = STATE_IP6_HEXSEQ1_COLON;
}
else if (rtl::isAsciiHexDigit(*p) && nDigits < 4)
@@ -2546,7 +2555,8 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
case STATE_IP6_HEXSEQ1_COLON:
if (*p == ':')
{
aTheCanonic.append(':');
if (pCanonic)
pCanonic->append(':');
eState = STATE_IP6_2COLON;
}
else if (rtl::isAsciiDigit(*p))
@@ -2568,24 +2578,31 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
case STATE_IP6_HEXSEQ1_MAYBE_IP4:
if (*p == ']')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
if (pCanonic)
pCanonic->append(
OUString::number(nNumber, 16));
eState = STATE_IP6_DONE;
}
else if (*p == ':')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
aTheCanonic.append(':');
if (pCanonic)
{
pCanonic->append(
OUString::number(nNumber, 16));
pCanonic->append(':');
}
eState = STATE_IP6_HEXSEQ1_COLON;
}
else if (*p == '.')
{
nNumber = 100 * (nNumber >> 8) + 10 * (nNumber >> 4 & 15)
+ (nNumber & 15);
aTheCanonic.append(
OUString::number(nNumber));
aTheCanonic.append('.');
if (pCanonic)
{
pCanonic->append(
OUString::number(nNumber));
pCanonic->append('.');
}
nOctets = 2;
eState = STATE_IP6_IP4_DOT;
}
@@ -2607,15 +2624,19 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
case STATE_IP6_HEXSEQ2:
if (*p == ']')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
if (pCanonic)
pCanonic->append(
OUString::number(nNumber, 16));
eState = STATE_IP6_DONE;
}
else if (*p == ':')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
aTheCanonic.append(':');
if (pCanonic)
{
pCanonic->append(
OUString::number(nNumber, 16));
pCanonic->append(':');
}
eState = STATE_IP6_HEXSEQ2_COLON;
}
else if (rtl::isAsciiHexDigit(*p) && nDigits < 4)
@@ -2647,24 +2668,31 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
case STATE_IP6_HEXSEQ2_MAYBE_IP4:
if (*p == ']')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
if (pCanonic)
pCanonic->append(
OUString::number(nNumber, 16));
eState = STATE_IP6_DONE;
}
else if (*p == ':')
{
aTheCanonic.append(
OUString::number(nNumber, 16));
aTheCanonic.append(':');
if (pCanonic)
{
pCanonic->append(
OUString::number(nNumber, 16));
pCanonic->append(':');
}
eState = STATE_IP6_HEXSEQ2_COLON;
}
else if (*p == '.')
{
nNumber = 100 * (nNumber >> 8) + 10 * (nNumber >> 4 & 15)
+ (nNumber & 15);
aTheCanonic.append(
OUString::number(nNumber));
aTheCanonic.append('.');
if (pCanonic)
{
pCanonic->append(
OUString::number(nNumber));
pCanonic->append('.');
}
nOctets = 2;
eState = STATE_IP6_IP4_DOT;
}
@@ -2687,8 +2715,9 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
if (*p == ']')
if (nOctets == 4)
{
aTheCanonic.append(
OUString::number(nNumber));
if (pCanonic)
pCanonic->append(
OUString::number(nNumber));
eState = STATE_IP6_DONE;
}
else
@@ -2696,9 +2725,12 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
else if (*p == '.')
if (nOctets < 4)
{
aTheCanonic.append(
OUString::number(nNumber));
aTheCanonic.append('.');
if (pCanonic)
{
pCanonic->append(
OUString::number(nNumber));
pCanonic->append('.');
}
++nOctets;
eState = STATE_IP6_IP4_DOT;
}
@@ -2733,30 +2765,36 @@ bool INetURLObject::parseHost(sal_Unicode const *& rBegin, sal_Unicode const * p
case STATE_LABEL:
case STATE_TOPLABEL:
case STATE_TOPLABEL_DOT:
aTheCanonic.setLength(0);
aTheCanonic.append(rBegin, p - rBegin);
if (pCanonic)
{
pCanonic->setLength(nOriginalCanonicLength);
pCanonic->append(rBegin, p - rBegin);
}
rBegin = p;
rCanonic = aTheCanonic.makeStringAndClear();
return true;
case STATE_IP4:
if (nOctets == 4)
{
aTheCanonic.append(
OUString::number(nNumber));
if (pCanonic)
pCanonic->append(
OUString::number(nNumber));
rBegin = p;
rCanonic = aTheCanonic.makeStringAndClear();
return true;
}
if (pCanonic)
pCanonic->setLength(nOriginalCanonicLength);
return false;
case STATE_IP6_DONE:
aTheCanonic.append(']');
if (pCanonic)
pCanonic->append(']');
rBegin = p;
rCanonic = aTheCanonic.makeStringAndClear();
return true;
default:
if (pCanonic)
pCanonic->setLength(nOriginalCanonicLength);
return false;
}
}
@@ -2767,11 +2805,11 @@ bool INetURLObject::parseHostOrNetBiosName(
EncodeMechanism eMechanism, rtl_TextEncoding eCharset, bool bNetBiosName,
OUStringBuffer* pCanonic)
{
OUString aTheCanonic;
sal_Int32 nOriginalCanonicLength = pCanonic ? pCanonic->getLength() : 0;
if (pBegin < pEnd)
{
sal_Unicode const * p = pBegin;
if (!parseHost(p, pEnd, aTheCanonic) || p != pEnd)
if (!parseHost(p, pEnd, pCanonic) || p != pEnd)
{
if (bNetBiosName)
{
@@ -2783,7 +2821,11 @@ bool INetURLObject::parseHostOrNetBiosName(
eMechanism, eCharset,
eEscapeType);
if (!INetMIME::isVisible(nUTF32))
{
if (pCanonic)
pCanonic->setLength(nOriginalCanonicLength);
return false;
}
if (!rtl::isAsciiAlphanumeric(nUTF32))
switch (nUTF32)
{
@@ -2811,15 +2853,17 @@ bool INetURLObject::parseHostOrNetBiosName(
eCharset, true);
}
}
aTheCanonic = buf.makeStringAndClear();
if (pCanonic)
pCanonic->append(buf);
}
else
{
if (pCanonic)
pCanonic->setLength(nOriginalCanonicLength);
return false;
}
}
}
if (pCanonic != nullptr) {
*pCanonic = aTheCanonic;
}
return true;
}