diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-06-02 12:56:18 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-06-02 12:56:18 +0200 |
commit | 8837c5dec402fd6782589c0a676bc7f90dea4061 (patch) | |
tree | 0d8633fecd6479603bdd72af78d8d14251b38202 | |
parent | 8376bfae58f1e32325eef934aaea8116995bb96a (diff) | |
download | busybox-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.c | 112 |
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 | ||
282 | static 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); | |||
1712 | struct var { | 1720 | struct 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 | ||
1768 | static const struct { | 1776 | static 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 | ||
1924 | static int | ||
1925 | varequal(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 ** | |||
1979 | findvar(struct var **vpp, const char *name) | 1981 | findvar(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 */ |