00001
00002
00003
00004
00005
00006
00007 static const unsigned short cp1255_2uni[128] = {
00008
00009 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
00010 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
00011
00012 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
00013 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
00014
00015 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7,
00016 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
00017
00018 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
00019 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
00020
00021 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7,
00022 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf,
00023
00024 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3,
00025 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
00026
00027 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
00028 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
00029
00030 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
00031 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd,
00032 };
00033
00034 static int
00035 cp1255_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
00036 {
00037 unsigned char c = *s;
00038 if (c < 0x80) {
00039 *pwc = (ucs4_t) c;
00040 return 1;
00041 }
00042 else {
00043 unsigned short wc = cp1255_2uni[c-0x80];
00044 if (wc != 0xfffd) {
00045 *pwc = (ucs4_t) wc;
00046 return 1;
00047 }
00048 }
00049 return RET_ILSEQ;
00050 }
00051
00052 static const unsigned char cp1255_page00[88] = {
00053 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7,
00054 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf,
00055 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
00056 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
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, 0xaa,
00060 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba,
00064 };
00065 static const unsigned char cp1255_page02[32] = {
00066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00,
00067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00069 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
00070 };
00071 static const unsigned char cp1255_page05[72] = {
00072 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
00073 0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
00074 0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00,
00075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00076 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
00077 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
00078 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
00079 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00,
00080 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00,
00081 };
00082 static const unsigned char cp1255_page20[56] = {
00083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe,
00084 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00,
00085 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00,
00086 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00,
00087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00088 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00089 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00,
00090 };
00091
00092 static int
00093 cp1255_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
00094 {
00095 unsigned char c = 0;
00096 if (wc < 0x0080) {
00097 *r = wc;
00098 return 1;
00099 }
00100 else if (wc >= 0x00a0 && wc < 0x00f8)
00101 c = cp1255_page00[wc-0x00a0];
00102 else if (wc == 0x0192)
00103 c = 0x83;
00104 else if (wc >= 0x02c0 && wc < 0x02e0)
00105 c = cp1255_page02[wc-0x02c0];
00106 else if (wc >= 0x05b0 && wc < 0x05f8)
00107 c = cp1255_page05[wc-0x05b0];
00108 else if (wc >= 0x2008 && wc < 0x2040)
00109 c = cp1255_page20[wc-0x2008];
00110 else if (wc == 0x20aa)
00111 c = 0xa4;
00112 else if (wc == 0x20ac)
00113 c = 0x80;
00114 else if (wc == 0x2122)
00115 c = 0x99;
00116 if (c != 0) {
00117 *r = c;
00118 return 1;
00119 }
00120 return RET_ILSEQ;
00121 }