summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2020-07-24 10:18:37 -0700
committerEdward Welbourne <edward.welbourne@qt.io>2020-07-31 03:29:11 +0000
commitcaa40f57d4d9ccf22d728e486148d2be6b29e249 (patch)
tree4afc221bd8b2b950b3961f2f4a6b4714d9297ea3 /src
parent2ab4fe2ac84d0da84b489f9898d44ab77b78fd6b (diff)
QLocale: update qt_asciiToDouble to use qsizetype
No need to change the output variable from int to qsizetype. That would complicate the use of libdouble-conversion, which uses ints. Change-Id: Iea47e0f8fc8b40378df7fffd1624bfdba1189d81 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/text/qlocale_tools.cpp20
-rw-r--r--src/corelib/text/qlocale_tools_p.h12
2 files changed, 19 insertions, 13 deletions
diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp
index 4e43d7d29b..cc34d3149a 100644
--- a/src/corelib/text/qlocale_tools.cpp
+++ b/src/corelib/text/qlocale_tools.cpp
@@ -278,7 +278,7 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha
--length;
}
-double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
+double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &processed,
StrayCharacterMode strayCharMode)
{
auto string_equals = [](const char *needle, const char *haystack, qsizetype haystackLen) {
@@ -329,7 +329,14 @@ double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
| double_conversion::StringToDoubleConverter::ALLOW_TRAILING_SPACES;
}
double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_qnan(), nullptr, nullptr);
- d = conv.StringToDouble(num, numLen, &processed);
+ if (int(numLen) != numLen) {
+ // a number over 2 GB in length is silly, just assume it isn't valid
+ ok = false;
+ processed = 0;
+ return 0.0;
+ } else {
+ d = conv.StringToDouble(num, numLen, &processed);
+ }
if (!qIsFinite(d)) {
ok = false;
@@ -487,19 +494,12 @@ QString qulltoa(qulonglong number, int base, const QStringView zero)
return QString(reinterpret_cast<QChar *>(p), end - p);
}
-double qstrtod(const char *s00, const char **se, bool *ok)
-{
- const int len = static_cast<int>(strlen(s00));
- Q_ASSERT(len >= 0);
- return qstrntod(s00, len, se, ok);
-}
-
/*!
\internal
Converts the initial portion of the string pointed to by \a s00 to a double, using the 'C' locale.
*/
-double qstrntod(const char *s00, int len, const char **se, bool *ok)
+double qstrntod(const char *s00, qsizetype len, const char **se, bool *ok)
{
int processed = 0;
bool nonNullOk = false;
diff --git a/src/corelib/text/qlocale_tools_p.h b/src/corelib/text/qlocale_tools_p.h
index 17bfcb2e36..723f27f3ee 100644
--- a/src/corelib/text/qlocale_tools_p.h
+++ b/src/corelib/text/qlocale_tools_p.h
@@ -62,7 +62,8 @@ enum StrayCharacterMode {
WhitespacesAllowed
};
-double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
+// API note: this function can't process a number with more than 2.1 billion digits
+double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &processed,
StrayCharacterMode strayCharMode = TrailingJunkProhibited);
void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
bool &sign, int &length, int &decpt);
@@ -106,8 +107,13 @@ inline UcsInt unicodeForDigit(uint digit, UcsInt zero)
return zero + digit;
}
-Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok);
-Q_CORE_EXPORT double qstrntod(const char *s00, int len, char const **se, bool *ok);
+Q_CORE_EXPORT double qstrntod(const char *s00, qsizetype len, char const **se, bool *ok);
+inline double qstrtod(const char *s00, char const **se, bool *ok)
+{
+ qsizetype len = qsizetype(strlen(s00));
+ return qstrntod(s00, len, se, ok);
+}
+
qlonglong qstrtoll(const char *nptr, const char **endptr, int base, bool *ok);
qulonglong qstrtoull(const char *nptr, const char **endptr, int base, bool *ok);