//+---------------------------------------------------------------------------
//
//
//  Lextable.hpp
//
//  History:
//      created 7/99 aarayas
//
//  1999 Microsoft Corporation
//----------------------------------------------------------------------------
#ifndef _LEXTABLE_HPP_
#define _LEXTABLE_HPP_
#include <windows.h>

/*************************************************
    Lexical Table definition
*************************************************/
#define Lex_UpperFlag             0x01         /* upper case */
#define Lex_LowerFlag             0x02         /* lower case */
#define Lex_DigitFlag             0x04         /* decimal digits */
#define Lex_SpaceFlag             0x08         /* spacing characters */
#define Lex_PunctFlag             0x10         /* punctuation characters */
#define Lex_ControlFlag             0x20         /* control characters */
#define Lex_LexiconFlag 0x40
#define Lex_VowelFlag 0x80
#define NTRANSTAB 256

#define INUPPERPAGES(ch) (ch & 0xff00)  // this is the same as ch > 0x00ff

/*************************************************
    Lexical Table
*************************************************/
const BYTE rgFlags[NTRANSTAB] =
{
	0x00, // 00        
	0x20, // 01        
	0x20, // 02        
	0x20, // 03        
	0x20, // 04        
	0x20, // 05        
	0x20, // 06        
	0x20, // 07        
	0x20, // 08        
	0x28, // 09    X   
	0x28, // 0a    X   
	0x28, // 0b    X   
	0x28, // 0c    X   
	0x28, // 0d    X   
	0x20, // 0e        
	0x20, // 0f        
	0x20, // 10        
	0x20, // 11        
	0x20, // 12        
	0x20, // 13        
	0x20, // 14        
	0x20, // 15        
	0x20, // 16        
	0x20, // 17        
	0x20, // 18        
	0x20, // 19        
	0x20, // 1a        
	0x20, // 1b        
	0x20, // 1c        
	0x20, // 1d        
	0x20, // 1e        
	0x20, // 1f        
	0x08, // 20    X   
	0x10, // 21     P   (!)
	0x10, // 22     P   (")
	0x10, // 23     P   (#)
	0x10, // 24     P   ($)
	0x10, // 25     P   (%)
	0x10, // 26     P   (&)
	0x50, // 27     PE  (')
	0x10, // 28     P   (()
	0x10, // 29     P   ())
	0x10, // 2a     P   (*)
	0x10, // 2b     P   (+)
	0x10, // 2c     P   (,)
	0x50, // 2d     PE  (-)
	0x50, // 2e     PE  (.)
	0x50, // 2f     PE  (/)
	0x44, // 30   D  E  (0)
	0x44, // 31   D  E  (1)
	0x44, // 32   D  E  (2)
	0x44, // 33   D  E  (3)
	0x44, // 34   D  E  (4)
	0x44, // 35   D  E  (5)
	0x44, // 36   D  E  (6)
	0x44, // 37   D  E  (7)
	0x44, // 38   D  E  (8)
	0x44, // 39   D  E  (9)
	0x10, // 3a     P   (:)
	0x10, // 3b     P   (;)
	0x10, // 3c     P   (<)
	0x10, // 3d     P   (=)
	0x10, // 3e     P   (>)
	0x10, // 3f     P   (?)
	0x10, // 40     P   (@)
	0xc1, // 41 U    EV (A)
	0x41, // 42 U    E  (B)
	0x41, // 43 U    E  (C)
	0x41, // 44 U    E  (D)
	0xc1, // 45 U    EV (E)
	0x41, // 46 U    E  (F)
	0x41, // 47 U    E  (G)
	0x41, // 48 U    E  (H)
	0xc1, // 49 U    EV (I)
	0x41, // 4a U    E  (J)
	0x41, // 4b U    E  (K)
	0x41, // 4c U    E  (L)
	0x41, // 4d U    E  (M)
	0x41, // 4e U    E  (N)
	0xc1, // 4f U    EV (O)
	0x41, // 50 U    E  (P)
	0x41, // 51 U    E  (Q)
	0x41, // 52 U    E  (R)
	0x41, // 53 U    E  (S)
	0x41, // 54 U    E  (T)
	0xc1, // 55 U    EV (U)
	0x41, // 56 U    E  (V)
	0x41, // 57 U    E  (W)
	0x41, // 58 U    E  (X)
	0x41, // 59 U    E  (Y)
	0x41, // 5a U    E  (Z)
	0x10, // 5b     P   ([)
	0x10, // 5c     P   (\)
	0x10, // 5d     P   (])
	0x10, // 5e     P   (^)
	0x10, // 5f     P   (_)
	0x10, // 60     P   (`)
	0xc2, // 61  L   EV (a)
	0x42, // 62  L   E  (b)
	0x42, // 63  L   E  (c)
	0x42, // 64  L   E  (d)
	0xc2, // 65  L   EV (e)
	0x42, // 66  L   E  (f)
	0x42, // 67  L   E  (g)
	0x42, // 68  L   E  (h)
	0xc2, // 69  L   EV (i)
	0x42, // 6a  L   E  (j)
	0x42, // 6b  L   E  (k)
	0x42, // 6c  L   E  (l)
	0x42, // 6d  L   E  (m)
	0x42, // 6e  L   E  (n)
	0xc2, // 6f  L   EV (o)
	0x42, // 70  L   E  (p)
	0x42, // 71  L   E  (q)
	0x42, // 72  L   E  (r)
	0x42, // 73  L   E  (s)
	0x42, // 74  L   E  (t)
	0xc2, // 75  L   EV (u)
	0x42, // 76  L   E  (v)
	0x42, // 77  L   E  (w)
	0x42, // 78  L   E  (x)
	0x42, // 79  L   E  (y)
	0x42, // 7a  L   E  (z)
	0x10, // 7b     P   ({)
	0x10, // 7c     P   (|)
	0x10, // 7d     P   (})
	0x10, // 7e     P   (~)
	0x20, // 7f         ()
	0x10, // 80     P   ()
	0x20, // 81         ()
	0x20, // 82         ()
	0x20, // 83         ()
	0x20, // 84         ()
	0x20, // 85         ()
	0x20, // 86         ()
	0x20, // 87         ()
	0x20, // 88         ()
	0x20, // 89         ()
	0x20, // 8a         ()
	0x20, // 8b         ()
	0x20, // 8c         ()
	0x20, // 8d         ()
	0x20, // 8e         ()
	0x20, // 8f         ()
	0x20, // 90         ()
	0x20, // 91         ()
	0x20, // 92         ()
	0x20, // 93         ()
	0x20, // 94         ()
	0x20, // 95         ()
	0x20, // 96         ()
	0x20, // 97         ()
	0x20, // 98         ()
	0x20, // 99         ()
	0x20, // 9a         ()
	0x20, // 9b         ()
	0x20, // 9c         ()
	0x20, // 9d         ()
	0x20, // 9e         ()
	0x20, // 9f         ()
	0x08, // a0    X    ()
	0x10, // a1     P   ()
	0x10, // a2     P   ()
	0x10, // a3     P   ()
	0x10, // a4     P   ()
	0x10, // a5     P   ()
	0x10, // a6     P   ()
	0x10, // a7     P   ()
	0x10, // a8     P   ()
	0x10, // a9     P   ()
	0x10, // aa     P   ()
	0x10, // ab     P   ()
	0x10, // ac     P   ()
	0x10, // ad     P   ()
	0x10, // ae     P   ()
	0x10, // af     P   ()
	0x10, // b0     P   ()
	0x10, // b1     P   ()
	0x54, // b2   D PE  ()
	0x54, // b3   D PE  ()
	0x10, // b4     P   ()
	0x10, // b5     P   ()
	0x10, // b6     P   ()
	0x10, // b7     P   ()
	0x10, // b8     P   ()
	0x54, // b9   D PE  ()
	0x10, // ba     P   ()
	0x10, // bb     P   ()
	0x54, // bc   D PE  ()
	0x54, // bd   D PE  ()
	0x54, // be   D PE  ()
	0x10, // bf     P   ()
	0xc1, // c0 U    EV ()
	0xc1, // c1 U    EV ()
	0xc1, // c2 U    EV ()
	0xc1, // c3 U    EV ()
	0xc1, // c4 U    EV ()
	0xc1, // c5 U    EV ()
	0x41, // c6 U    E  ()
	0x41, // c7 U    E  ()
	0xc1, // c8 U    EV ()
	0xc1, // c9 U    EV ()
	0xc1, // ca U    EV ()
	0xc1, // cb U    EV ()
	0xc1, // cc U    EV ()
	0xc1, // cd U    EV ()
	0xc1, // ce U    EV ()
	0xc1, // cf U    EV ()
	0x41, // d0 U    E  ()
	0x41, // d1 U    E  ()
	0xc1, // d2 U    EV ()
	0xc1, // d3 U    EV ()
	0xc1, // d4 U    EV ()
	0xc1, // d5 U    EV ()
	0xc1, // d6 U    EV ()
	0x10, // d7     P   ()
	0xc1, // d8 U    EV ()
	0xc1, // d9 U    EV ()
	0xc1, // da U    EV ()
	0xc1, // db U    EV ()
	0xc1, // dc U    EV ()
	0x41, // dd U    E  ()
	0x41, // de U    E  ()
	0x42, // df  L   E  ()
	0xc2, // e0  L   EV ()
	0xc2, // e1  L   EV ()
	0xc2, // e2  L   EV ()
	0xc2, // e3  L   EV ()
	0xc2, // e4  L   EV ()
	0xc2, // e5  L   EV ()
	0x42, // e6  L   E  ()
	0x42, // e7  L   E  ()
	0xc2, // e8  L   EV ()
	0xc2, // e9  L   EV ()
	0xc2, // ea  L   EV ()
	0xc2, // eb  L   EV ()
	0xc2, // ec  L   EV ()
	0xc2, // ed  L   EV ()
	0xc2, // ee  L   EV ()
	0xc2, // ef  L   EV ()
	0x42, // f0  L   E  ()
	0x42, // f1  L   E  ()
	0xc2, // f2  L   EV ()
	0xc2, // f3  L   EV ()
	0xc2, // f4  L   EV ()
	0xc2, // f5  L   EV ()
	0xc2, // f6  L   EV ()
	0x10, // f7     P   ()
	0xc2, // f8  L   EV ()
	0xc2, // f9  L   EV ()
	0xc2, // fa  L   EV ()
	0xc2, // fb  L   EV ()
	0xc2, // fc  L   EV ()
	0x42, // fd  L   E  ()
	0x42, // fe  L   E  ()
	0x42, // ff  L   E  ()
};

