diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-01-19 01:35:28 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-01-19 01:35:28 +0000 |
commit | 01715b0337fb0a0d94eb605d93c5e91e116179b5 (patch) | |
tree | 0301863b66ab68d0bba95f85285aefc936d959ac /libio/tst-fopenloc2.c | |
parent | a815c3ab359e99edc5d44934a0d00467a9a16bad (diff) | |
download | glibc-01715b0337fb0a0d94eb605d93c5e91e116179b5.tar.gz glibc-01715b0337fb0a0d94eb605d93c5e91e116179b5.tar.xz glibc-01715b0337fb0a0d94eb605d93c5e91e116179b5.zip |
[BZ #2173]
2006-01-18 Ulrich Drepper <drepper@redhat.com> [BZ #2173] * libio/fileops.c (_IO_new_file_fopen): If ,ccs= is given, also set vtable to the wide vtable. * libio/tst-fopenloc2.c: New file. * libio/Makefile (tests): Add tst-fopenloc2. * sysdeps/unix/sysv/linux/shm_open.c [__ASSUME_TMPFS_NAME]
Diffstat (limited to 'libio/tst-fopenloc2.c')
-rw-r--r-- | libio/tst-fopenloc2.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/libio/tst-fopenloc2.c b/libio/tst-fopenloc2.c new file mode 100644 index 0000000000..5ddd63446b --- /dev/null +++ b/libio/tst-fopenloc2.c @@ -0,0 +1,116 @@ +#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; +} |