From e7115b75306144ed8fd19dd96da605a3d359489c Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 21 Jan 2022 00:56:05 +0100 Subject: [PATCH] QStringConverter: use QStaticByteArrayMatcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Boyer-Moore tables can be calculated at compile-time, and the needles are long enough to make skipping worthwhile, even for small haystacks. Pick-to: 6.3 Change-Id: I3237812490367ed0491eb8d1667c6da67f38c517 Reviewed-by: Thiago Macieira Reviewed-by: Edward Welbourne Reviewed-by: MÃ¥rten Nordheim --- src/corelib/text/qstringconverter.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp index db159738b1..95e49da32b 100644 --- a/src/corelib/text/qstringconverter.cpp +++ b/src/corelib/text/qstringconverter.cpp @@ -1809,10 +1809,13 @@ std::optional QStringConverter::encodingForHtml(QByt // trust the initial BOM return encoding; + static constexpr auto metaSearcher = qMakeStaticByteArrayMatcher("meta "); + static constexpr auto charsetSearcher = qMakeStaticByteArrayMatcher("charset="); + QByteArray header = data.first(qMin(data.size(), qsizetype(1024))).toByteArray().toLower(); - qsizetype pos = header.indexOf("meta "); + qsizetype pos = metaSearcher.indexIn(header); if (pos != -1) { - pos = header.indexOf("charset=", pos); + pos = charsetSearcher.indexIn(header, pos); if (pos != -1) { pos += int(qstrlen("charset=")); if (pos < header.size() && (header.at(pos) == '\"' || header.at(pos) == '\''))