| #include <stdio.h> |
| #include <string.h> |
| #include <wchar.h> |
| |
| |
| static int |
| do_test (void) |
| { |
| size_t size; |
| wchar_t *buf; |
| FILE *fp = open_wmemstream (&buf, &size); |
| if (fp == NULL) |
| { |
| puts ("open_wmemstream 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 (fputws (L"foo", fp) == EOF) |
| { |
| puts ("fputws 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] != L'\0') |
| { |
| printf ("wide character at offset %d is %#x\n", |
| i, (unsigned int) buf[i]); |
| return 1; |
| } |
| |
| if (wmemcmp (buf + 32768, L"foo", 3) != 0) |
| { |
| puts ("written string incorrect"); |
| return 1; |
| } |
| |
| /* Mark the buffer. */ |
| wmemset (buf, L'A', size); |
| free (buf); |
| |
| /* Try again, this time with write mode enabled before the seek. */ |
| fp = open_wmemstream (&buf, &size); |
| if (fp == NULL) |
| { |
| puts ("2nd open_wmemstream failed"); |
| return 1; |
| } |
| |
| off = ftello64 (fp); |
| if (off != 0) |
| { |
| puts ("2nd initial position wrong"); |
| return 1; |
| } |
| |
| if (fputws (L"bar", fp) == EOF) |
| { |
| puts ("2nd fputws failed"); |
| return 1; |
| } |
| |
| if (fseek (fp, 32768, SEEK_SET) != 0) |
| { |
| puts ("2nd fseek failed"); |
| return 1; |
| } |
| |
| if (fputws (L"foo", fp) == EOF) |
| { |
| puts ("3rd fputws 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 (wmemcmp (buf, L"bar", 3) != 0) |
| { |
| puts ("initial string incorrect in 2nd try"); |
| return 1; |
| } |
| |
| for (int i = 3; i < 32768; ++i) |
| if (buf[i] != L'\0') |
| { |
| printf ("wide character at offset %d is %#x in 2nd try\n", |
| i, (unsigned int) buf[i]); |
| return 1; |
| } |
| |
| if (wmemcmp (buf + 32768, L"foo", 3) != 0) |
| { |
| puts ("written string incorrect in 2nd try"); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| #define TEST_FUNCTION do_test () |
| #include "../test-skeleton.c" |