fixing swapping of arguments in variable arguments functions (JT Hughes)
git-svn-id: https://svn.php.net/repository/pear/packages/Spreadsheet_Excel_Writer/trunk@126154 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
parent
d6f22d14bb
commit
e4465da849
|
|
@ -136,12 +136,6 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
|
||||||
*/
|
*/
|
||||||
var $_byte_order;
|
var $_byte_order;
|
||||||
|
|
||||||
/**
|
|
||||||
* Number of arguments for the current function
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
var $_func_args;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Array of external sheets
|
* Array of external sheets
|
||||||
* @var array
|
* @var array
|
||||||
|
|
@ -163,7 +157,6 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
|
||||||
$this->_parse_tree = ''; // The parse tree to be generated.
|
$this->_parse_tree = ''; // The parse tree to be generated.
|
||||||
$this->_initializeHashes(); // Initialize the hashes: ptg's and function's ptg's
|
$this->_initializeHashes(); // Initialize the hashes: ptg's and function's ptg's
|
||||||
$this->_byte_order = $byte_order; // Little Endian or Big Endian
|
$this->_byte_order = $byte_order; // Little Endian or Big Endian
|
||||||
$this->_func_args = 0; // Number of arguments for the current function
|
|
||||||
$this->_ext_sheets = array();
|
$this->_ext_sheets = array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -561,15 +554,15 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
|
||||||
{
|
{
|
||||||
return(pack("C", $this->ptg[$token]));
|
return(pack("C", $this->ptg[$token]));
|
||||||
}
|
}
|
||||||
elseif(preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token))
|
// commented so argument number can be processed correctly. See toReversePolish().
|
||||||
|
/*elseif(preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token))
|
||||||
{
|
{
|
||||||
return($this->_convertFunction($token,$this->_func_args));
|
return($this->_convertFunction($token,$this->_func_args));
|
||||||
}
|
}*/
|
||||||
// if it's an argument, ignore the token (the argument remains)
|
// if it's an argument, ignore the token (the argument remains)
|
||||||
elseif($token == 'arg')
|
elseif ($token == 'arg')
|
||||||
{
|
{
|
||||||
$this->_func_args++;
|
return '';
|
||||||
return('');
|
|
||||||
}
|
}
|
||||||
// TODO: use real error codes
|
// TODO: use real error codes
|
||||||
$this->raiseError("Unknown token $token", 0, PEAR_ERROR_DIE);
|
$this->raiseError("Unknown token $token", 0, PEAR_ERROR_DIE);
|
||||||
|
|
@ -616,21 +609,21 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @param string $token The name of the function for convertion to ptg value.
|
* @param string $token The name of the function for convertion to ptg value.
|
||||||
* @param integer $num_args The number of arguments the function recieves.
|
* @param integer $num_args The number of arguments the function receives.
|
||||||
|
* @return string The packed ptg for the function
|
||||||
*/
|
*/
|
||||||
function _convertFunction($token, $num_args)
|
function _convertFunction($token, $num_args)
|
||||||
{
|
{
|
||||||
$this->_func_args = 0; // re initialize the number of arguments
|
|
||||||
$args = $this->_functions[$token][1];
|
$args = $this->_functions[$token][1];
|
||||||
$volatile = $this->_functions[$token][3];
|
$volatile = $this->_functions[$token][3];
|
||||||
|
|
||||||
// Fixed number of args eg. TIME($i,$j,$k).
|
// Fixed number of args eg. TIME($i,$j,$k).
|
||||||
if ($args >= 0) {
|
if ($args >= 0) {
|
||||||
return(pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]));
|
return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]);
|
||||||
}
|
}
|
||||||
// Variable number of args eg. SUM($i,$j,$k, ..).
|
// Variable number of args eg. SUM($i,$j,$k, ..).
|
||||||
if ($args == -1) {
|
if ($args == -1) {
|
||||||
return(pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]));
|
return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1455,7 +1448,7 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
|
||||||
return($this->raiseError("Incorrect number of arguments in function $function() "));
|
return($this->raiseError("Incorrect number of arguments in function $function() "));
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = $this->_createTree($function, $result, '');
|
$result = $this->_createTree($function, $result, $num_args);
|
||||||
$this->_advance(); // eat the ")"
|
$this->_advance(); // eat the ")"
|
||||||
return($result);
|
return($result);
|
||||||
}
|
}
|
||||||
|
|
@ -1540,12 +1533,35 @@ class Spreadsheet_Excel_Writer_Parser extends PEAR
|
||||||
}
|
}
|
||||||
$polish .= $converted_tree;
|
$polish .= $converted_tree;
|
||||||
}
|
}
|
||||||
$converted_tree = $this->_convert($tree['value']);
|
// if it's a function convert it here (so we can set it's arguments)
|
||||||
if($this->isError($converted_tree)) {
|
if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and
|
||||||
return($converted_tree);
|
!preg_match('/^([A-I]?[A-Z])(\d+)$/',$tree['value']) and
|
||||||
|
!preg_match("/^[A-I]?[A-Z](\d+)\.\.[A-I]?[A-Z](\d+)$/",$tree['value']) and
|
||||||
|
!is_numeric($tree['value']) and
|
||||||
|
!isset($this->ptg[$tree['value']]))
|
||||||
|
{
|
||||||
|
// left subtree for a function is always an array.
|
||||||
|
if ($tree['left'] != '') {
|
||||||
|
$left_tree = $this->toReversePolish($tree['left']);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
$left_tree = '';
|
||||||
|
}
|
||||||
|
if (PEAR::isError($left_tree)) {
|
||||||
|
return $left_tree;
|
||||||
|
}
|
||||||
|
// add it's left subtree and return.
|
||||||
|
return $left_tree.$this->_convertFunction($tree['value'], $tree['right']);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$converted_tree = $this->_convert($tree['value']);
|
||||||
|
if (PEAR::isError($converted_tree)) {
|
||||||
|
return $converted_tree;
|
||||||
|
}
|
||||||
|
}
|
||||||
$polish .= $converted_tree;
|
$polish .= $converted_tree;
|
||||||
return($polish);
|
return $polish;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue