00001
00002
00003
00004
00005
00006 #ifdef NEED_TOWC
00007
00008 static const unsigned short cp1251_2uni[128] = {
00009
00010 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021,
00011 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f,
00012
00013 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
00014 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f,
00015
00016 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7,
00017 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
00018
00019 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7,
00020 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
00021
00022 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
00023 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
00024
00025 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
00026 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
00027
00028 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
00029 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
00030
00031 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
00032 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
00033 };
00034
00035 static int
00036 cp1251_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
00037 {
00038 unsigned char c = *s;
00039 if (c < 0x80) {
00040 *pwc = (ucs4_t) c;
00041 return 1;
00042 }
00043 else {
00044 unsigned short wc = cp1251_2uni[c-0x80];
00045 if (wc != 0xfffd) {
00046 *pwc = (ucs4_t) wc;
00047 return 1;
00048 }
00049 }
00050 return RET_ILSEQ;
00051 }
00052 #endif
00053
00054 #ifdef NEED_TOMB
00055 static const unsigned char cp1251_page00[32] = {
00056 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7,
00057 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00,
00058 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7,
00059 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
00060 };
00061 static const unsigned char cp1251_page04[152] = {
00062 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf,
00063 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f,
00064 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
00065 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
00066 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
00067 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
00068 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
00069 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
00070 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
00071 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
00072 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf,
00073 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f,
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 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00081 };
00082 static const unsigned char cp1251_page20[48] = {
00083 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00,
00084 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00,
00085 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00,
00086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00087 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00088 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00,
00089 };
00090
00091 static int
00092 cp1251_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
00093 {
00094 unsigned char c = 0;
00095 if (wc < 0x0080) {
00096 *r = wc;
00097 return 1;
00098 }
00099 else if (wc >= 0x00a0 && wc < 0x00c0)
00100 c = cp1251_page00[wc-0x00a0];
00101 else if (wc >= 0x0400 && wc < 0x0498)
00102 c = cp1251_page04[wc-0x0400];
00103 else if (wc >= 0x2010 && wc < 0x2040)
00104 c = cp1251_page20[wc-0x2010];
00105 else if (wc == 0x20ac)
00106 c = 0x88;
00107 else if (wc == 0x2116)
00108 c = 0xb9;
00109 else if (wc == 0x2122)
00110 c = 0x99;
00111 if (c != 0) {
00112 *r = c;
00113 return 1;
00114 }
00115 return RET_ILSEQ;
00116 }
00117 #endif