svn commit: r215567 - head/bin/sh

Jilles Tjoelker jilles at FreeBSD.org
Sat Nov 20 14:14:52 UTC 2010


Author: jilles
Date: Sat Nov 20 14:14:52 2010
New Revision: 215567
URL: http://svn.freebsd.org/changeset/base/215567

Log:
  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.

Modified:
  head/bin/sh/eval.c
  head/bin/sh/expand.c
  head/bin/sh/main.c
  head/bin/sh/options.c
  head/bin/sh/output.c
  head/bin/sh/output.h
  head/bin/sh/var.c

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c	Sat Nov 20 13:30:48 2010	(r215566)
+++ head/bin/sh/eval.c	Sat Nov 20 14:14:52 2010	(r215567)
@@ -699,13 +699,13 @@ evalcommand(union node *cmd, int flags, 
 		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) {

Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c	Sat Nov 20 13:30:48 2010	(r215566)
+++ head/bin/sh/expand.c	Sat Nov 20 14:14:52 2010	(r215567)
@@ -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);
 }

Modified: head/bin/sh/main.c
==============================================================================
--- head/bin/sh/main.c	Sat Nov 20 13:30:48 2010	(r215566)
+++ head/bin/sh/main.c	Sat Nov 20 14:14:52 2010	(r215567)
@@ -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)

Modified: head/bin/sh/options.c
==============================================================================
--- head/bin/sh/options.c	Sat Nov 20 13:30:48 2010	(r215566)
+++ head/bin/sh/options.c	Sat Nov 20 14:14:52 2010	(r215567)
@@ -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++)

Modified: head/bin/sh/output.c
==============================================================================
--- head/bin/sh/output.c	Sat Nov 20 13:30:48 2010	(r215566)
+++ head/bin/sh/output.c	Sat Nov 20 14:14:52 2010	(r215567)
@@ -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 *fi
 		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

Modified: head/bin/sh/output.h
==============================================================================
--- head/bin/sh/output.h	Sat Nov 20 13:30:48 2010	(r215566)
+++ head/bin/sh/output.h	Sat Nov 20 14:14:52 2010	(r215567)
@@ -54,6 +54,7 @@ extern struct output *out1; /* &memout i
 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

Modified: head/bin/sh/var.c
==============================================================================
--- head/bin/sh/var.c	Sat Nov 20 13:30:48 2010	(r215566)
+++ head/bin/sh/var.c	Sat Nov 20 14:14:52 2010	(r215567)
@@ -633,10 +633,10 @@ showvarscmd(int argc __unused, char **ar
 
 	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');
 				}
 			}


More information about the svn-src-head mailing list