diff --git a/poincare/include/poincare/symbol.h b/poincare/include/poincare/symbol.h index e8b9beb04..4f7b5beb9 100644 --- a/poincare/include/poincare/symbol.h +++ b/poincare/include/poincare/symbol.h @@ -5,7 +5,7 @@ class Symbol : public LeafExpression { public: - Symbol(char * name); + Symbol(const char * name); ~Symbol(); ExpressionLayout * createLayout() override; float approximate(Context& context) override; diff --git a/poincare/src/simplify/expression_builder.cpp b/poincare/src/simplify/expression_builder.cpp index 6afe4c707..ebe0161c4 100644 --- a/poincare/src/simplify/expression_builder.cpp +++ b/poincare/src/simplify/expression_builder.cpp @@ -2,6 +2,7 @@ #include #include #include +#include extern "C" { #include } @@ -38,6 +39,9 @@ Expression * ExpressionBuilder::build(ExpressionMatch matches[]) { case Expression::Type::Integer: result = new Integer(m_integerValue); break; + case Expression::Type::Symbol: + result = new Symbol(m_symbolName); + break; default: assert(false); break; diff --git a/poincare/src/simplify/expression_selector.cpp b/poincare/src/simplify/expression_selector.cpp index a67b80769..4f4f67a1d 100644 --- a/poincare/src/simplify/expression_selector.cpp +++ b/poincare/src/simplify/expression_selector.cpp @@ -1,8 +1,11 @@ -#include "expression_selector.h" extern "C" { #include } +#include +#include +#include "expression_selector.h" + int ExpressionSelector::match(Expression * e, ExpressionMatch * matches) { int numberOfMatches = 0; @@ -16,6 +19,34 @@ int ExpressionSelector::match(Expression * e, ExpressionMatch * matches) { return 0; } break; + case ExpressionSelector::Match::TypeAndValue: + if (e->type() != m_expressionType) { + return 0; + } + switch(e->type()) { + case Expression::Type::Integer: + { + Integer integer = Integer(m_integerValue); + if (!e->valueEquals(&integer)) { + return 0; + } + } + break; + case Expression::Type::Symbol: + { + Symbol symbol = Symbol(m_symbolName); + if (!e->valueEquals(&symbol)) { + return 0; + } + } + break; + default: + // Symbol and Integer are the only expressions which should be matched + // with a value. + assert(false); + break; + } + break; case ExpressionSelector::Match::Wildcard: /* This should not happen as a wildcard should be matched _before_ */ assert(false); diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index 9d8b04e3b..35efef79c 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -6,7 +6,7 @@ extern "C" { #include } -Symbol::Symbol(char * name) { +Symbol::Symbol(const char * name) { size_t length = strlen(name); m_name = (char *)malloc(sizeof(char)*length+1); memcpy(m_name, name, length);