| 285 | } |
| 286 | |
| 287 | bool ExpressionParser::isValid(const QString& expr, const QStringList& vars) { |
| 288 | QDEBUG(Q_FUNC_INFO << ", expr:" << expr << ", vars:" << vars); |
| 289 | if (expr.isEmpty()) |
| 290 | return true; |
| 291 | |
| 292 | gsl_set_error_handler_off(); |
| 293 | |
| 294 | Parser parser(false); |
| 295 | parser.setSkipSpecialFunctionEvaluation(true); |
| 296 | |
| 297 | for (const auto& var : vars) |
| 298 | parser.assign_symbol(qPrintable(var), 0); |
| 299 | |
| 300 | // Row index |
| 301 | parser.assign_symbol("i", 0); |
| 302 | |
| 303 | const auto numberLocale = QLocale(); |
| 304 | DEBUG(Q_FUNC_INFO << ", number locale: " << STDSTRING(numberLocale.name())) |
| 305 | parser.parse(qPrintable(expr), qPrintable(numberLocale.name())); |
| 306 | |
| 307 | // if parsing with number locale fails, try default locale |
| 308 | if (parser.parseErrors() > 0) { |
| 309 | DEBUG(Q_FUNC_INFO << ", WARNING: failed parsing expr \"" << STDSTRING(expr) << "\" with locale " << numberLocale.name().toStdString() |
| 310 | << ", errors = " << parser.parseErrors()) |
| 311 | parser.parse(qPrintable(expr), "en_US"); |
| 312 | if (parser.parseErrors() > 0) |
| 313 | DEBUG(Q_FUNC_INFO << ", ERROR: parsing FAILED, errors = " << parser.parseErrors()) |
| 314 | } |
| 315 | |
| 316 | /* remove temporarily defined symbols */ |
| 317 | for (const auto& var : vars) |
| 318 | parser.remove_symbol(qPrintable(var)); |
| 319 | |
| 320 | return parser.parseErrors() == 0; |
| 321 | } |
| 322 | |
| 323 | QStringList ExpressionParser::getParameter(const QString& expr, const QStringList& vars) { |
| 324 | QDEBUG(Q_FUNC_INFO << ", variables:" << vars); |
nothing calls this directly
no test coverage detected