Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * Cyrillic and MULE_INTERNAL
4 : *
5 : * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
6 : * Portions Copyright (c) 1994, Regents of the University of California
7 : *
8 : * IDENTIFICATION
9 : * src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c
10 : *
11 : *-------------------------------------------------------------------------
12 : */
13 :
14 : #include "postgres.h"
15 : #include "fmgr.h"
16 : #include "mb/pg_wchar.h"
17 :
18 12 : PG_MODULE_MAGIC_EXT(
19 : .name = "cyrillic_and_mic",
20 : .version = PG_VERSION
21 : );
22 :
23 6 : PG_FUNCTION_INFO_V1(koi8r_to_mic);
24 12 : PG_FUNCTION_INFO_V1(mic_to_koi8r);
25 12 : PG_FUNCTION_INFO_V1(iso_to_mic);
26 12 : PG_FUNCTION_INFO_V1(mic_to_iso);
27 6 : PG_FUNCTION_INFO_V1(win1251_to_mic);
28 6 : PG_FUNCTION_INFO_V1(mic_to_win1251);
29 6 : PG_FUNCTION_INFO_V1(win866_to_mic);
30 6 : PG_FUNCTION_INFO_V1(mic_to_win866);
31 6 : PG_FUNCTION_INFO_V1(koi8r_to_win1251);
32 6 : PG_FUNCTION_INFO_V1(win1251_to_koi8r);
33 6 : PG_FUNCTION_INFO_V1(koi8r_to_win866);
34 6 : PG_FUNCTION_INFO_V1(win866_to_koi8r);
35 6 : PG_FUNCTION_INFO_V1(win866_to_win1251);
36 6 : PG_FUNCTION_INFO_V1(win1251_to_win866);
37 12 : PG_FUNCTION_INFO_V1(iso_to_koi8r);
38 6 : PG_FUNCTION_INFO_V1(koi8r_to_iso);
39 6 : PG_FUNCTION_INFO_V1(iso_to_win1251);
40 6 : PG_FUNCTION_INFO_V1(win1251_to_iso);
41 6 : PG_FUNCTION_INFO_V1(iso_to_win866);
42 6 : PG_FUNCTION_INFO_V1(win866_to_iso);
43 :
44 : /* ----------
45 : * conv_proc(
46 : * INTEGER, -- source encoding id
47 : * INTEGER, -- destination encoding id
48 : * CSTRING, -- source string (null terminated C string)
49 : * CSTRING, -- destination string (null terminated C string)
50 : * INTEGER, -- source string length
51 : * BOOL -- if true, don't throw an error if conversion fails
52 : * ) returns INTEGER;
53 : *
54 : * Returns the number of bytes successfully converted.
55 : * ----------
56 : */
57 :
58 : /*
59 : * Cyrillic support
60 : * currently supported Cyrillic encodings:
61 : *
62 : * KOI8-R (this is also the charset for the mule internal code for Cyrillic)
63 : * ISO-8859-5
64 : * Microsoft's CP1251 (windows-1251)
65 : * Alternativny Variant (MS-DOS CP866)
66 : */
67 :
68 : /* ISO-8859-5 to KOI8-R */
69 : static const unsigned char iso2koi[] = {
70 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 : 0x00, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 : 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
77 : 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
78 : 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
79 : 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
80 : 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
81 : 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
82 : 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
83 : 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1,
84 : 0x00, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
86 : };
87 :
88 : /* KOI8-R to ISO-8859-5 */
89 : static const unsigned char koi2iso[] = {
90 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94 : 0x00, 0x00, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00,
95 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 : 0x00, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00,
97 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 : 0xEE, 0xD0, 0xD1, 0xE6, 0xD4, 0xD5, 0xE4, 0xD3,
99 : 0xE5, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE,
100 : 0xDF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xD6, 0xD2,
101 : 0xEC, 0xEB, 0xD7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA,
102 : 0xCE, 0xB0, 0xB1, 0xC6, 0xB4, 0xB5, 0xC4, 0xB3,
103 : 0xC5, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE,
104 : 0xBF, 0xCF, 0xC0, 0xC1, 0xC2, 0xC3, 0xB6, 0xB2,
105 : 0xCC, 0xCB, 0xB7, 0xC8, 0xCD, 0xC9, 0xC7, 0xCA
106 : };
107 :
108 : /* WIN1251 to KOI8-R */
109 : static const unsigned char win12512koi[] = {
110 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
115 : 0xB3, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x00, 0xB7,
116 : 0x00, 0x00, 0xB6, 0xA6, 0xAD, 0x00, 0x00, 0x00,
117 : 0xA3, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, 0xA7,
118 : 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
119 : 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
120 : 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
121 : 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
122 : 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
123 : 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
124 : 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
125 : 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1
126 : };
127 :
128 : /* KOI8-R to WIN1251 */
129 : static const unsigned char koi2win1251[] = {
130 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
133 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134 : 0x00, 0x00, 0x00, 0xB8, 0xBA, 0x00, 0xB3, 0xBF,
135 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00,
136 : 0x00, 0x00, 0x00, 0xA8, 0xAA, 0x00, 0xB2, 0xAF,
137 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x00, 0x00,
138 : 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
139 : 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
140 : 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
141 : 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
142 : 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
143 : 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
144 : 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
145 : 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA
146 : };
147 :
148 : /* WIN866 to KOI8-R */
149 : static const unsigned char win8662koi[] = {
150 : 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
151 : 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
152 : 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
153 : 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
154 : 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
155 : 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
156 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
158 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162 : 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
163 : 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1,
164 : 0xB3, 0xA3, 0xB4, 0xA4, 0xB7, 0xA7, 0x00, 0x00,
165 : 0xB6, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
166 : };
167 :
168 : /* KOI8-R to WIN866 */
169 : static const unsigned char koi2win866[] = {
170 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 : 0x00, 0x00, 0x00, 0xF1, 0xF3, 0x00, 0xF9, 0xF5,
175 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x00, 0x00,
176 : 0x00, 0x00, 0x00, 0xF0, 0xF2, 0x00, 0xF8, 0xF4,
177 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
178 : 0xEE, 0xA0, 0xA1, 0xE6, 0xA4, 0xA5, 0xE4, 0xA3,
179 : 0xE5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE,
180 : 0xAF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xA6, 0xA2,
181 : 0xEC, 0xEB, 0xA7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA,
182 : 0x9E, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83,
183 : 0x95, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
184 : 0x8F, 0x9F, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82,
185 : 0x9C, 0x9B, 0x87, 0x98, 0x9D, 0x99, 0x97, 0x9A
186 : };
187 :
188 : /* WIN866 to WIN1251 */
189 : static const unsigned char win8662win1251[] = {
190 : 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
191 : 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
192 : 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
193 : 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
194 : 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
195 : 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
196 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x00, 0x00,
198 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
199 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 : 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
203 : 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
204 : 0xA8, 0xB8, 0xAA, 0xBA, 0xAF, 0xBF, 0x00, 0x00,
205 : 0xB2, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
206 : };
207 :
208 : /* WIN1251 to WIN866 */
209 : static const unsigned char win12512win866[] = {
210 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 : 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
215 : 0xF0, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xF4,
216 : 0x00, 0x00, 0xF8, 0xF9, 0xAD, 0x00, 0x00, 0x00,
217 : 0xF1, 0x00, 0xF3, 0x00, 0x00, 0x00, 0x00, 0xF5,
218 : 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
219 : 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
220 : 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
221 : 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
222 : 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
223 : 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
224 : 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
225 : 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF
226 : };
227 :
228 : /* ISO-8859-5 to WIN1251 */
229 : static const unsigned char iso2win1251[] = {
230 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 : 0x00, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 : 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
237 : 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
238 : 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
239 : 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
240 : 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
241 : 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
242 : 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
243 : 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
244 : 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
246 : };
247 :
248 : /* WIN1251 to ISO-8859-5 */
249 : static const unsigned char win12512iso[] = {
250 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 : 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 : 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 : 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
259 : 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
260 : 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
261 : 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
262 : 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
263 : 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
264 : 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
265 : 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF
266 : };
267 :
268 : /* ISO-8859-5 to WIN866 */
269 : static const unsigned char iso2win866[] = {
270 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 : 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276 : 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
277 : 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
278 : 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
279 : 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
280 : 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
281 : 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
282 : 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
283 : 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
284 : 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
286 : };
287 :
288 : /* WIN866 to ISO-8859-5 */
289 : static const unsigned char win8662iso[] = {
290 : 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
291 : 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
292 : 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
293 : 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
294 : 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
295 : 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
296 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 : 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
303 : 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
304 : 0xA1, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
306 : };
307 :
308 :
309 : Datum
310 6 : koi8r_to_mic(PG_FUNCTION_ARGS)
311 : {
312 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
313 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
314 6 : int len = PG_GETARG_INT32(4);
315 6 : bool noError = PG_GETARG_BOOL(5);
316 : int converted;
317 :
318 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_MULE_INTERNAL);
319 :
320 6 : converted = latin2mic(src, dest, len, LC_KOI8_R, PG_KOI8R, noError);
321 :
322 6 : PG_RETURN_INT32(converted);
323 : }
324 :
325 : Datum
326 330 : mic_to_koi8r(PG_FUNCTION_ARGS)
327 : {
328 330 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
329 330 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
330 330 : int len = PG_GETARG_INT32(4);
331 330 : bool noError = PG_GETARG_BOOL(5);
332 : int converted;
333 :
334 330 : CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_KOI8R);
335 :
336 330 : converted = mic2latin(src, dest, len, LC_KOI8_R, PG_KOI8R, noError);
337 :
338 186 : PG_RETURN_INT32(converted);
339 : }
340 :
341 : Datum
342 150 : iso_to_mic(PG_FUNCTION_ARGS)
343 : {
344 150 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
345 150 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
346 150 : int len = PG_GETARG_INT32(4);
347 150 : bool noError = PG_GETARG_BOOL(5);
348 : int converted;
349 :
350 150 : CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_MULE_INTERNAL);
351 :
352 150 : converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_ISO_8859_5, iso2koi, noError);
353 :
354 96 : PG_RETURN_INT32(converted);
355 : }
356 :
357 : Datum
358 330 : mic_to_iso(PG_FUNCTION_ARGS)
359 : {
360 330 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
361 330 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
362 330 : int len = PG_GETARG_INT32(4);
363 330 : bool noError = PG_GETARG_BOOL(5);
364 : int converted;
365 :
366 330 : CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_ISO_8859_5);
367 :
368 330 : converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_ISO_8859_5, koi2iso, noError);
369 :
370 186 : PG_RETURN_INT32(converted);
371 : }
372 :
373 : Datum
374 6 : win1251_to_mic(PG_FUNCTION_ARGS)
375 : {
376 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
377 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
378 6 : int len = PG_GETARG_INT32(4);
379 6 : bool noError = PG_GETARG_BOOL(5);
380 : int converted;
381 :
382 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_MULE_INTERNAL);
383 :
384 6 : converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_WIN1251, win12512koi, noError);
385 :
386 6 : PG_RETURN_INT32(converted);
387 : }
388 :
389 : Datum
390 6 : mic_to_win1251(PG_FUNCTION_ARGS)
391 : {
392 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
393 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
394 6 : int len = PG_GETARG_INT32(4);
395 6 : bool noError = PG_GETARG_BOOL(5);
396 : int converted;
397 :
398 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN1251);
399 :
400 6 : converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_WIN1251, koi2win1251, noError);
401 :
402 6 : PG_RETURN_INT32(converted);
403 : }
404 :
405 : Datum
406 6 : win866_to_mic(PG_FUNCTION_ARGS)
407 : {
408 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
409 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
410 6 : int len = PG_GETARG_INT32(4);
411 6 : bool noError = PG_GETARG_BOOL(5);
412 : int converted;
413 :
414 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_MULE_INTERNAL);
415 :
416 6 : converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_WIN866, win8662koi, noError);
417 :
418 6 : PG_RETURN_INT32(converted);
419 : }
420 :
421 : Datum
422 6 : mic_to_win866(PG_FUNCTION_ARGS)
423 : {
424 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
425 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
426 6 : int len = PG_GETARG_INT32(4);
427 6 : bool noError = PG_GETARG_BOOL(5);
428 : int converted;
429 :
430 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN866);
431 :
432 6 : converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_WIN866, koi2win866, noError);
433 :
434 6 : PG_RETURN_INT32(converted);
435 : }
436 :
437 : Datum
438 6 : koi8r_to_win1251(PG_FUNCTION_ARGS)
439 : {
440 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
441 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
442 6 : int len = PG_GETARG_INT32(4);
443 6 : bool noError = PG_GETARG_BOOL(5);
444 : int converted;
445 :
446 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN1251);
447 :
448 6 : converted = local2local(src, dest, len, PG_KOI8R, PG_WIN1251, koi2win1251, noError);
449 :
450 6 : PG_RETURN_INT32(converted);
451 : }
452 :
453 : Datum
454 6 : win1251_to_koi8r(PG_FUNCTION_ARGS)
455 : {
456 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
457 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
458 6 : int len = PG_GETARG_INT32(4);
459 6 : bool noError = PG_GETARG_BOOL(5);
460 : int converted;
461 :
462 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_KOI8R);
463 :
464 6 : converted = local2local(src, dest, len, PG_WIN1251, PG_KOI8R, win12512koi, noError);
465 :
466 6 : PG_RETURN_INT32(converted);
467 : }
468 :
469 : Datum
470 6 : koi8r_to_win866(PG_FUNCTION_ARGS)
471 : {
472 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
473 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
474 6 : int len = PG_GETARG_INT32(4);
475 6 : bool noError = PG_GETARG_BOOL(5);
476 : int converted;
477 :
478 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN866);
479 :
480 6 : converted = local2local(src, dest, len, PG_KOI8R, PG_WIN866, koi2win866, noError);
481 :
482 6 : PG_RETURN_INT32(converted);
483 : }
484 :
485 : Datum
486 6 : win866_to_koi8r(PG_FUNCTION_ARGS)
487 : {
488 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
489 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
490 6 : int len = PG_GETARG_INT32(4);
491 6 : bool noError = PG_GETARG_BOOL(5);
492 : int converted;
493 :
494 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_KOI8R);
495 :
496 6 : converted = local2local(src, dest, len, PG_WIN866, PG_KOI8R, win8662koi, noError);
497 :
498 6 : PG_RETURN_INT32(converted);
499 : }
500 :
501 : Datum
502 6 : win866_to_win1251(PG_FUNCTION_ARGS)
503 : {
504 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
505 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
506 6 : int len = PG_GETARG_INT32(4);
507 6 : bool noError = PG_GETARG_BOOL(5);
508 : int converted;
509 :
510 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_WIN1251);
511 :
512 6 : converted = local2local(src, dest, len, PG_WIN866, PG_WIN1251, win8662win1251, noError);
513 :
514 6 : PG_RETURN_INT32(converted);
515 : }
516 :
517 : Datum
518 6 : win1251_to_win866(PG_FUNCTION_ARGS)
519 : {
520 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
521 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
522 6 : int len = PG_GETARG_INT32(4);
523 6 : bool noError = PG_GETARG_BOOL(5);
524 : int converted;
525 :
526 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_WIN866);
527 :
528 6 : converted = local2local(src, dest, len, PG_WIN1251, PG_WIN866, win12512win866, noError);
529 :
530 6 : PG_RETURN_INT32(converted);
531 : }
532 :
533 : Datum
534 150 : iso_to_koi8r(PG_FUNCTION_ARGS)
535 : {
536 150 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
537 150 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
538 150 : int len = PG_GETARG_INT32(4);
539 150 : bool noError = PG_GETARG_BOOL(5);
540 : int converted;
541 :
542 150 : CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_KOI8R);
543 :
544 150 : converted = local2local(src, dest, len, PG_ISO_8859_5, PG_KOI8R, iso2koi, noError);
545 :
546 96 : PG_RETURN_INT32(converted);
547 : }
548 :
549 : Datum
550 6 : koi8r_to_iso(PG_FUNCTION_ARGS)
551 : {
552 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
553 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
554 6 : int len = PG_GETARG_INT32(4);
555 6 : bool noError = PG_GETARG_BOOL(5);
556 : int converted;
557 :
558 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_ISO_8859_5);
559 :
560 6 : converted = local2local(src, dest, len, PG_KOI8R, PG_ISO_8859_5, koi2iso, noError);
561 :
562 6 : PG_RETURN_INT32(converted);
563 : }
564 :
565 : Datum
566 6 : iso_to_win1251(PG_FUNCTION_ARGS)
567 : {
568 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
569 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
570 6 : int len = PG_GETARG_INT32(4);
571 6 : bool noError = PG_GETARG_BOOL(5);
572 : int converted;
573 :
574 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN1251);
575 :
576 6 : converted = local2local(src, dest, len, PG_ISO_8859_5, PG_WIN1251, iso2win1251, noError);
577 :
578 6 : PG_RETURN_INT32(converted);
579 : }
580 :
581 : Datum
582 6 : win1251_to_iso(PG_FUNCTION_ARGS)
583 : {
584 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
585 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
586 6 : int len = PG_GETARG_INT32(4);
587 6 : bool noError = PG_GETARG_BOOL(5);
588 : int converted;
589 :
590 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_ISO_8859_5);
591 :
592 6 : converted = local2local(src, dest, len, PG_WIN1251, PG_ISO_8859_5, win12512iso, noError);
593 :
594 6 : PG_RETURN_INT32(converted);
595 : }
596 :
597 : Datum
598 6 : iso_to_win866(PG_FUNCTION_ARGS)
599 : {
600 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
601 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
602 6 : int len = PG_GETARG_INT32(4);
603 6 : bool noError = PG_GETARG_BOOL(5);
604 : int converted;
605 :
606 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN866);
607 :
608 6 : converted = local2local(src, dest, len, PG_ISO_8859_5, PG_WIN866, iso2win866, noError);
609 :
610 6 : PG_RETURN_INT32(converted);
611 : }
612 :
613 : Datum
614 6 : win866_to_iso(PG_FUNCTION_ARGS)
615 : {
616 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
617 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
618 6 : int len = PG_GETARG_INT32(4);
619 6 : bool noError = PG_GETARG_BOOL(5);
620 : int converted;
621 :
622 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_ISO_8859_5);
623 :
624 6 : converted = local2local(src, dest, len, PG_WIN866, PG_ISO_8859_5, win8662iso, noError);
625 :
626 6 : PG_RETURN_INT32(converted);
627 : }
|