const BYTE rgPunctFlags[NTRANSTAB] =
{
	0x00, // 00     
	0x00, // 01     
	0x00, // 02     
	0x00, // 03     
	0x00, // 04     
	0x00, // 05     
	0x00, // 06     
	0x00, // 07     
	0x00, // 08     
	0x08, // 09    W
	0x08, // 0a    W
	0x08, // 0b    W
	0x08, // 0c    W
	0x08, // 0d    W
	0x00, // 0e     
	0x00, // 0f     
	0x00, // 10     
	0x00, // 11     
	0x00, // 12     
	0x00, // 13     
	0x00, // 14     
	0x00, // 15     
	0x00, // 16     
	0x00, // 17     
	0x00, // 18     
	0x00, // 19     
	0x00, // 1a     
	0x00, // 1b     
	0x00, // 1c     
	0x00, // 1d     
	0x00, // 1e     
	0x00, // 1f     
	0x08, // 20    W
	0x04, // 21   T  (!)
	0x05, // 22 L T  (")
	0x01, // 23 L    (#)
	0x01, // 24 L    ($)
	0x04, // 25   T  (%)
	0x00, // 26      (&)
	0x05, // 27 L T  (')
	0x01, // 28 L    (()
	0x04, // 29   T  ())
	0x08, // 2a    W (*)
	0x00, // 2b      (+)
	0x04, // 2c   T  (,)
	0x02, // 2d  J   (-)
	0x04, // 2e   T  (.)
	0x02, // 2f  J   (/)
	0x00, // 30      (0)
	0x00, // 31      (1)
	0x00, // 32      (2)
	0x00, // 33      (3)
	0x00, // 34      (4)
	0x00, // 35      (5)
	0x00, // 36      (6)
	0x00, // 37      (7)
	0x00, // 38      (8)
	0x00, // 39      (9)
	0x04, // 3a   T  (:)
	0x04, // 3b   T  (;)
	0x09, // 3c L  W (<)
	0x08, // 3d    W (=)
	0x0c, // 3e   TW (>)
	0x04, // 3f   T  (?)
	0x02, // 40  J   (@)
	0x00, // 41      (A)
	0x00, // 42      (B)
	0x00, // 43      (C)
	0x00, // 44      (D)
	0x00, // 45      (E)
	0x00, // 46      (F)
	0x00, // 47      (G)
	0x00, // 48      (H)
	0x00, // 49      (I)
	0x00, // 4a      (J)
	0x00, // 4b      (K)
	0x00, // 4c      (L)
	0x00, // 4d      (M)
	0x00, // 4e      (N)
	0x00, // 4f      (O)
	0x00, // 50      (P)
	0x00, // 51      (Q)
	0x00, // 52      (R)
	0x00, // 53      (S)
	0x00, // 54      (T)
	0x00, // 55      (U)
	0x00, // 56      (V)
	0x00, // 57      (W)
	0x00, // 58      (X)
	0x00, // 59      (Y)
	0x00, // 5a      (Z)
	0x01, // 5b L    ([)
	0x02, // 5c  J   (\)
	0x04, // 5d   T  (])
	0x00, // 5e      (^)
	0x00, // 5f      (_)
	0x00, // 60      (`)
	0x00, // 61      (a)
	0x00, // 62      (b)
	0x00, // 63      (c)
	0x00, // 64      (d)
	0x00, // 65      (e)
	0x00, // 66      (f)
	0x00, // 67      (g)
	0x00, // 68      (h)
	0x00, // 69      (i)
	0x00, // 6a      (j)
	0x00, // 6b      (k)
	0x00, // 6c      (l)
	0x00, // 6d      (m)
	0x00, // 6e      (n)
	0x00, // 6f      (o)
	0x00, // 70      (p)
	0x00, // 71      (q)
	0x00, // 72      (r)
	0x00, // 73      (s)
	0x00, // 74      (t)
	0x00, // 75      (u)
	0x00, // 76      (v)
	0x00, // 77      (w)
	0x00, // 78      (x)
	0x00, // 79      (y)
	0x00, // 7a      (z)
	0x01, // 7b L    ({)
	0x00, // 7c      (|)
	0x04, // 7d   T  (})
	0x00, // 7e      (~)
	0x00, // 7f      ()
	0x01, // 80 L    ()
	0x00, // 81      ()
	0x00, // 82      ()
	0x00, // 83      ()
	0x00, // 84      ()
	0x00, // 85      ()
	0x00, // 86      ()
	0x00, // 87      ()
	0x00, // 88      ()
	0x00, // 89      ()
	0x00, // 8a      ()
	0x00, // 8b      ()
	0x00, // 8c      ()
	0x00, // 8d      ()
	0x00, // 8e      ()
	0x00, // 8f      ()
	0x00, // 90      ()
	0x00, // 91      ()
	0x00, // 92      ()
	0x00, // 93      ()
	0x00, // 94      ()
	0x00, // 95      ()
	0x00, // 96      ()
	0x00, // 97      ()
	0x00, // 98      ()
	0x00, // 99      ()
	0x00, // 9a      ()
	0x00, // 9b      ()
	0x00, // 9c      ()
	0x00, // 9d      ()
	0x00, // 9e      ()
	0x00, // 9f      ()
	0x08, // a0    W ()
	0x00, // a1      ()
	0x00, // a2      ()
	0x00, // a3      ()
	0x00, // a4      ()
	0x00, // a5      ()
	0x00, // a6      ()
	0x00, // a7      ()
	0x00, // a8      ()
	0x00, // a9      ()
	0x00, // aa      ()
	0x00, // ab      ()
	0x00, // ac      ()
	0x00, // ad      ()
	0x00, // ae      ()
	0x00, // af      ()
	0x00, // b0      ()
	0x00, // b1      ()
	0x00, // b2      ()
	0x00, // b3      ()
	0x00, // b4      ()
	0x00, // b5      ()
	0x00, // b6      ()
	0x00, // b7      ()
	0x00, // b8      ()
	0x00, // b9      ()
	0x00, // ba      ()
	0x00, // bb      ()
	0x00, // bc      ()
	0x00, // bd      ()
	0x00, // be      ()
	0x00, // bf      ()
	0x00, // c0      ()
	0x00, // c1      ()
	0x00, // c2      ()
	0x00, // c3      ()
	0x00, // c4      ()
	0x00, // c5      ()
	0x00, // c6      ()
	0x00, // c7      ()
	0x00, // c8      ()
	0x00, // c9      ()
	0x00, // ca      ()
	0x00, // cb      ()
	0x00, // cc      ()
	0x00, // cd      ()
	0x00, // ce      ()
	0x00, // cf      ()
	0x00, // d0      ()
	0x00, // d1      ()
	0x00, // d2      ()
	0x00, // d3      ()
	0x00, // d4      ()
	0x00, // d5      ()
	0x00, // d6      ()
	0x00, // d7      ()
	0x00, // d8      ()
	0x00, // d9      ()
	0x00, // da      ()
	0x00, // db      ()
	0x00, // dc      ()
	0x00, // dd      ()
	0x00, // de      ()
	0x00, // df      ()
	0x00, // e0      ()
	0x00, // e1      ()
	0x00, // e2      ()
	0x00, // e3      ()
	0x00, // e4      ()
	0x00, // e5      ()
	0x00, // e6      ()
	0x00, // e7      ()
	0x00, // e8      ()
	0x00, // e9      ()
	0x00, // ea      ()
	0x00, // eb      ()
	0x00, // ec      ()
	0x00, // ed      ()
	0x00, // ee      ()
	0x00, // ef      ()
	0x00, // f0      ()
	0x00, // f1      ()
	0x00, // f2      ()
	0x00, // f3      ()
	0x00, // f4      ()
	0x00, // f5      ()
	0x00, // f6      ()
	0x00, // f7      ()
	0x00, // f8      ()
	0x00, // f9      ()
	0x00, // fa      ()
	0x00, // fb      ()
	0x00, // fc      ()
	0x00, // fd      ()
	0x00, // fe      ()
	0x00, // ff      ()
};

/*************************************************
    Functions definition - define lextable.cpp
*************************************************/
BOOL IsUpperPunctW(const WCHAR ch);
BOOL IsUpperWordDelimW(WCHAR wc);
BOOL TWB_IsCharPunctW(WCHAR ch);
BOOL TWB_IsCharWordDelimW(WCHAR ch);
bool IsThaiChar(const WCHAR ch);
bool IsThaiNumeric(const WCHAR ch);
#endif