summaryrefslogtreecommitdiffstats
path: root/bin/sh/options.c
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2016-01-07 23:13:20 +0000
committerjilles <jilles@FreeBSD.org>2016-01-07 23:13:20 +0000
commitacacb5074b2237806e9955d5aeafb3cbac26a80d (patch)
treec20ea8b5ec4098e9f3256f758d8c0867eb765b7f /bin/sh/options.c
parent66aa33e3b54566ac437dc5e07c902034dd158713 (diff)
downloadFreeBSD-src-acacb5074b2237806e9955d5aeafb3cbac26a80d.zip
FreeBSD-src-acacb5074b2237806e9955d5aeafb3cbac26a80d.tar.gz
sh: Reduce size of options table.
Diffstat (limited to 'bin/sh/options.c')
-rw-r--r--bin/sh/options.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/bin/sh/options.c b/bin/sh/options.c
index d131200..606ccfb 100644
--- a/bin/sh/options.c
+++ b/bin/sh/options.c
@@ -91,7 +91,7 @@ procargs(int argc, char **argv)
if (argc > 0)
argptr++;
for (i = 0; i < NOPTS; i++)
- optlist[i].val = 2;
+ optval[i] = 2;
privileged = (getuid() != geteuid() || getgid() != getegid());
options(1);
if (*argptr == NULL && minusc == NULL)
@@ -104,8 +104,8 @@ procargs(int argc, char **argv)
if (mflag == 2)
mflag = iflag;
for (i = 0; i < NOPTS; i++)
- if (optlist[i].val == 2)
- optlist[i].val = 0;
+ if (optval[i] == 2)
+ optval[i] = 0;
arg0 = argv[0];
if (sflag == 0 && minusc == NULL) {
scriptname = *argptr++;
@@ -250,26 +250,29 @@ static void
minus_o(char *name, int val)
{
int i;
+ const unsigned char *on;
+ size_t len;
if (name == NULL) {
if (val) {
/* "Pretty" output. */
out1str("Current option settings\n");
- for (i = 0; i < NOPTS; i++)
- out1fmt("%-16s%s\n", optlist[i].name,
- optlist[i].val ? "on" : "off");
+ for (i = 0, on = optname; i < NOPTS; i++, on += *on + 1)
+ out1fmt("%-16.*s%s\n", *on, on + 1,
+ optval[i] ? "on" : "off");
} else {
/* Output suitable for re-input to shell. */
- for (i = 0; i < NOPTS; i++)
- out1fmt("%s %co %s%s",
+ for (i = 0, on = optname; i < NOPTS; i++, on += *on + 1)
+ out1fmt("%s %co %.*s%s",
i % 6 == 0 ? "set" : "",
- optlist[i].val ? '-' : '+',
- optlist[i].name,
+ optval[i] ? '-' : '+',
+ *on, on + 1,
i % 6 == 5 || i == NOPTS - 1 ? "\n" : "");
}
} else {
- for (i = 0; i < NOPTS; i++)
- if (equal(name, optlist[i].name)) {
+ len = strlen(name);
+ for (i = 0, on = optname; i < NOPTS; i++, on += *on + 1)
+ if (*on == len && memcmp(on + 1, name, len) == 0) {
setoptionbyindex(i, val);
return;
}
@@ -281,18 +284,18 @@ minus_o(char *name, int val)
static void
setoptionbyindex(int idx, int val)
{
- if (optlist[idx].letter == 'p' && !val && privileged) {
+ if (optletter[idx] == 'p' && !val && privileged) {
if (setgid(getgid()) == -1)
error("setgid");
if (setuid(getuid()) == -1)
error("setuid");
}
- optlist[idx].val = val;
+ optval[idx] = val;
if (val) {
/* #%$ hack for ksh semantics */
- if (optlist[idx].letter == 'V')
+ if (optletter[idx] == 'V')
Eflag = 0;
- else if (optlist[idx].letter == 'E')
+ else if (optletter[idx] == 'E')
Vflag = 0;
}
}
@@ -303,7 +306,7 @@ setoption(int flag, int val)
int i;
for (i = 0; i < NSHORTOPTS; i++)
- if (optlist[i].letter == flag) {
+ if (optletter[i] == flag) {
setoptionbyindex(i, val);
return;
}
OpenPOWER on IntegriCloud