1: <?php
 2:  3:  4:  5:  6:  7:  8: 
 9: 
10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 
25: function smarty_function_math($params, $template)
26: {
27:     static $_allowed_funcs = array(
28:         'int'  => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true,
29:         'log'  => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true,
30:         'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true, 'tan' => true
31:     );
32:     
33:     if (empty($params['equation'])) {
34:         trigger_error("math: missing equation parameter", E_USER_WARNING);
35: 
36:         return;
37:     }
38: 
39:     $equation = $params['equation'];
40: 
41:     
42:     if (substr_count($equation, "(") != substr_count($equation, ")")) {
43:         trigger_error("math: unbalanced parenthesis", E_USER_WARNING);
44: 
45:         return;
46:     }
47: 
48:     
49:     preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!", $equation, $match);
50: 
51:     foreach ($match[1] as $curr_var) {
52:         if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) {
53:             trigger_error("math: function call $curr_var not allowed", E_USER_WARNING);
54: 
55:             return;
56:         }
57:     }
58: 
59:     foreach ($params as $key => $val) {
60:         if ($key != "equation" && $key != "format" && $key != "assign") {
61:             
62:             if (strlen($val) == 0) {
63:                 trigger_error("math: parameter $key is empty", E_USER_WARNING);
64: 
65:                 return;
66:             }
67:             if (!is_numeric($val)) {
68:                 trigger_error("math: parameter $key: is not numeric", E_USER_WARNING);
69: 
70:                 return;
71:             }
72:             $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
73:         }
74:     }
75:     $smarty_math_result = null;
76:     eval("\$smarty_math_result = " . $equation . ";");
77: 
78:     if (empty($params['format'])) {
79:         if (empty($params['assign'])) {
80:             return $smarty_math_result;
81:         } else {
82:             $template->assign($params['assign'], $smarty_math_result);
83:         }
84:     } else {
85:         if (empty($params['assign'])) {
86:             printf($params['format'], $smarty_math_result);
87:         } else {
88:             $template->assign($params['assign'], sprintf($params['format'], $smarty_math_result));
89:         }
90:     }
91: }
92: