summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@nokia.com>2009-03-18 21:39:03 (GMT)
committerThiago Macieira <thiago.macieira@nokia.com>2009-07-21 13:48:45 (GMT)
commit3b545a4008fed0250d61ce1bb54af1a47fd8df92 (patch)
treee271ed61fbaf06fd744636ebb4eb6d20c105a376 /src
parente3c5ca076ee15975dd2d8973b871ec0115c614fc (diff)
downloadQt-3b545a4008fed0250d61ce1bb54af1a47fd8df92.zip
Qt-3b545a4008fed0250d61ce1bb54af1a47fd8df92.tar.gz
Qt-3b545a4008fed0250d61ce1bb54af1a47fd8df92.tar.bz2
Change qt_nameprep to do in-line nameprepping
This will allow to do less allocations in qt_ACE_do.
Diffstat (limited to 'src')
-rw-r--r--src/corelib/io/qurl.cpp50
1 files changed, 24 insertions, 26 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index dc27dfb..d65cee2 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -2336,12 +2336,12 @@ static const NameprepCaseFoldingEntry NameprepCaseFolding[] = {
{ 0x1D7BB, { 0x03C3, 0x0000, 0x0000, 0x0000 } }
};
-static void mapToLowerCase(QString *str)
+static void mapToLowerCase(QString *str, int from)
{
int N = sizeof(NameprepCaseFolding) / sizeof(NameprepCaseFolding[0]);
QChar *d = 0;
- for (int i = 0; i < str->size(); ++i) {
+ for (int i = from; i < str->size(); ++i) {
int uc = str->at(i).unicode();
if (uc < 0x80) {
if (uc <= 'Z' && uc >= 'A') {
@@ -2388,11 +2388,11 @@ static bool isMappedToNothing(const QChar &ch)
}
-static void stripProhibitedOutput(QString *str)
+static void stripProhibitedOutput(QString *str, int from)
{
- ushort *out = (ushort *)str->data();
+ ushort *out = (ushort *)str->data() + from;
const ushort *in = out;
- const ushort *end = out + str->size();
+ const ushort *end = (ushort *)str->data() + str->size();
while (in < end) {
ushort uc = *in;
if (uc < 0x80 ||
@@ -2903,36 +2903,34 @@ static bool isBidirectionalL(const QChar &ch)
#ifdef QT_BUILD_INTERNAL
// export for tst_qurl.cpp
-Q_AUTOTEST_EXPORT QString qt_nameprep(const QString &);
+Q_AUTOTEST_EXPORT void qt_nameprep(QString *source, int from);
Q_AUTOTEST_EXPORT bool qt_check_std3rules(const QStringRef &);
#else
// non-test build, keep the symbols for ourselves
-static QString qt_nameprep(const QString &);
+static QString void qt_nameprep(QString *source, int from)
static bool qt_check_std3rules(const QStringRef &);
#endif
-QString qt_nameprep(const QString &source)
+void qt_nameprep(QString *source, int from)
{
- QString mapped = source;
+ QString &mapped = *source;
- bool simple = true;
- for (int i = 0; i < mapped.size(); ++i) {
- ushort uc = mapped.at(i).unicode();
+ for ( ; from < mapped.size(); ++from) {
+ ushort uc = mapped.at(from).unicode();
if (uc > 0x80) {
- simple = false;
break;
} else if (uc >= 'A' && uc <= 'Z') {
- mapped[i] = QChar(uc | 0x20);
+ mapped[from] = QChar(uc | 0x20);
}
}
- if (simple)
- return mapped;
+ if (from == mapped.size())
+ return; // everything was mapped easily (lowercased, actually)
// Characters commonly mapped to nothing are simply removed
// (Table B.1)
- QChar *out = mapped.data();
+ QChar *out = mapped.data() + from;
const QChar *in = out;
- const QChar *e = in + mapped.size();
+ const QChar *e = mapped.constData() + mapped.size();
while (in < e) {
if (!isMappedToNothing(*in))
*out++ = *in;
@@ -2942,30 +2940,30 @@ QString qt_nameprep(const QString &source)
mapped.truncate(out - mapped.constData());
// Map to lowercase (Table B.2)
- mapToLowerCase(&mapped);
+ mapToLowerCase(&mapped, from);
// Normalize to Unicode 3.2 form KC
- mapped = mapped.normalized(QString::NormalizationForm_KC, QChar::Unicode_3_2);
+ extern void qt_string_normalize(QString *data, QString::NormalizationForm mode,
+ QChar::UnicodeVersion version, int from);
+ qt_string_normalize(&mapped, QString::NormalizationForm_KC, QChar::Unicode_3_2, from);
// Strip prohibited output
- stripProhibitedOutput(&mapped);
+ stripProhibitedOutput(&mapped, from);
// Check for valid bidirectional characters
bool containsLCat = false;
bool containsRandALCat = false;
- for (int j = 0; j < mapped.size() && (!containsLCat || !containsRandALCat); ++j) {
+ for (int j = from; j < mapped.size() && (!containsLCat || !containsRandALCat); ++j) {
if (isBidirectionalL(mapped.at(j)))
containsLCat = true;
else if (isBidirectionalRorAL(mapped.at(j)))
containsRandALCat = true;
}
if (containsRandALCat) {
- if (containsLCat || (!isBidirectionalRorAL(mapped.at(0))
+ if (containsLCat || (!isBidirectionalRorAL(mapped.at(from))
|| !isBidirectionalRorAL(mapped.at(mapped.size() - 1))))
mapped.clear();
}
-
- return mapped;
}
bool qt_check_std3rules(const QStringRef &source)
@@ -3281,7 +3279,7 @@ static QString qt_ACE_do(const QString &domainMC, AceOperation op)
// Nameprep the host. If the labels in the hostname are Punycode
// encoded, we decode them immediately, then nameprep them.
QString tmp = domain.mid(lastIdx, idx - lastIdx);
- tmp = qt_nameprep(tmp);
+ qt_nameprep(&tmp, 0);
if (isIdnEnabled) {
toPunycodeHelper(tmp.constData(), tmp.size(), &aux);