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