diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2021-08-27 15:48:12 +0200 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2021-08-30 17:46:00 +0200 |
commit | 88b54cc22a45f9724c201e7249ac79deb55ff48a (patch) | |
tree | e6538e9bc7f6633ffbd7868c10e85923e84f6d35 /src/corelib/text/qlocale.cpp | |
parent | 7d33779a795afb54af1a96c0da93b532f9db3ba2 (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.cpp | 43 |
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; |