From 661445a1c0cf9197442b7d25270d4fbdcd14fb5a Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Thu, 13 Dec 2007 14:58:44 -0700 Subject: [PATCH] Another fseek test. * tests/test-fseek.c (main): Also test ungetc handling. * tests/test-fseeko.c (main): Likewise. * modules/fseeko (Depends-on): Add verify. * lib/fseeko.c [!HAVE_FSEEKO]: Verify that off_t is not too large. Reported by Larry Jones. Signed-off-by: Eric Blake --- ChangeLog | 8 ++++++++ lib/fseeko.c | 3 +++ modules/fseeko | 1 + tests/test-fseek.c | 10 ++++++++-- tests/test-fseeko.c | 10 ++++++++-- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd3d5f2c1..a7828da31 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2007-12-13 Eric Blake + Another fseek test. + * tests/test-fseek.c (main): Also test ungetc handling. + * tests/test-fseeko.c (main): Likewise. + * modules/fseeko (Depends-on): Add verify. + * lib/fseeko.c [!HAVE_FSEEKO]: Verify that off_t is not too + large. + Reported by Larry Jones. + Fix fseeko on mingw. * lib/fseeko.c (rpl_fseeko) [_IOERR]: Reset EOF flag on successful seek. diff --git a/lib/fseeko.c b/lib/fseeko.c index 97dcf6da0..6d55ec8b1 100644 --- a/lib/fseeko.c +++ b/lib/fseeko.c @@ -27,6 +27,9 @@ #if !HAVE_FSEEKO # undef fseek # define fseeko fseek + +# include +verify (sizeof (off_t) == sizeof (long)); #endif int diff --git a/modules/fseeko b/modules/fseeko index eb109011e..cb26003de 100644 --- a/modules/fseeko +++ b/modules/fseeko @@ -8,6 +8,7 @@ m4/fseeko.m4 Depends-on: lseek stdio +verify configure.ac-early: AC_REQUIRE([AC_FUNC_FSEEKO]) diff --git a/tests/test-fseek.c b/tests/test-fseek.c index dde7ea0de..0c7db958d 100644 --- a/tests/test-fseek.c +++ b/tests/test-fseek.c @@ -23,17 +23,23 @@ int main (int argc, char **argv) { - /* Assume stdin is seekable iff argc > 1. */ + /* Assume stdin is non-empty and seekable iff argc > 1. */ int expected = argc > 1 ? 0 : -1; if (fseek (stdin, 0, SEEK_CUR) != expected) return 1; if (argc > 1) { - /* Test that fseek resets end-of-file marker. */ + /* Test that fseek discards ungetc data. */ + int ch = fgetc (stdin); + if (ch == EOF) + return 1; + if (ungetc (ch ^ 0xff, stdin) != (ch ^ 0xff)) + return 1; if (fseek (stdin, 0, SEEK_END)) return 1; if (fgetc (stdin) != EOF) return 1; + /* Test that fseek resets end-of-file marker. */ if (!feof (stdin)) return 1; if (fseek (stdin, 0, SEEK_END)) diff --git a/tests/test-fseeko.c b/tests/test-fseeko.c index 3be4f6e50..25289cef0 100644 --- a/tests/test-fseeko.c +++ b/tests/test-fseeko.c @@ -26,7 +26,7 @@ int main (int argc, char **argv) { - /* Assume stdin is seekable iff argc > 1. */ + /* Assume stdin is non-empty and seekable iff argc > 1. */ int expected = argc > 1 ? 0 : -1; /* Exit with success only if fseek/fseeko agree. */ int r1 = fseeko (stdin, (off_t)0, SEEK_CUR); @@ -35,11 +35,17 @@ main (int argc, char **argv) return 1; if (argc > 1) { - /* Test that fseek resets end-of-file marker. */ + /* Test that fseek discards ungetc data. */ + int ch = fgetc (stdin); + if (ch == EOF) + return 1; + if (ungetc (ch ^ 0xff, stdin) != (ch ^ 0xff)) + return 1; if (fseeko (stdin, (off_t) 0, SEEK_END)) return 1; if (fgetc (stdin) != EOF) return 1; + /* Test that fseek resets end-of-file marker. */ if (!feof (stdin)) return 1; if (fseeko (stdin, (off_t) 0, SEEK_END)) -- 2.11.0