00001
00002
00003
00004
00005
00006
00007 static const unsigned short tcvn_2uni_1[32] = {
00008
00009 0x0000, 0x00da, 0x1ee4, 0x0003, 0x1eea, 0x1eec, 0x1eee, 0x0007,
00010 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
00011
00012 0x0010, 0x1ee8, 0x1ef0, 0x1ef2, 0x1ef6, 0x1ef8, 0x00dd, 0x1ef4,
00013 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
00014 };
00015 static const unsigned short tcvn_2uni_2[128] = {
00016
00017 0x00c0, 0x1ea2, 0x00c3, 0x00c1, 0x1ea0, 0x1eb6, 0x1eac, 0x00c8,
00018 0x1eba, 0x1ebc, 0x00c9, 0x1eb8, 0x1ec6, 0x00cc, 0x1ec8, 0x0128,
00019
00020 0x00cd, 0x1eca, 0x00d2, 0x1ece, 0x00d5, 0x00d3, 0x1ecc, 0x1ed8,
00021 0x1edc, 0x1ede, 0x1ee0, 0x1eda, 0x1ee2, 0x00d9, 0x1ee6, 0x0168,
00022
00023 0x00a0, 0x0102, 0x00c2, 0x00ca, 0x00d4, 0x01a0, 0x01af, 0x0110,
00024 0x0103, 0x00e2, 0x00ea, 0x00f4, 0x01a1, 0x01b0, 0x0111, 0x1eb0,
00025
00026 0x0300, 0x0309, 0x0303, 0x0301, 0x0323, 0x00e0, 0x1ea3, 0x00e3,
00027 0x00e1, 0x1ea1, 0x1eb2, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eaf, 0x1eb4,
00028
00029 0x1eae, 0x1ea6, 0x1ea8, 0x1eaa, 0x1ea4, 0x1ec0, 0x1eb7, 0x1ea7,
00030 0x1ea9, 0x1eab, 0x1ea5, 0x1ead, 0x00e8, 0x1ec2, 0x1ebb, 0x1ebd,
00031
00032 0x00e9, 0x1eb9, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ebf, 0x1ec7, 0x00ec,
00033 0x1ec9, 0x1ec4, 0x1ebe, 0x1ed2, 0x0129, 0x00ed, 0x1ecb, 0x00f2,
00034
00035 0x1ed4, 0x1ecf, 0x00f5, 0x00f3, 0x1ecd, 0x1ed3, 0x1ed5, 0x1ed7,
00036 0x1ed1, 0x1ed9, 0x1edd, 0x1edf, 0x1ee1, 0x1edb, 0x1ee3, 0x00f9,
00037
00038 0x1ed6, 0x1ee7, 0x0169, 0x00fa, 0x1ee5, 0x1eeb, 0x1eed, 0x1eef,
00039 0x1ee9, 0x1ef1, 0x1ef3, 0x1ef7, 0x1ef9, 0x00fd, 0x1ef5, 0x1ed0,
00040 };
00041
00042 static int
00043 tcvn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
00044 {
00045 unsigned char c = *s;
00046 if (c < 0x20)
00047 *pwc = (ucs4_t) tcvn_2uni_1[c];
00048 else if (c < 0x80)
00049 *pwc = (ucs4_t) c;
00050 else
00051 *pwc = (ucs4_t) tcvn_2uni_2[c-0x80];
00052 return 1;
00053 }
00054
00055 static const unsigned char tcvn_page00[96+184] = {
00056 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00058 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00060 0x80, 0x83, 0xa2, 0x82, 0x00, 0x00, 0x00, 0x00,
00061 0x87, 0x8a, 0xa3, 0x00, 0x8d, 0x90, 0x00, 0x00,
00062 0x00, 0x00, 0x92, 0x95, 0xa4, 0x94, 0x00, 0x00,
00063 0x00, 0x9d, 0x01, 0x00, 0x00, 0x16, 0x00, 0x00,
00064 0xb5, 0xb8, 0xa9, 0xb7, 0x00, 0x00, 0x00, 0x00,
00065 0xcc, 0xd0, 0xaa, 0x00, 0xd7, 0xdd, 0x00, 0x00,
00066 0x00, 0x00, 0xdf, 0xe3, 0xab, 0xe2, 0x00, 0x00,
00067 0x00, 0xef, 0xf3, 0x00, 0x00, 0xfd, 0x00, 0x00,
00068
00069 0x00, 0x00, 0xa1, 0xa8, 0x00, 0x00, 0x00, 0x00,
00070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00071 0xa7, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00072 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00074 0x8f, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00079 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00080 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00082 0x9f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00084 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00088 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00089 0xa5, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6,
00091 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00092 };
00093 static const unsigned char tcvn_page03[40] = {
00094 0xb0, 0xb3, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00,
00095 0x00, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00098 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00,
00099 };
00100 static const unsigned char tcvn_page1e[96] = {
00101 0x84, 0xb9, 0x81, 0xb6, 0xc4, 0xca, 0xc1, 0xc7,
00102 0xc2, 0xc8, 0xc3, 0xc9, 0x86, 0xcb, 0xc0, 0xbe,
00103 0xaf, 0xbb, 0xba, 0xbc, 0xbf, 0xbd, 0x85, 0xc6,
00104 0x8b, 0xd1, 0x88, 0xce, 0x89, 0xcf, 0xda, 0xd5,
00105 0xc5, 0xd2, 0xcd, 0xd3, 0xd9, 0xd4, 0x8c, 0xd6,
00106 0x8e, 0xd8, 0x91, 0xde, 0x96, 0xe4, 0x93, 0xe1,
00107 0xff, 0xe8, 0xdb, 0xe5, 0xe0, 0xe6, 0xf0, 0xe7,
00108 0x97, 0xe9, 0x9b, 0xed, 0x98, 0xea, 0x99, 0xeb,
00109 0x9a, 0xec, 0x9c, 0xee, 0x02, 0xf4, 0x9e, 0xf1,
00110 0x11, 0xf8, 0x04, 0xf5, 0x05, 0xf6, 0x06, 0xf7,
00111 0x12, 0xf9, 0x13, 0xfa, 0x17, 0xfe, 0x14, 0xfb,
00112 0x15, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00113 };
00114
00115 static int
00116 tcvn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
00117 {
00118 unsigned char c = 0;
00119 if (wc < 0x0080 && (wc >= 0x0020 || (0x00fe0076 & (1 << wc)) == 0)) {
00120 *r = wc;
00121 return 1;
00122 }
00123 else if (wc >= 0x00a0 && wc < 0x01b8)
00124 c = tcvn_page00[wc-0x00a0];
00125 else if (wc >= 0x0300 && wc < 0x0328)
00126 c = tcvn_page03[wc-0x0300];
00127 else if (wc >= 0x1ea0 && wc < 0x1f00)
00128 c = tcvn_page1e[wc-0x1ea0];
00129 if (c != 0) {
00130 *r = c;
00131 return 1;
00132 }
00133 return RET_ILSEQ;
00134 }