diff --git a/src/DataFilter.cpp b/src/DataFilter.cpp index 958fc1820..9003857c4 100644 --- a/src/DataFilter.cpp +++ b/src/DataFilter.cpp @@ -1084,8 +1084,8 @@ void Leaf::validateFilter(DataFilter *df, Leaf *leaf) break; case Leaf::UnaryOperation : - { // only 1 at present, unary minus return the value * -1 - if (!Leaf::isNumber(df, leaf->lvalue.l)) { + { // unary minus needs a number, unary ! is happy with anything + if (leaf->op == '-' && !Leaf::isNumber(df, leaf->lvalue.l)) { DataFiltererrors << QString(tr("unary negation on a string!")); leaf->inerror = true; } @@ -2087,7 +2087,15 @@ Result Leaf::eval(Context *context, DataFilter *df, Leaf *leaf, float x, RideIte { // get result Result lhs = eval(context, df, leaf->lvalue.l, x, m, p); - return Result(lhs.number * -1); + + // unary minus + if (leaf->op == '-') return Result(lhs.number * -1); + + // unary not + if (leaf->op == '!') return Result(!lhs.number); + + // unknown + return(Result(0)); } break; diff --git a/src/DataFilter.y b/src/DataFilter.y index 6e7de1b6b..fca405049 100644 --- a/src/DataFilter.y +++ b/src/DataFilter.y @@ -117,6 +117,12 @@ lexpr : expr { $$ = $1; } $$->fparms << $3; $$->fparms << $5; $$->op = 0; } + | '!' lexpr %prec OR { $$ = new Leaf(@1.first_column, @2.last_column); + $$->type = Leaf::UnaryOperation; + $$->lvalue.l = $2; + $$->op = '!'; + $$->rvalue.l = NULL; + } | lexpr OR lexpr { $$ = new Leaf(@1.first_column, @3.last_column); $$->type = Leaf::Logical;