diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-08-09 00:11:12 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-08-09 00:11:12 +0000 |
commit | 5e473a71467d30b51faadb7b5ae4305abc0a16d7 (patch) | |
tree | 2988eff040e9881835c7f813ff51d180d4ca9555 /libio/tst-fgetws.c | |
parent | ca130fe4651a2ca547b05187bdc2804defc8a66b (diff) | |
download | glibc-5e473a71467d30b51faadb7b5ae4305abc0a16d7.zip glibc-5e473a71467d30b51faadb7b5ae4305abc0a16d7.tar.gz glibc-5e473a71467d30b51faadb7b5ae4305abc0a16d7.tar.bz2 |
update.
* libio/wfileops.c (_IO_wfile_underflow): Remove incorrect test
for possible conversion using __codecvt_do_in.
* libio/Makefile (tests): Add tst-fgetws.
* libio/tst-fgetws.c: New file.
* libio/iofgetws.c: Use _IO_ferror_unlocked macros instead of
coding the test here.
Diffstat (limited to 'libio/tst-fgetws.c')
-rw-r--r-- | libio/tst-fgetws.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/libio/tst-fgetws.c b/libio/tst-fgetws.c new file mode 100644 index 0000000..88b6261 --- /dev/null +++ b/libio/tst-fgetws.c @@ -0,0 +1,185 @@ +/* Taken from the Li18nux base test suite. */ + +#define _XOPEN_SOURCE 500 +#include <errno.h> +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <wchar.h> + +#define WIDE_STR_LEN 32 + +int +main (int argc, char *argv[]) +{ + int i; + FILE *fp; + wchar_t *ret, wcs[WIDE_STR_LEN]; + int result = 0; + const char il_str1[] = {0xe3, 0x81, '\0'}; + const char il_str2[] = {'0', '\n', 'A', 'B', 0xe3, 0x81, 'E', '\0'}; + char name1[] = "/tmp/tst-fgetws.out.XXXXXX"; + char name2[] = "/tmp/tst-fgetws.out.XXXXXX"; + int fd; + + puts ("This program runs on de_DE.UTF-8 locale."); + if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) + { + fprintf (stderr, "Err: Cannot run on the de_DE.UTF-8 locale"); + exit (EXIT_FAILURE); + } + + /* Make a file `il_str1'. */ + fd = mkstemp (name1); + if (fd == -1) + { + printf ("cannot open temp file: %m\n"); + exit (EXIT_FAILURE); + } + if ((fp = fdopen (fd, "w")) == NULL) + { + printf ("Can't open %s.\n", argv[1]); + exit (EXIT_FAILURE); + } + fwrite (il_str1, sizeof (char), sizeof (il_str1), fp); + fclose (fp); + + /* Make a file `il_str2'. */ + fd = mkstemp (name2); + if (fd == -1) + { + printf ("cannot open temp file: %m\n"); + exit (EXIT_FAILURE); + } + if ((fp = fdopen (fd, "w")) == NULL) + { + fprintf (stderr, "Can't open %s.\n", argv[1]); + exit (EXIT_FAILURE); + } + fwrite (il_str2, sizeof (char), sizeof (il_str2), fp); + fclose (fp); + + + /* Test for il_str1. */ + if ((fp = fopen (name1, "r")) == NULL) + { + fprintf (stderr, "Can't open %s.\n", argv[1]); + exit (EXIT_FAILURE); + } + + puts ("--"); + puts ("Read a byte sequence which is invalid as a wide character string."); + puts (" bytes: 0xe3, 0x81, '\\0'"); + + errno = 0; + ret = fgetws (wcs, WIDE_STR_LEN, fp); + + if (ret == NULL) + { + puts ("Return Value: NULL"); + + if (errno == EILSEQ) + puts ("errno = EILSEQ"); + else + { + printf ("errno = %d\n", errno); + result = 1; + } + } + else + { + printf ("Return Value: %p\n", ret); + for (i = 0; i < wcslen (wcs) + 1; i++) + printf (" wcs[%d] = %04x", i, (unsigned int)wcs[i]); + printf ("\n"); + result = 1; + } + + /* Test for il_str2. */ + if ((fp = fopen (name2, "r")) == NULL) + { + fprintf (stderr, "Can't open %s.\n", argv[1]); + exit (EXIT_FAILURE); + } + + puts ("--"); + puts ("Read a byte sequence which is invalid as a wide character string."); + puts (" bytes: '0', '\\n', 'A', 'B', 0xe3, 0x81, 'c', '\\0'"); + + errno = 0; + ret = fgetws (wcs, WIDE_STR_LEN, fp); + + if (ret == NULL) + { + puts ("Return Value: NULL"); + + if (errno == EILSEQ) + puts ("errno = EILSEQ"); + else + printf ("errno = %d\n", errno); + + result = 1; + } + else + { + int i; + + printf ("Return Value: %p\n", ret); + for (i = 0; i < wcslen (wcs) + 1; i++) + printf (" wcs[%d] = 0x%04x", i, (unsigned int)wcs[i]); + printf ("\n"); + + for (i = 0; il_str2[i] != '\n'; ++i) + if ((wchar_t) il_str2[i] != wcs[i]) + { + puts ("read string not correct"); + result = 1; + break; + } + if (il_str2[i] == '\n') + { + if (wcs[i] != L'\n') + { + puts ("newline missing"); + result = 1; + } + else if (wcs[i + 1] != L'\0') + { + puts ("read string not NUL-terminated"); + result = 1; + } + } + } + + puts ("\nsecond line"); + errno = 0; + ret = fgetws (wcs, WIDE_STR_LEN, fp); + + if (ret == NULL) + { + puts ("Return Value: NULL"); + + if (errno == EILSEQ) + puts ("errno = EILSEQ"); + else + { + printf ("errno = %d\n", errno); + result = 1; + } + } + else + { + printf ("Return Value: %p\n", ret); + for (i = 0; i < wcslen (wcs) + 1; i++) + printf (" wcs[%d] = 0x%04x", i, (unsigned int)wcs[i]); + printf ("\n"); + } + + fclose (fp); + + unlink (name1); + unlink (name2); + + return result; +} |