00001
00002
00003
00004
00005
00006
00007 static const unsigned short cp1256_2uni[128] = {
00008
00009 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
00010 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
00011
00012 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
00013 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba,
00014
00015 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
00016 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
00017
00018 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
00019 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f,
00020
00021 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
00022 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
00023
00024 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7,
00025 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643,
00026
00027 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7,
00028 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef,
00029
00030 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7,
00031 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2,
00032 };
00033
00034 static int
00035 cp1256_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 else
00041 *pwc = (ucs4_t) cp1256_2uni[c-0x80];
00042 return 1;
00043 }
00044
00045 static const unsigned char cp1256_page00[96] = {
00046 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
00047 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf,
00048 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
00049 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00,
00050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7,
00053 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00054 0xe0, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0xe7,
00055 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x00, 0xee, 0xef,
00056 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xf7,
00057 0x00, 0xf9, 0x00, 0xfb, 0xfc, 0x00, 0x00, 0x00,
00058 };
00059 static const unsigned char cp1256_page01[72] = {
00060 0x00, 0x00, 0x8c, 0x9c, 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, 0x00,
00064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00068 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00,
00069 };
00070 static const unsigned char cp1256_page06[208] = {
00071 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00,
00072 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00073 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbf,
00074 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
00075 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
00076 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd8,
00077 0xd9, 0xda, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00,
00078 0xdc, 0xdd, 0xde, 0xdf, 0xe1, 0xe3, 0xe4, 0xe5,
00079 0xe6, 0xec, 0xed, 0xf0, 0xf1, 0xf2, 0xf3, 0xf5,
00080 0xf6, 0xf8, 0xfa, 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, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00,
00086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00,
00087 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00088 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00089 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00091 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90,
00092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00093 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xaa, 0x00,
00094 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00096 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
00097 };
00098 static const unsigned char cp1256_page20[56] = {
00099 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0xfd, 0xfe,
00100 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00,
00101 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00,
00102 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00,
00103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00104 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00105 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00,
00106 };
00107
00108 static int
00109 cp1256_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
00110 {
00111 unsigned char c = 0;
00112 if (wc < 0x0080) {
00113 *r = wc;
00114 return 1;
00115 }
00116 else if (wc >= 0x00a0 && wc < 0x0100)
00117 c = cp1256_page00[wc-0x00a0];
00118 else if (wc >= 0x0150 && wc < 0x0198)
00119 c = cp1256_page01[wc-0x0150];
00120 else if (wc == 0x02c6)
00121 c = 0x88;
00122 else if (wc >= 0x0608 && wc < 0x06d8)
00123 c = cp1256_page06[wc-0x0608];
00124 else if (wc >= 0x2008 && wc < 0x2040)
00125 c = cp1256_page20[wc-0x2008];
00126 else if (wc == 0x20ac)
00127 c = 0x80;
00128 else if (wc == 0x2122)
00129 c = 0x99;
00130 if (c != 0) {
00131 *r = c;
00132 return 1;
00133 }
00134 return RET_ILSEQ;
00135 }