/* Test program for ungetc/fseekpos interaction. Copyright (C) 2004-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ #include <stdio.h> static void do_prepare (void); #define PREPARE(argc, argv) do_prepare () static int do_test (void); #define TEST_FUNCTION do_test () #include "../test-skeleton.c" static const char pattern[] = "abcdefghijklmnopqrstuvwxyz"; static char *temp_file; static void do_prepare (void) { int fd = create_temp_file ("bug-ungetc.", &temp_file); if (fd == -1) { printf ("cannot create temporary file: %m\n"); exit (1); } write (fd, pattern, sizeof (pattern) - 1); close (fd); } #define TEST_POS 5 static int do_one_test (int mode) { FILE *f = fopen (temp_file, "r"); if (f == NULL) { printf ("%d: could not open temporary file: %m\n", mode); return 1; } int i; for (i = 0; i < TEST_POS; ++i) getc (f); fpos_t p; if (fgetpos (f, &p) != 0) { printf ("%d: fgetpos failed: %m\n", mode); return 1; } if (mode) { if (fseek (f, 0, SEEK_SET) != 0) { printf ("%d: fseek failed: %m\n", mode); return 1; } for (i = 0; i < TEST_POS - (mode >= 2); ++i) getc (f); } if (mode != 2 && ungetc ('X', f) != 'X') { printf ("%d: ungetc failed\n", mode); return 1; } if (mode == 3 && getc (f) != 'X') { printf ("%d: getc after ungetc did not return X\n", mode); return 1; } if (fsetpos (f, &p) != 0) { printf ("%d: fsetpos failed: %m\n", mode); return 1; } if (getc (f) != pattern[TEST_POS]) { printf ("%d: getc did not return %c\n", mode, pattern[TEST_POS]); return 1; } fclose (f); return 0; } static int do_test (void) { int mode, ret = 0; for (mode = 0; mode <= 4; mode++) ret |= do_one_test (mode); return ret; }