xref: /haiku/src/tests/system/libroot/posix/tst-wprintf2.c (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /* Test case by Yoshito Kawada <KAWADA@jp.ibm.com>.  */
2 #include <errno.h>
3 #include <fcntl.h>
4 #include <locale.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <unistd.h>
9 #include <wchar.h>
10 
11 
12 void error(int exitCode, int, const char* message);
13 
14 
15 int
16 main(int argc, char *argv[])
17 {
18 	int a = 3;
19 	int fd;
20 	char name[] = "/tmp/wprintf.out.XXXXXX";
21 	FILE *fp;
22 	char buf[100];
23 	size_t len;
24 	int res = 0;
25 
26 	fd = mkstemp(name);
27 	if (fd == -1)
28 		error(EXIT_FAILURE, errno, "cannot open temporary file");
29 
30 	unlink(name);
31 
32 	setlocale(LC_ALL, "");
33 
34 	fp = fdopen(dup(fd), "w");
35 	if (fp == NULL)
36 		error(EXIT_FAILURE, errno, "fdopen(,\"w\")");
37 
38 	fwprintf(fp,L"test start" );
39 	fwprintf(fp, L" int %d\n", a);
40 
41 	/* String with precision.  */
42 	fwprintf(fp, L"1[%6.3s]\n", argv[1]);
43 
44 	fclose(fp);
45 
46 	fp = fdopen(dup (fd), "a");
47 	if (fp == NULL)
48 		error(EXIT_FAILURE, errno, "fdopen(,\"a\")");
49 
50 	setvbuf(fp, NULL, _IONBF, 0);
51 
52 	/* fwprintf to unbuffered stream.   */
53 	fwprintf(fp, L"hello.\n");
54 
55 	fclose(fp);
56 
57 	/* Now read it back in.  This time using multibyte functions.  */
58 	lseek(fd, SEEK_SET, 0);
59 	fp = fdopen(fd, "r");
60 	if (fp == NULL)
61 		error(EXIT_FAILURE, errno, "fdopen(,\"r\")");
62 
63 	if (fgets(buf, sizeof buf, fp) != buf)
64 		error(EXIT_FAILURE, errno, "first fgets");
65 	len = strlen(buf);
66 	if (buf[len - 1] == '\n')
67 		--len;
68 	else {
69 		puts ("newline missing after first line");
70 		res = 1;
71 	}
72 	printf("1st line: \"%.*s\" -> %s\n", (int) len, buf,
73 		strncmp(buf, "test start int 3", len) == 0 ? "OK" : "FAIL");
74 	res |= strncmp(buf, "test start int 3", len) != 0;
75 
76 	if (fgets(buf, sizeof(buf), fp) != buf)
77 		error(EXIT_FAILURE, errno, "second fgets");
78 	len = strlen(buf);
79 	if (buf[len - 1] == '\n')
80 		--len;
81 	else {
82 		puts("newline missing after second line");
83 		res = 1;
84 	}
85 	printf ("2nd line: \"%.*s\" -> %s\n", (int) len, buf,
86 		strncmp(buf, "1[   Som]", len) == 0 ? "OK" : "FAIL");
87 	res |= strncmp(buf, "1[   Som]", len) != 0;
88 
89 	if (fgets(buf, sizeof(buf), fp) != buf)
90 		error(EXIT_FAILURE, errno, "third fgets");
91 	len = strlen(buf);
92 	if (buf[len - 1] == '\n')
93 		--len;
94 	else {
95 		puts("newline missing after third line");
96 		res = 1;
97 	}
98 	printf("3rd line: \"%.*s\" -> %s\n", (int) len, buf,
99 		strncmp(buf, "hello.", len) == 0 ? "OK" : "FAIL");
100 	res |= strncmp(buf, "hello.", len) != 0;
101 
102 	return res;
103 }
104 
105 
106 void
107 error(int exitCode, int errorCode, const char* message)
108 {
109 	perror(message);
110 	exit(exitCode);
111 }
112