From 22e9d84074a575c4374e701ead3567a10e9f2f16 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 11 Sep 2011 00:47:11 -0400 Subject: [PATCH] Expressions - Implemented E9:operator_negate, the unary -. --- src/E9.cpp | 43 +++++++++++++++++++++++++++++++------------ src/E9.h | 3 ++- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/E9.cpp b/src/E9.cpp index 0b845cded..b6bfb09bd 100644 --- a/src/E9.cpp +++ b/src/E9.cpp @@ -109,12 +109,15 @@ void E9::eval (const Task& task, std::vector & value_stack) operator_not (result, right); } -/* - // TODO Unary -. - else if (arg->raw == "-") + + // TODO Not sure this is correct. + else if (arg->_raw == "-" && value_stack.size () < 2) { + Arg right = value_stack.back (); + value_stack.pop_back (); + + operator_negate (result, right); } -*/ // Binary operators. else @@ -218,8 +221,7 @@ bool E9::eval_match (Arg& left, Arg& right, bool case_sensitive) //////////////////////////////////////////////////////////////////////////////// void E9::operator_not (Arg& result, Arg& right) { - result = right; - coerce (result, Arg::type_bool); + result = coerce (right, Arg::type_bool); if (result._value == "true") result._value = "false"; @@ -229,6 +231,15 @@ void E9::operator_not (Arg& result, Arg& right) // std::cout << "# " << right << " --> " << result << "\n"; } +//////////////////////////////////////////////////////////////////////////////// +void E9::operator_negate (Arg& result, Arg& right) +{ + result = coerce (right, Arg::type_number); + result._value = format (- strtod (result._value.c_str (), NULL)); + + std::cout << "# " << right << " --> " << result << "\n"; +} + //////////////////////////////////////////////////////////////////////////////// void E9::operator_and (Arg& result, Arg& left, Arg& right) { @@ -607,18 +618,26 @@ const Arg E9::coerce (const Arg& input, const Arg::type type) if (type == Arg::type_bool) { - result._raw = input._raw; - result._value = get_bool (input) ? "true" : "false"; - result._type = Arg::type_bool; + result._raw = input._raw; + result._value = get_bool (input) ? "true" : "false"; + result._type = Arg::type_bool; result._category = input._category; } else if (type == Arg::type_string) { // TODO Convert date? - result._raw = input._raw; - result._value = input._value; - result._type = Arg::type_string; + result._raw = input._raw; + result._value = input._value; + result._type = Arg::type_string; + result._category = input._category; + } + + else if (type == Arg::type_number) + { + result._raw = input._raw; + result._value = input._value; + result._type = Arg::type_number; result._category = input._category; } diff --git a/src/E9.h b/src/E9.h index 9150b0051..45429c259 100644 --- a/src/E9.h +++ b/src/E9.h @@ -47,7 +47,8 @@ private: bool eval_match (Arg&, Arg&, bool); // Unary. - void operator_not (Arg&, Arg&); + void operator_not (Arg&, Arg&); + void operator_negate (Arg&, Arg&); // Binary. void operator_and (Arg&, Arg&, Arg&);