shell: unify endofname() in hush and ash
authorDenys Vlasenko <dvlasenk@redhat.com>
Tue, 7 Sep 2010 10:19:33 +0000 (12:19 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Tue, 7 Sep 2010 10:19:33 +0000 (12:19 +0200)
function                                             old     new   delta
builtin_umask                                        132     133      +1
changepath                                           195     194      -1
expand_and_evaluate_arith                             77      69      -8
ash_arith                                            143     135      -8
expand_one_var                                      1551    1515     -36
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/4 up/down: 1/-53)             Total: -52 bytes

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
shell/ash.c
shell/hush.c
shell/math.c
shell/math.h

index 273ecabdb022205e1963898c2dca1722c91a5e5f..70425b324f1747937d4b4185558ad05361082c3f 100644 (file)
@@ -1982,10 +1982,6 @@ extern struct globals_var *const ash_ptr_to_globals_var;
 # define optindval()    (voptind.var_text + 7)
 #endif
 
-
-#define is_name(c)      ((c) == '_' || isalpha((unsigned char)(c)))
-#define is_in_name(c)   ((c) == '_' || isalnum((unsigned char)(c)))
-
 #if ENABLE_ASH_GETOPTS
 static void FAST_FUNC
 getoptsreset(const char *value)
@@ -1995,24 +1991,26 @@ getoptsreset(const char *value)
 }
 #endif
 
+/* math.h has these, otherwise define our private copies */
+#if !ENABLE_SH_MATH_SUPPORT
+#define is_name(c)      ((c) == '_' || isalpha((unsigned char)(c)))
+#define is_in_name(c)   ((c) == '_' || isalnum((unsigned char)(c)))
 /*
- * Return of a legal variable name (a letter or underscore followed by zero or
- * more letters, underscores, and digits).
+ * Return the pointer to the first char which is not part of a legal variable name
+ * (a letter or underscore followed by letters, underscores, and digits).
  */
