/*
 *  TEST SUITE FOR MB/WC FUNCTIONS IN C LIBRARY
 *
 *	 FILE:	tst_funcs.h
 *
 *	 Definitions of macros
 */


#ifndef TST_FUNCS_H
#define TST_FUNCS_H

#define C_SUCCESS	   'S'	/* test case test passed		 */
#define C_FAILURE	   'F'	/* test case failed			 */
#define C_IGNORED	   'I'	/* test case/result ignored (not tested) */
#define C_INVALID	   'D'	/* test data may be wrong		 */
#define C_LOCALES	   'L'	/* can't set locale (skip)		 */


extern int result (FILE * fp, char res, const char *func, const char *loc,
		   int rec_no, int seq_num, int case_no, const char *msg);

#define Result(C, S, E, M) \
  result (fp, (C), (S), locale, rec+1, seq_num+1, (E), (M))

#define CASE_0	  0
#define CASE_1	  1
#define CASE_2	  2
#define CASE_3	  3
#define CASE_4	  4
#define CASE_5	  5
#define CASE_6	  6
#define CASE_7	  7
#define CASE_8	  8
#define CASE_9	  9

#define MS_PASSED "PASSED"
#define MS_SPACE  "	 "
#define MS_FAILED "	 "
#define MS_NOTEST "NOTEST"
#define MS_ABORTU "ABEND0"
#define MS_ABORT  "ABEND1"

#define MK_PASSED 0x00
#define MK_SPACE  0x01
#define MK_NOTEST 0x02
#define MK_ABORTU 0x04
#define MK_ABORT  0x08



/* ------------------ COMMON MACROS ------------------ */

#define TST_ABS(x)  (((x) > 0) ? (x) : -(x))

#define TMD_ERRET(_type_)   int	  err_val; \
			    int	  ret_flg; \
			    _type_ ret_val

#define TMD_RECHEAD(_FUNC_)				      \
									 \
			      typedef struct {				 \
				  TIN_##_FUNC_##_REC  input;		 \
				  TEX_##_FUNC_##_REC  expect;		 \
				  int is_last;				 \
			      }	  TST_##_FUNC_##_REC;			 \
			      typedef struct {				 \
				  TST_HEAD	      hd;		 \
				  TST_##_FUNC_##_REC  rec[ MAX_LOC_TEST ]; \
			      }	  TST_##_FUNC_

#define TST_FTYP(func)		tst_##func##_loc
#define TST_HEAD(func)		tst_##func##_loc[ loc ].hd
#define TST_INPUT(func)		tst_##func##_loc[ loc ].rec[ rec ].input
#define TST_EXPECT(func)	tst_##func##_loc[ loc ].rec[ rec ].expect
#define TST_INPUT_SEQ(func) \
	tst_##func##_loc[ loc ].rec[ rec ].input.seq[ seq_num ]
#define TST_EXPECT_SEQ(func) \
	tst_##func##_loc[ loc ].rec[ rec ].expect.seq[ seq_num ]
#define TST_IS_LAST(func) \
	tst_##func##_loc[ loc ].rec[ rec ].is_last


#define TST_DECL_VARS(_type_)				\
	int   loc, rec, err_count = 0;			\
	int   warn_count __attribute__ ((unused));	\
	int   func_id, seq_num = 0;			\
	const char *locale;				\
	int   err_exp, ret_flg;				\
	int errno_save = 0;				\
	_type_ ret_exp;					\
	_type_ ret

#define TST_DO_TEST(o_func) \
	for (loc = 0; strcmp (TST_HEAD (o_func).locale, TST_LOC_end); ++loc)


#define TST_HEAD_LOCALE(ofunc, s_func) \
  func_id = TST_HEAD (ofunc).func_id;					      \
  locale  = TST_HEAD (ofunc).locale;					      \
  if (setlocale (LC_ALL, locale) == NULL)				      \
    {									      \
      fprintf (stderr, "Warning : can't set locale: %s\nskipping ...\n",      \
	       locale);							      \
      result (fp, C_LOCALES, s_func, locale, 0, 0, 0, "can't set locale");    \
      ++err_count;							      \
      continue;								      \
    }

#define TST_DO_REC(ofunc) \
	for (rec=0; !TST_IS_LAST (ofunc); ++rec)

#define TST_DO_SEQ(_count_) \
	for (seq_num=0; seq_num < _count_; seq_num++)

#define TST_GET_ERRET(_ofunc_)			\
	err_exp = TST_EXPECT (_ofunc_).err_val; \
	ret_flg = TST_EXPECT (_ofunc_).ret_flg; \
	ret_exp = TST_EXPECT (_ofunc_).ret_val

#define TST_GET_ERRET_SEQ(_ofunc_)		    \
	err_exp = TST_EXPECT_SEQ (_ofunc_).err_val; \
	ret_flg = TST_EXPECT_SEQ (_ofunc_).ret_flg; \
	ret_exp = TST_EXPECT_SEQ (_ofunc_).ret_val

