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
main(int argc,char * argv[])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 
28   setlocale (LC_ALL, "en_US.UTF-8");
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 }
104