]>
Commit | Line | Data |
---|---|---|
9c38a689 UD |
1 | #include <errno.h> |
2 | #include <error.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 | int | |
12 | main (int argc, char *argv[]) | |
13 | { | |
14 | int a = 3; | |
15 | int fd; | |
16 | char name[] = "/tmp/wprintf.out.XXXXXX"; | |
17 | FILE *fp; | |
18 | char buf[100]; | |
19 | size_t len; | |
20 | int res = 0; | |
21 | ||
22 | fd = mkstemp (name); | |
23 | if (fd == -1) | |
24 | error (EXIT_FAILURE, errno, "cannot open temporary file"); | |
25 | ||
26 | unlink (name); | |
27 | ||
f881f6ff | 28 | setlocale (LC_ALL, "en_US.UTF-8"); |
9c38a689 UD |
29 | |
30 | fp = fdopen (dup (fd), "w"); | |
31 | if (fp == NULL) | |
32 | error (EXIT_FAILURE, errno, "fdopen(,\"w\")"); | |
33 | ||
34 | fwprintf (fp, L"test start"); | |
35 | fwprintf (fp, L" int %d\n", a); | |
36 | ||
37 | /* String with precision. */ | |
38 | fwprintf (fp, L"1[%6.3s]\n", argv[1]); | |
39 | ||
40 | fclose (fp); | |
41 | ||
42 | fp = fdopen (dup (fd), "a"); | |
43 | if (fp == NULL) | |
44 | error (EXIT_FAILURE, errno, "fdopen(,\"a\")"); | |
45 | ||
46 | setvbuf (fp, NULL, _IONBF, 0); | |
47 | ||
48 | /* fwprintf to unbuffered stream. */ | |
49 | fwprintf (fp, L"hello.\n"); | |
50 | ||
51 | fclose (fp); | |
52 | ||
53 | ||
54 | /* Now read it back in. This time using multibyte functions. */ | |
55 | lseek (fd, SEEK_SET, 0); | |
56 | fp = fdopen (fd, "r"); | |
57 | if (fp == NULL) | |
58 | error (EXIT_FAILURE, errno, "fdopen(,\"r\")"); | |
59 | ||
60 | if (fgets (buf, sizeof buf, fp) != buf) | |
61 | error (EXIT_FAILURE, errno, "first fgets"); | |
62 | len = strlen (buf); | |
63 | if (buf[len - 1] == '\n') | |
64 | --len; | |
65 | else | |
66 | { | |
67 | puts ("newline missing after first line"); | |
68 | res = 1; | |
69 | } | |
70 | printf ("1st line: \"%.*s\" -> %s\n", (int) len, buf, | |
71 | strncmp (buf, "test start int 3", len) == 0 ? "OK" : "FAIL"); | |
72 | res |= strncmp (buf, "test start int 3", len) != 0; | |
73 | ||
74 | if (fgets (buf, sizeof buf, fp) != buf) | |
75 | error (EXIT_FAILURE, errno, "second fgets"); | |
76 | len = strlen (buf); | |
77 | if (buf[len - 1] == '\n') | |
78 | --len; | |
79 | else | |
80 | { | |
81 | puts ("newline missing after second line"); | |
82 | res = 1; | |
83 | } | |
84 | printf ("2nd line: \"%.*s\" -> %s\n", (int) len, buf, | |
85 | strncmp (buf, "1[ Som]", len) == 0 ? "OK" : "FAIL"); | |
86 | res |= strncmp (buf, "1[ Som]", len) != 0; | |
87 | ||
88 | if (fgets (buf, sizeof buf, fp) != buf) | |
89 | error (EXIT_FAILURE, errno, "third fgets"); | |
90 | len = strlen (buf); | |
91 | if (buf[len - 1] == '\n') | |
92 | --len; | |
93 | else | |
94 | { | |
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 | } |