| 920 | |
| 921 | |
| 922 | BOOL IsUTF8 ( const char *pTest, int nLength ) |
| 923 | { |
| 924 | static int byte_class_table[256] = { |
| 925 | /* 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F */ |
| 926 | /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 927 | /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 928 | /* 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 929 | /* 30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 930 | /* 40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 931 | /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 932 | /* 60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 933 | /* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 934 | /* 80 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
| 935 | /* 90 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 936 | /* A0 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
| 937 | /* B0 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
| 938 | /* C0 */ 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, |
| 939 | /* D0 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, |
| 940 | /* E0 */ 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, |
| 941 | /* F0 */ 9, 10, 10, 10, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 |
| 942 | /* 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F */ |
| 943 | }; |
| 944 | /* state table */ |
| 945 | typedef enum { |
| 946 | kSTART = 0, kA, kB, kC, kD, kE, kF, kG, kERROR, kNumOfStates |
| 947 | } utf8_state; |
| 948 | static utf8_state state_table[] = { |
| 949 | /* kSTART, kA, kB, kC, kD, kE, kF, kG, kERROR */ |
| 950 | /* 0x00-0x7F: 0 */ kSTART, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 951 | /* 0x80-0x8F: 1 */ kERROR, kSTART, kA, kERROR, kA, kB, kERROR, kB, kERROR, |
| 952 | /* 0x90-0x9f: 2 */ kERROR, kSTART, kA, kERROR, kA, kB, kB, kERROR, kERROR, |
| 953 | /* 0xa0-0xbf: 3 */ kERROR, kSTART, kA, kA, kERROR, kB, kB, kERROR, kERROR, |
| 954 | /* 0xc0-0xc1, 0xf5-0xff: 4 */ kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 955 | /* 0xc2-0xdf: 5 */ kA, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 956 | /* 0xe0: 6 */ kC, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 957 | /* 0xe1-0xec, 0xee-0xef: 7 */ kB, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 958 | /* 0xed: 8 */ kD, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 959 | /* 0xf0: 9 */ kF, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 960 | /* 0xf1-0xf3: 10 */ kE, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, |
| 961 | /* 0xf4: 11 */ kG, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR, kERROR |
| 962 | }; |
| 963 | #define BYTE_CLASS(b) (byte_class_table[(unsigned char)b]) |
| 964 | #define NEXT_STATE(b,cur) (state_table[(BYTE_CLASS(b) * kNumOfStates) + (cur)]) |
| 965 | utf8_state current = kSTART; |
| 966 | int i; |
| 967 | const char *pt = pTest; |
| 968 | int len = nLength; |
| 969 | for ( i = 0; i < len ; i++, pt++ ) { |
| 970 | current = NEXT_STATE ( *pt, current ); |
| 971 | if ( kERROR == current ) { |
| 972 | break; |
| 973 | } |
| 974 | } |
| 975 | return ( current == kSTART ) ? TRUE : FALSE; |
| 976 | } |
| 977 | |
| 978 | |
| 979 | BOOL IsUTF7 ( const char *pTest, int nLength ) |