summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qlocale.cpp
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2021-08-27 15:48:12 +0200
committerEdward Welbourne <edward.welbourne@qt.io>2021-08-30 17:46:00 +0200
commit88b54cc22a45f9724c201e7249ac79deb55ff48a (patch)
treee6538e9bc7f6633ffbd7868c10e85923e84f6d35 /src/corelib/text/qlocale.cpp
parent7d33779a795afb54af1a96c0da93b532f9db3ba2 (diff)
Rework QLocalePrivate::bytearrayToU?LongLong()
Change it to take a QByteArrayView instead of a plain char *; all its callers do know the size and propagating it enables the implementation to call strntou?ll() rather than strtou?ll(), thereby escaping the need for '\0'-termination. Fixes: QTBUG-74286 Change-Id: Ie9394786e9fcf25c1d1be2421805f47c018d13bb Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/corelib/text/qlocale.cpp')
-rw-r--r--src/corelib/text/qlocale.cpp43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index db8e1fe563..5abc4d3a09 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -3997,7 +3997,7 @@ qlonglong QLocaleData::stringToLongLong(QStringView str, int base, bool *ok,
return 0;
}
- return bytearrayToLongLong(buff.constData(), base, ok);
+ return bytearrayToLongLong(QByteArrayView(buff.constData(), buff.size()), base, ok);
}
qulonglong QLocaleData::stringToUnsLongLong(QStringView str, int base, bool *ok,
@@ -4010,34 +4010,34 @@ qulonglong QLocaleData::stringToUnsLongLong(QStringView str, int base, bool *ok,
return 0;
}
- return bytearrayToUnsLongLong(buff.constData(), base, ok);
+ return bytearrayToUnsLongLong(QByteArrayView(buff.constData(), buff.size()), base, ok);
}
-qlonglong QLocaleData::bytearrayToLongLong(const char *num, int base, bool *ok)
+qlonglong QLocaleData::bytearrayToLongLong(QByteArrayView num, int base, bool *ok)
{
- bool _ok;
- const char *endptr;
-
- if (*num == '\0') {
+ if (num.isEmpty() || num.at(0) == '\0') {
if (ok != nullptr)
*ok = false;
return 0;
}
- qlonglong l = qstrtoll(num, &endptr, base, &_ok);
+ bool _ok;
+ const char *endptr;
+ const qlonglong l = qstrntoll(num.data(), num.size(), &endptr, base, &_ok);
- if (!_ok) {
+ if (!_ok || endptr == num.data()) {
if (ok != nullptr)
*ok = false;
return 0;
}
- if (*endptr != '\0') {
- while (ascii_isspace(*endptr))
+ const char *const stop = num.end();
+ if (endptr < stop && *endptr != '\0') {
+ while (endptr < stop && ascii_isspace(*endptr))
++endptr;
}
- if (*endptr != '\0') {
+ if (endptr < stop && *endptr != '\0') {
// we stopped at a non-digit character after converting some digits
if (ok != nullptr)
*ok = false;
@@ -4049,24 +4049,31 @@ qlonglong QLocaleData::bytearrayToLongLong(const char *num, int base, bool *ok)
return l;
}
-qulonglong QLocaleData::bytearrayToUnsLongLong(const char *num, int base, bool *ok)
+qulonglong QLocaleData::bytearrayToUnsLongLong(QByteArrayView num, int base, bool *ok)
{
+ if (num.isEmpty() || num.at(0) == '\0') {
+ if (ok != nullptr)
+ *ok = false;
+ return 0;
+ }
+
bool _ok;
const char *endptr;
- qulonglong l = qstrtoull(num, &endptr, base, &_ok);
+ const qulonglong l = qstrntoull(num.data(), num.size(), &endptr, base, &_ok);
- if (!_ok) {
+ if (!_ok || endptr == num.data()) {
if (ok != nullptr)
*ok = false;
return 0;
}
- if (*endptr != '\0') {
- while (ascii_isspace(*endptr))
+ const char *const stop = num.end();
+ if (endptr < stop && *endptr != '\0') {
+ while (endptr < stop && ascii_isspace(*endptr))
++endptr;
}
- if (*endptr != '\0') {
+ if (endptr < stop && *endptr != '\0') {
if (ok != nullptr)
*ok = false;
return 0;