shells: do not need to have math state global

function                                             old     new   delta                           
ash_arith                                              -     143    +143                           
expand_variables                                    2102    2124     +22                           
popstring                                            134     140      +6                           
parse_command                                       1460    1463      +3                           
trapcmd                                              236     238      +2                           
changepath                                           197     196      -1                           
raise_interrupt                                       86      83      -3                           
hush_main                                           1012     991     -21                           
ash_main                                            1388    1364     -24                           
arith_set_local_var                                   73      34     -39                           
dash_arith                                           117       -    -117                           
------------------------------------------------------------------------------                     
(add/remove: 1/1 grow/shrink: 4/5 up/down: 176/-205)          Total: -29 bytes

diff --git a/shell/hush.c b/shell/hush.c
index e93e5a9..3725191 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -454,9 +454,6 @@
 #if ENABLE_FEATURE_EDITING
 	line_input_t *line_input_state;
 #endif
-#if ENABLE_SH_MATH_SUPPORT
-	arith_eval_hooks_t hooks;
-#endif
 	pid_t root_pid;
 	pid_t last_bg_pid;
 #if ENABLE_HUSH_JOB
@@ -1189,12 +1186,12 @@
 static void arith_set_local_var(const char *name, const char *val, int flags)
 {
 	/* arith code doesnt malloc space, so do it for it */
-	char *var = xmalloc(strlen(name) + 1 + strlen(val) + 1);
-	sprintf(var, "%s=%s", name, val);
+	char *var = xasprintf("%s=%s", name, val);
 	set_local_var(var, flags);
 }
 #endif
 
+
 /*
  * in_str support
  */
@@ -1807,20 +1804,26 @@
 #endif
 #if ENABLE_SH_MATH_SUPPORT
 		case '+': { /* <SPECIAL_VAR_SYMBOL>(cmd<SPECIAL_VAR_SYMBOL> */
+			arith_eval_hooks_t hooks;
 			arith_t res;
 			char buf[30];
 			int errcode;
+
 			*p = '\0';
 			++arg;
 			debug_printf_subst("ARITH '%s' first_ch %x\n", arg, first_ch);
-			res = arith(arg, &errcode, &G.hooks);
-			if (errcode < 0)
+			hooks.lookupvar = lookup_param;
+			hooks.setvar = arith_set_local_var;
+			hooks.endofname = endofname;
+			res = arith(arg, &errcode, &hooks);
+			if (errcode < 0) {
 				switch (errcode) {
 				case -3: maybe_die("arith", "exponent less than 0"); break;
 				case -2: maybe_die("arith", "divide by zero"); break;
 				case -5: maybe_die("arith", "expression recursion loop detected"); break;
-				default: maybe_die("arith", "syntax error");
+				default: maybe_die("arith", "syntax error"); break;
 				}
+			}
 			sprintf(buf, arith_t_fmt, res);
 			o_addstrauto(output, buf);
 			debug_printf_subst("ARITH RES '"arith_t_fmt"'\n", res);
@@ -4601,11 +4604,6 @@
 #if ENABLE_FEATURE_EDITING
 	G.line_input_state = new_line_input_t(FOR_SHELL);
 #endif
-#if ENABLE_SH_MATH_SUPPORT
-	G.hooks.lookupvar = lookup_param;
-	G.hooks.setvar = arith_set_local_var;
-	G.hooks.endofname = endofname;
-#endif
 	/* XXX what should these be while sourcing /etc/profile? */
 	G.global_argc = argc;
 	G.global_argv = argv;