diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2013-02-26 12:41:59 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-02-27 03:13:30 +0100 |
commit | 996db96d5eb4927a130605e8c1820d7e1b303191 (patch) | |
tree | 894ce9fb99955ba2f607b1d7e11bd371c465a860 /src/corelib/tools/qstring.cpp | |
parent | 7729d89e15bc68899554b28f480a891c61ef0872 (diff) |
Fix QString::toUcs4() returns incorrectly resized QVector
...when the string contains surrogate code points.
Task-number: QTBUG-25536
Change-Id: I07251fee641c14f33175678768ddbe551dbe2bb1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools/qstring.cpp')
-rw-r--r-- | src/corelib/tools/qstring.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index bbe7628d38..3089cfef8b 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -966,20 +966,21 @@ const QString::Null QString::null = { }; \sa utf16(), toLatin1(), toUtf8(), toLocal8Bit() */ -// ### replace with QCharIterator int QString::toUcs4_helper(const ushort *uc, int length, uint *out) { int i = 0; - for (; i < length; ++i) { - uint u = uc[i]; - if (QChar::isHighSurrogate(u) && i + 1 < length) { - ushort low = uc[i+1]; + const ushort *const e = uc + length; + while (uc < e) { + uint u = *uc; + if (QChar::isHighSurrogate(u) && uc + 1 < e) { + ushort low = uc[1]; if (QChar::isLowSurrogate(low)) { - ++i; + ++uc; u = QChar::surrogateToUcs4(u, low); } } - *out++ = u; + out[i++] = u; + ++uc; } return i; } |