[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-i18n-doc
Subject: [plasma-workspace/Plasma/5.8] runners/calculator: [Calculator Runner] Use "approximate" approximatio
From: Kai Uwe Broulik <null () kde ! org>
Date: 2017-03-28 8:28:37
Message-ID: E1csmUX-0004Eq-Sj () code ! kde ! org
[Download RAW message or body]
Git commit 34b74d7b5dac9dd458a960e392954ac6c30df3d2 by Kai Uwe Broulik.
Committed on 28/03/2017 at 08:26.
Pushed by broulik into branch 'Plasma/5.8'.
[Calculator Runner] Use "approximate" approximation mode
The runner calculator isn't entitled for being a scientifically correct calculator.
This keeps seemingly innocent calculations such as "2^0.333333333" from eating all \
RAM until it crashes. A hint is added to the result if it is only an approximation.
BUG: 277011
FIXED-IN: 5.8.7
CCMAIL: kde-i18n-doc@kde.org
Differential Revision: https://phabricator.kde.org/D4290
(cherry picked from commit df7f1ed1eb7df7e3c039dc19db4893ca01b3327f)
M +7 -3 runners/calculator/calculatorrunner.cpp
M +1 -1 runners/calculator/calculatorrunner.h
M +9 -1 runners/calculator/qalculate_engine.cpp
M +1 -1 runners/calculator/qalculate_engine.h
https://commits.kde.org/plasma-workspace/34b74d7b5dac9dd458a960e392954ac6c30df3d2
diff --git a/runners/calculator/calculatorrunner.cpp \
b/runners/calculator/calculatorrunner.cpp index f9552d2f..86111c9e 100644
--- a/runners/calculator/calculatorrunner.cpp
+++ b/runners/calculator/calculatorrunner.cpp
@@ -258,7 +258,8 @@ void CalculatorRunner::match(Plasma::RunnerContext &context)
cmd.replace(QRegExp(QStringLiteral("([a-zA-Z]+)")), QStringLiteral("Math.\\1")); \
//needed for accessing math funktions like sin(),.... #endif
- QString result = calculate(cmd);
+ bool isApproximate = false;
+ QString result = calculate(cmd, &isApproximate);
if (!result.isEmpty() && result != cmd) {
if (toHex) {
result = "0x" + QString::number(result.toInt(), 16).toUpper();
@@ -268,19 +269,22 @@ void CalculatorRunner::match(Plasma::RunnerContext &context)
match.setType(Plasma::QueryMatch::InformationalMatch);
match.setIconName(QStringLiteral("accessories-calculator"));
match.setText(result);
+ if (isApproximate) {
+ match.setSubtext(i18nc("The result of the calculation is only an \
approximation", "Approximation")); + }
match.setData(result);
match.setId(term);
context.addMatch(match);
}
}
-QString CalculatorRunner::calculate(const QString& term)
+QString CalculatorRunner::calculate(const QString& term, bool *isApproximate)
{
#ifdef ENABLE_QALCULATE
QString result;
try {
- result = m_engine->evaluate(term);
+ result = m_engine->evaluate(term, isApproximate);
} catch(std::exception& e) {
qDebug() << "qalculate error: " << e.what();
}
diff --git a/runners/calculator/calculatorrunner.h \
b/runners/calculator/calculatorrunner.h index f14de4df..9ab1a860 100644
--- a/runners/calculator/calculatorrunner.h
+++ b/runners/calculator/calculatorrunner.h
@@ -47,7 +47,7 @@ class CalculatorRunner : public Plasma::AbstractRunner
QMimeData * mimeDataForMatch(const Plasma::QueryMatch &match) override;
private:
- QString calculate(const QString& term);
+ QString calculate(const QString& term, bool *isApproximate);
void userFriendlySubstitutions(QString& cmd);
void powSubstitutions(QString& cmd);
void hexSubstitutions(QString& cmd);
diff --git a/runners/calculator/qalculate_engine.cpp \
b/runners/calculator/qalculate_engine.cpp index f47cee78..39a3e672 100644
--- a/runners/calculator/qalculate_engine.cpp
+++ b/runners/calculator/qalculate_engine.cpp
@@ -79,7 +79,7 @@ void QalculateEngine::updateResult(KJob* job)
}
}
-QString QalculateEngine::evaluate(const QString& expression)
+QString QalculateEngine::evaluate(const QString& expression, bool *isApproximate)
{
if (expression.isEmpty()) {
return "";
@@ -98,6 +98,10 @@ QString QalculateEngine::evaluate(const QString& expression)
eo.parse_options.angle_unit = ANGLE_UNIT_RADIANS;
eo.structuring = STRUCTURING_SIMPLIFY;
+ // suggested in https://github.com/Qalculate/libqalculate/issues/16
+ // to avoid memory overflow for seemingly innocent calculations (Bug 277011)
+ eo.approximation = APPROXIMATION_APPROXIMATE;
+
CALCULATOR->setPrecision(16);
MathStructure result = CALCULATOR->calculate(ctext, eo);
@@ -114,6 +118,10 @@ QString QalculateEngine::evaluate(const QString& expression)
m_lastResult = result.print(po).c_str();
+ if (isApproximate) {
+ *isApproximate = result.isApproximate();
+ }
+
return m_lastResult;
}
diff --git a/runners/calculator/qalculate_engine.h \
b/runners/calculator/qalculate_engine.h index 5fd88876..5bdff27b 100644
--- a/runners/calculator/qalculate_engine.h
+++ b/runners/calculator/qalculate_engine.h
@@ -35,7 +35,7 @@ public:
QString lastResult() const { return m_lastResult; }
public Q_SLOTS:
- QString evaluate(const QString& expression);
+ QString evaluate(const QString& expression, bool *isApproximate = nullptr);
void updateExchangeRates();
void copyToClipboard(bool flag = true);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic