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