|  | #include <errno.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <unistd.h> | 
|  | #include <wchar.h> | 
|  |  | 
|  |  | 
|  | static const struct | 
|  | { | 
|  | const char *enc; | 
|  | const char *data; | 
|  | size_t datalen; | 
|  | const wchar_t *expected; | 
|  | size_t expectedlen; | 
|  | } tests[] = | 
|  | { | 
|  | { "UCS-4LE", "a\0\0\0b\0\0\0", 8, L"ab", 2 }, | 
|  | { "UCS-4BE", "\0\0\0a\0\0\0b", 8, L"ab", 2 }, | 
|  | }; | 
|  | #define ntests (sizeof (tests) / sizeof (tests[0])) | 
|  |  | 
|  |  | 
|  | static int do_test (void); | 
|  | #define TEST_FUNCTION do_test () | 
|  |  | 
|  | static void prepare (void); | 
|  | #define PREPARE(argc, argv) prepare (); | 
|  |  | 
|  | #include "../test-skeleton.c" | 
|  |  | 
|  |  | 
|  | static int fd; | 
|  | static char *tmpname; | 
|  |  | 
|  |  | 
|  | static void | 
|  | prepare (void) | 
|  | { | 
|  | fd = create_temp_file ("tst-fopenloc2", &tmpname); | 
|  | if (fd == -1) | 
|  | { | 
|  | puts ("cannot open temp file"); | 
|  | exit (1); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | for (int i = 0; i < ntests; ++i) | 
|  | { | 
|  | if (ftruncate (fd, 0) != 0) | 
|  | { | 
|  | printf ("ftruncate in round %d failed\n", i + 1); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (TEMP_FAILURE_RETRY (write (fd, tests[i].data, tests[i].datalen)) | 
|  | != tests[i].datalen) | 
|  | { | 
|  | printf ("write in round %d failed\n", i + 1); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (lseek (fd, 0, SEEK_SET) != 0) | 
|  | { | 
|  | printf ("lseek in round %d failed\n", i + 1); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | char *ccs; | 
|  | if (asprintf (&ccs, "r,ccs=%s", tests[i].enc) == -1) | 
|  | { | 
|  | printf ("asprintf in round %d failed\n", i + 1); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | FILE *fp = fopen (tmpname, ccs); | 
|  | if (fp == NULL) | 
|  | { | 
|  | printf ("fopen in round %d failed\n", i + 1); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | #define LINELEN 100 | 
|  | wchar_t line[LINELEN]; | 
|  | if (fgetws (line, LINELEN, fp) != line) | 
|  | { | 
|  | printf ("fgetws in round %d failed\n", i + 1); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (wcslen (line) != tests[i].expectedlen) | 
|  | { | 
|  | printf ("round %d: expected length %zu, got length %zu\n", | 
|  | i + 1, tests[i].expectedlen, wcslen (line)); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (wcscmp (tests[i].expected, line) != 0) | 
|  | { | 
|  | printf ("round %d: expected L\"%ls\", got L\"%ls\"\n", | 
|  | i + 1, tests[i].expected, line); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | fclose (fp); | 
|  |  | 
|  | free (ccs); | 
|  | } | 
|  |  | 
|  | close (fd); | 
|  |  | 
|  | return 0; | 
|  | } |