/*
  SWSCANF: int swscanf (const wchar_t *ws, const wchar_t *fmt, ...);
*/

#define TST_FUNCTION swscanf

#include "tsp_common.c"
#include "dat_swscanf.c"

int
tst_swscanf (FILE * fp, int debug_flg)
{
  TST_DECL_VARS (int);
  wchar_t *ws;
  wchar_t *fmt;
  int val_int1;
  unsigned val_int2;
  float val_flt;
  char val_c;
  char val_s[MBSSIZE * 3];
  wchar_t val_S[WCSSIZE * 3], *exp_S;
  int i;

  TST_DO_TEST (swscanf)
  {
    TST_HEAD_LOCALE (swscanf, S_SWSCANF);
    TST_DO_REC (swscanf)
    {
      TST_GET_ERRET (swscanf);
      ws = TST_INPUT (swscanf).ws;
      fmt = TST_INPUT (swscanf).fmt;
      val_int1 = val_int2 = val_flt = val_c = 0;
      memset (val_s, 0, sizeof (val_s));
      memset (val_S, 0, sizeof (val_S));

      TST_CLEAR_ERRNO;

      if (TST_INPUT (swscanf).wch)
	{
	  ret = swscanf (ws, fmt, val_S);
	}
      else
	{
	  ret =
	    swscanf (ws, fmt, &val_int1, &val_int2, &val_flt, &val_c, val_s);
	}

      TST_SAVE_ERRNO;

      if (debug_flg)
	{			/* seems fprintf doesn't update errno */
	  fprintf (stdout, "swscanf() [ %s : %d ] ret = %d\n", locale,
		   rec + 1, ret);
	  fprintf (stdout, "			    errno   = %d\n",
		   errno_save);
	  fprintf (stdout, "			    collate = %s\n",
		   (setlocale (LC_COLLATE, NULL)) ? setlocale (LC_COLLATE,
							       NULL) : "");

	  if (TST_INPUT (swscanf).wch)
	    {
	      fprintf (stdout, "			val_S[ 0 ] = 0x%lx\n",
		       (unsigned long int) val_S[0]);
	    }
	  else
	    {
	      fprintf (stdout, "			val_int1   = %d\n",
		       val_int1);
	      fprintf (stdout, "			val_int2   = %d\n",
		       val_int2);
	      fprintf (stdout, "			val_flt	   = %f\n",
		       val_flt);
	      fprintf (stdout, "			val_c	   = %c\n",
		       val_c);
	      fprintf (stdout, "			val_s	   = %s\n",
		       val_s);
	    }
	}

      TST_IF_RETURN (S_SWSCANF)
      {
      };

      if (errno == 0 && TST_INPUT (swscanf).wch)
	{
	  for (exp_S = TST_EXPECT (swscanf).val_S, i = 0; i < WCSSIZE * 3;
	       i++)
	    {
	      if (val_S[i] == L'\0' || exp_S[i] == L'\0')
		{
		  if (val_S[i] != exp_S[i] && TST_INPUT (swscanf).wch == 'C')
		    {
		      err_count++;
		      Result (C_FAILURE, S_SWSCANF, CASE_4,
			      "the converted wide-char string is different"
			      " from an expected value.");
		    }
		  break;
		}

	      if (val_S[i] != exp_S[i])
		{
		  err_count++;
		  Result (C_FAILURE, S_SWSCANF, CASE_4,
			  "the converted wide-char string is different from"
			  " an expected value.");
		  break;
		}
	      else
		{
		  Result (C_SUCCESS, S_SWSCANF, CASE_4, MS_PASSED);
		}
	    }
	}

      if (errno == 0 && !TST_INPUT (swscanf).wch)
	{
	  if (val_int1 != TST_EXPECT (swscanf).val_int ||
	      val_int2 != TST_EXPECT (swscanf).val_uns ||
	      val_flt != TST_EXPECT (swscanf).val_flt ||
	      val_c != TST_EXPECT (swscanf).val_c ||
	      strcmp (val_s, TST_EXPECT (swscanf).val_s))
	    {
	      err_count++;
	      Result (C_FAILURE, S_SWSCANF, CASE_3,
		      "the converted values are different from expected values.");
	    }
	  else
	    {
	      Result (C_SUCCESS, S_SWSCANF, CASE_3, MS_PASSED);
	    }
	}
    }
  }

  return err_count;
}
