2024-12-30 Bruno Haible <bruno@clisp.org>
+ mbfile: Support pushback characters also right before EOF.
+ * lib/mbfile.h (mbfile_multi_getc): Read pushed-back character before
+ testing for sticky EOF.
+ * tests/test-mbfile.c (main): Test pushback at EOF.
+
mbfile: Allow 2 pushback characters.
* lib/mbfile.h: Include <stdlib.h>.
(MBFILE_MAX_PUSHBACK): New macro.
unsigned int new_bufcount;
size_t bytes;
- /* If EOF has already been seen, don't use getc. This matters if
- mbf->fp is connected to an interactive tty. */
- if (mbf->eof_seen)
- goto eof;
-
/* Return character pushed back, if there is one. */
if (mbf->pushback_count > 0)
{
return;
}
+ /* If EOF has already been seen, don't use getc. This matters if
+ mbf->fp is connected to an interactive tty. */
+ if (mbf->eof_seen)
+ goto eof;
+
new_bufcount = mbf->bufcount;
/* If mbf->state is not in an initial state, some more 32-bit wide character
/* The input consists of 4 UTF-8 characters:
'$', U+00A5, U+20AC, U+0001F403. */
mbf_char_t next;
+ mbf_char_t prev;
mbf_getc (next, mbstdin);
ASSERT (!mb_iseof (next));
ASSERT (!mb_iseof (next));
ASSERT (mb_len (next) == 4);
ASSERT (mb_iseq (next, 0x1F403));
+ mb_copy (&prev, &next);
mbf_getc (next, mbstdin);
ASSERT (mb_iseof (next));
+ /* Even at EOF, we need to be able to push back 2 characters. */
+ mbf_ungetc (next, mbstdin);
+ mbf_ungetc (prev, mbstdin);
+
+ mbf_char_t renext;
+
+ mbf_getc (renext, mbstdin);
+ ASSERT (!mb_iseof (renext));
+ ASSERT (mb_len (renext) == 4);
+ ASSERT (mb_iseq (renext, 0x1F403));
+
+ mbf_getc (renext, mbstdin);
+ ASSERT (mb_iseof (renext));
+
return test_exit_status;
}