/* Based on a test program by Won Kyu Park <wkpark@chem.skku.ac.kr>.  */

#include <wchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wctype.h>
#include <locale.h>

int
main (void)
{
  int test = 0;
  int idx = 0;
  char buf[100], *pchar;
  wchar_t tmp[10];
  wchar_t tmp1[] = { L'W', L'o', L'r', L'l', L'd', L'\0' };
  char str[] = "Hello";
  int result = 0;

  pchar = setlocale (LC_ALL, "");
  printf ("locale : %s\n",pchar);
  printf ("MB_CUR_MAX %Zd\n", MB_CUR_MAX);

  puts ("---- test 1 ------");
  test = mbstowcs (tmp, str, (strlen (str) + 1) * sizeof (char));
  printf ("size of string by mbstowcs %d\n", test);
  if (test != strlen (str))
    result = 1;
  idx += wctomb (&buf[0], tmp[0]);
  idx += wctomb (&buf[idx], tmp[1]);
  buf[idx] = 0;
  printf ("orig string %s\n", str);
  printf ("string by wctomb %s\n", buf);
  printf ("string by %%C %C", (wint_t) tmp[0]);
  if (tmp[0] != L'H')
    result = 1;
  printf ("%C\n", (wint_t) tmp[1]);
  if (tmp[1] != L'e')
    result = 1;
  printf ("string by %%S %S\n", tmp);
  if (wcscmp (tmp, L"Hello") != 0)
    result = 1;
  puts ("---- test 2 ------");
  printf ("wchar string %S\n", tmp1);
  printf ("wchar %C\n", (wint_t) tmp1[0]);
  test = wcstombs (buf, tmp1, (wcslen (tmp1) + 1) * sizeof (wchar_t));
  printf ("size of string by wcstombs %d\n", test);
  if (test != wcslen (tmp1))
    result = 1;
  test = wcslen (tmp1);
  printf ("size of string by wcslen %d\n", test);
  printf ("char %s\n", buf);
  if (strcmp (buf, "World") != 0)
    result = 1;
  puts ("------------------");

  return result;
}
