Thread (151 messages) 151 messages, 6 authors, 2017-05-11

Re: [PATCH 10/26] Check for EOF while parsing mails

From: Johannes Schindelin <hidden>
Date: 2017-04-28 10:45:10

Hi Peff,

On Thu, 27 Apr 2017, Jeff King wrote:
On Wed, Apr 26, 2017 at 10:20:16PM +0200, Johannes Schindelin wrote:
quoted
diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c
index 30681681c13..c0d88f97512 100644
--- a/builtin/mailsplit.c
+++ b/builtin/mailsplit.c
@@ -232,7 +232,7 @@ static int split_mbox(const char *file, const char *dir, int allow_bare,
 
 	do {
 		peek = fgetc(f);
-	} while (isspace(peek));
+	} while (peek >= 0 && isspace(peek));
 	ungetc(peek, f);
Are we guaranteed that EOF is a negative number?
No, you're right.
Also, what is the behavior of ungetc when we pass it EOF?
According to the documentation, it would cast EOF to an unsigned char and
push that back. Definitely incorrect.
It looks like POSIX does what we want (pushing EOF is a noop, and the
stream retains its feof() status), but I don't know if there are other
implementations to worry about.
That's not what my man page here says:

	ungetc()  pushes  c  back to stream, cast to unsigned char, where
	it is available for subsequent read operations.  Pushed-back
	characters will be returned in reverse order; only one pushback is
	guaranteed.
Perhaps:

  /* soak up whitespace */
  while ((peek = fgetc(f)) != EOF) {
	if (!isspace(peek)) {
		ungetc(peek, f);
		break;
	}
  }

would be more portable.
True. I changed it slightly differently, please see my reply to Hannes.

Thanks,
Dscho
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help