/*
  MBRTOWC: size_t mbrtowc (wchar_t *pwc, const char *s, size_t n,
			   mbstate_t *ps)
*/

#define TST_FUNCTION mbrtowc

#include "tsp_common.c"
#include "dat_mbrtowc.c"


int
tst_mbrtowc (FILE * fp, int debug_flg)
{
  TST_DECL_VARS (size_t);
  char w_flg, s_flg;
  char *s;
  size_t n;
  char t_flg;
  static mbstate_t t = { 0 };
  mbstate_t *pt;
  wchar_t wc, *pwc, wc_ex;

  TST_DO_TEST (mbrtowc)
  {
    TST_HEAD_LOCALE (mbrtowc, S_MBRTOWC);
    TST_DO_REC (mbrtowc)
    {
      if (mbrtowc (NULL, "", 0, &t) != 0)
	{
	  err_count++;
	  Result (C_FAILURE, S_MBRTOWC, CASE_3,
		  "Initialization failed - skipping this test case.");
	  continue;
	}

      TST_DO_SEQ (MBRTOWC_SEQNUM)
      {
	TST_GET_ERRET_SEQ (mbrtowc);
	w_flg = TST_INPUT_SEQ (mbrtowc).w_flg;
	s_flg = TST_INPUT_SEQ (mbrtowc).s_flg;
	s = TST_INPUT_SEQ (mbrtowc).s;
	n = TST_INPUT_SEQ (mbrtowc).n;
	t_flg = TST_INPUT_SEQ (mbrtowc).t_flg;
	pwc = (w_flg == 0) ? NULL : &wc;

	if (s_flg == 0)
	  {
	    s = NULL;
	  }

	if (n == USE_MBCURMAX)
	  {
	    n = MB_CUR_MAX;
	  }

	pt = (t_flg == 0) ? NULL : &t;

	TST_CLEAR_ERRNO;
	ret = mbrtowc (pwc, s, n, pt);
	TST_SAVE_ERRNO;

	if (debug_flg)
	  {
	    fprintf (stdout, "mbrtowc() [ %s : %d : %d ] ret = %zd\n",
		     locale, rec + 1, seq_num + 1, ret);
	    fprintf (stdout, "			    errno = %hd\n",
		     errno_save);
	  }

	TST_IF_RETURN (S_MBRTOWC)
	{
	};

	if (pwc == NULL || s == NULL || ret == (size_t) - 1
	    || ret == (size_t) - 2)
	  {
	    continue;
	  }

	wc_ex = TST_EXPECT_SEQ (mbrtowc).wc;
	if (wc_ex == wc)
	  {
	    Result (C_SUCCESS, S_MBRTOWC, CASE_4, MS_PASSED);
	  }
	else
	  {
	    err_count++;
	    Result (C_FAILURE, S_MBRTOWC, CASE_4,
		    "converted wc is different from an expected wc");
	  }
      }
    }
  }

  return err_count;
}
