/* Contributed by Owen Taylor <otaylor@redhat.com>.  */

#include <iconv.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>

#define BUFSIZE 10000

int
main (int argc, char *argv[])
{
  char inbuf[BUFSIZE];
  wchar_t outbuf[BUFSIZE];

  iconv_t cd;
  int i;
  char *inptr;
  char *outptr;
  size_t inbytes_left, outbytes_left;
  int count;
  int result = 0;

  for (i=0; i < BUFSIZE; i++)
    inbuf[i] = 'a';

  cd = iconv_open ("UCS-4LE", "UTF-8");

  inbytes_left = BUFSIZE;
  outbytes_left = BUFSIZE * 4;
  inptr = inbuf;
  outptr = (char *) outbuf;

  count = iconv (cd, &inptr, &inbytes_left, &outptr, &outbytes_left);

  if (count < 0)
    {
      if (errno == E2BIG)
	printf ("Received E2BIG\n");
      else
	printf ("Received something else\n");

      printf ("inptr change: %td\n", inptr - inbuf);
      printf ("inlen change: %zd\n", BUFSIZE - inbytes_left);
      printf ("outptr change: %td\n", outptr - (char *) outbuf);
      printf ("outlen change: %zd\n", BUFSIZE * 4 - outbytes_left);
      result = 1;
    }
  else
    printf ("Succeeded\n");

  return result;
}
