All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Refactor recv_sideband()
@ 2016-06-13 19:52 Lukas Fleischer
  2016-06-13 21:07 ` Nicolas Pitre
                   ` (3 more replies)
  0 siblings, 4 replies; 60+ messages in thread
From: Lukas Fleischer @ 2016-06-13 19:52 UTC (permalink / raw)
  To: git; +Cc: Nicolas Pitre, Johannes Sixt

Improve the readability of recv_sideband() significantly by replacing
fragile buffer manipulations with more sophisticated format strings.
Also, reorganize the overall control flow, remove some superfluous
variables and replace a custom implementation of strpbrk() with a call
to the standard C library function.

Signed-off-by: Lukas Fleischer <lfleischer@lfos.de>
---
I had a really hard time reading and understanding this function when I
came up with my last patch. What I ended up with is almost a complete
rewrite of recv_sideband() and I find the end result to be much more
readable than what we have now. Given that this is quite invasive, it
would be good to have some more eyes and opinions...

If you want me to split this patch into smaller changes, please let me
know. However, finding a good way to split this into logical changes
might not be easy given that the new code does not have much in common
with what we had before.

 sideband.c | 94 ++++++++++++++++++++------------------------------------------
 1 file changed, 30 insertions(+), 64 deletions(-)

diff --git a/sideband.c b/sideband.c
index fde8adc..0a078c3 100644
--- a/sideband.c
+++ b/sideband.c
@@ -13,103 +13,69 @@
  * the remote died unexpectedly.  A flush() concludes the stream.
  */
 
-#define PREFIX "remote:"
+#define PREFIX "remote: "
 
 #define ANSI_SUFFIX "\033[K"
 #define DUMB_SUFFIX "        "
 