-static char* FAST_FUNC
+static const char*
 endofname(const char *name)
 {
-       char *p;
-
-       p = (char *) name;
-       if (!is_name(*p))
-               return p;
-       while (*++p) {
-               if (!is_in_name(*p))
+       if (!is_name(*name))
+               return name;
+       while (*++name) {
+               if (!is_in_name(*name))
                        break;
        }
-       return p;
+       return name;
 }
+#endif
 
 /*
  * Compares two strings up to the first = or '\0'.  The first
@@ -2195,9 +2193,10 @@ setvareq(char *s, int flags)
 static void
 setvar(const char *name, const char *val, int flags)
 {
-       char *p, *q;
-       size_t namelen;
+       const char *q;
+       char *p;
        char *nameeq;
+       size_t namelen;
        size_t vallen;
 
        q = endofname(name);
@@ -2211,12 +2210,13 @@ setvar(const char *name, const char *val, int flags)
        } else {
                vallen = strlen(val);
        }
+
        INT_OFF;
        nameeq = ckmalloc(namelen + vallen + 2);
-       p = (char *)memcpy(nameeq, name, namelen) + namelen;
+       p = memcpy(nameeq, name, namelen) + namelen;
        if (val) {
                *p++ = '=';
-               p = (char *)memcpy(p, val, vallen) + vallen;
+               p = memcpy(p, val, vallen) + vallen;
        }
        *p = '\0';
        setvareq(nameeq, flags | VNOSAVE);
@@ -5444,7 +5444,7 @@ ash_arith(const char *s)
 
        math_hooks.lookupvar = lookupvar;
        math_hooks.setvar    = setvar2;
-       math_hooks.endofname = endofname;
+       //math_hooks.endofname = endofname;
 
        INT_OFF;
        result = arith(s, &errcode, &math_hooks);
@@ -9405,7 +9405,7 @@ evalbltin(const struct builtincmd *cmd, int argc, char **argv)
 static int
 goodname(const char *p)
 {
-       return !*endofname(p);
+       return endofname(p)[0] == '\0';
 }
 
 
index ae2876ac71cddbe0064538c87d1b6d9e91bf258b..3e8c387e7f04ccd5ae927daa4a451fc3f31e1983 100644 (file)
@@ -1671,24 +1671,6 @@ static void unset_vars(char **strings)
        free(strings);
 }
 
-#if ENABLE_SH_MATH_SUPPORT
-# define is_name(c)      ((c) == '_' || isalpha((unsigned char)(c)))
-# define is_in_name(c)   ((c) == '_' || isalnum((unsigned char)(c)))
-static char* FAST_FUNC endofname(const char *name)
-{
-       char *p;
-
-       p = (char *) name;
-       if (!is_name(*p))
-               return p;
-       while (*++p) {
-               if (!is_in_name(*p))
-                       break;
-       }
-       return p;
-}
-#endif
-
 static void FAST_FUNC set_local_var_from_halves(const char *name, const char *val)
 {
        char *var = xasprintf("%s=%s", name, val);
@@ -4446,7 +4428,7 @@ static arith_t expand_and_evaluate_arith(const char *arg, int *errcode_p)
 
        hooks.lookupvar = get_local_var_value;
        hooks.setvar = set_local_var_from_halves;
-       hooks.endofname = endofname;
+       //hooks.endofname = endofname;
        exp_str = expand_pseudo_dquoted(arg);
        res = arith(exp_str ? exp_str : arg, errcode_p, &hooks);
        free(exp_str);
index f0cc2e35dd648b3d2abe5f3aebe8a9b064604c99..a4c55a4d078ad3a6649f0b5f47485b6c8f41f8d4 100644 (file)
 #define a_e_h_t arith_eval_hooks_t
 #define lookupvar (math_hooks->lookupvar)
 #define setvar    (math_hooks->setvar   )
-#define endofname (math_hooks->endofname)
+//#define endofname (math_hooks->endofname)
 
 #define arith_isspace(arithval) \
        (arithval == ' ' || arithval == '\n' || arithval == '\t')
@@ -479,6 +479,18 @@ static const char op_tokens[] ALIGN1 = {
 /* ptr to ")" */
 #define endexpression (&op_tokens[sizeof(op_tokens)-7])
 
+const char* FAST_FUNC
+endofname(const char *name)
+{
+       if (!is_name(*name))
+               return name;
+       while (*++name) {
+               if (!is_in_name(*name))
+                       break;
+       }
+       return name;
+}
+
 arith_t
 arith(const char *expr, int *perrcode, a_e_h_t *math_hooks)
 {
index 2b0b2b89de8e69fb2f23f91f3fa0d987dd7b2e66..96088b4d2bc78c287323683bee947dc748bba9dd 100644 (file)
@@ -87,14 +87,19 @@ typedef long arith_t;
 #define strto_arith_t strtoul
 #endif
 
+/* ash's and hush's endofname is the same, so... */
+# define is_name(c)      ((c) == '_' || isalpha((unsigned char)(c)))
+# define is_in_name(c)   ((c) == '_' || isalnum((unsigned char)(c)))
+const char* FAST_FUNC endofname(const char *name);
+
 typedef const char* FAST_FUNC (*arith_var_lookup_t)(const char *name);
 typedef void        FAST_FUNC (*arith_var_set_t)(const char *name, const char *val);
-typedef char*       FAST_FUNC (*arith_var_endofname_t)(const char *name);
+//typedef const char* FAST_FUNC (*arith_var_endofname_t)(const char *name);
 
 typedef struct arith_eval_hooks {
        arith_var_lookup_t    lookupvar;
        arith_var_set_t       setvar;
-       arith_var_endofname_t endofname;
+//     arith_var_endofname_t endofname;
 } arith_eval_hooks_t;
 
 arith_t arith(const char *expr, int *perrcode, arith_eval_hooks_t*);