shell: unify endofname() in hush and ash
No binary (build failed)
—
(log yok)
| @@ -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'; |
| } | |
| @@ -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); | |
| @@ -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) | |
| { | |
| @@ -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*); | |