#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; }