1/* Taken from the Li18nux base test suite.  */
2
3#define _XOPEN_SOURCE 500
4#include <errno.h>
5#include <locale.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <unistd.h>
9#include <wchar.h>
10
11#define WIDE_STR_LEN 32
12
13
14int
15main(int argc, char *argv[])
16{
17	size_t i;
18	FILE *fp;
19	wchar_t *ret, wcs[WIDE_STR_LEN];
20	int result = 0;
21	const char il_str1[] = { 0xe3, 0x81, '\0' };
22	const char il_str2[] = { '0', '\n', 'A', 'B', 0xe3, 0x81, 'E', '\0' };
23	char name1[] = "/tmp/tst-fgetws.out.XXXXXX";
24	char name2[] = "/tmp/tst-fgetws.out.XXXXXX";
25	int fd;
26
27	puts("This program runs on de_DE.UTF-8 locale.");
28	if (setlocale(LC_ALL, "de_DE.UTF-8") == NULL) {
29		fprintf(stderr, "Err: Cannot run on the de_DE.UTF-8 locale");
30		exit(EXIT_FAILURE);
31	}
32
33	/* Make a file `il_str1'. */
34	fd = mkstemp(name1);
35	if (fd == -1) {
36		printf("cannot open temp file: %m\n");
37		exit(EXIT_FAILURE);
38	}
39	if ((fp = fdopen(fd, "w")) == NULL) {
40		printf("Can't open %s.\n", argv[1]);
41		exit(EXIT_FAILURE);
42	}
43	fwrite(il_str1, sizeof(char), sizeof(il_str1), fp);
44	fclose(fp);
45
46	/* Make a file `il_str2'. */
47	fd = mkstemp(name2);
48	if (fd == -1) {
49		printf("cannot open temp file: %m\n");
50		exit(EXIT_FAILURE);
51	}
52	if ((fp = fdopen(fd, "w")) == NULL) {
53		fprintf(stderr, "Can't open %s.\n", argv[1]);
54		exit(EXIT_FAILURE);
55	}
56	fwrite(il_str2, sizeof(char), sizeof(il_str2), fp);
57	fclose(fp);
58
59	/* Test for il_str1. */
60	if ((fp = fopen(name1, "r")) == NULL) {
61		fprintf(stderr, "Can't open %s.\n", argv[1]);
62		exit(EXIT_FAILURE);
63	}
64
65	puts("--");
66	puts("Read a byte sequence which is invalid as a wide character string.");
67	puts(" bytes: 0xe3, 0x81, '\\0'");
68
69	errno = 0;
70	ret = fgetws(wcs, WIDE_STR_LEN, fp);
71
72	if (ret == NULL) {
73		puts("Return Value: NULL");
74
75		if (errno == EILSEQ)
76			puts("errno = EILSEQ");
77		else {
78			printf("errno = %d\n", errno);
79			result = 1;
80		}
81	} else {
82		printf("Return Value: %p\n", ret);
83		for (i = 0; i < wcslen(wcs) + 1; i++)
84			printf(" wcs[%zd] = %04x", i, (unsigned int) wcs[i]);
85		printf("\n");
86		result = 1;
87	}
88
89	/* Test for il_str2. */
90	if ((fp = fopen(name2, "r")) == NULL) {
91		fprintf(stderr, "Can't open %s.\n", argv[1]);
92		exit(EXIT_FAILURE);
93	}
94
95	puts("--");
96	puts("Read a byte sequence which is invalid as a wide character string.");
97	puts(" bytes: '0', '\\n', 'A', 'B', 0xe3, 0x81, 'c', '\\0'");
98
99	errno = 0;
100	ret = fgetws(wcs, WIDE_STR_LEN, fp);
101
102	if (ret == NULL) {
103		puts("Return Value: NULL");
104
105		if (errno == EILSEQ)
106			puts("errno = EILSEQ");
107		else
108			printf("errno = %d\n", errno);
109
110		result = 1;
111	} else {
112		size_t i;
113
114		printf("Return Value: %p\n", ret);
115		for (i = 0; i < wcslen(wcs) + 1; i++)
116			printf(" wcs[%zd] = 0x%04x", i, (unsigned int) wcs[i]);
117		printf("\n");
118
119		for (i = 0; il_str2[i] != '\n'; ++i)
120			if ((wchar_t) il_str2[i] != wcs[i]) {
121				puts("read string not correct");
122				result = 1;
123				break;
124			}
125		if (il_str2[i] == '\n') {
126			if (wcs[i] != L'\n') {
127				puts("newline missing");
128				result = 1;
129			} else if (wcs[i + 1] != L'\0') {
130				puts("read string not NUL-terminated");
131				result = 1;
132			}
133		}
134	}
135
136	puts("\nsecond line");
137	errno = 0;
138	ret = fgetws(wcs, WIDE_STR_LEN, fp);
139
140	if (ret == NULL) {
141		puts("Return Value: NULL");
142
143		if (errno == EILSEQ)
144			puts("errno = EILSEQ");
145		else {
146			printf("errno = %d\n", errno);
147			result = 1;
148		}
149	} else {
150		printf("Return Value: %p\n", ret);
151		for (i = 0; i < wcslen(wcs) + 1; i++)
152			printf(" wcs[%zd] = 0x%04x", i, (unsigned int) wcs[i]);
153		printf("\n");
154	}
155
156	fclose(fp);
157
158	unlink(name1);
159	unlink(name2);
160
161	return result;
162}
163