#define TST_CLEAR_ERRNO \
	errno = 0

#define TST_SAVE_ERRNO \
	errno_save = errno

/* Test value of ret and of errno if it should have a value.  */
#define TST_IF_RETURN(_s_func_) \
  if (err_exp != 0)							      \
    {									      \
      if (errno_save == err_exp)					      \
	{								      \
	  result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 1,	      \
		  MS_PASSED);						      \
	}								      \
      else								      \
	{								      \
	  err_count++;							      \
	  result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 1,	      \
		  "the value of errno is different from an expected value");  \
	}								      \
    }									      \
									      \
  if (ret_flg == 1)							      \
    {									      \
      if (ret == ret_exp)						      \
	{								      \
	  result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 2,	      \
		  MS_PASSED);						      \
	}								      \
      else								      \
	{								      \
	  err_count++;							      \
	  result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 2,	      \
		  "the return value is different from an expected value");    \
	}								      \
    }									      \
  else

#define TEX_ERRET_REC(_type_)			\
	struct {				\
	    TMD_ERRET (_type_);			\
	}

#define TEX_ERRET_REC_SEQ(_type_, _count_)	\
	struct {				\
	    struct {				\
		TMD_ERRET (_type_);		\
	    } seq[ _count_ ];			\
	}



/* ------------------ FUNCTION: ISW*() ------------------- */

#define TST_ISW_STRUCT(_FUNC_, _func_)			\
	typedef						\
	struct {					\
	    wint_t   wc;				\
	} TIN_ISW##_FUNC_##_REC;			\
	typedef						\
	TEX_ERRET_REC (int)   TEX_ISW##_FUNC_##_REC;	\
	TMD_RECHEAD (ISW##_FUNC_)

#define TST_FUNC_ISW(_FUNC_, _func_) \
int									      \
tst_isw##_func_ (FILE *fp, int debug_flg)				      \
{									      \
  TST_DECL_VARS(int);							      \
  wint_t wc;								      \
  TST_DO_TEST (isw##_func_)						      \
    {									      \
      TST_HEAD_LOCALE (isw##_func_, S_ISW##_FUNC_);			      \
      TST_DO_REC(isw##_func_)						      \
	{								      \
	  TST_GET_ERRET (isw##_func_);					      \
	  wc = TST_INPUT (isw##_func_).wc;				      \
	  ret = isw##_func_ (wc);					      \
	  if (debug_flg)						      \
	    {								      \
	      fprintf (stdout, "isw*() [ %s : %d ] ret = %d\n", locale,	      \
		       rec+1, ret);					      \
	    }								      \
									      \
	  TST_IF_RETURN (S_ISW##_FUNC_)					      \
	    {								      \
	      if (ret != 0)						      \
		{							      \
		  result (fp, C_SUCCESS, S_ISW##_FUNC_, locale, rec+1,	      \
			  seq_num+1, 3, MS_PASSED);			      \
		}							      \
	      else							      \
		{							      \
		  err_count++;						      \
		  result (fp, C_FAILURE, S_ISW##_FUNC_, locale, rec+1,	      \
			  seq_num+1, 3,					      \
			  "the function returned 0, but should be non-zero"); \
		}							      \
	    }								      \
	}								      \
    }									      \
									      \
  return err_count;							      \
}



/* ------------------ FUNCTION: TOW*() ------------------ */

#define TST_TOW_STRUCT(_FUNC_, _func_)			\
	typedef						\
	struct {					\
	    wint_t   wc;				\
	} TIN_TOW##_FUNC_##_REC;			\
	typedef						\
	TEX_ERRET_REC (wint_t)	TEX_TOW##_FUNC_##_REC;	\
	TMD_RECHEAD (TOW##_FUNC_)

#define TST_FUNC_TOW(_FUNC_, _func_)					\
int									\
tst_tow##_func_ (FILE *fp, int debug_flg)				\
{									\
  TST_DECL_VARS (wint_t);						\
  wint_t wc;								\
  TST_DO_TEST (tow##_func_)						\
    {									\
      TST_HEAD_LOCALE (tow##_func_, S_TOW##_FUNC_);			\
      TST_DO_REC (tow##_func_)						\
	{								\
	  TST_GET_ERRET (tow##_func_);					\
	  wc = TST_INPUT (tow##_func_).wc;				\
	  ret = tow##_func_ (wc);					\
	  if (debug_flg)						\
	    {								\
	      fprintf (stdout, "tow*() [ %s : %d ] ret = 0x%x\n",	\
		       locale, rec+1, ret);				\
	    }								\
									\
	  TST_IF_RETURN (S_TOW##_FUNC_) { };				\
	}								\
    }									\
									\
  return err_count;							\
}


#endif /* TST_FUNCS_H */
