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