All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Lukas Fleischer <lfleischer@lfos.de>
Cc: git@vger.kernel.org, Nicolas Pitre <nico@fluxnic.net>,
	Johannes Sixt <j6t@kdbg.org>
Subject: Re: [PATCH v2] Refactor recv_sideband()
Date: Tue, 14 Jun 2016 14:25:42 -0700	[thread overview]
Message-ID: <xmqqbn338nu1.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <20160614210038.31465-1-lfleischer@lfos.de> (Lukas Fleischer's message of "Tue, 14 Jun 2016 23:00:38 +0200")

Lukas Fleischer <lfleischer@lfos.de> writes:

Lukas Fleischer <lfleischer@lfos.de> writes:

> Improve the readability of recv_sideband() significantly by replacing

s/significantly //; "making it readable" is already a subjective
goodness criterion, and you do not have to make it sound even more
subjective.  Let the updated result convince the reader that it is
vastly more readable.

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

I find that calling the loop "a custom implementation" is a bit
unfair.  The original tried to avoid looking beyond "len", but in
the updated code because you have buf[len] = '\0' to terminate the
line, and because you pass LARGE_PACKET_MAX to packet_read() while
your buf[] allocates one more byte, you can use strpbrk() here
safely. Which would mean "a custom implementation" was done for a
reason.

But that is a minor point.

I'll omit the preimage lines from the following.

>  int recv_sideband(const char *me, int in_stream, int out)
>  {
> +	const char *term, *suffix;
> +	char buf[LARGE_PACKET_MAX + 1];
> +	struct strbuf outbuf = STRBUF_INIT;
> +	const char *b, *brk;
>  
> +	strbuf_addf(&outbuf, "%s", PREFIX);

I highly suspect that you are better off without this line being
here.

> ...
>  	while (1) {
>  		int band, len;
> +		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[0] & 0xff;
> +		buf[len] = '\0';
>  		len--;
>  		switch (band) {
>  		case 3:
> +			fprintf(stderr, "%s%s\n", PREFIX, buf + 1);
>  			return SIDEBAND_REMOTE_ERROR;

Two "return"s we see above will leak outbuf.buf that holds PREFIX.

>  		case 2:
> +			b = buf + 1;
>  
> +			/*
> +			 * 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;
>  
> +				if (linelen > 0) {
> +					strbuf_addf(&outbuf, "%.*s%s%c",
> +						    linelen, b, suffix, *brk);
>  				} else {
> +					strbuf_addf(&outbuf, "%c", *brk);
>  				}
> +				xwrite(STDERR_FILENO, outbuf.buf, outbuf.len);
> +				strbuf_reset(&outbuf);
> +				strbuf_addf(&outbuf, "%s", PREFIX);

Instead of doing "we assume outbuf already has PREFIX when we add
contents from buf[]", the code structure would be better if you:

 * make outbuf.buf contain PREFIX at the beginning of this innermost
   loop; lose the reset/addf from here.

 * move strbuf_reset(&outbuf) at the end of the next if (*b) block
   to just before "continue;"

perhaps?

> +				b = brk + 1;
> +			}
>  
> +			if (*b) {
> +				xwrite(STDERR_FILENO, outbuf.buf, outbuf.len);
> +				/* Incomplete line, skip the next prefix. */
> +				strbuf_reset(&outbuf);
> +			}
>  			continue;
>  		case 1:
> +			write_or_die(out, buf + 1, len);
>  			continue;
>  		default:
>  			fprintf(stderr, "%s: protocol error: bad band #%d\n",

  parent reply	other threads:[~2016-06-14 21:25 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqbn338nu1.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=j6t@kdbg.org \
    --cc=lfleischer@lfos.de \
    --cc=nico@fluxnic.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.