-#define FIX_SIZE 10  /* large enough for any of the above */
-
 int recv_sideband(const char *me, int in_stream, int out)
 {
-	unsigned pf = strlen(PREFIX);
-	unsigned sf;
-	char buf[LARGE_PACKET_MAX + 2*FIX_SIZE];
-	char *suffix, *term;
-	int skip_pf = 0;
+	const char *term;
+	const char *prefix = PREFIX, *suffix;
+	char buf[LARGE_PACKET_MAX + 1];
+	const char *b, *brk;
 
-	memcpy(buf, PREFIX, pf);
 	term = getenv("TERM");
 	if (isatty(2) && term && strcmp(term, "dumb"))
 		suffix = ANSI_SUFFIX;
 	else
 		suffix = DUMB_SUFFIX;
-	sf = strlen(suffix);
 
 	while (1) {
 		int band, len;
-		len = packet_read(in_stream, NULL, NULL, buf + pf, LARGE_PACKET_MAX, 0);
+		len = packet_read(in_stream, NULL, NULL, buf, LARGE_PACKET_MAX, 0);
 		if (len == 0)
 			break;
 		if (len < 1) {
 			fprintf(stderr, "%s: protocol error: no band designator\n", me);
 			return SIDEBAND_PROTOCOL_ERROR;
 		}
-		band = buf[pf] & 0xff;
+		band = buf[0] & 0xff;
+		buf[len] = '\0';
 		len--;
 		switch (band) {
 		case 3:
-			buf[pf] = ' ';
-			buf[pf+1+len] = '\0';
-			fprintf(stderr, "%s\n", buf);
+			fprintf(stderr, "%s%s\n", PREFIX, buf + 1);
 			return SIDEBAND_REMOTE_ERROR;
 		case 2:
-			buf[pf] = ' ';
-			do {
-				char *b = buf;
-				int brk = 0;
-
-				/*
-				 * If the last buffer didn't end with a line
-				 * break then we should not print a prefix
-				 * this time around.
-				 */
-				if (skip_pf) {
-					b += pf+1;
-				} else {
-					len += pf+1;
-					brk += pf+1;
-				}
+			b = buf + 1;
 
-				/* Look for a line break. */
-				for (;;) {
-					brk++;
-					if (brk > len) {
-						brk = 0;
-						break;
-					}
-					if (b[brk-1] == '\n' ||
-					    b[brk-1] == '\r')
-						break;
-				}
+			/*
+			 * Append a suffix to each nonempty line to clear the
+			 * end of the screen line.
+			 */
+			while ((brk = strpbrk(b, "\n\r"))) {
+				int linelen = brk - b;
 
-				/*
-				 * Let's insert a suffix to clear the end
-				 * of the screen line if a line break was
-				 * found.  Also, if we don't skip the
-				 * prefix, then a non-empty string must be
-				 * present too.
-				 */
-				if (brk > (skip_pf ? 0 : (pf+1 + 1))) {
-					char save[FIX_SIZE];
-					memcpy(save, b + brk, sf);
-					b[brk + sf - 1] = b[brk - 1];
-					memcpy(b + brk - 1, suffix, sf);
-					fprintf(stderr, "%.*s", brk + sf, b);
-					memcpy(b + brk, save, sf);
-					len -= brk;
+				if (linelen > 0) {
+					fprintf(stderr, "%s%.*s%s%c", prefix,
+						linelen, b, suffix, *brk);
 				} else {
-					int l = brk ? brk : len;
-					fprintf(stderr, "%.*s", l, b);
-					len -= l;
+					fprintf(stderr, "%s%c", prefix, *brk);
 				}
 
-				skip_pf = !brk;
-				memmove(buf + pf+1, b + brk, len);
-			} while (len);
+				b = brk + 1;
+				prefix = PREFIX;
+			}
+
+			if (*b) {
+				fprintf(stderr, "%s%s", prefix, b);
+				/* Incomplete line, skip the next prefix. */
+				prefix = "";
+			}
 			continue;
 		case 1:
-			write_or_die(out, buf + pf+1, len);
+			write_or_die(out, buf + 1, len);
 			continue;
 		default:
 			fprintf(stderr, "%s: protocol error: bad band #%d\n",
-- 
2.8.3

^ permalink raw reply related	[flat|nested] 60+ messages in thread

end of thread, other threads:[~2016-07-07  0:57 UTC | newest]

Thread overview: 60+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-13 19:52 [PATCH] Refactor recv_sideband() Lukas Fleischer
2016-06-13 21:07 ` Nicolas Pitre
2016-06-14 13:44   ` Johannes Schindelin
2016-06-14 15:04     ` Nicolas Pitre
2016-06-14 15:30       ` Johannes Schindelin
     [not found]       ` <Cq7rbYgOpb0CVCq7sbGmpL@videotron.ca>
2016-06-14 16:43         ` Nicolas Pitre
2016-06-14 17:09   ` Nicolas Pitre
     [not found]     ` <CsLdb3qLMBok7CsLebwX38@videotron.ca>
2016-06-14 17:55       ` Nicolas Pitre
2016-06-14 18:11         ` Junio C Hamano
2016-06-14 19:11           ` Lukas Fleischer
2016-06-14 19:16             ` Junio C Hamano
     [not found]         ` <Ct7VbfLfTHEALCt7Wbh8Xs@videotron.ca>
2016-06-14 20:10           ` Nicolas Pitre
2016-06-14 21:00 ` [PATCH v2] " Lukas Fleischer
2016-06-14 21:11   ` Lukas Fleischer
2016-06-14 21:25   ` Junio C Hamano
2016-06-15  3:44     ` Jeff King
     [not found]     ` <146597489449.32143.1327156804178869158@s-8d3a2dc3.on.site.uni-stuttgart.de>
2016-06-19 10:48       ` Lukas Fleischer
2016-06-24 15:31   ` Jeff King
2016-06-24 17:45     ` Johannes Schindelin
2016-06-24 18:14       ` Jeff King
2016-06-24 18:32         ` Junio C Hamano
2016-06-27 10:58           ` Lukas Fleischer
2016-06-27 15:54             ` Junio C Hamano
2016-06-27 16:16               ` Jeff King
2016-06-27 17:50                 ` Junio C Hamano
2016-06-27 20:34                   ` Lukas Fleischer
2016-06-27 20:47                     ` Nicolas Pitre
2016-06-28  4:01                       ` Lukas Fleischer
2016-06-28  5:20                     ` Junio C Hamano
2016-06-28 10:04                 ` Johannes Schindelin
2016-06-28 10:05                   ` Johannes Schindelin
2016-06-28 15:13                     ` Junio C Hamano
2016-06-28 16:21                       ` Johannes Schindelin
2016-06-24 20:07         ` Dennis Kaarsemaker
2016-06-22  5:29 ` [PATCH v3] " Lukas Fleischer
2016-06-22 15:02   ` Nicolas Pitre
2016-06-22 22:47     ` Nicolas Pitre
2016-06-23 17:35       ` Lukas Fleischer
2016-06-23 18:59         ` Nicolas Pitre
2016-06-28  4:35 ` [PATCH v4] " Lukas Fleischer
2016-06-28 16:57   ` Junio C Hamano
2016-06-28 17:24     ` Junio C Hamano
2016-06-28 17:46       ` Nicolas Pitre
2016-06-28 18:13         ` Junio C Hamano
2016-06-28 18:28           ` Nicolas Pitre
2016-06-28 19:51             ` Junio C Hamano
2016-06-28 20:36               ` Nicolas Pitre
2016-06-28 21:09                 ` Junio C Hamano
2016-06-28 21:44                   ` Nicolas Pitre
2016-06-28 22:33                     ` Junio C Hamano
2016-06-28 22:47                       ` Junio C Hamano
2016-06-29  3:00                         ` Junio C Hamano
2016-06-29  3:41                           ` Nicolas Pitre
2016-06-29  2:02                       ` Nicolas Pitre
2016-06-29 16:40                         ` Junio C Hamano
2016-06-30  6:16                           ` Lukas Fleischer
2016-07-01 20:01                             ` Junio C Hamano
2016-07-05 20:35                           ` Nicolas Pitre
2016-07-06 21:11                             ` Junio C Hamano
2016-07-07  0:56                               ` Nicolas Pitre

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.