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/ash.c b/shell/ash.c
index 4aaea28..1cd2050 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -185,10 +185,6 @@
 #define debug optlist[15]
 #endif
 
-#if ENABLE_SH_MATH_SUPPORT
-	arith_eval_hooks_t math_hooks;
-#endif
-
 	/* trap handler commands */
 	/*
 	 * Sigmode records the current value of the signal handlers for the various
@@ -238,7 +234,6 @@
 #define random_LCG         (G_misc.random_LCG        )
 #define backgndpid  (G_misc.backgndpid )
 #define job_warning (G_misc.job_warning)
-#define math_hooks  (G_misc.math_hooks )
 #define INIT_G_misc() do { \
 	(*(struct globals_misc**)&ash_ptr_to_globals_misc) = xzalloc(sizeof(G_misc)); \
 	barrier(); \
@@ -1103,6 +1098,14 @@
 	va_end(ap);
 }
 
+static void raise_error_syntax(const char *) NORETURN;
+static void
+raise_error_syntax(const char *msg)
+{
+	ash_msg_and_raise_error("syntax error: %s", msg);
+	/* NOTREACHED */
+}
+
 static void ash_msg_and_raise(int, const char *, ...) NORETURN;
 static void
 ash_msg_and_raise(int cond, const char *msg, ...)
@@ -5241,7 +5244,32 @@
  */
 
 #if ENABLE_SH_MATH_SUPPORT
-static arith_t dash_arith(const char *);
+static arith_t
+ash_arith(const char *s)
+{
+	arith_eval_hooks_t math_hooks;
+	arith_t result;
+	int errcode = 0;
+
+	math_hooks.lookupvar = lookupvar;
+	math_hooks.setvar = setvar;
+	math_hooks.endofname = endofname;
+
+	INT_OFF;
+	result = arith(s, &errcode, &math_hooks);
+	if (errcode < 0) {
+		if (errcode == -3)
+			ash_msg_and_raise_error("exponent less than 0");
+		if (errcode == -2)
+			ash_msg_and_raise_error("divide by zero");
+		if (errcode == -5)
+			ash_msg_and_raise_error("expression recursion loop detected");
+		raise_error_syntax(s);
+	}
+	INT_ON;
+
+	return result;
+}
 #endif
 
 /*
@@ -5720,7 +5748,7 @@
 	if (quotes)
 		rmescapes(p + 2);
 
-	len = cvtnum(dash_arith(p + 2));
+	len = cvtnum(ash_arith(p + 2));
 
 	if (flag != '"')
 		recordregion(begoff, begoff + len, 0);
@@ -10127,14 +10155,6 @@
  */
 #define NEOF ((union node *)&tokpushback)
 
-static void raise_error_syntax(const char *) NORETURN;
-static void
-raise_error_syntax(const char *msg)
-{
-	ash_msg_and_raise_error("syntax error: %s", msg);
-	/* NOTREACHED */
-}
-
 /*
  * Called when an unexpected token is read during the parse.  The argument
  * is the token that is expected, or -1 if more than one type of token can
@@ -12353,33 +12373,11 @@
 }
 
 #if ENABLE_SH_MATH_SUPPORT
-static arith_t
-dash_arith(const char *s)
-{
-	arith_t result;
-	int errcode = 0;
-
-	INT_OFF;
-	result = arith(s, &errcode, &math_hooks);
-	if (errcode < 0) {
-		if (errcode == -3)
-			ash_msg_and_raise_error("exponent less than 0");
-		if (errcode == -2)
-			ash_msg_and_raise_error("divide by zero");
-		if (errcode == -5)
-			ash_msg_and_raise_error("expression recursion loop detected");
-		raise_error_syntax(s);
-	}
-	INT_ON;
-
-	return result;
-}
-
 /*
- *  The let builtin. partial stolen from GNU Bash, the Bourne Again SHell.
- *  Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
+ * The let builtin. partial stolen from GNU Bash, the Bourne Again SHell.
+ * Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
  *
- *  Copyright (C) 2003 Vladimir Oleynik <dzo@simtreas.ru>
+ * Copyright (C) 2003 Vladimir Oleynik <dzo@simtreas.ru>
  */
 static int
 letcmd(int argc UNUSED_PARAM, char **argv)
@@ -12390,7 +12388,7 @@
 	if (!*argv)
 		ash_msg_and_raise_error("expression expected");
 	do {
-		i = dash_arith(*argv);
+		i = ash_arith(*argv);
 	} while (*++argv);
 
 	return !i;
@@ -13119,11 +13117,6 @@
 	INIT_G_alias();
 #endif
 	INIT_G_cmdtable();
-#if ENABLE_SH_MATH_SUPPORT
-	math_hooks.lookupvar = lookupvar;
-	math_hooks.setvar = setvar;
-	math_hooks.endofname = endofname;
-#endif
 
 #if PROFILE
 	monitor(4, etext, profile_buf, sizeof(profile_buf), 50);