| #include <stdio.h> |
| #include <string.h> |
| |
| |
| static int |
| do_test (void) |
| { |
| size_t size; |
| char *buf; |
| FILE *fp = open_memstream (&buf, &size); |
| if (fp == NULL) |
| { |
| puts ("open_memstream failed"); |
| return 1; |
| } |
| |
| off64_t off = ftello64 (fp); |
| if (off != 0) |
| { |
| puts ("initial position wrong"); |
| return 1; |
| } |
| |
| if (fseek (fp, 32768, SEEK_SET) != 0) |
| { |
| puts ("fseek failed"); |
| return 1; |
| } |
| |
| if (fputs ("foo", fp) == EOF) |
| { |
| puts ("fputs failed"); |
| return 1; |
| } |
| |
| if (fclose (fp) == EOF) |
| { |
| puts ("fclose failed"); |
| return 1; |
| } |
| |
| if (size != 32768 + 3) |
| { |
| printf ("expected size %d, got %zu\n", 32768 + 3, size); |
| return 1; |
| } |
| |
| for (int i = 0; i < 32768; ++i) |
| if (buf[i] != '\0') |
| { |
| printf ("byte at offset %d is %#hhx\n", i, buf[i]); |
| return 1; |
| } |
| |
| if (memcmp (buf + 32768, "foo", 3) != 0) |
| { |
| puts ("written string incorrect"); |
| return 1; |
| } |
| |
| /* Mark the buffer. */ |
| memset (buf, 'A', size); |
| free (buf); |
| |
| /* Try again, this time with write mode enabled before the seek. */ |
| fp = open_memstream (&buf, &size); |
| if (fp == NULL) |
| { |
| puts ("2nd open_memstream failed"); |
| return 1; |
| } |
| |
| off = ftello64 (fp); |
| if (off != 0) |
| { |
| puts ("2nd initial position wrong"); |
| return 1; |
| } |
| |
| if (fputs ("bar", fp) == EOF) |
| { |
| puts ("2nd fputs failed"); |
| return 1; |
| } |
| |
| if (fseek (fp, 32768, SEEK_SET) != 0) |
| { |
| puts ("2nd fseek failed"); |
| return 1; |
| } |
| |
| if (fputs ("foo", fp) == EOF) |
| { |
| puts ("3rd fputs failed"); |
| return 1; |
| } |
| |
| if (fclose (fp) == EOF) |
| { |
| puts ("2nd fclose failed"); |
| return 1; |
| } |
| |
| if (size != 32768 + 3) |
| { |
| printf ("2nd expected size %d, got %zu\n", 32768 + 3, size); |
| return 1; |
| } |
| |
| if (memcmp (buf, "bar", 3) != 0) |
| { |
| puts ("initial string incorrect in 2nd try"); |
| return 1; |
| } |
| |
| for (int i = 3; i < 32768; ++i) |
| if (buf[i] != '\0') |
| { |
| printf ("byte at offset %d is %#hhx in 2nd try\n", i, buf[i]); |
| return 1; |
| } |
| |
| if (memcmp (buf + 32768, "foo", 3) != 0) |
| { |
| puts ("written string incorrect in 2nd try"); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| #define TEST_FUNCTION do_test () |
| #include "../test-skeleton.c" |