/* Verify that ftell does not go into an infinite loop when a conversion fails
   due to insufficient space in the buffer.
   Copyright (C) 2014-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <wchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <errno.h>
#include <unistd.h>

static int do_test (void);
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"

/* Arbitrary number large enough so that the target buffer during conversion is
   not large enough.  */
#define STRING_SIZE (1400)
#define NSTRINGS (2)

static int
do_test (void)
{
  FILE *fp = NULL;
  wchar_t *inputs[NSTRINGS] = {NULL};
  int ret = 1;

  if (setlocale (LC_ALL, "en_US.UTF-8") == NULL)
    {
      printf ("Cannot set en_US.UTF-8 locale.\n");
      goto out;
    }


  /* Generate input from one character, chosen because it has an odd number of
     bytes in UTF-8, making it easier to reproduce the problem:

     NAME    Hiragana letter GO
     CHAR    ご
     UTF-8   E38194
     UCS     3054
     MARC-8  692434  */
  wchar_t seed = L'ご';
  for (int i = 0; i < NSTRINGS; i++)
    {
      inputs[i] = malloc (STRING_SIZE * sizeof (wchar_t));
      if (inputs[i] == NULL)
	{
	  printf ("Failed to allocate memory for inputs: %m\n");
	  goto out;
	}
      wmemset (inputs[i], seed, STRING_SIZE - 1);
      inputs[i][STRING_SIZE - 1] = L'\0';
    }

  char *filename;
  int fd = create_temp_file ("tst-fseek-wide-partial.out", &filename);

  if (fd == -1)
    {
      printf ("create_temp_file: %m\n");
      goto out;
    }

  fp = fdopen (fd, "w+");
  if (fp == NULL)
    {
      printf ("fopen: %m\n");
      close (fd);
      goto out;
    }

  for (int i = 0; i < NSTRINGS; i++)
    {
      printf ("offset: %ld\n", ftell (fp));
      if (fputws (inputs[i], fp) == -1)
	{
	  perror ("fputws");
	  goto out;
	}
    }
  ret = 0;

out:
  if (fp != NULL)
    fclose (fp);
  for (int i = 0; i < NSTRINGS; i++)
    free (inputs[i]);

  return ret;
}
