aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-06-02 12:56:18 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-06-02 12:56:18 +0200
commit8837c5dec402fd6782589c0a676bc7f90dea4061 (patch)
tree0d8633fecd6479603bdd72af78d8d14251b38202
parent8376bfae58f1e32325eef934aaea8116995bb96a (diff)
downloadbusybox-w32-8837c5dec402fd6782589c0a676bc7f90dea4061.tar.gz
busybox-w32-8837c5dec402fd6782589c0a676bc7f90dea4061.tar.bz2
busybox-w32-8837c5dec402fd6782589c0a676bc7f90dea4061.zip
ash: remove one redundant function, improve string sharing, better field names
function old new delta var_end - 15 +15 changepath 194 192 -2 setvareq 222 218 -4 lookupvar 57 51 -6 bltinlookup 57 51 -6 evalfun 452 443 -9 varequal 14 - -14 ------------------------------------------------------------------------------ (add/remove: 1/1 grow/shrink: 0/5 up/down: 15/-41) Total: -26 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/ash.c112
1 files changed, 57 insertions, 55 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 9e7da1edd..d77d9d3c2 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -279,6 +279,14 @@ static int isdigit_str9(const char *str)
279 return (*str == '\0'); 279 return (*str == '\0');
280} 280}
281 281
282static const char *var_end(const char *var)
283{
284 while (*var)
285 if (*var++ == '=')
286 break;
287 return var;
288}
289
282 290
283/* ============ Interrupts / exceptions */ 291/* ============ Interrupts / exceptions */
284/* 292/*
@@ -1712,8 +1720,8 @@ static void FAST_FUNC getoptsreset(const char *value);
1712struct var { 1720struct var {
1713 struct var *next; /* next entry in hash list */ 1721 struct var *next; /* next entry in hash list */
1714 int flags; /* flags are defined above */ 1722 int flags; /* flags are defined above */
1715 const char *text; /* name=value */ 1723 const char *var_text; /* name=value */
1716 void (*func)(const char *) FAST_FUNC; /* function to be called when */ 1724 void (*var_func)(const char *) FAST_FUNC; /* function to be called when */
1717 /* the variable gets set/unset */ 1725 /* the variable gets set/unset */
1718}; 1726};
1719 1727
@@ -1767,13 +1775,13 @@ static void change_random(const char *) FAST_FUNC;
1767 1775
1768static const struct { 1776static const struct {
1769 int flags; 1777 int flags;
1770 const char *text; 1778 const char *var_text;
1771 void (*func)(const char *) FAST_FUNC; 1779 void (*var_func)(const char *) FAST_FUNC;
1772} varinit_data[] = { 1780} varinit_data[] = {
1773 { VSTRFIXED|VTEXTFIXED , defifsvar , NULL }, 1781 { VSTRFIXED|VTEXTFIXED , defifsvar , NULL },
1774#if ENABLE_ASH_MAIL 1782#if ENABLE_ASH_MAIL
1775 { VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL\0" , changemail }, 1783 { VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL" , changemail },
1776 { VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH\0", changemail }, 1784 { VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH" , changemail },
1777#endif 1785#endif
1778 { VSTRFIXED|VTEXTFIXED , bb_PATH_root_path, changepath }, 1786 { VSTRFIXED|VTEXTFIXED , bb_PATH_root_path, changepath },
1779 { VSTRFIXED|VTEXTFIXED , "PS1=$ " , NULL }, 1787 { VSTRFIXED|VTEXTFIXED , "PS1=$ " , NULL },
@@ -1783,14 +1791,14 @@ static const struct {
1783 { VSTRFIXED|VTEXTFIXED , "OPTIND=1" , getoptsreset }, 1791 { VSTRFIXED|VTEXTFIXED , "OPTIND=1" , getoptsreset },
1784#endif 1792#endif
1785#if ENABLE_ASH_RANDOM_SUPPORT 1793#if ENABLE_ASH_RANDOM_SUPPORT
1786 { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "RANDOM\0", change_random }, 1794 { VSTRFIXED|VTEXTFIXED|VUNSET|VDYNAMIC, "RANDOM", change_random },
1787#endif 1795#endif
1788#if ENABLE_LOCALE_SUPPORT 1796#if ENABLE_LOCALE_SUPPORT
1789 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_ALL\0" , change_lc_all }, 1797 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_ALL" , change_lc_all },
1790 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_CTYPE\0", change_lc_ctype }, 1798 { VSTRFIXED|VTEXTFIXED|VUNSET, "LC_CTYPE" , change_lc_ctype },
1791#endif 1799#endif
1792#if ENABLE_FEATURE_EDITING_SAVEHISTORY 1800#if ENABLE_FEATURE_EDITING_SAVEHISTORY
1793 { VSTRFIXED|VTEXTFIXED|VUNSET, "HISTFILE\0", NULL }, 1801 { VSTRFIXED|VTEXTFIXED|VUNSET, "HISTFILE" , NULL },
1794#endif 1802#endif
1795}; 1803};
1796 1804
@@ -1817,9 +1825,9 @@ extern struct globals_var *const ash_ptr_to_globals_var;
1817 (*(struct globals_var**)&ash_ptr_to_globals_var) = xzalloc(sizeof(G_var)); \ 1825 (*(struct globals_var**)&ash_ptr_to_globals_var) = xzalloc(sizeof(G_var)); \
1818 barrier(); \ 1826 barrier(); \
1819 for (i = 0; i < ARRAY_SIZE(varinit_data); i++) { \ 1827 for (i = 0; i < ARRAY_SIZE(varinit_data); i++) { \
1820 varinit[i].flags = varinit_data[i].flags; \ 1828 varinit[i].flags = varinit_data[i].flags; \
1821 varinit[i].text = varinit_data[i].text; \ 1829 varinit[i].var_text = varinit_data[i].var_text; \
1822 varinit[i].func = varinit_data[i].func; \ 1830 varinit[i].var_func = varinit_data[i].var_func; \
1823 } \ 1831 } \
1824} while (0) 1832} while (0)
1825 1833
@@ -1850,19 +1858,19 @@ extern struct globals_var *const ash_ptr_to_globals_var;
1850 * They have to skip over the name. They return the null string 1858 * They have to skip over the name. They return the null string
1851 * for unset variables. 1859 * for unset variables.
1852 */ 1860 */
1853#define ifsval() (vifs.text + 4) 1861#define ifsval() (vifs.var_text + 4)
1854#define ifsset() ((vifs.flags & VUNSET) == 0) 1862#define ifsset() ((vifs.flags & VUNSET) == 0)
1855#if ENABLE_ASH_MAIL 1863#if ENABLE_ASH_MAIL
1856# define mailval() (vmail.text + 5) 1864# define mailval() (vmail.var_text + 5)
1857# define mpathval() (vmpath.text + 9) 1865# define mpathval() (vmpath.var_text + 9)
1858# define mpathset() ((vmpath.flags & VUNSET) == 0) 1866# define mpathset() ((vmpath.flags & VUNSET) == 0)
1859#endif 1867#endif
1860#define pathval() (vpath.text + 5) 1868#define pathval() (vpath.var_text + 5)
1861#define ps1val() (vps1.text + 4) 1869#define ps1val() (vps1.var_text + 4)
1862#define ps2val() (vps2.text + 4) 1870#define ps2val() (vps2.var_text + 4)
1863#define ps4val() (vps4.text + 4) 1871#define ps4val() (vps4.var_text + 4)
1864#if ENABLE_ASH_GETOPTS 1872#if ENABLE_ASH_GETOPTS
1865# define optindval() (voptind.text + 7) 1873# define optindval() (voptind.var_text + 7)
1866#endif 1874#endif
1867 1875
1868 1876
@@ -1921,12 +1929,6 @@ varcmp(const char *p, const char *q)
1921 return c - d; 1929 return c - d;
1922} 1930}
1923 1931
1924static int
1925varequal(const char *a, const char *b)
1926{
1927 return !varcmp(a, b);
1928}
1929
1930/* 1932/*
1931 * Find the appropriate entry in the hash table from the name. 1933 * Find the appropriate entry in the hash table from the name.
1932 */ 1934 */
@@ -1961,15 +1963,15 @@ initvar(void)
1961 * PS1 depends on uid 1963 * PS1 depends on uid
1962 */ 1964 */
1963#if ENABLE_FEATURE_EDITING && ENABLE_FEATURE_EDITING_FANCY_PROMPT 1965#if ENABLE_FEATURE_EDITING && ENABLE_FEATURE_EDITING_FANCY_PROMPT
1964 vps1.text = "PS1=\\w \\$ "; 1966 vps1.var_text = "PS1=\\w \\$ ";
1965#else 1967#else
1966 if (!geteuid()) 1968 if (!geteuid())
1967 vps1.text = "PS1=# "; 1969 vps1.var_text = "PS1=# ";
1968#endif 1970#endif
1969 vp = varinit; 1971 vp = varinit;
1970 end = vp + ARRAY_SIZE(varinit); 1972 end = vp + ARRAY_SIZE(varinit);
1971 do { 1973 do {
1972 vpp = hashvar(vp->text); 1974 vpp = hashvar(vp->var_text);
1973 vp->next = *vpp; 1975 vp->next = *vpp;
1974 *vpp = vp; 1976 *vpp = vp;
1975 } while (++vp < end); 1977 } while (++vp < end);
@@ -1979,7 +1981,7 @@ static struct var **
1979findvar(struct var **vpp, const char *name) 1981findvar(struct var **vpp, const char *name)
1980{ 1982{
1981 for (; *vpp; vpp = &(*vpp)->next) { 1983 for (; *vpp; vpp = &(*vpp)->next) {
1982 if (varequal((*vpp)->text, name)) { 1984 if (varcmp((*vpp)->var_text, name) == 0) {
1983 break; 1985 break;
1984 } 1986 }
1985 } 1987 }
@@ -2003,11 +2005,11 @@ lookupvar(const char *name)
2003 * As soon as they're unset, they're no longer dynamic, and dynamic 2005 * As soon as they're unset, they're no longer dynamic, and dynamic
2004 * lookup will no longer happen at that point. -- PFM. 2006 * lookup will no longer happen at that point. -- PFM.
2005 */ 2007 */
2006 if ((v->flags & VDYNAMIC)) 2008 if (v->flags & VDYNAMIC)
2007 (*v->func)(NULL); 2009 v->var_func(NULL);
2008#endif 2010#endif
2009 if (!(v->flags & VUNSET)) 2011 if (!(v->flags & VUNSET))
2010 return strchrnul(v->text, '=') + 1; 2012 return var_end(v->var_text);
2011 } 2013 }
2012 return NULL; 2014 return NULL;
2013} 2015}
@@ -2021,8 +2023,8 @@ bltinlookup(const char *name)
2021 struct strlist *sp; 2023 struct strlist *sp;
2022 2024
2023 for (sp = cmdenviron; sp; sp = sp->next) { 2025 for (sp = cmdenviron; sp; sp = sp->next) {
2024 if (varequal(sp->text, name)) 2026 if (varcmp(sp->text, name) == 0)
2025 return strchrnul(sp->text, '=') + 1; 2027 return var_end(sp->text);
2026 } 2028 }
2027 return lookupvar(name); 2029 return lookupvar(name);
2028} 2030}
@@ -2048,24 +2050,24 @@ setvareq(char *s, int flags)
2048 2050
2049 if (flags & VNOSAVE) 2051 if (flags & VNOSAVE)
2050 free(s); 2052 free(s);
2051 n = vp->text; 2053 n = vp->var_text;
2052 ash_msg_and_raise_error("%.*s: is read only", strchrnul(n, '=') - n, n); 2054 ash_msg_and_raise_error("%.*s: is read only", strchrnul(n, '=') - n, n);
2053 } 2055 }
2054 2056
2055 if (flags & VNOSET) 2057 if (flags & VNOSET)
2056 return; 2058 return;
2057 2059
2058 if (vp->func && (flags & VNOFUNC) == 0) 2060 if (vp->var_func && !(flags & VNOFUNC))
2059 (*vp->func)(strchrnul(s, '=') + 1); 2061 vp->var_func(var_end(s));
2060 2062
2061 if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) 2063 if (!(vp->flags & (VTEXTFIXED|VSTACK)))
2062 free((char*)vp->text); 2064 free((char*)vp->var_text);
2063 2065
2064 flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET); 2066 flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET);
2065 } else { 2067 } else {
2068 /* variable s is not found */
2066 if (flags & VNOSET) 2069 if (flags & VNOSET)
2067 return; 2070 return;
2068 /* not found */
2069 vp = ckzalloc(sizeof(*vp)); 2071 vp = ckzalloc(sizeof(*vp));
2070 vp->next = *vpp; 2072 vp->next = *vpp;
2071 /*vp->func = NULL; - ckzalloc did it */ 2073 /*vp->func = NULL; - ckzalloc did it */
@@ -2073,7 +2075,7 @@ setvareq(char *s, int flags)
2073 } 2075 }
2074 if (!(flags & (VTEXTFIXED|VSTACK|VNOSAVE))) 2076 if (!(flags & (VTEXTFIXED|VSTACK|VNOSAVE)))
2075 s = ckstrdup(s); 2077 s = ckstrdup(s);
2076 vp->text = s; 2078 vp->var_text = s;
2077 vp->flags = flags; 2079 vp->flags = flags;
2078} 2080}
2079 2081
@@ -2171,7 +2173,7 @@ unsetvar(const char *s)
2171 if ((flags & VSTRFIXED) == 0) { 2173 if ((flags & VSTRFIXED) == 0) {
2172 INT_OFF; 2174 INT_OFF;
2173 if ((flags & (VTEXTFIXED|VSTACK)) == 0) 2175 if ((flags & (VTEXTFIXED|VSTACK)) == 0)
2174 free((char*)vp->text); 2176 free((char*)vp->var_text);
2175 *vpp = vp->next; 2177 *vpp = vp->next;
2176 free(vp); 2178 free(vp);
2177 INT_ON; 2179 INT_ON;
@@ -2223,7 +2225,7 @@ listvars(int on, int off, char ***end)
2223 if ((vp->flags & mask) == on) { 2225 if ((vp->flags & mask) == on) {
2224 if (ep == stackstrend()) 2226 if (ep == stackstrend())
2225 ep = growstackstr(); 2227 ep = growstackstr();
2226 *ep++ = (char *) vp->text; 2228 *ep++ = (char*)vp->var_text;
2227 } 2229 }
2228 } 2230 }
2229 } while (++vpp < vartab + VTABSIZE); 2231 } while (++vpp < vartab + VTABSIZE);
@@ -6591,7 +6593,7 @@ evalvar(char *p, int flags, struct strlist *var_str_list)
6591 var = p; 6593 var = p;
6592 easy = (!quoted || (*var == '@' && shellparam.nparam)); 6594 easy = (!quoted || (*var == '@' && shellparam.nparam));
6593 startloc = expdest - (char *)stackblock(); 6595 startloc = expdest - (char *)stackblock();
6594 p = strchr(p, '=') + 1; 6596 p = strchr(p, '=') + 1; //TODO: use var_end(p)?
6595 6597
6596 again: 6598 again:
6597 varlen = varvalue(var, varflags, flags, var_str_list); 6599 varlen = varvalue(var, varflags, flags, var_str_list);
@@ -8637,14 +8639,14 @@ poplocalvars(void)
8637 free((char*)lvp->text); 8639 free((char*)lvp->text);
8638 optschanged(); 8640 optschanged();
8639 } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) { 8641 } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) {
8640 unsetvar(vp->text); 8642 unsetvar(vp->var_text);
8641 } else { 8643 } else {
8642 if (vp->func) 8644 if (vp->var_func)
8643 (*vp->func)(strchrnul(lvp->text, '=') + 1); 8645 vp->var_func(var_end(lvp->text));
8644 if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) 8646 if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
8645 free((char*)vp->text); 8647 free((char*)vp->var_text);
8646 vp->flags = lvp->flags; 8648 vp->flags = lvp->flags;
8647 vp->text = lvp->text; 8649 vp->var_text = lvp->text;
8648 } 8650 }
8649 free(lvp); 8651 free(lvp);
8650 } 8652 }
@@ -8763,7 +8765,7 @@ mklocal(char *name)
8763 vp = *vpp; /* the new variable */ 8765 vp = *vpp; /* the new variable */
8764 lvp->flags = VUNSET; 8766 lvp->flags = VUNSET;
8765 } else { 8767 } else {
8766 lvp->text = vp->text; 8768 lvp->text = vp->var_text;
8767 lvp->flags = vp->flags; 8769 lvp->flags = vp->flags;
8768 vp->flags |= VSTRFIXED|VTEXTFIXED; 8770 vp->flags |= VSTRFIXED|VTEXTFIXED;
8769 if (eq) 8771 if (eq)
@@ -9073,7 +9075,7 @@ evalcommand(union node *cmd, int flags)
9073 expredir(cmd->ncmd.redirect); 9075 expredir(cmd->ncmd.redirect);
9074 status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2); 9076 status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2);
9075 9077
9076 path = vpath.text; 9078 path = vpath.var_text;
9077 for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) { 9079 for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) {
9078 struct strlist **spp; 9080 struct strlist **spp;
9079 char *p; 9081 char *p;
@@ -9086,7 +9088,7 @@ evalcommand(union node *cmd, int flags)
9086 * is present 9088 * is present
9087 */ 9089 */
9088 p = (*spp)->text; 9090 p = (*spp)->text;
9089 if (varequal(p, path)) 9091 if (varcmp(p, path) == 0)
9090 path = p; 9092 path = p;
9091 } 9093 }
9092 9094
@@ -10113,7 +10115,7 @@ change_random(const char *value)
10113 /* "get", generate */ 10115 /* "get", generate */
10114 t = next_random(&random_gen); 10116 t = next_random(&random_gen);
10115 /* set without recursion */ 10117 /* set without recursion */
10116 setvar(vrandom.text, utoa(t), VNOFUNC); 10118 setvar(vrandom.var_text, utoa(t), VNOFUNC);
10117 vrandom.flags &= ~VNOFUNC; 10119 vrandom.flags &= ~VNOFUNC;
10118 } else { 10120 } else {
10119 /* set/reset */ 10121 /* set/reset */