From 8b2f13d84def87b4ebd0901bf0c3157bc1f6dee3 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 7 Sep 2010 12:19:33 +0200 Subject: [PATCH] shell: unify endofname() in hush and ash 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 --- shell/ash.c | 42 +++++++++++++++++++++--------------------- shell/hush.c | 20 +------------------- shell/math.c | 14 +++++++++++++- shell/math.h | 9 +++++++-- 4 files changed, 42 insertions(+), 43 deletions(-) diff --git a/shell/ash.c b/shell/ash.c index 273ecabdb..70425b324 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -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'; } diff --git a/shell/hush.c b/shell/hush.c index ae2876ac7..3e8c387e7 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -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); diff --git a/shell/math.c b/shell/math.c index f0cc2e35d..a4c55a4d0 100644 --- a/shell/math.c +++ b/shell/math.c @@ -122,7 +122,7 @@ #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) { diff --git a/shell/math.h b/shell/math.h index 2b0b2b89d..96088b4d2 100644 --- a/shell/math.h +++ b/shell/math.h @@ -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*); -- 2.25.1