X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2FSGExpression.cxx;h=df0aa9d747d13b6a0e26d61a9a69f6459b17dd19;hb=5b92575ed31ab0577d5ece4da42a88cfb88b4ad7;hp=dc0d3270baeacded83a09186f0447e8856050b06;hpb=8a5a1d33019835a648b34d18f0b7d5fc2e4032fc;p=simgear.git diff --git a/simgear/structure/SGExpression.cxx b/simgear/structure/SGExpression.cxx index dc0d3270..df0aa9d7 100644 --- a/simgear/structure/SGExpression.cxx +++ b/simgear/structure/SGExpression.cxx @@ -27,12 +27,12 @@ #include "Singleton.hxx" #include -#include #include #include #include #include #include +#include // for strcmp #include @@ -126,7 +126,7 @@ SGReadValueFromContent(const SGPropertyNode *node, T& value) template static SGExpression* -SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression); +SGReadExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression); template static bool @@ -135,7 +135,7 @@ SGReadNaryOperands(SGNaryExpression* nary, { for (int i = 0; i < expression->nChildren(); ++i) { SGExpression* inputExpression; - inputExpression = SGReadIExpression(inputRoot, expression->getChild(i)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(i)); if (!inputExpression) return false; nary->addOperand(inputExpression); @@ -165,12 +165,13 @@ SGReadNaryOperands(SGNaryExpression* nary, template static SGExpression* -SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) +SGReadExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) { if (!expression) return 0; std::string name = expression->getName(); + if (name == "value") { T value; if (!SGReadValueFromContent(expression, value)) { @@ -201,7 +202,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadIExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -215,7 +216,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadIExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -240,7 +241,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) SGSharedPtr > inputExpression; for (int i = 0; !inputExpression && i < expression->nChildren(); ++i) - inputExpression = SGReadIExpression(inputRoot, expression->getChild(i)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(i)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -254,8 +255,8 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadIExpression(inputRoot, expression->getChild(0)), - SGReadIExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -269,8 +270,8 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadIExpression(inputRoot, expression->getChild(0)), - SGReadIExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -292,6 +293,21 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) } return output; } + + if (name == "difference" || name == "dif" ) { + if (expression->nChildren() < 1) { + SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); + return 0; + } + SGDifferenceExpression* output = new SGDifferenceExpression; + if (!SGReadNaryOperands(output, inputRoot, expression)) { + delete output; + SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); + return 0; + } + return output; + } + if (name == "prod" || name == "product") { if (expression->nChildren() < 1) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -355,7 +371,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) } SGSharedPtr > inputExpression; - inputExpression = SGReadIExpression(inputRoot, inputNode); + inputExpression = SGReadExpression(inputRoot, inputNode); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -364,29 +380,13 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return new SGInterpTableExpression(inputExpression, tab); } - return 0; -} - - -template -static SGExpression* -SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) -{ - SGExpression* r = SGReadIExpression(inputRoot, expression); - if (r) - return r; - - if (!expression) - return 0; - - std::string name = expression->getName(); if (name == "acos") { if (expression->nChildren() != 1) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -400,7 +400,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -414,7 +414,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -428,7 +428,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -442,7 +442,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -456,7 +456,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -470,7 +470,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -484,7 +484,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -498,7 +498,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -512,7 +512,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -526,7 +526,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -540,7 +540,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -554,7 +554,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -568,7 +568,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -582,7 +582,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -596,7 +596,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -610,7 +610,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -629,8 +629,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadFExpression(inputRoot, expression->getChild(0)), - SGReadFExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -644,8 +644,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadFExpression(inputRoot, expression->getChild(0)), - SGReadFExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -659,8 +659,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadFExpression(inputRoot, expression->getChild(0)), - SGReadFExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -674,8 +674,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadIExpression(inputRoot, expression->getChild(0)), - SGReadIExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -690,17 +690,17 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) SGExpression* SGReadIntExpression(SGPropertyNode *inputRoot, const SGPropertyNode *configNode) -{ return SGReadIExpression(inputRoot, configNode); } +{ return SGReadExpression(inputRoot, configNode); } SGExpression* SGReadFloatExpression(SGPropertyNode *inputRoot, const SGPropertyNode *configNode) -{ return SGReadFExpression(inputRoot, configNode); } +{ return SGReadExpression(inputRoot, configNode); } SGExpression* SGReadDoubleExpression(SGPropertyNode *inputRoot, const SGPropertyNode *configNode) -{ return SGReadFExpression(inputRoot, configNode); } +{ return SGReadExpression(inputRoot, configNode); } // SGExpression* // SGReadBoolExpression(SGPropertyNode *inputRoot,