diff options
author | Jilles Tjoelker <jilles@FreeBSD.org> | 2010-11-20 14:14:52 +0000 |
---|---|---|
committer | Jilles Tjoelker <jilles@FreeBSD.org> | 2010-11-20 14:14:52 +0000 |
commit | aeb5d065044ee6733a7fee14edb52959a28c1ab4 (patch) | |
tree | bb660239ff9ba03cd107817f9d8d00fabdba49a1 | |
parent | 8987b01ea9c92618bc12d80b444807a9954ea51e (diff) | |
download | src-aeb5d065044ee6733a7fee14edb52959a28c1ab4.tar.gz src-aeb5d065044ee6733a7fee14edb52959a28c1ab4.zip |
sh: Code size optimizations to buffered output.
This is mainly less use of the outc macro.
No functional change is intended, but code size is about 2K less on i386.
Notes
Notes:
svn path=/head/; revision=215567
-rw-r--r-- | bin/sh/eval.c | 12 | ||||
-rw-r--r-- | bin/sh/expand.c | 6 | ||||
-rw-r--r-- | bin/sh/main.c | 6 | ||||
-rw-r--r-- | bin/sh/options.c | 13 | ||||
-rw-r--r-- | bin/sh/output.c | 12 | ||||
-rw-r--r-- | bin/sh/output.h | 3 | ||||
-rw-r--r-- | bin/sh/var.c | 21 |
7 files changed, 39 insertions, 34 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c index 415b9eba0120..c306e731f316 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -699,13 +699,13 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) for (sp = varlist.list ; sp ; sp = sp->next) { if (sep != 0) out2c(' '); - p = sp->text; - while (*p != '=' && *p != '\0') - out2c(*p++); - if (*p != '\0') { - out2c(*p++); + p = strchr(sp->text, '='); + if (p != NULL) { + p++; + outbin(sp->text, p - sp->text, out2); out2qstr(p); - } + } else + out2qstr(sp->text); sep = ' '; } for (sp = arglist.list ; sp ; sp = sp->next) { diff --git a/bin/sh/expand.c b/bin/sh/expand.c index 200da3f046d4..d251ed07bd08 100644 --- a/bin/sh/expand.c +++ b/bin/sh/expand.c @@ -1592,9 +1592,7 @@ wordexpcmd(int argc, char **argv) for (i = 1, len = 0; i < argc; i++) len += strlen(argv[i]); out1fmt("%08x", (int)len); - for (i = 1; i < argc; i++) { - out1str(argv[i]); - out1c('\0'); - } + for (i = 1; i < argc; i++) + outbin(argv[i], strlen(argv[i]) + 1, out1); return (0); } diff --git a/bin/sh/main.c b/bin/sh/main.c index 83a62a7a7e50..9298f696545d 100644 --- a/bin/sh/main.c +++ b/bin/sh/main.c @@ -128,10 +128,8 @@ main(int argc, char *argv[]) exitshell(exitstatus); } reset(); - if (exception == EXINT) { - out2c('\n'); - flushout(&errout); - } + if (exception == EXINT) + out2fmt_flush("\n"); popstackmark(&smark); FORCEINTON; /* enable interrupts */ if (state == 1) diff --git a/bin/sh/options.c b/bin/sh/options.c index af80036283b0..389e55506c5e 100644 --- a/bin/sh/options.c +++ b/bin/sh/options.c @@ -261,13 +261,12 @@ minus_o(char *name, int val) optlist[i].val ? "on" : "off"); } else { /* Output suitable for re-input to shell. */ - for (i = 0; i < NOPTS; i++) { - if (i % 6 == 0) - out1str(i == 0 ? "set" : "\nset"); - out1fmt(" %co %s", optlist[i].val ? '-' : '+', - optlist[i].name); - } - out1c('\n'); + for (i = 0; i < NOPTS; i++) + out1fmt("%s %co %s%s", + i % 6 == 0 ? "set" : "", + optlist[i].val ? '-' : '+', + optlist[i].name, + i % 6 == 5 || i == NOPTS - 1 ? "\n" : ""); } } else { for (i = 0; i < NOPTS; i++) diff --git a/bin/sh/output.c b/bin/sh/output.c index d7fc534d7013..8442a22ec62a 100644 --- a/bin/sh/output.c +++ b/bin/sh/output.c @@ -96,6 +96,12 @@ RESET { void +outcslow(int c, struct output *file) +{ + outc(c, file); +} + +void out1str(const char *p) { outstr(p, out1); @@ -149,19 +155,19 @@ outqstr(const char *p, struct output *file) case '\'': /* Can't quote single quotes inside single quotes. */ if (inquotes) - outc('\'', file); + outcslow('\'', file); inquotes = 0; outstr("\\'", file); break; default: if (!inquotes) - outc('\'', file); + outcslow('\'', file); inquotes = 1; outc(ch, file); } } if (inquotes) - outc('\'', file); + outcslow('\'', file); } void diff --git a/bin/sh/output.h b/bin/sh/output.h index a7c748e72b8b..5e3b04886a89 100644 --- a/bin/sh/output.h +++ b/bin/sh/output.h @@ -54,6 +54,7 @@ extern struct output *out1; /* &memout if backquote, otherwise &output */ extern struct output *out2; /* &memout if backquote with 2>&1, otherwise &errout */ +void outcslow(int, struct output *); void out1str(const char *); void out1qstr(const char *); void out2str(const char *); @@ -74,7 +75,7 @@ int xwrite(int, const char *, int); #define outc(c, file) (--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c))) #define out1c(c) outc(c, out1); -#define out2c(c) outc(c, out2); +#define out2c(c) outcslow(c, out2); #define OUTPUT_INCL #endif diff --git a/bin/sh/var.c b/bin/sh/var.c index 3bba368ab56b..6c0618f3e583 100644 --- a/bin/sh/var.c +++ b/bin/sh/var.c @@ -633,10 +633,10 @@ showvarscmd(int argc __unused, char **argv __unused) qsort(vars, n, sizeof(*vars), var_compare); for (i = 0; i < n; i++) { - for (s = vars[i]; *s != '='; s++) - out1c(*s); - out1c('='); - out1qstr(s + 1); + s = strchr(vars[i], '='); + s++; + outbin(vars[i], s - vars[i], out1); + out1qstr(s); out1c('\n'); } ckfree(vars); @@ -710,12 +710,15 @@ found:; out1str(cmdname); out1c(' '); } - for (p = vp->text ; *p != '=' ; p++) - out1c(*p); + p = strchr(vp->text, '='); if (values && !(vp->flags & VUNSET)) { - out1c('='); - out1qstr(p + 1); - } + p++; + outbin(vp->text, p - vp->text, + out1); + out1qstr(p); + } else + outbin(vp->text, p - vp->text, + out1); out1c('\n'); } } |