|
Packit |
6c4009 |
/* Test program for ungetc/ftell interaction bug. */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#include <stdio.h>
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
static void do_prepare (void);
|
|
Packit |
6c4009 |
#define PREPARE(argc, argv) do_prepare ()
|
|
Packit |
6c4009 |
static int do_test (void);
|
|
Packit |
6c4009 |
#define TEST_FUNCTION do_test ()
|
|
Packit |
6c4009 |
#include <test-skeleton.c>
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
static const char pattern[] = "12345";
|
|
Packit |
6c4009 |
static char *temp_file;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
static void
|
|
Packit |
6c4009 |
do_prepare (void)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
int fd = create_temp_file ("bug-ungetc.", &temp_file);
|
|
Packit |
6c4009 |
if (fd == -1)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("cannot create temporary file: %m\n");
|
|
Packit |
6c4009 |
exit (1);
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
write (fd, pattern, sizeof (pattern));
|
|
Packit |
6c4009 |
close (fd);
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
static int
|
|
Packit |
6c4009 |
do_test (void)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
int i;
|
|
Packit |
6c4009 |
FILE *f;
|
|
Packit |
6c4009 |
char buf[10];
|
|
Packit |
6c4009 |
long offset, diff;
|
|
Packit |
6c4009 |
int result = 0;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
f = fopen (temp_file, "rw");
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
rewind (f);
|
|
Packit |
6c4009 |
for (i = 0; i < 3; i++)
|
|
Packit |
6c4009 |
printf ("%c\n", getc (f));
|
|
Packit |
6c4009 |
offset = ftell (f);
|
|
Packit |
6c4009 |
printf ("offset = %ld\n", offset);
|
|
Packit |
6c4009 |
if (ungetc ('4', f) != '4')
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("ungetc failed\n");
|
|
Packit |
6c4009 |
abort ();
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
printf ("offset after ungetc = %ld\n", ftell (f));
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
i = fread ((void *) buf, 4, (size_t) 1, f);
|
|
Packit |
6c4009 |
printf ("read %d (%c), offset = %ld\n", i, buf[0], ftell (f));
|
|
Packit |
6c4009 |
diff = ftell (f) - offset;
|
|
Packit |
6c4009 |
if (diff != 3)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("ftell did not update properly. got %ld, expected 3\n", diff);
|
|
Packit |
6c4009 |
result = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
fclose (f);
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
return result;
|
|
Packit |
6c4009 |
}
|