/* Taken from the Li18nux base test suite.  */

#define _XOPEN_SOURCE 500
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wchar.h>

int
main (void)
{
  FILE *fp;
  const char *str = "abcdef";
  wint_t ret, wc;
  char fname[] = "/tmp/tst-ungetwc2.out.XXXXXX";
  int fd;
  long int pos;
  int result = 0;

  puts ("This program runs on de_DE.UTF-8 locale.");
  if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL)
    {
      fprintf (stderr, "Err: Cannot run on the de_DE.UTF-8 locale\n");
      exit (EXIT_FAILURE);
    }

  /* Write some characters to `testfile'. */
  fd = mkstemp (fname);
  if (fd == -1)
    {
      printf ("cannot open temp file: %m\n");
      exit (EXIT_FAILURE);
    }
  if ((fp = fdopen (fd, "w")) == NULL)
    {
      fprintf (stderr, "Cannot open 'testfile'.\n");
      exit (EXIT_FAILURE);
    }
  fputs (str, fp);
  fclose (fp);

  /* Open `testfile'. */
  if ((fp = fopen (fname, "r")) == NULL)
    {
      fprintf (stderr, "Cannot open 'testfile'.");
      exit (EXIT_FAILURE);
    }

  /* Get a character. */
  wc = getwc (fp);
  pos = ftell (fp);
  printf ("After get a character: %ld\n", pos);
  if (pos != 1)
    result = 1;

  /* Unget a character. */
  ret = ungetwc (wc, fp);
  if (ret == WEOF)
    {
      fprintf (stderr, "ungetwc() returns NULL.");
      exit (EXIT_FAILURE);
    }
  pos = ftell (fp);
  printf ("After unget a character: %ld\n", pos);
  if (pos != 0)
    result = 1;

  /* Reget a character. */
  wc = getwc (fp);
  pos = ftell (fp);
  printf ("After reget a character: %ld\n", pos);
  if (pos != 1)
    result = 1;

  fclose (fp);

  unlink (fname);

  return result;
}
