From b1d11bf45ec55d469f47c1341d593fdae790bb6a Mon Sep 17 00:00:00 2001
From: Denis Vlasenko <vda.linux@googlemail.com>
Date: Mon, 6 Apr 2009 12:24:58 +0000
Subject: hush: more efficient filtering of "safe" arithmetic

function                                             old     new   delta
expand_variables                                    2170    2147     -23
---
 shell/hush.c | 28 +++++++++-------------------
 1 file changed, 9 insertions(+), 19 deletions(-)

(limited to 'shell')

diff --git a/shell/hush.c b/shell/hush.c
index 3aae7d7c1..e86f0d22f 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -1782,24 +1782,15 @@ static int expand_vars_to_list(o_string *output, int n, char *arg, char or_mask)
 			debug_printf_subst("ARITH '%s' first_ch %x\n", arg, first_ch);
 
 			/* Optional: skip expansion if expr is simple ("a + 3", "i++" etc) */
-			exp_str = arg;
-			while (1) {
-				unsigned char c = *exp_str++;
-				if (c == '\0') {
-					exp_str = NULL;
-					goto skip_expand;
-				}
-				if (isdigit(c))
-					continue;
-				if (strchr(" \t+-*/%<>()_", c) != NULL)
-					continue;
-				c |= 0x20; /* tolower */
-				if (c >= 'a' && c <= 'z')
-					continue;
-				break;
-			}
-			/* We need to expand. Example: "echo $(($a + 1)) $((1 + $((2)) ))" */
-			{
+			exp_str = NULL;
+			if (strchr(arg, '$') != NULL
+#if ENABLE_HUSH_TICK
+			 || strchr(arg, '`') != NULL
+#endif
+			) {
+				/* We need to expand. Example:
+				 * echo $(($a + `echo 1`)) $((1 + $((2)) ))
+				 */
 				struct in_str input;
 				o_string dest = NULL_O_STRING;
 
@@ -1810,7 +1801,6 @@ static int expand_vars_to_list(o_string *output, int n, char *arg, char or_mask)
 				//bb_error_msg("'%s' -> '%s'", dest.data, exp_str);
 				o_free(&dest);
 			}
- skip_expand:
 			hooks.lookupvar = get_local_var_value;
 			hooks.setvar = arith_set_local_var;
 			hooks.endofname = endofname;
-- 
cgit v1.2.3-55-g6feb