Mercurial > hg > octave-shane > gnulib-hg
changeset 11015:1b3e52ed017e
Enable tests for fflush after ungetc.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Thu, 15 Jan 2009 12:24:04 +0100 |
parents | 622b789a86c4 |
children | 5d3e28b13bb3 |
files | ChangeLog tests/test-fflush2.c tests/test-fflush2.sh |
diffstat | 3 files changed, 80 insertions(+), 45 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-01-15 Bruno Haible <bruno@clisp.org> + + * tests/test-fflush2.sh: Invoke test-fflush2 twice. + * tests/test-fflush2.c (ASSERT): Always fail. + (main): Add two tests for fflush() after ungetc(), taking into account + the Austin Group's clarification. + Suggested by Eric Blake. + 2009-01-15 Albert Chin-A-Young <china@thewrittenword.com> mktime.m4: remove K&R-style function prototypes
--- a/tests/test-fflush2.c +++ b/tests/test-fflush2.c @@ -1,5 +1,5 @@ /* Test of POSIX compatible fflush() function. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,9 +20,7 @@ #include <stdlib.h> -/* This test can only be made to work on specific platforms. */ -#if defined _IO_ferror_unlocked || defined __sferror /* GNU libc, BeOS; FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ -# define ASSERT(expr) \ +#define ASSERT(expr) \ do \ { \ if (!(expr)) \ @@ -33,57 +31,85 @@ } \ } \ while (0) -#else -# define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - printf ("Skipping test: expected failure on this platform\n"); \ - exit (77); \ - } \ - } \ - while (0) -#endif int main (int argc, char **argv) { -#if 0 - /* Check fflush after a backup ungetc() call. This is case 1 in terms of - <http://lists.gnu.org/archive/html/bug-gnulib/2008-03/msg00131.html>. - The Austin Group has not yet decided how this should behave. */ -#endif -#if 0 - /* Check fflush after a non-backup ungetc() call. This is case 2 in terms of - <http://lists.gnu.org/archive/html/bug-gnulib/2008-03/msg00131.html>. - The Austin Group has not yet decided how this should behave. */ - /* Check that fflush after a non-backup ungetc() call discards the ungetc - buffer. This is mandated by POSIX - <http://www.opengroup.org/susv3/functions/ungetc.html>: - "The value of the file-position indicator for the stream after - reading or discarding all pushed-back bytes shall be the same - as it was before the bytes were pushed back." */ int c; - c = fgetc (stdin); - ASSERT (c == '#'); + if (argc > 1) + switch (argv[1][0]) + { + case '1': + /* Check fflush after a backup ungetc() call. This is case 1a in + terms of + <http://lists.gnu.org/archive/html/bug-gnulib/2008-03/msg00131.html>, + according to the Austin Group's resolution on 2009-01-08. */ + + c = fgetc (stdin); + ASSERT (c == '#'); + + c = fgetc (stdin); + ASSERT (c == '!'); - c = fgetc (stdin); - ASSERT (c == '!'); + /* Here the file-position indicator must be 2. */ + + c = ungetc ('!', stdin); + ASSERT (c == '!'); + + fflush (stdin); - /* Here the file-position indicator must be 2. */ + /* Here the file-position indicator must be 1. */ + + c = fgetc (stdin); + ASSERT (c == '!'); - c = ungetc ('@', stdin); - ASSERT (c == '@'); + c = fgetc (stdin); + ASSERT (c == '/'); + + return 0; - fflush (stdin); + case '2': + /* Check fflush after a non-backup ungetc() call. This is case 2a in + terms of + <http://lists.gnu.org/archive/html/bug-gnulib/2008-03/msg00131.html>, + according to the Austin Group's resolution on 2009-01-08. */ + /* Check that fflush after a non-backup ungetc() call discards the + ungetc buffer. This is mandated by POSIX + <http://www.opengroup.org/susv3/functions/ungetc.html>: + "The value of the file-position indicator for the stream after + reading or discarding all pushed-back bytes shall be the same + as it was before the bytes were pushed back." + <http://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> + "[After fflush(),] the file offset of the underlying open file + description shall be set to the file position of the stream, and + any characters pushed back onto the stream by ungetc() or + ungetwc() that have not subsequently been read from the stream + shall be discarded." */ - /* Here the file-position indicator must be 2 again. */ + c = fgetc (stdin); + ASSERT (c == '#'); - c = fgetc (stdin); - ASSERT (c == '/'); -#endif + c = fgetc (stdin); + ASSERT (c == '!'); + + /* Here the file-position indicator must be 2. */ + + c = ungetc ('@', stdin); + ASSERT (c == '@'); + + fflush (stdin); + + /* Here the file-position indicator must be 1. */ - return 0; + c = fgetc (stdin); + ASSERT (c == '!'); + + c = fgetc (stdin); + ASSERT (c == '/'); + + return 0; + } + + return 1; }
--- a/tests/test-fflush2.sh +++ b/tests/test-fflush2.sh @@ -2,7 +2,8 @@ # Execute the test only with seekable input stream. # The behaviour of fflush() on a non-seekable input stream is undefined. -./test-fflush2${EXEEXT} < "$srcdir/test-fflush2.sh" || exit $? +./test-fflush2${EXEEXT} 1 < "$srcdir/test-fflush2.sh" || exit $? +./test-fflush2${EXEEXT} 2 < "$srcdir/test-fflush2.sh" || exit $? #cat "$srcdir/test-fflush2.sh" | ./test-fflush2${EXEEXT} || exit $? exit 0