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