svn commit: r318385 - head/bin/sh

Jilles Tjoelker jilles at FreeBSD.org
Tue May 16 21:54:52 UTC 2017


Author: jilles
Date: Tue May 16 21:54:51 2017
New Revision: 318385
URL: https://svnweb.freebsd.org/changeset/base/318385

Log:
  sh: Simplify output buffering.
  
  Similarly to how STPUTC was changed, change struct output to store the
  pointer just past the end of the available space instead of the size of the
  available space, so after writing a character it is only necessary to
  increment a pointer and not to decrement a counter.

Modified:
  head/bin/sh/eval.c
  head/bin/sh/output.c
  head/bin/sh/output.h

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c	Tue May 16 21:50:29 2017	(r318384)
+++ head/bin/sh/eval.c	Tue May 16 21:54:51 2017	(r318385)
@@ -1080,8 +1080,8 @@ evalcommand(union node *cmd, int flags, 
 #endif
 		mode = (cmdentry.u.index == EXECCMD)? 0 : REDIR_PUSH;
 		if (flags == EV_BACKCMD) {
-			memout.nleft = 0;
 			memout.nextc = memout.buf;
+			memout.bufend = memout.buf;
 			memout.bufsize = 64;
 			mode |= REDIR_BACKQ;
 		}
@@ -1134,8 +1134,11 @@ cmddone:
 			exitshell(exitstatus);
 		if (flags == EV_BACKCMD) {
 			backcmd->buf = memout.buf;
-			backcmd->nleft = memout.nextc - memout.buf;
+			backcmd->nleft = memout.buf != NULL ?
+			    memout.nextc - memout.buf : 0;
 			memout.buf = NULL;
+			memout.nextc = NULL;
+			memout.bufend = NULL;
 		}
 		if (cmdentry.u.index != EXECCMD)
 			popredir();

Modified: head/bin/sh/output.c
==============================================================================
--- head/bin/sh/output.c	Tue May 16 21:50:29 2017	(r318384)
+++ head/bin/sh/output.c	Tue May 16 21:54:51 2017	(r318385)
@@ -71,9 +71,9 @@ __FBSDID("$FreeBSD$");
 
 static int doformat_wr(void *, const char *, int);
 
-struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0};
-struct output errout = {NULL, 0, NULL, 256, 2, 0};
-struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0};
+struct output output = {NULL, NULL, NULL, OUTBUFSIZ, 1, 0};
+struct output errout = {NULL, NULL, NULL, 256, 2, 0};
+struct output memout = {NULL, NULL, NULL, 0, MEM_OUT, 0};
 struct output *out1 = &output;
 struct output *out2 = &errout;
 
@@ -214,20 +214,19 @@ emptyoutbuf(struct output *dest)
 		INTOFF;
 		dest->buf = ckmalloc(dest->bufsize);
 		dest->nextc = dest->buf;
-		dest->nleft = dest->bufsize;
+		dest->bufend = dest->buf + dest->bufsize;
 		INTON;
 	} else if (dest->fd == MEM_OUT) {
-		offset = dest->bufsize;
+		offset = dest->nextc - dest->buf;
 		INTOFF;
 		dest->bufsize <<= 1;
 		dest->buf = ckrealloc(dest->buf, dest->bufsize);
-		dest->nleft = dest->bufsize - offset;
+		dest->bufend = dest->buf + dest->bufsize;
 		dest->nextc = dest->buf + offset;
 		INTON;
 	} else {
 		flushout(dest);
 	}
-	dest->nleft--;
 }
 
 
@@ -248,7 +247,6 @@ flushout(struct output *dest)
 	if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0)
 		dest->flags |= OUTPUT_ERR;
 	dest->nextc = dest->buf;
-	dest->nleft = dest->bufsize;
 }
 
 
@@ -258,8 +256,9 @@ freestdout(void)
 	INTOFF;
 	if (output.buf) {
 		ckfree(output.buf);
+		output.nextc = NULL;
 		output.buf = NULL;
-		output.nleft = 0;
+		output.bufend = NULL;
 	}
 	INTON;
 }

Modified: head/bin/sh/output.h
==============================================================================
--- head/bin/sh/output.h	Tue May 16 21:50:29 2017	(r318384)
+++ head/bin/sh/output.h	Tue May 16 21:54:51 2017	(r318385)
@@ -40,7 +40,7 @@
 
 struct output {
 	char *nextc;
-	int nleft;
+	char *bufend;
 	char *buf;
 	int bufsize;
 	short fd;
@@ -75,7 +75,7 @@ void fmtstr(char *, int, const char *, .
 void doformat(struct output *, const char *, va_list) __printflike(2, 0);
 int xwrite(int, const char *, int);
 
-#define outc(c, file)	(--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c)))
+#define outc(c, file)	((file)->nextc == (file)->bufend ? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c)))
 #define out1c(c)	outc(c, out1);
 #define out2c(c)	outcslow(c, out2);
 


More information about the svn-src-head mailing list