X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-fflush2.c;h=c89dc9124a7e575caaedb720f20883a247830df0;hb=5f1cfee9e825db39e75bc2388856fb274d395e20;hp=105a57551e8031af410388ccdc5af14b8e75bb83;hpb=e220635fc952c63b533873f2af39ec76aed4b4e3;p=gnulib.git diff --git a/tests/test-fflush2.c b/tests/test-fflush2.c index 105a57551..c89dc9124 100644 --- 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-2010 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 @@ -18,72 +18,91 @@ #include -#include - -/* 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) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) -#else -# define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - printf ("Skipping test: expected failure on this platform\n"); \ - exit (77); \ - } \ - } \ - while (0) -#endif +#include "binary-io.h" +#include "macros.h" int main (int argc, char **argv) { -#if 0 - /* Check fflush after a backup ungetc() call. This is case 1 in terms of - . - 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 - . - 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 - : - "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 == '#'); + /* Avoid the well-known bugs of fflush() on streams in O_TEXT mode + on native Windows platforms. */ + SET_BINARY (0); - 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 + , + according to the Austin Group's resolution on 2009-01-08. */ - /* Here the file-position indicator must be 2. */ + c = fgetc (stdin); + ASSERT (c == '#'); - c = ungetc ('@', stdin); - ASSERT (c == '@'); + c = fgetc (stdin); + ASSERT (c == '!'); - fflush (stdin); + /* Here the file-position indicator must be 2. */ - /* Here the file-position indicator must be 2 again. */ + c = ungetc ('!', stdin); + ASSERT (c == '!'); - c = fgetc (stdin); - ASSERT (c == '/'); -#endif + fflush (stdin); - return 0; + /* Here the file-position indicator must be 1. */ + + c = fgetc (stdin); + ASSERT (c == '!'); + + c = fgetc (stdin); + ASSERT (c == '/'); + + return 0; + + case '2': + /* Check fflush after a non-backup ungetc() call. This is case 2a in + terms of + , + 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 + : + "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." + + "[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." */ + + 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 1. */ + + c = fgetc (stdin); + ASSERT (c == '!'); + + c = fgetc (stdin); + ASSERT (c == '/'); + + return 0; + } + + return 1; }