| /* Test case by Yoshito Kawada <KAWADA@jp.ibm.com>.  */ | 
 | #include <errno.h> | 
 | #include <error.h> | 
 | #include <fcntl.h> | 
 | #include <locale.h> | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 | #include <unistd.h> | 
 | #include <wchar.h> | 
 |  | 
 | int | 
 | main (int argc, char *argv[]) | 
 | { | 
 |   int a = 3; | 
 |   int fd; | 
 |   char name[] = "/tmp/wprintf.out.XXXXXX"; | 
 |   FILE *fp; | 
 |   char buf[100]; | 
 |   size_t len; | 
 |   int res = 0; | 
 |  | 
 |   fd = mkstemp (name); | 
 |   if (fd == -1) | 
 |     error (EXIT_FAILURE, errno, "cannot open temporary file"); | 
 |  | 
 |   unlink (name); | 
 |  | 
 |   setlocale (LC_ALL, "en_US.UTF-8"); | 
 |  | 
 |   fp = fdopen (dup (fd), "w"); | 
 |   if (fp == NULL) | 
 |     error (EXIT_FAILURE, errno, "fdopen(,\"w\")"); | 
 |  | 
 |   fwprintf (fp, L"test start"); | 
 |   fwprintf (fp, L" int %d\n", a); | 
 |  | 
 |   /* String with precision.  */ | 
 |   fwprintf (fp, L"1[%6.3s]\n", argv[1]); | 
 |  | 
 |   fclose (fp); | 
 |  | 
 |   fp = fdopen (dup (fd), "a"); | 
 |   if (fp == NULL) | 
 |     error (EXIT_FAILURE, errno, "fdopen(,\"a\")"); | 
 |  | 
 |   setvbuf (fp, NULL, _IONBF, 0); | 
 |  | 
 |   /* fwprintf to unbuffered stream.   */ | 
 |   fwprintf (fp, L"hello.\n"); | 
 |  | 
 |   fclose (fp); | 
 |  | 
 |  | 
 |   /* Now read it back in.  This time using multibyte functions.  */ | 
 |   lseek (fd, SEEK_SET, 0); | 
 |   fp = fdopen (fd, "r"); | 
 |   if (fp == NULL) | 
 |     error (EXIT_FAILURE, errno, "fdopen(,\"r\")"); | 
 |  | 
 |   if (fgets (buf, sizeof buf, fp) != buf) | 
 |     error (EXIT_FAILURE, errno, "first fgets"); | 
 |   len = strlen (buf); | 
 |   if (buf[len - 1] == '\n') | 
 |     --len; | 
 |   else | 
 |     { | 
 |       puts ("newline missing after first line"); | 
 |       res = 1; | 
 |     } | 
 |   printf ("1st line: \"%.*s\" -> %s\n", (int) len, buf, | 
 | 	  strncmp (buf, "test start int 3", len) == 0 ? "OK" : "FAIL"); | 
 |   res |= strncmp (buf, "test start int 3", len) != 0; | 
 |  | 
 |   if (fgets (buf, sizeof buf, fp) != buf) | 
 |     error (EXIT_FAILURE, errno, "second fgets"); | 
 |   len = strlen (buf); | 
 |   if (buf[len - 1] == '\n') | 
 |     --len; | 
 |   else | 
 |     { | 
 |       puts ("newline missing after second line"); | 
 |       res = 1; | 
 |     } | 
 |   printf ("2nd line: \"%.*s\" -> %s\n", (int) len, buf, | 
 | 	  strncmp (buf, "1[   Som]", len) == 0 ? "OK" : "FAIL"); | 
 |   res |= strncmp (buf, "1[   Som]", len) != 0; | 
 |  | 
 |   if (fgets (buf, sizeof buf, fp) != buf) | 
 |     error (EXIT_FAILURE, errno, "third fgets"); | 
 |   len = strlen (buf); | 
 |   if (buf[len - 1] == '\n') | 
 |     --len; | 
 |   else | 
 |     { | 
 |       puts ("newline missing after third line"); | 
 |       res = 1; | 
 |     } | 
 |   printf ("3rd line: \"%.*s\" -> %s\n", (int) len, buf, | 
 | 	  strncmp (buf, "hello.", len) == 0 ? "OK" : "FAIL"); | 
 |   res |= strncmp (buf, "hello.", len) != 0; | 
 |  | 
 |   return res; | 
 | } |