diff options
Diffstat (limited to 'libio/bug-ungetc.c')
-rw-r--r-- | libio/bug-ungetc.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/libio/bug-ungetc.c b/libio/bug-ungetc.c new file mode 100644 index 0000000000..51940b68f5 --- /dev/null +++ b/libio/bug-ungetc.c @@ -0,0 +1,61 @@ +/* Test program for ungetc/ftell interaction bug. */ + +#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[] = "12345"; +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)); + close (fd); +} + +static int +do_test (void) +{ + int i; + FILE *f; + char buf[10]; + long offset, diff; + int result = 0; + + f = fopen (temp_file, "rw"); + + rewind (f); + for (i = 0; i < 3; i++) + printf ("%c\n", getc (f)); + offset = ftell (f); + printf ("offset = %ld\n", offset); + if (ungetc ('4', f) != '4') + { + printf ("ungetc failed\n"); + abort (); + } + printf ("offset after ungetc = %ld\n", ftell (f)); + + i = fread ((void *) buf, 4, (size_t) 1, f); + printf ("read %d (%c), offset = %ld\n", i, buf[0], ftell (f)); + diff = ftell (f) - offset; + if (diff != 3) + { + printf ("ftell did not update properly. got %ld, expected 3\n", diff); + result = 1; + } + fclose (f); + + return result; +} |