00001
00002
00003
00004
00005
00006
00007 static const unsigned short iso8859_16_2uni[96] = {
00008
00009 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
00010 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
00011
00012 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
00013 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
00014
00015 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
00016 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
00017
00018 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
00019 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
00020
00021 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
00022 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
00023
00024 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
00025 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff,
00026 };
00027
00028 static int
00029 iso8859_16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
00030 {
00031 unsigned char c = *s;
00032 if (c < 0xa0)
00033 *pwc = (ucs4_t) c;
00034 else
00035 *pwc = (ucs4_t) iso8859_16_2uni[c-0xa0];
00036 return 1;
00037 }
00038
00039 static const unsigned char iso8859_16_page00[224] = {
00040 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7,
00041 0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0x00, 0x00,
00042 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7,
00043 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
00044 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0xc7,
00045 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
00046 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0x00,
00047 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf,
00048 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0xe7,
00049 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
00050 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0x00,
00051 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff,
00052
00053 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xa2, 0xc5, 0xe5,
00054 0x00, 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x00, 0x00,
00055 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00056 0xdd, 0xfd, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00061 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0x00,
00062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00063 0xd5, 0xf5, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00,
00064 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00,
00065 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00067 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00068 0xbe, 0xac, 0xae, 0xaf, 0xbf, 0xb4, 0xb8, 0x00,
00069 };
00070 static const unsigned char iso8859_16_page02[8] = {
00071 0xaa, 0xba, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00,
00072 };
00073 static const unsigned char iso8859_16_page20[8] = {
00074 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa5, 0x00,
00075 };
00076
00077 static int
00078 iso8859_16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
00079 {
00080 unsigned char c = 0;
00081 if (wc < 0x00a0) {
00082 *r = wc;
00083 return 1;
00084 }
00085 else if (wc >= 0x00a0 && wc < 0x0180)
00086 c = iso8859_16_page00[wc-0x00a0];
00087 else if (wc >= 0x0218 && wc < 0x0220)
00088 c = iso8859_16_page02[wc-0x0218];
00089 else if (wc >= 0x2018 && wc < 0x2020)
00090 c = iso8859_16_page20[wc-0x2018];
00091 else if (wc == 0x20ac)
00092 c = 0xa4;
00093 if (c != 0) {
00094 *r = c;
00095 return 1;
00096 }
00097 return RET_ILSEQ;
00098 }