shells: do not need to have math state global
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 2 Apr 2009 13:46:27 +0000 (13:46 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 2 Apr 2009 13:46:27 +0000 (13:46 -0000)
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

shell/ash.c
shell/hush.c

index 4aaea28..1cd2050 100644 (file)
@@ -185,10 +185,6 @@ struct globals_misc {
 #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 @@ extern struct globals_misc *const ash_ptr_to_globals_misc;
 #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 @@ ash_msg_and_raise_error(const char *msg, ...)
        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 @@ redirectsafe(union node *redir, int flags)
  */
 
 #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 @@ expari(int quotes)
        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 @@ static struct heredoc *heredoc;
  */
 #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 @@ timescmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
 }
 
 #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 @@ letcmd(int argc UNUSED_PARAM, char **argv)
        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 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
        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);
index e93e5a9..3725191 100644 (file)
@@ -454,9 +454,6 @@ struct globals {
 #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 char *endofname(const char *name)
 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 @@ static int expand_vars_to_list(o_string *output, int n, char *arg, char or_mask)
 #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 @@ int hush_main(int argc, char **argv)
 #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;