#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"