From 224a3ea97ba98df293145afa0b578d60e895a798 Mon Sep 17 00:00:00 2001
From: Benjamin Renard <benjamin.renard@akka.eu>
Date: Fri, 24 Nov 2017 10:02:03 +0100
Subject: [PATCH] Fix expression parser when a function have more than one argument

---
 src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php
index 0a4713e..1000315 100644
--- a/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php
+++ b/src/InputOutput/IHMImpl/Tools/IHMExpressionParserClass.php
@@ -21,6 +21,7 @@ class IHMExpressionParserClass
 	private static $functionsNode    = 'function';
 	private static $functionsNameAtt = 'name';
 	private static $functionsArgsAtt = 'args';
+	private static $functionsParamsAtt = 'params';
 	private static $functionsNewKernelNode = 'new_kernel';
 
 	//operator
@@ -82,6 +83,7 @@ class IHMExpressionParserClass
 				"abs(dst)>0" => array("expression" => "greater_than((abs(\$dst)),0)", "params" => array(array("paramid" => "dst"))),
 				"2/(1+dst)" => array("expression" => "2/(1+\$dst)", "params" => array(array("paramid" => "dst"))),
 				"2/abs(1+dst)" => array("expression" => "2/(abs(1+\$dst))", "params" => array(array("paramid" => "dst"))),
+				"cross(vect_1,vect_2)"  => array("expression" => "(cross(\$vect_1,\$vect_2))", "params" => array(array("paramid" => "vect_1"), array("paramid" => "vect_2"))),
 		);
 
 		//init constants, aliases and functions for test
@@ -96,13 +98,14 @@ class IHMExpressionParserClass
 		);
 
 		$this->functionsArray = array(
-				"func_old" => array("kernel_name" => "func_new", "nb_args" => 0),
-				"atan" => array("kernel_name" => "atan", "nb_args" => 0),
-				"shiftT_" => array("kernel_name" => "#timeShift", "nb_args" => 1),
-				"smooth_" => array("kernel_name" => "#boxcar", "nb_args" => 1),
-				"deriv" => array("kernel_name" => "#deriv", "nb_args" => 0),
-				"abs" => array("kernel_name" => "abs", "nb_args" => 0),
-				"sqrt" => array("kernel_name" => "sqrt", "nb_args" => 0),
+				"func_old" => array("kernel_name" => "func_new", "nb_args" => 0, "nb_params" => 1),
+				"atan" => array("kernel_name" => "atan", "nb_args" => 0, "nb_params" => 1),
+				"shiftT_" => array("kernel_name" => "#timeShift", "nb_args" => 1, "nb_params" => 1),
+				"smooth_" => array("kernel_name" => "#boxcar", "nb_args" => 1, "nb_params" => 1),
+				"deriv" => array("kernel_name" => "#deriv", "nb_args" => 0, "nb_params" => 1),
+				"abs" => array("kernel_name" => "abs", "nb_args" => 0, "nb_params" => 1),
+				"sqrt" => array("kernel_name" => "sqrt", "nb_args" => 0, "nb_params" => 1),
+				"cross" => array("kernel_name" => "cross", "nb_args" => 0, "nb_params" => 2),
 		);
 
 		//add operator to change in function
@@ -304,6 +307,7 @@ class IHMExpressionParserClass
 		{
 			$tempArr =  explode('(', $functions_->item($i)->getAttribute(self::$functionsNameAtt));
 			$nbArgs  =  $functions_->item($i)->getAttribute(self::$functionsArgsAtt);
+			$nbParams = $functions_->item($i)->getAttribute(self::$functionsParamsAtt);
 			$kernelFunctions_ = $functions_->item($i)->getElementsByTagName(self::$functionsNewKernelNode);
 			if ($kernelFunctions_->length == 0)
 				$kernelFunction = "";
@@ -312,6 +316,7 @@ class IHMExpressionParserClass
 			$this->functionsArray[$tempArr[0]] = array(
 				"kernel_name" => $kernelFunction,
 				"nb_args"     => intval($nbArgs),
+				"nb_params"     => intval($nbParams),
 				"isOperator"  => false
 			);
 		}
@@ -790,7 +795,7 @@ class IHMExpressionParserClass
 	/*
 	 * @brief process used to replace "," by ";" for function
 	*/
-	private function fixComaFunction($tree,$isFunctionGroup,&$result)
+	private function fixComaFunction($tree,$crt_function,&$result,&$nbParams)
 	{
 		for ($i = 0; $i < count($tree); ++$i)
 		{
@@ -802,15 +807,20 @@ class IHMExpressionParserClass
 					$groupFunc = $this->isFunction($tree[$i-1]);
 				}
 				$res = array();
-				$this->fixComaFunction($tree[$i],$groupFunc,$res);
+				$nbParams = 0;
+				$this->fixComaFunction($tree[$i],$groupFunc ? $tree[$i-1] : "",$res,$nbParams);
 				$result[] = $res;
 			}
 			else
 			{
-				if ($isFunctionGroup && ($tree[$i] == ','))
-					$result[] = ';';
-				else
+				if (!empty($crt_function) && ($tree[$i] == ',')) {
+					$nb_func_params = $this->functionsArray[$crt_function]["nb_params"];
+					$result[] = ($nb_func_params <= $nbParams) ? ';' : ',';
+				}
+				else {
+					++$nbParams;
 					$result[] = $tree[$i];
+				}
 			}
 		}
 	}
@@ -920,7 +930,8 @@ class IHMExpressionParserClass
 		$this->fixGroupFunction($res_1,$res_2);
 
 		$res_3 = array();
-		$this->fixComaFunction($res_2,false,$res_3);
+		$nbParams = 0;
+		$this->fixComaFunction($res_2,"",$res_3,$nbParams);
 
 		$res_4 = array();
 		$this->fixOperatorToFunction($res_3,$res_4);
--
libgit2 0.21.2