X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-fbufmode.c;h=b1968943afff35171a192aa53ce300a8597b8e8f;hb=69770559f5bf198928150ac8162734d7f6b99c82;hp=af4fa88b7610365b298206802e7460349bc3c34f;hpb=66b599796cae5a74700e952717f31055d8430112;p=gnulib.git diff --git a/tests/test-fbufmode.c b/tests/test-fbufmode.c index af4fa88b7..b1968943a 100644 --- a/tests/test-fbufmode.c +++ b/tests/test-fbufmode.c @@ -1,10 +1,10 @@ /* Test of fbufmode() function. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007-2013 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -12,8 +12,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* Written by Bruno Haible , 2007. */ @@ -21,49 +20,86 @@ #include "fbufmode.h" -#include +#include -#define ASSERT(expr) if (!(expr)) abort (); +#include "macros.h" #define TESTFILE "t-fbufmode.tmp" -int -main () +/* ISO C99 disallows more than one setvbuf call on a given stream, + and HP-UX 11 and musl libc indeed don't support such use of setvbuf. + Therefore allocate a new stream for each possible mode value. */ +static int +test_mode (int mode) { FILE *fp; char buf[5]; - /* Create a file with some contents. */ - fp = fopen (TESTFILE, "w"); - if (fp == NULL) - goto skip; - if (fwrite ("foobarsh", 1, 8, fp) < 8) - goto skip; - if (fclose (fp)) - goto skip; - /* Open it for reading. */ fp = fopen (TESTFILE, "r"); - if (setvbuf (fp, NULL, _IONBF, 0)) - goto skip; - ASSERT (fbufmode (fp) == _IONBF); - - /* This setvbuf call can fail, e.g. on HP-UX 11. */ - if (setvbuf (fp, buf, _IOLBF, 5) == 0) - { - ASSERT (fbufmode (fp) == _IOLBF); - } - - /* This setvbuf call can fail, e.g. on HP-UX 11. */ - if (setvbuf (fp, buf, _IOFBF, 5) == 0) + switch (mode) { + case _IONBF: + ASSERT (setvbuf (fp, NULL, _IONBF, 0) == 0); + ASSERT (fbufmode (fp) == _IONBF); + break; + + case _IOLBF: + ASSERT (setvbuf (fp, buf, _IOLBF, 5) == 0); + /* mingw's setvbuf implements _IOLBF the same way as _IOFBF. */ + ASSERT (fbufmode (fp) == _IOLBF + || fbufmode (fp) == _IOFBF); + break; + + case _IOFBF: + ASSERT (setvbuf (fp, buf, _IOFBF, 5) == 0); ASSERT (fbufmode (fp) == _IOFBF); + break; + + default: + break; } fclose (fp); return 0; +} + +int +main () +{ + int ret; + + /* Create a file with some contents. */ + { + FILE *fp; + + fp = fopen (TESTFILE, "w"); + if (fp == NULL) + goto skip; + if (fwrite ("foobarsh", 1, 8, fp) < 8) + goto skip; + if (fclose (fp)) + goto skip; + } + + ret = test_mode (_IONBF); + if (ret != 0) + goto fail; + + ret = test_mode (_IOLBF); + if (ret != 0) + goto fail; + + ret = test_mode (_IOFBF); + if (ret != 0) + goto fail; + + return 0; + + fail: + return ret; skip: fprintf (stderr, "Skipping test: file operations failed.\n");