/* Copyright (C) 2000-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@gnu.org>, 2000.

   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 <ctype.h>
#include <langinfo.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wchar.h>
#include <wctype.h>
#include <sys/types.h>


#define ZERO  "\xe2\x82\x80"
#define ONE   "\xe2\x82\x81"
#define TWO   "\xe2\x82\x82"
#define THREE "\xe2\x82\x83"
#define FOUR  "\xe2\x82\x84"
#define FIVE  "\xe2\x82\x85"
#define SIX   "\xe2\x82\x86"
#define SEVEN "\xe2\x82\x87"
#define EIGHT "\xe2\x82\x88"
#define NINE  "\xe2\x82\x89"

static struct printf_int_test
{
  int n;
  const char *format;
  const char *expected;
} printf_int_tests[] =
{
  {       0, "%I'10d", "       " ZERO },
  {       1, "%I'10d", "       " ONE },
  {       2, "%I'10d", "       " TWO },
  {       3, "%I'10d", "       " THREE },
  {       4, "%I'10d", "       " FOUR },
  {       5, "%I'10d", "       " FIVE },
  {       6, "%I'10d", "       " SIX },
  {       7, "%I'10d", "       " SEVEN },
  {       8, "%I'10d", "       " EIGHT },
  {       9, "%I'10d", "       " NINE },
  {      11, "%I'10d", "    " ONE ONE },
  {      12, "%I'10d", "    " ONE TWO },
  {     123, "%I10d",  " " ONE TWO THREE },
  {     123, "%I'10d", " " ONE TWO THREE },
  {    1234, "%I10d",  ONE TWO THREE FOUR },
  {    1234, "%I'10d", ONE "," TWO THREE FOUR },
  {   12345, "%I'10d", ONE TWO "," THREE FOUR FIVE },
  {  123456, "%I'10d", ONE TWO THREE "," FOUR FIVE SIX },
  { 1234567, "%I'10d", ONE "," TWO THREE FOUR "," FIVE SIX SEVEN }
};
#define nprintf_int_tests \
  (sizeof (printf_int_tests) / sizeof (printf_int_tests[0]))

#define WZERO  L"\x2080"
#define WONE   L"\x2081"
#define WTWO   L"\x2082"
#define WTHREE L"\x2083"
#define WFOUR  L"\x2084"
#define WFIVE  L"\x2085"
#define WSIX   L"\x2086"
#define WSEVEN L"\x2087"
#define WEIGHT L"\x2088"
#define WNINE  L"\x2089"

static struct wprintf_int_test
{
  int n;
  const wchar_t *format;
  const wchar_t *expected;
} wprintf_int_tests[] =
{
  {       0, L"%I'10d", L"         " WZERO },
  {       1, L"%I'10d", L"         " WONE },
  {       2, L"%I'10d", L"         " WTWO },
  {       3, L"%I'10d", L"         " WTHREE },
  {       4, L"%I'10d", L"         " WFOUR },
  {       5, L"%I'10d", L"         " WFIVE },
  {       6, L"%I'10d", L"         " WSIX },
  {       7, L"%I'10d", L"         " WSEVEN },
  {       8, L"%I'10d", L"         " WEIGHT },
  {       9, L"%I'10d", L"         " WNINE },
  {      11, L"%I'10d", L"        " WONE WONE },
  {      12, L"%I'10d", L"        " WONE WTWO },
  {     123, L"%I10d",  L"       " WONE WTWO WTHREE },
  {     123, L"%I'10d", L"       " WONE WTWO WTHREE },
  {    1234, L"%I10d",  L"      " WONE WTWO WTHREE WFOUR },
  {    1234, L"%I'10d", L"     " WONE L"," WTWO WTHREE WFOUR },
  {   12345, L"%I'10d", L"    " WONE WTWO L"," WTHREE WFOUR WFIVE },
  {  123456, L"%I'10d", L"   " WONE WTWO WTHREE L"," WFOUR WFIVE WSIX },
  { 1234567, L"%I'10d", L" " WONE L"," WTWO WTHREE WFOUR L"," WFIVE WSIX WSEVEN }
};
#define nwprintf_int_tests \
  (sizeof (wprintf_int_tests) / sizeof (wprintf_int_tests[0]))


static int
do_test (void)
{
  int cnt;
  int failures;
  int status;

  if (setlocale (LC_ALL, "test7") == NULL)
    {
      puts ("cannot set locale `test7'");
      exit (1);
    }
  printf ("CODESET = \"%s\"\n", nl_langinfo (CODESET));

  /* First: printf tests.  */
  failures = 0;
  for (cnt = 0; cnt < (int) nprintf_int_tests; ++cnt)
    {
      char buf[100];
      ssize_t n;

      n = snprintf (buf, sizeof buf, printf_int_tests[cnt].format,
		    printf_int_tests[cnt].n);

      printf ("%3d: got \"%s\", expected \"%s\"",
	      cnt, buf, printf_int_tests[cnt].expected);

      if (n != (ssize_t) strlen (printf_int_tests[cnt].expected)
	  || strcmp (buf, printf_int_tests[cnt].expected) != 0)
	{
	  puts ("  -> FAILED");
	  ++failures;
	}
      else
	puts ("  -> OK");
    }

  printf ("%d failures in printf tests\n", failures);
  status = failures != 0;

  /* wprintf tests.  */
  failures = 0;
  for (cnt = 0; cnt < (int) nwprintf_int_tests; ++cnt)
    {
      wchar_t buf[100];
      ssize_t n;

      n = swprintf (buf, sizeof buf / sizeof (buf[0]),
		    wprintf_int_tests[cnt].format,
		    wprintf_int_tests[cnt].n);

      printf ("%3d: got \"%ls\", expected \"%ls\"",
	      cnt, buf, wprintf_int_tests[cnt].expected);

      if (n != (ssize_t) wcslen (wprintf_int_tests[cnt].expected)
	  || wcscmp (buf, wprintf_int_tests[cnt].expected) != 0)
	{
	  puts ("  -> FAILED");
	  ++failures;
	}
      else
	puts ("  -> OK");
    }

  printf ("%d failures in wprintf tests\n", failures);
  status = failures != 0;

  /* ctype tests.  This makes sure that the multibyte character digit
     representations are not handle in this table.  */
  failures = 0;
  for (cnt = 0; cnt < 256; ++cnt)
    if (cnt >= '0' && cnt <= '9')
      {
	if (! isdigit (cnt))
	  {
	    printf ("isdigit ('%c') == 0\n", cnt);
	    ++failures;
	  }
      }
    else
      {
	if (isdigit (cnt))
	  {
	    printf ("isdigit (%d) != 0\n", cnt);
	    ++failures;
	  }
      }

  printf ("%d failures in ctype tests\n", failures);
  status = failures != 0;

  /* wctype tests.  This makes sure the second set of digits is also
     recorded.  */
  failures = 0;
  for (cnt = 0; cnt < 256; ++cnt)
    if (cnt >= '0' && cnt <= '9')
      {
	if (! iswdigit (cnt))
	  {
	    printf ("iswdigit (L'%c') == 0\n", cnt);
	    ++failures;
	  }
      }
    else
      {
	if (iswdigit (cnt))
	  {
	    printf ("iswdigit (%d) != 0\n", cnt);
	    ++failures;
	  }
      }

  for (cnt = 0x2070; cnt < 0x2090; ++cnt)
    if (cnt >= 0x2080 && cnt <= 0x2089)
      {
	if (! iswdigit (cnt))
	  {
	    printf ("iswdigit (U%04X) == 0\n", cnt);
	    ++failures;
	  }
      }
    else
      {
	if (iswdigit (cnt))
	  {
	    printf ("iswdigit (U%04X) != 0\n", cnt);
	    ++failures;
	  }
      }

  printf ("%d failures in wctype tests\n", failures);
  status = failures != 0;

  return status;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
