/* Copyright (C) 2000-2014 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]))


int
main (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;
}
