/*
 *  TEST SUITE FOR MB/WC FUNCTIONS IN C LIBRARY
 *
 *	 FILE:	dat_iswxdigit.c
 *
 *	 ISW*:	int iswxdigit (wint_t wc);
 */


#include "dat_isw-funcs.h"


TST_ISW_LOC (XDIGIT, xdigit) = {

  {   TST_ISW_REC (de, xdigit)
      {
	{  { 0x0080 }, { 0,1,0 }  },	/* CTRL	    */
	{  { 0x009F }, { 0,1,0 }  },	/* CTRL	    */
	{  { 0x00A0 }, { 0,1,0 }  },	/* NB SPACE */
	{  { 0x00A1 }, { 0,1,0 }  },	/* UD !	    */
	{  { 0x00B0 }, { 0,1,0 }  },	/* Degree   */
	{  { 0x00B1 }, { 0,1,0 }  },	/* +- sign  */
	{  { 0x00B2 }, { 0,1,0 }  },	/* SUP 2    */
	{  { 0x00B3 }, { 0,1,0 }  },	/* SUP 3    */
	{  { 0x00B4 }, { 0,1,0 }  },	/* ACUTE    */
	{  { 0x00B8 }, { 0,1,0 }  },	/* CEDILLA  */
	{  { 0x00B9 }, { 0,1,0 }  },	/* SUP 1    */
	{  { 0x00BB }, { 0,1,0 }  },	/* >>	    */
	{  { 0x00BC }, { 0,1,0 }  },	/* 1/4	    */
	{  { 0x00BD }, { 0,1,0 }  },	/* 1/2	    */
	{  { 0x00BE }, { 0,1,0 }  },	/* 3/4	    */
	{  { 0x00BF }, { 0,1,0 }  },	/* UD ?	    */
	{  { 0x00C0 }, { 0,1,0 }  },	/* A Grave  */
	{  { 0x00D6 }, { 0,1,0 }  },	/* O dia    */
	{  { 0x00D7 }, { 0,1,0 }  },	/* multipl. */
	{  { 0x00D8 }, { 0,1,0 }  },	/* O stroke */
	{  { 0x00DF }, { 0,1,0 }  },	/* small Sh */
	{  { 0x00E0 }, { 0,1,0 }  },	/* a grave  */
	{  { 0x00F6 }, { 0,1,0 }  },	/* o dia    */
	{  { 0x00F7 }, { 0,1,0 }  },	/* division */
	{  { 0x00F8 }, { 0,1,0 }  },	/* o stroke */
	{  { 0x00FF }, { 0,1,0 }  },	/* y dia    */
	{ .is_last = 1 }		/* Last element.  */
      }
  },
  {   TST_ISW_REC( enUS, xdigit )
      {
	{  { WEOF   }, { 0,1,0 }  },
	{  { 0x0000 }, { 0,1,0 }  },
	{  { 0x001F }, { 0,1,0 }  },
	{  { 0x0020 }, { 0,1,0 }  },
	{  { 0x0021 }, { 0,1,0 }  },
	{  { 0x002F }, { 0,1,0 }  },
	{  { 0x0030 }, { 0,0,0 }  },
	{  { 0x0039 }, { 0,0,0 }  },
	{  { 0x003A }, { 0,1,0 }  },
	{  { 0x0040 }, { 0,1,0 }  },
	{  { 0x0041 }, { 0,0,0 }  },
	{  { 0x005A }, { 0,1,0 }  },
	{  { 0x005B }, { 0,1,0 }  },
	{  { 0x0060 }, { 0,1,0 }  },
	{  { 0x0061 }, { 0,0,0 }  },
	{  { 0x007A }, { 0,1,0 }  },
	{  { 0x007B }, { 0,1,0 }  },
	{  { 0x007E }, { 0,1,0 }  },
	{  { 0x007F }, { 0,1,0 }  },
	{  { 0x0080 }, { 0,1,0 }  },
	{ .is_last = 1 }		/* Last element.  */
      }
  },
  {   TST_ISW_REC( eucJP, xdigit )
      {
	{  { 0x3000 }, { 0,1,0 }  },	/* IDEO. SPACE	      */
	{  { 0x3020 }, { 0,1,0 }  },	/* POSTAL MARK FACE   */
	{  { 0x3029 }, { 0,1,0 }  },	/* Hangzhou NUM9      */
	{  { 0x302F }, { 0,1,0 }  },	/* Diacritics(Hangul) */
	{  { 0x3037 }, { 0,1,0 }  },	/* Separator Symbol   */
	{  { 0x303F }, { 0,1,0 }  },	/* IDEO. HALF SPACE   */
	{  { 0x3041 }, { 0,1,0 }  },	/* HIRAGANA a	      */
	{  { 0x3094 }, { 0,1,0 }  },	/* HIRAGANA u"	      */
	{  { 0x3099 }, { 0,1,0 }  },	/* SOUND MARK	      */
	{  { 0x309E }, { 0,1,0 }  },	/* ITERATION MARK     */
	{  { 0x30A1 }, { 0,1,0 }  },	/* KATAKANA a	      */
	{  { 0x30FA }, { 0,1,0 }  },	/* KATAKANA wo"	      */
	{  { 0x30FB }, { 0,1,0 }  },	/* KATAKANA MID.DOT   */
	{  { 0x30FE }, { 0,1,0 }  },	/* KATAKANA ITERATION */
	{  { 0x3191 }, { 0,1,0 }  },	/* KANBUN REV.MARK    */
	{  { 0x3243 }, { 0,1,0 }  },	/* IDEO. MARK (reach) */
	{  { 0x32CB }, { 0,1,0 }  },	/* IDEO.TEL.SYM.DEC12 */
	{  { 0x32FE }, { 0,1,0 }  },	/* MARU KATAKANA wo   */
	{  { 0x33FE }, { 0,1,0 }  },	/* CJK IDEO.TEL.31th  */
	{  { 0x4E00 }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0x4E05 }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0x4E06 }, { 0,1,0 }  },	/* CJK UNI.IDEO.NON-J */
	{  { 0x4E07 }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0x4FFF }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0x9000 }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0x9006 }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0x9007 }, { 0,1,0 }  },	/* CJK UNI.IDEO.NON-J */
	{  { 0x9FA4 }, { 0,1,0 }  },	/* CJK UNI.IDEO.NON-J */
	{  { 0x9FA5 }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0xFE4F }, { 0,1,0 }  },	/* CJK UNI.IDEO.      */
	{  { 0xFF0F }, { 0,1,0 }  },	/* FULL SLASH	      */
	{  { 0xFF19 }, { 0,1,0 }  },	/* FULL 9	      */
	{  { 0xFF20 }, { 0,1,0 }  },	/* FULL @	      */
	{  { 0xFF3A }, { 0,1,0 }  },	/* FULL Z	      */
	{  { 0xFF40 }, { 0,1,0 }  },	/* FULL GRAVE ACC.    */
	{  { 0xFF5A }, { 0,1,0 }  },	/* FULL z	      */
	{  { 0xFF5E }, { 0,1,0 }  },	/* FULL ~ (tilde)     */
	{  { 0xFF61 }, { 0,1,0 }  },	/* HALF IDEO.STOP. .  */
	{  { 0xFF65 }, { 0,1,0 }  },	/* HALF KATA MID.DOT  */
	{  { 0xFF66 }, { 0,1,0 }  },	/* HALF KATA WO	      */
	{  { 0xFF6F }, { 0,1,0 }  },	/* HALF KATA tu	      */
	{  { 0xFF70 }, { 0,1,0 }  },	/* HALF KATA PL -     */
	{  { 0xFF71 }, { 0,1,0 }  },	/* HALF KATA A	      */
	{  { 0xFF9E }, { 0,1,0 }  },	/* HALF KATA MI	      */
	{ .is_last = 1 }		/* Last element.  */
      }
  },
  {   TST_ISW_REC (end, xdigit) }
};
