#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;
}
