QLocal8Bit::convertFromUnicode[win] use local array for buffer
To match convertToUnicode, we use a local array as a temporary buffer, then if any growth is needed we work directly with a QBA. As a drive-by: explicitly cast to int where we pass int Pick-to: 6.6 6.5 Task-number: QTBUG-105105 Task-number: QTBUG-118185 Change-Id: I1efff318eea41d87d558599d737b64107af4ae17 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
parent
36a6522b48
commit
e34ee8e88a
@ -1396,14 +1396,22 @@ QByteArray QLocal8Bit::convertFromUnicode_sys(QStringView in, quint32 codePage,
|
|||||||
return QByteArray();
|
return QByteArray();
|
||||||
if (uclen == 0)
|
if (uclen == 0)
|
||||||
return QByteArray("");
|
return QByteArray("");
|
||||||
QByteArray mb(4096, 0);
|
|
||||||
|
std::array<char, 4096> buf;
|
||||||
|
char *out = buf.data();
|
||||||
|
qsizetype outlen = buf.size();
|
||||||
|
QByteArray mb;
|
||||||
|
|
||||||
int len;
|
int len;
|
||||||
while (!(len = WideCharToMultiByte(codePage, 0, ch, uclen, mb.data(), mb.size() - 1, nullptr,
|
while (!(len = WideCharToMultiByte(codePage, 0, ch, int(uclen), out, int(outlen), nullptr,
|
||||||
nullptr))) {
|
nullptr))) {
|
||||||
int r = GetLastError();
|
int r = GetLastError();
|
||||||
if (r == ERROR_INSUFFICIENT_BUFFER) {
|
if (r == ERROR_INSUFFICIENT_BUFFER) {
|
||||||
mb.resize(1
|
int neededLength = WideCharToMultiByte(codePage, 0, ch, int(uclen), nullptr, 0, nullptr,
|
||||||
+ WideCharToMultiByte(codePage, 0, ch, uclen, nullptr, 0, nullptr, nullptr));
|
nullptr);
|
||||||
|
mb.resize(neededLength);
|
||||||
|
out = mb.data();
|
||||||
|
outlen = neededLength;
|
||||||
// and try again...
|
// and try again...
|
||||||
} else {
|
} else {
|
||||||
// Fail. Probably can't happen in fact (dwFlags is 0).
|
// Fail. Probably can't happen in fact (dwFlags is 0).
|
||||||
@ -1416,7 +1424,12 @@ QByteArray QLocal8Bit::convertFromUnicode_sys(QStringView in, quint32 codePage,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mb.resize(len);
|
if (!len)
|
||||||
|
return QByteArray();
|
||||||
|
if (out == buf.data())
|
||||||
|
mb = QByteArray(buf.data(), len);
|
||||||
|
else
|
||||||
|
mb.resize(len);
|
||||||
return mb;
|
return mb;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user