ash: remove one redundant function, improve string sharing, better field names
No binary (build failed)
—
(log yok)
| @@ -279,6 +279,14 @@ static int isdigit_str9(const char *str) | |
| return (*str == '\0'); | |
| } | |
| + | static const char *var_end(const char *var) |
| + | { |
| + | while (*var) |
| + | if (*var++ == '=') |
| + | break; |
| + | return var; |
| + | } |
| + | |
| /* ============ Interrupts / exceptions */ | |
| /* | |
| @@ -1712,8 +1720,8 @@ static void FAST_FUNC getoptsreset(const char *value); | |
| struct var { | |
| struct var *next; /* next entry in hash list */ | |
| int flags; /* flags are defined above */ | |
| - | const char *text; /* name=value */ |
| - | void (*func)(const char *) FAST_FUNC; /* function to be called when */ |
| + | const char *var_text; /* name=value */ |
| + | void (*var_func)(const char *) FAST_FUNC; /* function to be called when */ |
| /* the variable gets set/unset */ | |
| }; | |
| @@ -1767,13 +1775,13 @@ static void change_random(const char *) FAST_FUNC; | |
| static const struct { | |
| int flags; | |
| - | const char *text; |
| - | void (*func)(const char *) FAST_FUNC; |
| + | const char *var_text; |
| + | void (*var_func)(const char *) FAST_FUNC; |
| } varinit_data[] = { | |
| { VSTRFIXED|VTEXTFIXED , defifsvar , NULL }, | |
| #if ENABLE_ASH_MAIL | |
| - | { VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL\0" , changemail }, |
| - | { VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH\0", changemail }, |
| + | { VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL" , changemail }, |
| + | { VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH" , changemail }, |
| #endif | |
| { VSTRFIXED|VTEXTFIXED , bb_PATH_root_path, changepath }, | |
| { VSTRFIXED|VTEXTFIXED , "PS1=$ " , NULL }, | |
| @@ -1783,14 +1791,14 @@ static const struct { | |
| { VSTRFIXED|VTEXTFIXED , "OPTIND=1" , getoptsreset }, | |
| #endif | |
| #if ENABLE_ASH_RANDOM_SUPPORT | |
| - | { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "RANDOM\0", change_random }, |
| + | { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "RANDOM", change_random }, |
| #endif | |
| #if ENABLE_LOCALE_SUPPORT | |
| - | { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_ALL\0" , change_lc_all }, |
| - | { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_CTYPE\0", change_lc_ctype }, |
| + | { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_ALL" , change_lc_all }, |
| + | { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_CTYPE" , change_lc_ctype }, |
| #endif | |
| #if ENABLE_FEATURE_EDITING_SAVEHISTORY | |
| - | { VSTRFIXED|VTEXTFIXED|VUNSET, "HISTFILE\0", NULL }, |
| + | { VSTRFIXED|VTEXTFIXED|VUNSET, "HISTFILE" , NULL }, |
| #endif | |
| }; | |
| @@ -1817,9 +1825,9 @@ extern struct globals_var *const ash_ptr_to_globals_var; | |
| (*(struct globals_var**)&ash_ptr_to_globals_var) = xzalloc(sizeof(G_var)); \ | |
| barrier(); \ | |
| for (i = 0; i < ARRAY_SIZE(varinit_data); i++) { \ | |
| - | varinit[i].flags = varinit_data[i].flags; \ |
| - | varinit[i].text = varinit_data[i].text; \ |
| - | varinit[i].func = varinit_data[i].func; \ |
| + | varinit[i].flags = varinit_data[i].flags; \ |
| + | varinit[i].var_text = varinit_data[i].var_text; \ |
| + | varinit[i].var_func = varinit_data[i].var_func; \ |
| } \ | |
| } while (0) | |
| @@ -1850,19 +1858,19 @@ extern struct globals_var *const ash_ptr_to_globals_var; | |
| * They have to skip over the name. They return the null string | |
| * for unset variables. | |
| */ | |
| - | #define ifsval() (vifs.text + 4) |
| + | #define ifsval() (vifs.var_text + 4) |
| #define ifsset() ((vifs.flags & VUNSET) == 0) | |
| #if ENABLE_ASH_MAIL | |
| - | # define mailval() (vmail.text + 5) |
| - | # define mpathval() (vmpath.text + 9) |
| + | # define mailval() (vmail.var_text + 5) |
| + | # define mpathval() (vmpath.var_text + 9) |
| # define mpathset() ((vmpath.flags & VUNSET) == 0) | |
| #endif | |
| - | #define pathval() (vpath.text + 5) |
| - | #define ps1val() (vps1.text + 4) |
| - | #define ps2val() (vps2.text + 4) |
| - | #define ps4val() (vps4.text + 4) |
| + | #define pathval() (vpath.var_text + 5) |
| + | #define ps1val() (vps1.var_text + 4) |
| + | #define ps2val() (vps2.var_text + 4) |
| + | #define ps4val() (vps4.var_text + 4) |
| #if ENABLE_ASH_GETOPTS | |
| - | # define optindval() (voptind.text + 7) |
| + | # define optindval() (voptind.var_text + 7) |
| #endif | |
| @@ -1921,12 +1929,6 @@ varcmp(const char *p, const char *q) | |
| return c - d; | |
| } | |
| - | static int |
| - | varequal(const char *a, const char *b) |
| - | { |
| - | return !varcmp(a, b); |
| - | } |
| - | |
| /* | |
| * Find the appropriate entry in the hash table from the name. | |
| */ | |
| @@ -1961,15 +1963,15 @@ initvar(void) | |
| * PS1 depends on uid | |
| */ | |
| #if ENABLE_FEATURE_EDITING && ENABLE_FEATURE_EDITING_FANCY_PROMPT | |
| - | vps1.text = "PS1=\\w \\$ "; |
| + | vps1.var_text = "PS1=\\w \\$ "; |
| #else | |
| if (!geteuid()) | |
| - | vps1.text = "PS1=# "; |
| + | vps1.var_text = "PS1=# "; |
| #endif | |
| vp = varinit; | |
| end = vp + ARRAY_SIZE(varinit); | |
| do { | |
| - | vpp = hashvar(vp->text); |
| + | vpp = hashvar(vp->var_text); |
| vp->next = *vpp; | |
| *vpp = vp; | |
| } while (++vp < end); | |
| @@ -1979,7 +1981,7 @@ static struct var ** | |
| findvar(struct var **vpp, const char *name) | |
| { | |
| for (; *vpp; vpp = &(*vpp)->next) { | |
| - | if (varequal((*vpp)->text, name)) { |
| + | if (varcmp((*vpp)->var_text, name) == 0) { |
| break; | |
| } | |
| } | |
| @@ -2003,11 +2005,11 @@ lookupvar(const char *name) | |
| * As soon as they're unset, they're no longer dynamic, and dynamic | |
| * lookup will no longer happen at that point. -- PFM. | |
| */ | |
| - | if ((v->flags & VDYNAMIC)) |
| - | (*v->func)(NULL); |
| + | if (v->flags & VDYNAMIC) |
| + | v->var_func(NULL); |
| #endif | |
| if (!(v->flags & VUNSET)) | |
| - | return strchrnul(v->text, '=') + 1; |
| + | return var_end(v->var_text); |
| } | |
| return NULL; | |
| } | |
| @@ -2021,8 +2023,8 @@ bltinlookup(const char *name) | |
| struct strlist *sp; | |
| for (sp = cmdenviron; sp; sp = sp->next) { | |
| - | if (varequal(sp->text, name)) |
| - | return strchrnul(sp->text, '=') + 1; |
| + | if (varcmp(sp->text, name) == 0) |
| + | return var_end(sp->text); |
| } | |
| return lookupvar(name); | |
| } | |
| @@ -2048,24 +2050,24 @@ setvareq(char *s, int flags) | |
| if (flags & VNOSAVE) | |
| free(s); | |
| - | n = vp->text; |
| + | n = vp->var_text; |
| ash_msg_and_raise_error("%.*s: is read only", strchrnul(n, '=') - n, n); | |
| } | |
| if (flags & VNOSET) | |
| return; | |
| - | if (vp->func && (flags & VNOFUNC) == 0) |
| - | (*vp->func)(strchrnul(s, '=') + 1); |
| + | if (vp->var_func && !(flags & VNOFUNC)) |
| + | vp->var_func(var_end(s)); |
| - | if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) |
| - | free((char*)vp->text); |
| + | if (!(vp->flags & (VTEXTFIXED|VSTACK))) |
| + | free((char*)vp->var_text); |
| flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET); | |
| } else { | |
| + | /* variable s is not found */ |
| if (flags & VNOSET) | |
| return; | |
| - | /* not found */ |
| vp = ckzalloc(sizeof(*vp)); | |
| vp->next = *vpp; | |
| /*vp->func = NULL; - ckzalloc did it */ | |
| @@ -2073,7 +2075,7 @@ setvareq(char *s, int flags) | |
| } | |
| if (!(flags & (VTEXTFIXED|VSTACK|VNOSAVE))) | |
| s = ckstrdup(s); | |
| - | vp->text = s; |
| + | vp->var_text = s; |
| vp->flags = flags; | |
| } | |
| @@ -2171,7 +2173,7 @@ unsetvar(const char *s) | |
| if ((flags & VSTRFIXED) == 0) { | |
| INT_OFF; | |
| if ((flags & (VTEXTFIXED|VSTACK)) == 0) | |
| - | free((char*)vp->text); |
| + | free((char*)vp->var_text); |
| *vpp = vp->next; | |
| free(vp); | |
| INT_ON; | |
| @@ -2223,7 +2225,7 @@ listvars(int on, int off, char ***end) | |
| if ((vp->flags & mask) == on) { | |
| if (ep == stackstrend()) | |
| ep = growstackstr(); | |
| - | *ep++ = (char *) vp->text; |
| + | *ep++ = (char*)vp->var_text; |
| } | |
| } | |
| } while (++vpp < vartab + VTABSIZE); | |
| @@ -6591,7 +6593,7 @@ evalvar(char *p, int flags, struct strlist *var_str_list) | |
| var = p; | |
| easy = (!quoted || (*var == '@' && shellparam.nparam)); | |
| startloc = expdest - (char *)stackblock(); | |
| - | p = strchr(p, '=') + 1; |
| + | p = strchr(p, '=') + 1; //TODO: use var_end(p)? |
| again: | |
| varlen = varvalue(var, varflags, flags, var_str_list); | |
| @@ -8637,14 +8639,14 @@ poplocalvars(void) | |
| free((char*)lvp->text); | |
| optschanged(); | |
| } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) { | |
| - | unsetvar(vp->text); |
| + | unsetvar(vp->var_text); |
| } else { | |
| - | if (vp->func) |
| - | (*vp->func)(strchrnul(lvp->text, '=') + 1); |
| + | if (vp->var_func) |
| + | vp->var_func(var_end(lvp->text)); |
| if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) | |
| - | free((char*)vp->text); |
| + | free((char*)vp->var_text); |
| vp->flags = lvp->flags; | |
| - | vp->text = lvp->text; |
| + | vp->var_text = lvp->text; |
| } | |
| free(lvp); | |
| } | |
| @@ -8763,7 +8765,7 @@ mklocal(char *name) | |
| vp = *vpp; /* the new variable */ | |
| lvp->flags = VUNSET; | |
| } else { | |
| - | lvp->text = vp->text; |
| + | lvp->text = vp->var_text; |
| lvp->flags = vp->flags; | |
| vp->flags |= VSTRFIXED|VTEXTFIXED; | |
| if (eq) | |
| @@ -9073,7 +9075,7 @@ evalcommand(union node *cmd, int flags) | |
| expredir(cmd->ncmd.redirect); | |
| status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2); | |
| - | path = vpath.text; |
| + | path = vpath.var_text; |
| for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) { | |
| struct strlist **spp; | |
| char *p; | |
| @@ -9086,7 +9088,7 @@ evalcommand(union node *cmd, int flags) | |
| * is present | |
| */ | |
| p = (*spp)->text; | |
| - | if (varequal(p, path)) |
| + | if (varcmp(p, path) == 0) |
| path = p; | |
| } | |
| @@ -10113,7 +10115,7 @@ change_random(const char *value) | |
| /* "get", generate */ | |
| t = next_random(&random_gen); | |
| /* set without recursion */ | |
| - | setvar(vrandom.text, utoa(t), VNOFUNC); |
| + | setvar(vrandom.var_text, utoa(t), VNOFUNC); |
| vrandom.flags &= ~VNOFUNC; | |
| } else { | |
| /* set/reset */ | |