#include <assert.h>
#include <mcheck.h>
#include <nl_types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/resource.h>


static const char *msgs[] =
{
#define INPUT(str)
#define OUTPUT(str) str,
#include <intl/msgs.h>
};
#define nmsgs (sizeof (msgs) / sizeof (msgs[0]))


/* Test for unbounded alloca.  */
static int
do_bz17905 (void)
{
  char *buf;
  struct rlimit rl;
  nl_catd result;

  const int sz = 1024 * 1024;

  getrlimit (RLIMIT_STACK, &rl);
  rl.rlim_cur = sz;
  setrlimit (RLIMIT_STACK, &rl);

  buf = malloc (sz + 1); 
  memset (buf, 'A', sz);
  buf[sz] = '\0';
  setenv ("NLSPATH", buf, 1);

  result = catopen (buf, NL_CAT_LOCALE);
  assert (result == (nl_catd) -1);

  free (buf);
  return 0;
}

#define ROUNDS 5

int
main (void)
{
  int rnd;
  int result = 0;

  mtrace ();

  /* We do this a few times to stress the memory handling.  */
  for (rnd = 0; rnd < ROUNDS; ++rnd)
    {
      nl_catd cd = catopen ("libc", 0);
      size_t cnt;

      if (cd == (nl_catd) -1)
	{
	  printf ("cannot load catalog: %m\n");
	  result = 1;
	  break;
	}

      /* Go through all the messages and compare the result.  */
      for (cnt = 0; cnt < nmsgs; ++cnt)
	{
	  char *trans;

	  trans = catgets (cd, 1, 1 + cnt,
			   "+#+# if this comes backs it's an error");

	  if (trans == NULL)
	    {
	      printf ("catgets return NULL for %zd\n", cnt);
	      result = 1;
	    }
	  else if (strcmp (trans, msgs[cnt]) != 0 && msgs[cnt][0] != '\0')
	    {
	      printf ("expected \"%s\", got \"%s\"\n", msgs[cnt], trans);
	      result = 1;
	    }
	}

      if (catclose (cd) != 0)
	{
	  printf ("catclose failed: %m\n");
	  result = 1;
	}
    }

  result += do_bz17905 ();
  return result;
}
