1 /* Test of POSIX compatible fflush() function. 2 Copyright (C) 2008-2021 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16 17 #include <config.h> 18 19 #include <stdio.h> 20 21 #include "binary-io.h" 22 #include "macros.h" 23 24 int 25 main (int argc, char **argv) /* */ 26 { 27 int c; 28 29 /* Avoid the well-known bugs of fflush() on streams in O_TEXT mode 30 on native Windows platforms. */ 31 set_binary_mode (0, O_BINARY); 32 33 if (argc > 1) 34 switch (argv[1][0]) 35 { 36 case '1': 37 /* Check fflush after a backup ungetc() call. This is case 1a in 38 terms of 39 <https://lists.gnu.org/r/bug-gnulib/2008-03/msg00131.html>, 40 according to the Austin Group's resolution on 2009-01-08. */ 41 42 c = fgetc (stdin); 43 ASSERT (c == '#'); 44 45 c = fgetc (stdin); 46 ASSERT (c == '!'); 47 48 /* Here the file-position indicator must be 2. */ 49 50 c = ungetc ('!', stdin); 51 ASSERT (c == '!'); 52 53 fflush (stdin); 54 55 /* Here the file-position indicator must be 1. */ 56 57 c = fgetc (stdin); 58 ASSERT (c == '!'); 59 60 c = fgetc (stdin); 61 ASSERT (c == '/'); 62 63 return 0; 64 65 case '2': 66 /* Check fflush after a non-backup ungetc() call. This is case 2a in 67 terms of 68 <https://lists.gnu.org/r/bug-gnulib/2008-03/msg00131.html>, 69 according to the Austin Group's resolution on 2009-01-08. */ 70 /* Check that fflush after a non-backup ungetc() call discards the 71 ungetc buffer. This is mandated by POSIX 72 <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html>: 73 "...any characters pushed back onto the stream by ungetc() 74 or ungetwc() that have not subsequently been read from the 75 stream shall be discarded..." */ 76 77 c = fgetc (stdin); 78 ASSERT (c == '#'); 79 80 c = fgetc (stdin); 81 ASSERT (c == '!'); 82 83 /* Here the file-position indicator must be 2. */ 84 85 c = ungetc ('@', stdin); 86 ASSERT (c == '@'); 87 88 fflush (stdin); 89 90 /* Here the file-position indicator must be 1. */ 91 92 c = fgetc (stdin); 93 ASSERT (c == '!'); 94 95 c = fgetc (stdin); 96 ASSERT (c == '/'); 97 98 return 0; 99 } 100 101 return 1; 102 }