2 * Copyright (c) 1995 Regents of the University of Michigan.
10 #ifdef STR_TRANSLATION
13 static char copyright[] = "@(#) Copyright (c) 1995 Regents of the University of Michigan.\nAll rights reserved.\n";
19 #include <ac/socket.h>
20 #include <ac/string.h>
22 #ifdef HAVE_SYS_PARAM_H
23 #include <sys/param.h>
32 ldap_set_string_translators( LDAP *ld, BERTranslateProc encode_proc,
33 BERTranslateProc decode_proc )
35 ld->ld_lber_encode_translate_proc = encode_proc;
36 ld->ld_lber_decode_translate_proc = decode_proc;
41 ldap_enable_translation( LDAP *ld, LDAPMessage *entry, int enable )
45 optionsp = ( entry == NULLMSG ) ? &ld->ld_lberoptions :
46 &entry->lm_ber->ber_options;
49 *optionsp |= LBER_TRANSLATE_STRINGS;
51 *optionsp &= ~LBER_TRANSLATE_STRINGS;
57 ldap_translate_from_t61( LDAP *ld, char **bufp, unsigned long *lenp,
60 if ( ld->ld_lber_decode_translate_proc == NULL ) {
61 return( LDAP_SUCCESS );
64 return( (*ld->ld_lber_decode_translate_proc)( bufp, lenp, free_input ));
69 ldap_translate_to_t61( LDAP *ld, char **bufp, unsigned long *lenp,
72 if ( ld->ld_lber_encode_translate_proc == NULL ) {
73 return( LDAP_SUCCESS );
76 return( (*ld->ld_lber_encode_translate_proc)( bufp, lenp, free_input ));
81 ** Character translation routine notes:
83 * On entry: bufp points to a "string" to be converted (not necessarily
84 * zero-terminated) and buflenp points to the length of the buffer.
86 * On exit: bufp should point to a malloc'd result. If free_input is
87 * non-zero then the original bufp will be freed. *buflenp should be
88 * set to the new length. Zero bytes in the input buffer must be left
91 * Return values: any ldap error code (LDAP_SUCCESS if all goes well).
95 #ifdef LDAP_CHARSET_8859
97 #if LDAP_CHARSET_8859 == 88591
99 #elif LDAP_CHARSET_8859 == 88592
101 #elif LDAP_CHARSET_8859 == 88593
103 #elif LDAP_CHARSET_8859 == 88594
105 #elif LDAP_CHARSET_8859 == 88595
107 #elif LDAP_CHARSET_8859 == 88596
109 #elif LDAP_CHARSET_8859 == 88597
111 #elif LDAP_CHARSET_8859 == 88598
113 #elif LDAP_CHARSET_8859 == 88599
115 #elif LDAP_CHARSET_8859 == 885910
122 * the following ISO_8859 to/afrom T.61 character set translation code is
123 * based on the code found in Enrique Silvestre Mora's iso-t61.c, found
124 * as part of this package:
125 * ftp://pereiii.uji.es/pub/uji-ftp/unix/ldap/iso-t61.translation.tar.Z
126 * Enrique is now (10/95) at this address: enrique.silvestre@uv.es
128 * changes made by mcs@umich.edu 12 October 1995:
129 * Change calling conventions of iso8859_t61() and t61_iso8859() to
130 * match libldap conventions; rename to ldap_8859_to_t61() and
131 * ldap_t61_to_8859().
132 * Change conversion routines to deal with non-zero terminated strings.
133 * ANSI-ize functions and include prototypes.
136 /* iso-t61.c - ISO-T61 translation routines (version: 0.2.1, July-1994) */
138 * Copyright (c) 1994 Enrique Silvestre Mora, Universitat Jaume I, Spain.
139 * All rights reserved.
141 * Redistribution and use in source and binary forms are permitted
142 * provided that this notice is preserved and that due credit is given
143 * to the Universitat Jaume I. The name of the University
144 * may not be used to endorse or promote products derived from this
145 * software without specific prior written permission. This software
146 * is provided ``as is'' without express or implied warranty.
152 #include <ac/string.h>
154 /* Character set used: ISO 8859-1, ISO 8859-2, ISO 8859-3, ... */
155 /* #define ISO_8859 1 */
161 typedef unsigned char Byte;
162 typedef struct { Byte a, b; } Couple;
164 static Byte *c_to_hh LDAP_P(( Byte *o, Byte c ));
165 static Byte *c_to_cc LDAP_P(( Byte *o, Couple *cc, Byte c ));
166 static int hh_to_c LDAP_P(( Byte *h ));
167 static Byte *cc_to_t61 LDAP_P(( Byte *o, Byte *s ));
170 Character choosed as base in diacritics alone: NO-BREAK SPACE.
171 (The standard say it must be a blank space, 0x20.)
175 static Couple diacritic[16] = {
176 #if (ISO_8859 == 1) || (ISO_8859 == 9)
177 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
178 {'~',0}, {0xaf,0}, {'(',ALONE}, {'.',ALONE},
179 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
180 {0,0}, {'"',ALONE}, {';',ALONE}, {'<',ALONE},
181 #elif (ISO_8859 == 2)
182 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
183 {'~',0}, {'-',ALONE}, {0xa2,0}, {0xff,0},
184 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
185 {0,0}, {0xbd,0}, {0xb2,0}, {0xb7,0}
186 #elif (ISO_8859 == 3)
187 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
188 {'~',0}, {'-',ALONE}, {0xa2,0}, {0xff,0},
189 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
190 {0,0}, {'"',ALONE}, {';',ALONE}, {'<',ALONE}
191 #elif (ISO_8859 == 4)
192 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
193 {'~',0}, {0xaf,0}, {'(',ALONE}, {0xff,0},
194 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
195 {0,0}, {'"',ALONE}, {0xb2,0}, {0xb7,0}
197 {0,0}, {'`',0}, {'\'',ALONE}, {'^',0},
198 {'~',0}, {'-',ALONE}, {'(',ALONE}, {'.',ALONE},
199 {':',ALONE}, {0,0}, {'0',ALONE}, {',',ALONE},
200 {0,0}, {'"',ALONE}, {';',ALONE}, {'<',ALONE}
205 --- T.61 (T.51) letters with diacritics: conversion to ISO 8859-n -----
206 A, C, D, E, G, H, I, J, K,
207 L, N, O, R, S, T, U, W, Y, Z.
208 -----------------------------------------------------------------------
210 static int letter_w_diacritic[16][38] = {
212 0, 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216 0xc0,0, 0, 0xc8,0, 0, 0xcc,0, 0,
217 0, 0, 0xd2,0, 0, 0, 0xd9,0, 0, 0,
218 0xe0,0, 0, 0xe8,0, 0, 0xec,0, 0,
219 0, 0, 0xf2,0, 0, 0, 0xf9,0, 0, 0,
220 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
221 -1, -1, 0xd3,-1, -1, 0, 0xda,0, 0xdd,-1,
222 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
223 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, 0xfd,-1,
224 0xc2,-1, 0, 0xca,-1, -1, 0xce,-1, 0,
225 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
226 0xe2,-1, 0, 0xea,-1, -1, 0xee,-1, 0,
227 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
228 0xc3,0, 0, 0, 0, 0, -1, 0, 0,
229 0, 0xd1,0xd5,0, 0, 0, -1, 0, 0, 0,
230 0xe3,0, 0, 0, 0, 0, -1, 0, 0,
231 0, 0xf1,0xf5,0, 0, 0, -1, 0, 0, 0,
232 -1, 0, 0, -1, 0, 0, -1, 0, 0,
233 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
234 -1, 0, 0, -1, 0, 0, -1, 0, 0,
235 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
236 -1, 0, 0, 0, -1, 0, 0, 0, 0,
237 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
238 -1, 0, 0, 0, -1, 0, 0, 0, 0,
239 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
240 0, -1, 0, -1, -1, 0, -1, 0, 0,
241 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
242 0, -1, 0, -1, -1, 0, 0, 0, 0,
243 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
244 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
245 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
246 0xe4,0, 0, 0xeb,0, 0, 0xef,0, 0,
247 0, 0, 0xf6,0, 0, 0, 0xfc,0, 0xff,0,
248 0, 0, 0, 0, 0, 0, 0, 0, 0,
249 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
250 0, 0, 0, 0, 0, 0, 0, 0, 0,
251 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
252 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
253 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
254 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
255 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
256 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
257 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
258 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
259 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
260 0, 0, 0, 0, 0, 0, 0, 0, 0,
261 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
262 0, 0, 0, 0, 0, 0, 0, 0, 0,
263 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
266 0, 0, 0, 0, 0, 0, 0, 0, 0,
267 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
268 -1, 0, 0, -1, 0, 0, -1, 0, 0,
269 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
270 -1, 0, 0, -1, 0, 0, -1, 0, 0,
271 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
272 0, -1, -1, -1, 0, 0, 0, 0, 0,
273 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
274 0, -1, -1, -1, 0, 0, 0, 0, 0,
275 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
276 #elif (ISO_8859 == 2)
277 0, 0, 0, 0, 0, 0, 0, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
281 -1, 0, 0, -1, 0, 0, -1, 0, 0,
282 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
283 -1, 0, 0, -1, 0, 0, -1, 0, 0,
284 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
285 0xc1,0xc6,0, 0xc9,0, 0, 0xcd,0, 0,
286 0xc5,0xd1,0xd3,0xc0,0xa6,0, 0xda,0, 0xdd,0xac,
287 0xe1,0xe6,0, 0xe9,0, 0, 0xed,0, 0,
288 0xe5,0xf1,0xf3,0xe0,0xb6,0, 0xfa,0, 0xfd,0xbc,
289 0xc2,-1, 0, -1, -1, -1, 0xce,-1, 0,
290 0, 0, 0xd4,0, -1, 0, -1, -1, -1, 0,
291 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
292 0, 0, 0xf4,0, -1, 0, -1, -1, -1, 0,
293 -1, 0, 0, 0, 0, 0, -1, 0, 0,
294 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
295 -1, 0, 0, 0, 0, 0, -1, 0, 0,
296 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
297 -1, 0, 0, -1, 0, 0, -1, 0, 0,
298 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
299 -1, 0, 0, -1, 0, 0, -1, 0, 0,
300 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
301 0xc3,0, 0, 0, -1, 0, 0, 0, 0,
302 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
303 0xe3,0, 0, 0, -1, 0, 0, 0, 0,
304 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
305 0, -1, 0, -1, -1, 0, -1, 0, 0,
306 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xaf,
307 0, -1, 0, -1, -1, 0, 0, 0, 0,
308 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xbf,
309 0xc4,0, 0, 0xcb,0, 0, -1, 0, 0,
310 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
311 0xe4,0, 0, 0xeb,0, 0, -1, 0, 0,
312 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
313 0, 0, 0, 0, 0, 0, 0, 0, 0,
314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
315 0, 0, 0, 0, 0, 0, 0, 0, 0,
316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
317 -1, 0, 0, 0, 0, 0, 0, 0, 0,
318 0, 0, 0, 0, 0, 0, 0xd9,0, 0, 0,
319 -1, 0, 0, 0, 0, 0, 0, 0, 0,
320 0, 0, 0, 0, 0, 0, 0xf9,0, 0, 0,
321 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
322 -1, -1, 0, -1, 0xaa,0xde,0, 0, 0, 0,
323 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
324 -1, -1, 0, -1, 0xba,0xfe,0, 0, 0, 0,
325 0, 0, 0, 0, 0, 0, 0, 0, 0,
326 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
327 0, 0, 0, 0, 0, 0, 0, 0, 0,
328 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
329 0, 0, 0, 0, 0, 0, 0, 0, 0,
330 0, 0, 0xd5,0, 0, 0, 0xdb,0, 0, 0,
331 0, 0, 0, 0, 0, 0, 0, 0, 0,
332 0, 0, 0xf5,0, 0, 0, 0xfb,0, 0, 0,
333 0xa1,0, 0, 0xca,0, 0, -1, 0, 0,
334 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
335 0xb1,0, 0, 0xea,0, 0, -1, 0, 0,
336 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
337 0, 0xc8,0xcf,0xcc,0, 0, 0, 0, 0,
338 0xa5,0xd2,0, 0xd8,0xa9,0xab,0, 0, 0, 0xae,
339 0, 0xe8,0xef,0xec,0, 0, 0, 0, 0,
340 0xb5,0xf2,0, 0xf8,0xb9,0xbb,0, 0, 0, 0xbe
341 #elif (ISO_8859 == 3)
342 0, 0, 0, 0, 0, 0, 0, 0, 0,
343 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
344 0, 0, 0, 0, 0, 0, 0, 0, 0,
345 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
346 0xc0,0, 0, 0xc8,0, 0, 0xcc,0, 0,
347 0, 0, 0xd2,0, 0, 0, 0xd9,0, 0, 0,
348 0xe0,0, 0, 0xe8,0, 0, 0xec,0, 0,
349 0, 0, 0xf2,0, 0, 0, 0xf9,0, 0, 0,
350 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
351 -1, -1, 0xd3,-1, -1, 0, 0xda,0, -1, -1,
352 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
353 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, -1, -1,
354 0xc2,0xc6,0, 0xca,0xd8,0xa6,0xce,0xac,0,
355 0, 0, 0xd4,0, 0xde,0, 0xdb,-1, -1, 0,
356 0xe2,0xe6,0, 0xea,0xf8,0xb6,0xee,0xbc,0,
357 0, 0, 0xf4,0, 0xfe,0, 0xfb,-1, -1, 0,
358 -1, 0, 0, 0, 0, 0, -1, 0, 0,
359 0, 0xd1,-1, 0, 0, 0, -1, 0, 0, 0,
360 -1, 0, 0, 0, 0, 0, -1, 0, 0,
361 0, 0xf1,-1, 0, 0, 0, -1, 0, 0, 0,
362 -1, 0, 0, -1, 0, 0, -1, 0, 0,
363 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
364 -1, 0, 0, -1, 0, 0, -1, 0, 0,
365 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
366 -1, 0, 0, 0, 0xab,0, 0, 0, 0,
367 0, 0, 0, 0, 0, 0, 0xdd,0, 0, 0,
368 -1, 0, 0, 0, 0xbb,0, 0, 0, 0,
369 0, 0, 0, 0, 0, 0, 0xfd,0, 0, 0,
370 0, 0xc5,0, -1, 0xd5,0, 0xa9,0, 0,
371 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xaf,
372 0, 0xe5,0, -1, 0xf5,0, 0, 0, 0,
373 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xbf,
374 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
375 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
376 0xe4,0, 0, 0xeb,0, 0, 0xef,0, 0,
377 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
378 0, 0, 0, 0, 0, 0, 0, 0, 0,
379 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
380 0, 0, 0, 0, 0, 0, 0, 0, 0,
381 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
382 -1, 0, 0, 0, 0, 0, 0, 0, 0,
383 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
384 -1, 0, 0, 0, 0, 0, 0, 0, 0,
385 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
386 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
387 -1, -1, 0, -1, 0xaa,-1, 0, 0, 0, 0,
388 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
389 -1, -1, 0, -1, 0xba,-1, 0, 0, 0, 0,
390 0, 0, 0, 0, 0, 0, 0, 0, 0,
391 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
392 0, 0, 0, 0, 0, 0, 0, 0, 0,
393 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
394 0, 0, 0, 0, 0, 0, 0, 0, 0,
395 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
396 0, 0, 0, 0, 0, 0, 0, 0, 0,
397 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
398 -1, 0, 0, -1, 0, 0, -1, 0, 0,
399 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
400 -1, 0, 0, -1, 0, 0, -1, 0, 0,
401 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
402 0, -1, -1, -1, 0, 0, 0, 0, 0,
403 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
404 0, -1, -1, -1, 0, 0, 0, 0, 0,
405 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
406 #elif (ISO_8859 == 4)
407 0, 0, 0, 0, 0, 0, 0, 0, 0,
408 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
409 0, 0, 0, 0, 0, 0, 0, 0, 0,
410 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
411 -1, 0, 0, -1, 0, 0, -1, 0, 0,
412 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
413 -1, 0, 0, -1, 0, 0, -1, 0, 0,
414 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
415 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
416 -1, -1, -1, -1, -1, 0, 0xda,0, -1, -1,
417 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
418 -1, -1, -1, -1, -1, 0, 0xfa,0, -1, -1,
419 0xc2,-1, 0, -1, -1, -1, 0xce,-1, 0,
420 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
421 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
422 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
423 0xc3,0, 0, 0, 0, 0, 0xa5,0, 0,
424 0, -1, 0xd5,0, 0, 0, 0xdd,0, 0, 0,
425 0xe3,0, 0, 0, 0, 0, 0xb5,0, 0,
426 0, -1, 0xf5,0, 0, 0, 0xfd,0, 0, 0,
427 0xc0,0, 0, 0xaa,0, 0, 0xcf,0, 0,
428 0, 0, 0xd2,0, 0, 0, 0xde,0, 0, 0,
429 0xe0,0, 0, 0xba,0, 0, 0xef,0, 0,
430 0, 0, 0xf2,0, 0, 0, 0xfe,0, 0, 0,
431 -1, 0, 0, 0, -1, 0, 0, 0, 0,
432 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
433 -1, 0, 0, 0, -1, 0, 0, 0, 0,
434 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
435 0, -1, 0, 0xcc,-1, 0, -1, 0, 0,
436 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
437 0, -1, 0, 0xec,-1, 0, 0, 0, 0,
438 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
439 0xc4,0, 0, 0xcb,0, 0, -1, 0, 0,
440 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
441 0xe4,0, 0, 0xeb,0, 0, -1, 0, 0,
442 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
443 0, 0, 0, 0, 0, 0, 0, 0, 0,
444 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
445 0, 0, 0, 0, 0, 0, 0, 0, 0,
446 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
448 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
449 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
450 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
451 0, -1, 0, 0, 0xab,0, 0, 0, 0xd3,
452 0xa6,0xd1,0, 0xa3,-1, -1, 0, 0, 0, 0,
453 0, -1, 0, 0, 0xbb,0, 0, 0, 0xf3,
454 0xb6,0xf1,0, 0xb3,-1, -1, 0, 0, 0, 0,
455 0, 0, 0, 0, 0, 0, 0, 0, 0,
456 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
457 0, 0, 0, 0, 0, 0, 0, 0, 0,
458 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
459 0, 0, 0, 0, 0, 0, 0, 0, 0,
460 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
461 0, 0, 0, 0, 0, 0, 0, 0, 0,
462 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
463 0xa1,0, 0, 0xca,0, 0, 0xc7,0, 0,
464 0, 0, 0, 0, 0, 0, 0xd9,0, 0, 0,
465 0xb1,0, 0, 0xea,0, 0, 0xe7,0, 0,
466 0, 0, 0, 0, 0, 0, 0xf9,0, 0, 0,
467 0, 0xc8,-1, -1, 0, 0, 0, 0, 0,
468 -1, -1, 0, -1, 0xa9,-1, 0, 0, 0, 0xae,
469 0, 0xe8,-1, -1, 0, 0, 0, 0, 0,
470 -1, -1, 0, -1, 0xb9,-1, 0, 0, 0, 0xbe
471 #elif (ISO_8859 == 9)
472 0, 0, 0, 0, 0, 0, 0, 0, 0,
473 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
474 0, 0, 0, 0, 0, 0, 0, 0, 0,
475 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
476 0xc0,0, 0, 0xc8,0, 0, 0xcc,0, 0,
477 0, 0, 0xd2,0, 0, 0, 0xd9,0, 0, 0,
478 0xe0,0, 0, 0xe8,0, 0, -1, 0, 0,
479 0, 0, 0xf2,0, 0, 0, 0xf9,0, 0, 0,
480 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
481 -1, -1, 0xd3,-1, -1, 0, 0xda,0, -1, -1,
482 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
483 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, -1, -1,
484 0xc2,-1, 0, 0xca,-1, -1, 0xce,-1, 0,
485 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
486 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
487 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
488 0xc3,0, 0, 0, 0, 0, -1, 0, 0,
489 0, 0xd1,0xd5,0, 0, 0, -1, 0, 0, 0,
490 0xe3,0, 0, 0, 0, 0, -1, 0, 0,
491 0, 0xf1,0xf5,0, 0, 0, -1, 0, 0, 0,
492 -1, 0, 0, -1, 0, 0, -1, 0, 0,
493 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
494 -1, 0, 0, -1, 0, 0, 0xef,0, 0,
495 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
496 -1, 0, 0, 0, 0xd0,0, 0, 0, 0,
497 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
498 -1, 0, 0, 0, 0xf0,0, 0, 0, 0,
499 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
500 0, -1, 0, -1, -1, 0, 0xdd,0, 0,
501 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
502 0, -1, 0, 0xec,-1, 0, 0, 0, 0,
503 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
504 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
505 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
506 0xe4,0, 0, 0xeb,0, 0, -1, 0, 0,
507 0, 0, 0xf6,0, 0, 0, 0xfc,0, 0xff,0,
508 0, 0, 0, 0, 0, 0, 0, 0, 0,
509 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
510 0, 0, 0, 0, 0, 0, 0, 0, 0,
511 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
512 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
513 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
514 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
515 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
516 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
517 -1, -1, 0, -1, 0xde,-1, 0, 0, 0, 0,
518 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
519 -1, -1, 0, -1, 0xfe,-1, 0, 0, 0, 0,
520 0, 0, 0, 0, 0, 0, 0, 0, 0,
521 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
522 0, 0, 0, 0, 0, 0, 0, 0, 0,
523 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
524 0, 0, 0, 0, 0, 0, 0, 0, 0,
525 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
526 0, 0, 0, 0, 0, 0, 0, 0, 0,
527 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
528 -1, 0, 0, -1, 0, 0, -1, 0, 0,
529 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
530 -1, 0, 0, 0xea,0, 0, -1, 0, 0,
531 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
532 0, -1, -1, -1, 0, 0, 0, 0, 0,
533 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
534 0, -1, -1, -1, 0, 0, 0, 0, 0,
535 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
536 #elif (ISO_8859 == 10)
537 0, 0, 0, 0, 0, 0, 0, 0, 0,
538 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
539 0, 0, 0, 0, 0, 0, 0, 0, 0,
540 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
541 -1, 0, 0, -1, 0, 0, -1, 0, 0,
542 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
543 -1, 0, 0, -1, 0, 0, -1, 0, 0,
544 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
545 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
546 -1, -1, 0xd3,-1, -1, 0, 0xda,0, 0xdd,-1,
547 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
548 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, 0xfd,-1,
549 0xc2,-1, 0, -1, -1, -1, 0xce,-1, 0,
550 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
551 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
552 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
553 0xc3,0, 0, 0, 0, 0, 0xa5,0, 0,
554 0, -1, 0xd5,0, 0, 0, 0xd7,0, 0, 0,
555 0xe3,0, 0, 0, 0, 0, 0xb5,0, 0,
556 0, -1, 0xf5,0, 0, 0, 0xf7,0, 0, 0,
557 0xc0,0, 0, 0xa2,0, 0, 0xa4,0, 0,
558 0, 0, 0xd2,0, 0, 0, 0xae,0, 0, 0,
559 0xe0,0, 0, 0xb2,0, 0, 0xb4,0, 0,
560 0, 0, 0xf2,0, 0, 0, 0xbe,0, 0, 0,
561 -1, 0, 0, 0, -1, 0, 0, 0, 0,
562 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
563 -1, 0, 0, 0, -1, 0, 0, 0, 0,
564 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
565 0, -1, 0, 0xcc,-1, 0, -1, 0, 0,
566 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
567 0, -1, 0, 0xec,-1, 0, 0, 0, 0,
568 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
569 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
570 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
571 0xe4,0, 0, 0xeb,0, 0, 0xef,0, 0,
572 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
573 0, 0, 0, 0, 0, 0, 0, 0, 0,
574 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
575 0, 0, 0, 0, 0, 0, 0, 0, 0,
576 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
577 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
578 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
579 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
580 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
581 0, -1, 0, 0, 0xa3,0, 0, 0, 0xa6,
582 0xa8,0xd1,0, -1, -1, -1, 0, 0, 0, 0,
583 0, -1, 0, 0, 0xb3,0, 0, 0, 0xb6,
584 0xb8,0xf1,0, -1, -1, -1, 0, 0, 0, 0,
585 0, 0, 0, 0, 0, 0, 0, 0, 0,
586 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
587 0, 0, 0, 0, 0, 0, 0, 0, 0,
588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
589 0, 0, 0, 0, 0, 0, 0, 0, 0,
590 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
591 0, 0, 0, 0, 0, 0, 0, 0, 0,
592 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
593 0xa1,0, 0, 0xca,0, 0, 0xc7,0, 0,
594 0, 0, 0, 0, 0, 0, 0xd9,0, 0, 0,
595 0xb1,0, 0, 0xea,0, 0, 0xe7,0, 0,
596 0, 0, 0, 0, 0, 0, 0xf9,0, 0, 0,
597 0, 0xc8,-1, -1, 0, 0, 0, 0, 0,
598 -1, -1, 0, -1, 0xaa,-1, 0, 0, 0, 0xac,
599 0, 0xe8,-1, -1, 0, 0, 0, 0, 0,
600 -1, -1, 0, -1, 0xba,-1, 0, 0, 0, 0xbc
602 0, 0, 0, 0, 0, 0, 0, 0, 0,
603 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
604 0, 0, 0, 0, 0, 0, 0, 0, 0,
605 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
606 -1, 0, 0, -1, 0, 0, -1, 0, 0,
607 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
608 -1, 0, 0, -1, 0, 0, -1, 0, 0,
609 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
610 -1, -1, 0, -1, 0, 0, -1, 0, 0,
611 -1, -1, -1, -1, -1, 0, -1, 0, -1, -1,
612 -1, -1, 0, -1, 0, 0, -1, 0, 0,
613 -1, -1, -1, -1, -1, 0, -1, 0, -1, -1,
614 -1, -1, 0, -1, -1, -1, -1, -1, 0,
615 0, 0, -1, 0, -1, 0, -1, -1, -1, 0,
616 -1, -1, 0, -1, -1, -1, -1, -1, 0,
617 0, 0, -1, 0, -1, 0, -1, -1, -1, 0,
618 -1, 0, 0, 0, 0, 0, -1, 0, 0,
619 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
620 -1, 0, 0, 0, 0, 0, -1, 0, 0,
621 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
622 -1, 0, 0, -1, 0, 0, -1, 0, 0,
623 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
624 -1, 0, 0, -1, 0, 0, -1, 0, 0,
625 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
626 -1, 0, 0, 0, -1, 0, 0, 0, 0,
627 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
628 -1, 0, 0, 0, -1, 0, 0, 0, 0,
629 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
630 0, -1, 0, -1, -1, 0, -1, 0, 0,
631 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
632 0, -1, 0, -1, -1, 0, 0, 0, 0,
633 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
634 -1, 0, 0, -1, 0, 0, -1, 0, 0,
635 0, 0, -1, 0, 0, 0, -1, 0, -1, 0,
636 -1, 0, 0, -1, 0, 0, -1, 0, 0,
637 0, 0, -1, 0, 0, 0, -1, 0, -1, 0,
638 0, 0, 0, 0, 0, 0, 0, 0, 0,
639 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
640 0, 0, 0, 0, 0, 0, 0, 0, 0,
641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
642 -1, 0, 0, 0, 0, 0, 0, 0, 0,
643 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
644 -1, 0, 0, 0, 0, 0, 0, 0, 0,
645 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
646 0, -1, 0, 0, -1, 0, 0, 0, -1,
647 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
648 0, -1, 0, 0, -1, 0, 0, 0, -1,
649 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
650 0, 0, 0, 0, 0, 0, 0, 0, 0,
651 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
652 0, 0, 0, 0, 0, 0, 0, 0, 0,
653 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
654 0, 0, 0, 0, 0, 0, 0, 0, 0,
655 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
656 0, 0, 0, 0, 0, 0, 0, 0, 0,
657 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
658 -1, 0, 0, -1, 0, 0, -1, 0, 0,
659 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
660 -1, 0, 0, -1, 0, 0, -1, 0, 0,
661 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
662 0, -1, -1, -1, 0, 0, 0, 0, 0,
663 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
664 0, -1, -1, -1, 0, 0, 0, 0, 0,
665 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
670 --- T.61 characters [0xA0 .. 0xBF] -----------------
672 static Couple trans_t61a_iso8859[32] = {
673 #if (ISO_8859 == 1) || (ISO_8859 == 9)
674 {'N','S'}, {0xa1,0}, {0xa2,0}, {0xa3,0},
675 {'D','O'}, {0xa5,0}, {'C','u'}, {0xa7,0},
676 {0xa4,0}, {'\'','6'},{'"','6'}, {0xab,0},
677 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
678 {0xb0,0}, {0xb1,0}, {0xb2,0}, {0xb3,0},
679 {0xd7,0}, {0xb5,0}, {0xb6,0}, {0xb7,0},
680 {0xf7,0}, {'\'','9'},{'"','9'}, {0xbb,0},
681 {0xbc,0}, {0xbd,0}, {0xbe,0}, {0xbf,0}
682 #elif (ISO_8859 == 2) || (ISO_8859 == 4)
683 {'N','S'}, {'!','I'}, {'C','t'}, {'P','d'},
684 {'D','O'}, {'Y','e'}, {'C','u'}, {0xa7,0},
685 {0xa4,0}, {'\'','6'},{'"','6'}, {'<','<'},
686 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
687 {0xb0,0}, {'+','-'}, {'2','S'}, {'3','S'},
688 {0xd7,0}, {'M','y'}, {'P','I'}, {'.','M'},
689 {0xf7,0}, {'\'','9'},{'"','9'}, {'>','>'},
690 {'1','4'}, {'1','2'}, {'3','4'}, {'?','I'},
691 #elif (ISO_8859 == 3)
692 {'N','S'}, {'!','I'}, {'C','t'}, {0xa3,0},
693 {'D','O'}, {'Y','e'}, {'C','u'}, {0xa7,0},
694 {0xa4,0}, {'\'','6'},{'"','6'}, {'<','<'},
695 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
696 {0xb0,0}, {'+','-'}, {0xb2,0}, {0xb3,0},
697 {0xd7,0}, {0xb5,0}, {'P','I'}, {0xb7,0},
698 {0xf7,0}, {'\'','9'},{'"','9'}, {'>','>'},
699 {'1','4'}, {0xbd,0}, {'3','4'}, {'?','I'}
700 #elif (ISO_8859 == 10)
701 {'N','S'}, {'!','I'}, {'C','t'}, {'P','d'},
702 {'D','O'}, {'Y','e'}, {'C','u'}, {0xa7,0},
703 {'C','u'}, {'\'','6'},{'"','6'}, {'<','<'},
704 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
705 {0xb0,0}, {'+','-'}, {'2','S'}, {'3','S'},
706 {'*','X'}, {'M','y'}, {'P','I'}, {0xb7,0},
707 {'-',':'}, {'\'','9'},{'"','9'}, {'>','>'},
708 {'1','4'}, {'1','2'}, {'3','4'}, {'?','I'}
710 {'N','S'}, {'!','I'}, {'C','t'}, {'P','d'},
711 {'D','O'}, {'Y','e'}, {'C','u'}, {'S','E'},
712 {'X','O'}, {'\'','6'},{'"','6'}, {'<','<'},
713 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
714 {'D','G'}, {'+','-'}, {'2','S'}, {'3','S'},
715 {'*','X'}, {'M','y'}, {'P','I'}, {'.','M'},
716 {'-',':'}, {'\'','9'},{'"','9'}, {'>','>'},
717 {'1','4'}, {'1','2'}, {'3','4'}, {'?','I'}
722 --- T.61 characters [0xE0 .. 0xFF] -----------------
724 static Couple trans_t61b_iso8859[48] = {
726 {'-','M'}, {0xb9,0}, {0xae,0}, {0xa9,0},
727 {'T','M'}, {'M','8'}, {0xac,0}, {0xa6,0},
728 {0,0}, {0,0}, {0,0}, {0,0},
729 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
730 {'O','m'}, {0xc6,0}, {0xd0,0}, {0xaa,0},
731 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
732 {'L','/'}, {0xd8,0}, {'O','E'}, {0xba,0},
733 {0xde,0}, {'T','/'}, {'N','G'}, {'\'','n'},
734 {'k','k'}, {0xe6,0}, {'d','/'}, {0xf0,0},
735 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
736 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
737 {0xfe,0}, {'t','/'}, {'n','g'}, {'-','-'}
738 #elif (ISO_8859 == 2)
739 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
740 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
741 {0,0}, {0,0}, {0,0}, {0,0},
742 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
743 {'O','m'}, {'A','E'}, {0xd0,0}, {'-','a'},
744 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
745 {0xa3,0}, {'O','/'}, {'O','E'}, {'-','o'},
746 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
747 {'k','k'}, {'a','e'}, {0xf0,0}, {'d','-'},
748 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
749 {0xb3,0}, {'o','/'}, {'o','e'}, {0xdf,0},
750 {'t','h'}, {'t','/'}, {'n','g'}, {'-','-'}
751 #elif (ISO_8859 == 3)
752 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
753 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
754 {0,0}, {0,0}, {0,0}, {0,0},
755 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
756 {'O','m'}, {'A','E'}, {'D','/'}, {'-','a'},
757 {0xa1,0}, {0,0}, {'I','J'}, {'L','.'},
758 {'L','/'}, {'O','/'}, {'O','E'}, {'-','o'},
759 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
760 {'k','k'}, {'a','e'}, {'d','/'}, {'d','-'},
761 {0xb1,0}, {0xb9,0}, {'i','j'}, {'l','.'},
762 {'l','/'}, {'o','/'}, {'o','e'}, {0xdf,0},
763 {'t','h'}, {'t','/'}, {'n','g'}, {'-','-'}
764 #elif (ISO_8859 == 4)
765 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
766 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
767 {0,0}, {0,0}, {0,0}, {0,0},
768 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
769 {'O','m'}, {0xc6,0}, {0xd0,0}, {'-','a'},
770 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
771 {'L','/'}, {0xd8,0}, {'O','E'}, {'-','o'},
772 {'T','H'}, {0xac,0}, {0xbd,0}, {'\'','n'},
773 {0xa2,0}, {0xe6,0}, {0xf0,0}, {'d','-'},
774 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
775 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
776 {'t','h'}, {0xbc,0}, {0xbf,0}, {'-','-'}
777 #elif (ISO_8859 == 9)
778 {'-','M'}, {0xb9,0}, {0xae,0}, {0xa9,0},
779 {'T','M'}, {'M','8'}, {0xac,0}, {0xa6,0},
780 {0,0}, {0,0}, {0,0}, {0,0},
781 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
782 {'O','m'}, {0xc6,0}, {'D','/'}, {0xaa,0},
783 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
784 {'L','/'}, {0xd8,0}, {'O','E'}, {0xba,0},
785 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
786 {'k','k'}, {0xe6,0}, {'d','/'}, {'d','-'},
787 {'h','/'}, {0xfd,0}, {'i','j'}, {'l','.'},
788 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
789 {'t','h'}, {'t','/'}, {'n','g'}, {'-','-'}
790 #elif (ISO_8859 == 10)
791 {0xbd,0}, {'1','S'}, {'R','g'}, {'C','o'},
792 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
793 {0,0}, {0,0}, {0,0}, {0,0},
794 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
795 {'O','m'}, {0xc6,0}, {0xa9,0}, {'-','a'},
796 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
797 {'L','/'}, {0xd8,0}, {'O','E'}, {'-','o'},
798 {0xde,0}, {0xab,0}, {0xaf,0}, {'\'','n'},
799 {0xff,0}, {0xe6,0}, {0xb9,0}, {0xf0,0},
800 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
801 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
802 {0xfe,0}, {0xbb,0}, {0xbf,0}, {'-','-'}
804 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
805 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
806 {0,0}, {0,0}, {0,0}, {0,0},
807 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
808 {'O','m'}, {'A','E'}, {'D','/'}, {'-','a'},
809 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
810 {'L','/'}, {'O','/'}, {'O','E'}, {'-','o'},
811 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
812 {'k','k'}, {'a','e'}, {'d','/'}, {'d','-'},
813 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
814 {'l','/'}, {'o','/'}, {'o','e'}, {'s','s'},
815 {'t','h'}, {'t','-'}, {'n','g'}, {'-','-'}
820 --- ISO 8859-n characters <0xA0 .. 0xFF> -------------------
823 static Couple trans_iso8859_t61[96] = {
824 {0xa0,0}, {0xa1,0}, {0xa2,0}, {0xa3,0},
825 {0xa8,0}, {0xa5,0}, {0xd7,0}, {0xa7,0},
826 {0xc8,ALONE}, {0xd3,0}, {0xe3,0}, {0xab,0},
827 {0xd6,0}, {0xff,0}, {0xd2,0}, {0xc5,ALONE},
828 {0xb0,0}, {0xb1,0}, {0xb2,0}, {0xb3,0},
829 {0xc2,ALONE}, {0xb5,0}, {0xb6,0}, {0xb7,0},
830 {0xcb,ALONE}, {0xd1,0}, {0xeb,0}, {0xbb,0},
831 {0xbc,0}, {0xbd,0}, {0xbe,0}, {0xbf,0},
832 {0xc1,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
833 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xcb,'C'},
834 {0xc1,'E'}, {0xc2,'E'}, {0xc3,'E'}, {0xc8,'E'},
835 {0xc1,'I'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
836 {0xe2,0}, {0xc4,'N'}, {0xc1,'O'}, {0xc2,'O'},
837 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xb4,0},
838 {0xe9,0}, {0xc1,'U'}, {0xc2,'U'}, {0xc3,'U'},
839 {0xc8,'U'}, {0xc2,'Y'}, {0xec,0}, {0xfb,0},
840 {0xc1,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
841 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xcb,'c'},
842 {0xc1,'e'}, {0xc2,'e'}, {0xc3,'e'}, {0xc8,'e'},
843 {0xc1,'i'}, {0xc2,'i'}, {0xc3,'i'}, {0xc8,'i'},
844 {0xf3,0}, {0xc4,'n'}, {0xc1,'o'}, {0xc2,'o'},
845 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xb8,0},
846 {0xf9,0}, {0xc1,'u'}, {0xc2,'u'}, {0xc3,'u'},
847 {0xc8,'u'}, {0xc2,'y'}, {0xfc,0}, {0xc8,'y'}
849 #elif (ISO_8859 == 2)
850 static Couple trans_iso8859_t61[96] = {
851 {0xa0,0}, {0xce,'A'}, {0xc6,ALONE}, {0xe8,0},
852 {0xa8,0}, {0xcf,'L'}, {0xc2,'S'}, {0xa7,0},
853 {0xc8,ALONE}, {0xcf,'S'}, {0xcb,'S'}, {0xcf,'T'},
854 {0xc2,'Z'}, {0xff,0}, {0xcf,'Z'}, {0xc7,'Z'},
855 {0xb0,0}, {0xce,'a'}, {0xce,ALONE}, {0xf8,0},
856 {0xc2,ALONE}, {0xcf,'l'}, {0xc2,'s'}, {0xcf,ALONE},
857 {0xcb,ALONE}, {0xcf,'s'}, {0xcb,'s'}, {0xcf,'t'},
858 {0xc2,'z'}, {0xcd,ALONE}, {0xcf,'z'}, {0xc7,'z'},
859 {0xc2,'R'}, {0xc2,'A'}, {0xc3,'A'}, {0xc6,'A'},
860 {0xc8,'A'}, {0xc2,'L'}, {0xc2,'C'}, {0xcb,'C'},
861 {0xcf,'C'}, {0xc2,'E'}, {0xce,'E'}, {0xc8,'E'},
862 {0xcf,'E'}, {0xc2,'I'}, {0xc3,'I'}, {0xcf,'D'},
863 {0xe2,0}, {0xc2,'N'}, {0xcf,'N'}, {0xc2,'O'},
864 {0xc3,'O'}, {0xcd,'O'}, {0xc8,'O'}, {0xb4,0},
865 {0xcf,'R'}, {0xca,'U'}, {0xc2,'U'}, {0xcd,'U'},
866 {0xc8,'U'}, {0xc2,'Y'}, {0xcb,'T'}, {0xfb,0},
867 {0xc2,'r'}, {0xc2,'a'}, {0xc3,'a'}, {0xc6,'a'},
868 {0xc8,'a'}, {0xc2,'l'}, {0xc2,'c'}, {0xcb,'c'},
869 {0xcf,'c'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
870 {0xcf,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xcf,'d'},
871 {0xf2,0}, {0xc2,'n'}, {0xcf,'n'}, {0xc2,'o'},
872 {0xc3,'o'}, {0xcd,'o'}, {0xc8,'o'}, {0xb8,0},
873 {0xcf,'r'}, {0xca,'u'}, {0xc2,'u'}, {0xcd,'u'},
874 {0xc8,'u'}, {0xc2,'y'}, {0xcb,'t'}, {0xc7,ALONE}
876 #elif (ISO_8859 == 3)
877 static Couple trans_iso8859_t61[96] = {
878 {0xa0,0}, {0xe4,0}, {0xc6,ALONE}, {0xa3,0},
879 {0xa8,0}, {0,0}, {0xc3,'H'}, {0xa7,0},
880 {0xc8,ALONE}, {0xc7,'I'}, {0xcb,'S'}, {0xc6,'G'},
881 {0xc3,'J'}, {0xff,0}, {0,0}, {0xc7,'Z'},
882 {0xb0,0}, {0xf4,0}, {0xb2,0}, {0xb3,0},
883 {0xc2,ALONE}, {0xb5,0}, {0xc3,'h'}, {0xb7,0},
884 {0xcb,ALONE}, {0xf5,0}, {0xcb,'s'}, {0xc6,'g'},
885 {0xc3,'j'}, {0xbd,0}, {0,0}, {0xc7,'z'},
886 {0xc1,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0,0},
887 {0xc8,'A'}, {0xc7,'C'}, {0xc3,'C'}, {0xcb,'C'},
888 {0xc1,'E'}, {0xc2,'E'}, {0xc3,'E'}, {0xc8,'E'},
889 {0xc1,'I'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
890 {0,0}, {0xc4,'N'}, {0xc1,'O'}, {0xc2,'O'},
891 {0xc3,'O'}, {0xc7,'G'}, {0xc8,'O'}, {0xb4,0},
892 {0xc3,'G'}, {0xc1,'U'}, {0xc2,'U'}, {0xc3,'U'},
893 {0xc8,'U'}, {0xc6,'U'}, {0xc3,'S'}, {0xfb,0},
894 {0xc1,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0,0},
895 {0xc8,'a'}, {0xc7,'c'}, {0xc3,'c'}, {0xcb,'c'},
896 {0xc1,'e'}, {0xc2,'e'}, {0xc3,'e'}, {0xc8,'e'},
897 {0xc1,'i'}, {0xc2,'i'}, {0xc3,'i'}, {0xc8,'i'},
898 {0,0}, {0xc4,'n'}, {0xc1,'o'}, {0xc2,'o'},
899 {0xc3,'o'}, {0xc7,'g'}, {0xc8,'o'}, {0xb8,0},
900 {0xc3,'g'}, {0xc1,'u'}, {0xc2,'u'}, {0xc3,'u'},
901 {0xc8,'u'}, {0xc6,'u'}, {0xc3,'s'}, {0xc7,ALONE}
903 #elif (ISO_8859 == 4)
904 static Couple trans_iso8859_t61[96] = {
905 {0xa0,0}, {0xce,'A'}, {0xf0,0}, {0xcb,'R'},
906 {0xa8,0}, {0xc4,'I'}, {0xcb,'L'}, {0xa7,0},
907 {0xc8,ALONE}, {0xcf,'S'}, {0xc5,'E'}, {0xcb,'G'},
908 {0xed,0}, {0xff,0}, {0xcf,'Z'}, {0xc5,ALONE},
909 {0xb0,0}, {0xce,'a'}, {0xce,ALONE}, {0xcb,'r'},
910 {0xc2,ALONE}, {0xc4,'i'}, {0xcb,'l'}, {0xcf,ALONE},
911 {0xcb,ALONE}, {0xcf,'s'}, {0xc5,'e'}, {0xcb,'g'},
912 {0xfd,0}, {0xee,0}, {0xcf,'z'}, {0xfe,0},
913 {0xc5,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
914 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xce,'I'},
915 {0xcf,'C'}, {0xc2,'E'}, {0xce,'E'}, {0xc8,'E'},
916 {0xc7,'E'}, {0xc2,'I'}, {0xc3,'I'}, {0xc5,'I'},
917 {0xe2,0}, {0xcb,'N'}, {0xc5,'O'}, {0xcb,'K'},
918 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xb4,0},
919 {0xe9,0}, {0xce,'U'}, {0xc2,'U'}, {0xc3,'U'},
920 {0xc8,'U'}, {0xc4,'U'}, {0xc5,'U'}, {0xfb,0},
921 {0xc5,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
922 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xce,'i'},
923 {0xcf,'c'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
924 {0xc7,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xc5,'i'},
925 {0xf2,0}, {0xcb,'n'}, {0xc5,'o'}, {0xcb,'k'},
926 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xb8,0},
927 {0xf9,0}, {0xce,'u'}, {0xc2,'u'}, {0xc3,'u'},
928 {0xc8,'u'}, {0xc4,'u'}, {0xc5,'u'}, {0xc7,ALONE}
930 #elif (ISO_8859 == 9)
931 static Couple trans_iso8859_t61[96] = {
932 {0xa0,0}, {0xa1,0}, {0xa2,0}, {0xa3,0},
933 {0xa8,0}, {0xa5,0}, {0xd7,0}, {0xa7,0},
934 {0xc8,ALONE}, {0xd3,0}, {0xe3,0}, {0xab,0},
935 {0xd6,0}, {0xff,0}, {0xd2,0}, {0xc5,ALONE},
936 {0xb0,0}, {0xb1,0}, {0xb2,0}, {0xb3,0},
937 {0xc2,ALONE}, {0xb5,0}, {0xb6,0}, {0xb7,0},
938 {0xcb,ALONE}, {0xd1,0}, {0xeb,0}, {0xbb,0},
939 {0xbc,0}, {0xbd,0}, {0xbe,0}, {0xbf,0},
940 {0xc1,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
941 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xcb,'C'},
942 {0xc1,'E'}, {0xc2,'E'}, {0xc3,'E'}, {0xc8,'E'},
943 {0xc1,'I'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
944 {0xc6,'G'}, {0xc4,'N'}, {0xc1,'O'}, {0xc2,'O'},
945 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xb4,0},
946 {0xe9,0}, {0xc1,'U'}, {0xc2,'U'}, {0xc3,'U'},
947 {0xc8,'U'}, {0xc7,'I'}, {0xcb,'S'}, {0xfb,0},
948 {0xc1,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
949 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xcb,'c'},
950 {0xc1,'e'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
951 {0xc7,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xc5,'i'},
952 {0xc6,'g'}, {0xc4,'n'}, {0xc1,'o'}, {0xc2,'o'},
953 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xb8,0},
954 {0xf9,0}, {0xc1,'u'}, {0xc2,'u'}, {0xc3,'u'},
955 {0xc8,'u'}, {0xf5,0}, {0xcb,'s'}, {0xc8,'y'}
957 #elif (ISO_8859 == 10)
958 static Couple trans_iso8859_t61[96] = {
959 {0xa0,0}, {0xce,'A'}, {0xc5,'E'}, {0xcb,'G'},
960 {0xc5,'I'}, {0xc4,'I'}, {0xcb,'K'}, {0xa7,0},
961 {0xcb,'L'}, {0xe2,0}, {0xcf,'S'}, {0xed,0},
962 {0xcf,'Z'}, {0xff,0}, {0xc5,'U'}, {0xee,0},
963 {0xb0,0}, {0xce,'a'}, {0xc5,'e'}, {0xcb,'g'},
964 {0xc5,'i'}, {0xc4,'i'}, {0xcb,'k'}, {0xb7,0},
965 {0xcb,'l'}, {0xf2,0}, {0xcf,'s'}, {0xfd,0},
966 {0xcf,'z'}, {0xd0,0}, {0xc5,'u'}, {0xfe,0},
967 {0xc5,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
968 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xce,'I'},
969 {0xcf,'C'}, {0xc2,'E'}, {0xce,'E'}, {0xc8,'E'},
970 {0xc7,'E'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
971 {0,0}, {0xcb,'N'}, {0xc5,'O'}, {0xc2,'O'},
972 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xc4,'U'},
973 {0xe9,0}, {0xce,'U'}, {0xc2,'U'}, {0xc3,'U'},
974 {0xc8,'U'}, {0xc2,'Y'}, {0xec,0}, {0xfb,0},
975 {0xc5,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
976 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xce,'i'},
977 {0xcf,'c'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
978 {0xc7,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xc8,'i'},
979 {0xf3,0}, {0xcb,'n'}, {0xc5,'o'}, {0xc2,'o'},
980 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xc4,'u'},
981 {0xf9,0}, {0xce,'u'}, {0xc2,'u'}, {0xc3,'u'},
982 {0xc8,'u'}, {0xc2,'y'}, {0xfc,0}, {0xf0,0}
988 c_to_hh( Byte *o, Byte c )
992 *o++ = '{'; *o++ = 'x';
994 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
996 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
1003 c_to_cc( Byte *o, Couple *cc, Byte c )
1005 if ( (*cc).a != 0 ) {
1017 return c_to_hh( o, c );
1020 /* --- routine to convert from T.61 to ISO 8859-n --- */
1023 ldap_t61_to_8859( char **bufp, unsigned long *buflenp, int free_input )
1031 Debug( LDAP_DEBUG_TRACE, "ldap_t61_to_8859 input length: %ld\n",
1037 if ( (o = oo = (Byte *)malloc( 2 * len + 64 )) == NULL ) {
1041 while ( (char *)s - *(char **)bufp < len ) {
1042 switch ( *s >> 4 ) {
1045 o = c_to_cc( o, &trans_t61a_iso8859[ *s - 0xA0 ], *s );
1049 case 0xD: case 0xE: case 0xF:
1050 o = c_to_cc( o, &trans_t61b_iso8859[ *s - 0xD0 ], *s );
1055 if ( (*s == 0xC0) || (*s == 0xC9) || (*s == 0xCC) ) {
1056 o = c_to_hh( o, *s++ );
1063 case 'A': c = letter_w_diacritic[n][0]; break;
1064 case 'C': c = letter_w_diacritic[n][1]; break;
1065 case 'D': c = letter_w_diacritic[n][2]; break;
1066 case 'E': c = letter_w_diacritic[n][3]; break;
1067 case 'G': c = letter_w_diacritic[n][4]; break;
1068 case 'H': c = letter_w_diacritic[n][5]; break;
1069 case 'I': c = letter_w_diacritic[n][6]; break;
1070 case 'J': c = letter_w_diacritic[n][7]; break;
1071 case 'K': c = letter_w_diacritic[n][8]; break;
1072 case 'L': c = letter_w_diacritic[n][9]; break;
1073 case 'N': c = letter_w_diacritic[n][10]; break;
1074 case 'O': c = letter_w_diacritic[n][11]; break;
1075 case 'R': c = letter_w_diacritic[n][12]; break;
1076 case 'S': c = letter_w_diacritic[n][13]; break;
1077 case 'T': c = letter_w_diacritic[n][14]; break;
1078 case 'U': c = letter_w_diacritic[n][15]; break;
1079 case 'W': c = letter_w_diacritic[n][16]; break;
1080 case 'Y': c = letter_w_diacritic[n][17]; break;
1081 case 'Z': c = letter_w_diacritic[n][18]; break;
1083 case 'a': c = letter_w_diacritic[n][19]; break;
1084 case 'c': c = letter_w_diacritic[n][20]; break;
1085 case 'd': c = letter_w_diacritic[n][21]; break;
1086 case 'e': c = letter_w_diacritic[n][22]; break;
1087 case 'g': c = letter_w_diacritic[n][23]; break;
1088 case 'h': c = letter_w_diacritic[n][24]; break;
1089 case 'i': c = letter_w_diacritic[n][25]; break;
1090 case 'j': c = letter_w_diacritic[n][26]; break;
1091 case 'k': c = letter_w_diacritic[n][27]; break;
1092 case 'l': c = letter_w_diacritic[n][28]; break;
1093 case 'n': c = letter_w_diacritic[n][29]; break;
1094 case 'o': c = letter_w_diacritic[n][30]; break;
1095 case 'r': c = letter_w_diacritic[n][31]; break;
1096 case 's': c = letter_w_diacritic[n][32]; break;
1097 case 't': c = letter_w_diacritic[n][33]; break;
1098 case 'u': c = letter_w_diacritic[n][34]; break;
1099 case 'w': c = letter_w_diacritic[n][35]; break;
1100 case 'y': c = letter_w_diacritic[n][36]; break;
1101 case 'z': c = letter_w_diacritic[n][37]; break;
1103 case ALONE: c = (( !diacritic[n].b ) ? diacritic[n].a : -1);
1114 *o++ = ( ( *s == ALONE ) ? ' ' : *s );
1119 *o++ = diacritic[n].a;
1126 *o++ = 0x1B; /* <ESC> */
1139 if ( (oo = (Byte *)realloc( o, len )) == NULL ) {
1147 *bufp = (char *) oo;
1158 if ( (*h >= '0') && (*h <= '9') ) c = *h++ - '0';
1159 else if ( (*h >= 'A') && (*h <= 'F') ) c = *h++ - 'A' + 10;
1160 else if ( (*h >= 'a') && (*h <= 'f') ) c = *h++ - 'a' + 10;
1165 if ( (*h >= '0') && (*h <= '9') ) c |= *h - '0';
1166 else if ( (*h >= 'A') && (*h <= 'F') ) c |= *h - 'A' + 10;
1167 else if ( (*h >= 'a') && (*h <= 'f') ) c |= *h - 'a' + 10;
1175 cc_to_t61( Byte *o, Byte *s )
1179 switch ( *(s + 1) ) {
1181 case '`': c = -1; break; /* <grave-accent> */
1185 case '!': c = 0x7C; break; /* <vertical-line> */
1186 case '(': c = 0x7B; break; /* <left-curly-bracket> */
1187 case '-': c = 0xAD; break; /* <upwards-arrow> */
1188 default: c = -1; /* <grave-accent> */
1192 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1193 (ISO_8859 == 4) || (ISO_8859 == 9)
1196 case '\'': c = -2; break; /* <acute-accent> */
1198 case '^': c = -3; break; /* <circumflex-acent> */
1202 case ')': c = 0x5D; break; /* <right-square-bracket> */
1203 case '>': c = 0xBB; break; /* <right-angle-quotation> */
1204 case '-': c = 0xAE; break; /* <rightwards-arrow> */
1205 default: c = -3; /* <circumflex-acent> */
1210 case '?': c = -4; break; /* <tilde> */
1212 #if (ISO_8859 == 1) || (ISO_8859 == 4) || (ISO_8859 == 9)
1213 case 0xAF: c = -5; break; /* <macron> */
1218 case '-': c = 0xFF; break; /* <soft-hyphen> */
1219 case '<': c = 0xAC; break; /* <leftwards arrow> */
1220 case '+': c = 0xB1; break; /* <plus-minus> */
1221 case 'd': c = 0xF3; break; /* <eth> */
1222 default: c = -5; /* <macron> */
1226 #if (ISO_8859 == 2) || (ISO_8859 == 3)
1227 case 0xA2: c = -6; break; /* <breve> */
1231 if ( *s == '<' ) c = 0x5B; /* <left-square-bracket> */
1232 else c = -6; /* <breve> */
1235 #if (ISO_8859 == 2) || (ISO_8859 == 3) || (ISO_8859 == 4)
1236 case 0xFF: c = -7; break; /* <dot-accent> */
1241 case 'i': c = 0xF5; break; /* <dotless-i> */
1242 case 'L': c = 0xE7; break; /* <L-middle-dot> */
1243 case 'l': c = 0xF7; break; /* <l-middle-dot> */
1244 default: c = -7; /* <dot-accent> */
1248 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1249 (ISO_8859 == 4) || (ISO_8859 == 9)
1250 case 0xA8: c = -8; break; /* <diaeresis> */
1254 if ( *s == '-') c = 0xB8; /* <division-sign> */
1255 else c = -8; /* <diaeresis> */
1258 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1259 (ISO_8859 == 4) || (ISO_8859 == 9) || (ISO_8859 == 10)
1262 case '0': c = -10; break; /* <ring-above> */
1264 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1265 (ISO_8859 == 4) || (ISO_8859 == 9)
1268 case ',': c = -11; break; /* <cedilla> */
1273 case '"': c = -13; break; /* <double-acute-accent> */
1275 #if (ISO_8859 == 2) || (ISO_8859 == 4)
1278 case ';': c = -14; break; /* <ogonek> */
1280 #if (ISO_8859 == 2) || (ISO_8859 == 4)
1281 case 0xB7: c = -15; break; /* <caron> */
1285 if ( *s == '!' ) c = 0x7D; /* <left-curly-bracket> */
1289 if ( *s == '<' ) c = 0xAB; /* <left-angle-quotation> */
1290 else c = -15; /* <caron> */
1295 case '/': c = 0x5C; break; /* <reverse-solidus> */
1296 case 'D': c = 0xE2; break; /* <D-stroke> */
1297 case 'd': c = 0xF2; break; /* <d-stroke> */
1298 case 'H': c = 0xE4; break; /* <H-stroke> */
1299 case 'h': c = 0xF4; break; /* <h-stroke> */
1300 case 'L': c = 0xE8; break; /* <L-stroke> */
1301 case 'l': c = 0xF8; break; /* <l-stroke> */
1302 case 'O': c = 0xE9; break; /* <O-stroke> */
1303 case 'o': c = 0xF9; break; /* <o-stroke> */
1304 case 'T': c = 0xED; break; /* <T-stroke> */
1305 case 't': c = 0xFD; break; /* <t-stroke> */
1310 if ( *s == '1' ) c = 0xBD; /* <one-half> */
1315 case '1': c = 0xBC; break; /* <one-quarter> */
1316 case '3': c = 0xBE; break; /* <three-quarters> */
1322 case '\'': c = 0xA9; break; /* <left-single-quotation> */
1323 case '"': c = 0xAA; break; /* <left-double-quotation> */
1329 case '1': c = 0xDC; break; /* <one-eighth> */
1330 case '3': c = 0xDD; break; /* <three-eighths> */
1331 case '5': c = 0xDE; break; /* <five-eighths> */
1332 case '7': c = 0xDF; break; /* <seven-eighths> */
1333 case 'M': c = 0xD5; break; /* <eighth-note> */
1339 case '\'': c = 0xB9; break; /* <right-single-quotation> */
1340 case '"': c = 0xBA; break; /* <right-double-quotation> */
1345 if ( *s == 'A' ) c = -10; /* <ring-above> + <A> */
1350 case '-': c = 0xE3; break; /* <femenine-ordinal-a> */
1351 case 'a': c = -10; break; /* <ring-above> + <a> */
1356 if ( *s == 'B' ) c = 0xD7; /* <broken-bar> */
1360 if ( *s == 'N' ) c = 0xA6; /* <number-sign> */
1364 if ( *s == 'P' ) c = 0xA3; /* <pound-sign> */
1369 case 'S': c = 0xA7; break; /* <section-sign> */
1370 case 'A': c = 0xE1; break; /* <AE> */
1371 case 'O': c = 0xEA; break; /* <OE> */
1377 case 'a': c = 0xF1; break; /* <ae> */
1378 case 'o': c = 0xFA; break; /* <oe> */
1379 case 'Y': c = 0xA5; break; /* <yen-sign> */
1385 case 'D': c = 0xB0; break; /* <degree-sign> */
1386 case 'N': c = 0xEE; break; /* <Eng> */
1392 case 'R': c = 0xD2; break; /* <registered-sign> */
1393 case 'n': c = 0xFE; break; /* <eng> */
1398 if ( *s == 'T' ) c = 0xEC; /* <Thorn> */
1402 if ( *s == 't' ) c = 0xFC; /* <thorn> */
1407 case 'P': c = 0xB6; break; /* <pilcrow-sign> */
1408 case '!': c = 0xA1; break; /* <inverted-exclamation> */
1409 case '?': c = 0xBF; break; /* <inverted-question> */
1414 if ( *s == 'I' ) c = 0xE6; /* <IJ> */
1418 if ( *s == 'i' ) c = 0xF6; /* <ij> */
1422 if ( *s == 'k' ) c = 0xF0; /* <kra> */
1427 case '.': c = 0xB7; break; /* <middle-dot> */
1428 case '-': c = 0xD0; break; /* <em-dash> */
1429 case 'T': c = 0xD4; break; /* <trade-mark-sign> */
1435 case '\'': /* <macron> RFC 1345 */
1436 case ' ': c = -5; break; /* <macron> */
1437 case 'O': c = 0xE0; break; /* <Ohm sign> */
1442 if ( *s == '\'' ) c = 0xEF; /* <n-preceded-by-apostrophe> */
1447 case 'D': c = 0xA4; break; /* <dollar-sign> */
1448 case 'N': c = 0xD6; break; /* <not-sign> */
1454 case 'C': c = 0xD3; break; /* <copyright-sign> */
1455 case '-': c = 0xEB; break; /* <masculine-ordinal-o> */
1461 case '1': c = 0xD1; break; /* <superscript-1> */
1462 case '2': c = 0xB2; break; /* <superscript-2> */
1463 case '3': c = 0xB3; break; /* <superscript-3> */
1464 case 'N': c = 0xA0; break; /* <no-break-space> */
1469 if ( *s == 's' ) c = 0xFB; /* <sharp-s> */
1473 if ( *s == 'C' ) c = 0xA2; /* <cent-sign> */
1477 if ( *s == 'C' ) c = 0xA8; /* <currency-sign> */
1481 if ( *s == '-' ) c = 0xAF; /* <downwards-arrow> */
1485 if ( *s == '*' ) c = 0xB4; /* <multiplication-sign> */
1489 if ( *s == 'M' ) c = 0xB5; /* <micro-sign> */
1503 case 'A': c = letter_w_diacritic[n][0]; break;
1504 case 'C': c = letter_w_diacritic[n][1]; break;
1505 case 'D': c = letter_w_diacritic[n][2]; break;
1506 case 'E': c = letter_w_diacritic[n][3]; break;
1507 case 'G': c = letter_w_diacritic[n][4]; break;
1508 case 'H': c = letter_w_diacritic[n][5]; break;
1509 case 'I': c = letter_w_diacritic[n][6]; break;
1510 case 'J': c = letter_w_diacritic[n][7]; break;
1511 case 'K': c = letter_w_diacritic[n][8]; break;
1512 case 'L': c = letter_w_diacritic[n][9]; break;
1513 case 'N': c = letter_w_diacritic[n][10]; break;
1514 case 'O': c = letter_w_diacritic[n][11]; break;
1515 case 'R': c = letter_w_diacritic[n][12]; break;
1516 case 'S': c = letter_w_diacritic[n][13]; break;
1517 case 'T': c = letter_w_diacritic[n][14]; break;
1518 case 'U': c = letter_w_diacritic[n][15]; break;
1519 case 'W': c = letter_w_diacritic[n][16]; break;
1520 case 'Y': c = letter_w_diacritic[n][17]; break;
1521 case 'Z': c = letter_w_diacritic[n][18]; break;
1523 case 'a': c = letter_w_diacritic[n][19]; break;
1524 case 'c': c = letter_w_diacritic[n][20]; break;
1525 case 'd': c = letter_w_diacritic[n][21]; break;
1526 case 'e': c = letter_w_diacritic[n][22]; break;
1527 case 'g': c = letter_w_diacritic[n][23]; break;
1528 case 'h': c = letter_w_diacritic[n][24]; break;
1529 case 'i': c = letter_w_diacritic[n][25]; break;
1530 case 'j': c = letter_w_diacritic[n][26]; break;
1531 case 'k': c = letter_w_diacritic[n][27]; break;
1532 case 'l': c = letter_w_diacritic[n][28]; break;
1533 case 'n': c = letter_w_diacritic[n][29]; break;
1534 case 'o': c = letter_w_diacritic[n][30]; break;
1535 case 'r': c = letter_w_diacritic[n][31]; break;
1536 case 's': c = letter_w_diacritic[n][32]; break;
1537 case 't': c = letter_w_diacritic[n][33]; break;
1538 case 'u': c = letter_w_diacritic[n][34]; break;
1539 case 'w': c = letter_w_diacritic[n][35]; break;
1540 case 'y': c = letter_w_diacritic[n][36]; break;
1541 case 'z': c = letter_w_diacritic[n][37]; break;
1544 case ' ': c = -1; break;
1553 *o++ = ( ( (*s == ' ') || (*s == '\'') ) ? ALONE : *s );
1558 /* --- routine to convert from ISO 8859-n to T.61 --- */
1561 ldap_8859_to_t61( char **bufp, unsigned long *buflenp, int free_input )
1563 Byte *s, *oo, *o, *aux;
1568 Debug( LDAP_DEBUG_TRACE, "ldap_8859_to_t61 input length: %ld\n",
1574 if ( (o = oo = (Byte *)malloc( 2 * len + 64 )) == NULL ) {
1578 while ( (char *)s - *(char **)bufp < len ) {
1584 case '^': *o++ = 0xC3; *o++ = ALONE; s++; break;
1588 if ( (c = hh_to_c( s )) != -1 ) {
1595 default: *o++ = *s++;
1602 case '`': *o++ = 0xC1; *o++ = ALONE; s++; break;
1603 case '~': *o++ = 0xC4; *o++ = ALONE; s++; break;
1607 if ( *(s + 2) == '}' ) {
1608 if ( (aux = cc_to_t61( o, s )) != NULL ) {
1614 } else if ( (*(s + 3) == '}') && ( (*s == 'x') || (*s == 'X') ) &&
1615 ( (c = hh_to_c( s + 1 )) != -1 ) ) {
1629 case 4: case 5: case 6: case 7:
1633 case 5: case 6: case 7:
1634 # if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1635 (ISO_8859 == 4) || (ISO_8859 == 9) || (ISO_8859 == 10)
1636 if ( (*(cc = &trans_iso8859_t61[ *s - 0xA0 ])).a ) {
1638 if ( (*cc).b ) *o++ = (*cc).b;
1653 if ( (oo = (Byte *)realloc( o, len )) == NULL ) {
1661 *bufp = (char *) oo;
1667 #ifdef NOT_NEEDED_IN_LIBLDAP /* mcs@umich.edu 12 Oct 1995 */
1668 /* --- routine to convert "escaped" (\hh) characters to 8bits --- */
1670 void convert_escaped_to_8bit( s )
1678 if ( (c = hh_to_c( ++s )) != -1 ) {
1689 /* --- routine to convert 8bits characters to the "escaped" (\hh) form --- */
1691 char *convert_8bit_to_escaped( s )
1697 if ( (o = oo = (Byte *)malloc( 2 * strlen( s ) + 64 )) == NULL ) {
1707 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
1709 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
1716 if ( (oo = (Byte *)realloc( o, strlen( o ) + 1 )) == NULL ) {
1721 return( (char *)oo );
1724 /* --- routine to convert from T.61 to printable characters --- */
1727 printable characters [RFC 1488]: 'A'..'Z', 'a'..'z', '0'..'9',
1728 '\'', '(', ')', '+', ',', '-', '.', '/', ':', '?, ' '.
1730 that conversion is language dependent.
1733 static Couple last_t61_printabled[32] = {
1734 {0,0}, {'A','E'}, {'D',0}, {0,0},
1735 {'H',0}, {0,0}, {'I','J'}, {'L',0},
1736 {'L',0}, {'O',0}, {'O','E'}, {0,0},
1737 {'T','H'}, {'T',0}, {'N','G'}, {'n',0},
1738 {'k',0}, {'a','e'}, {'d',0}, {'d',0},
1739 {'h',0}, {'i',0}, {'i','j'}, {'l',0},
1740 {'l',0}, {'o',0}, {'o','e'}, {'s','s'},
1741 {'t','h'}, {'t',0}, {'n','g'}, {0,0}
1744 char *t61_printable( s )
1751 if ( (o = oo = (Byte *)malloc( 2 * strlen( s ) + 64 )) == NULL ) {
1756 if ( ( (*s >= 'A') && (*s <= 'Z') ) ||
1757 ( (*s >= 'a') && (*s <= 'z') ) ||
1758 ( (*s >= '0') && (*s <= '9') ) ||
1759 ( (*s >= '\'') && (*s <= ')') ) ||
1760 ( (*s >= '+') && (*s <= '/') ) ||
1761 ( *s == '?' ) || ( *s == ' ' ) )
1765 if ( (*(cc = &last_t61_printabled[ *s - 0xE0 ])).a ) {
1767 if ( (*cc).b ) *o++ = (*cc).b;
1770 else if ( (*s >> 4) == 0xC ) {
1772 case 0xCA: /* ring */
1773 switch ( *(s + 1) ) {
1774 case 'A': *o++ = 'A'; *o++ = 'A'; s++; break; /* Swedish */
1775 case 'a': *o++ = 'a'; *o++ = 'a'; s++; break; /* Swedish */
1779 case 0xC8: /* diaeresis */
1780 switch ( *(s + 1) ) {
1781 case 'Y': *o++ = 'I'; *o++ = 'J'; s++; break; /* Dutch */
1782 case 'y': *o++ = 'i'; *o++ = 'j'; s++; break; /* Dutch */
1794 if ( (oo = (Byte *)realloc( o, strlen( o ) + 1 )) == NULL ) {
1799 return( (char *)oo );
1801 #endif /* NOT_NEEDED_IN_LIBLDAP */ /* mcs@umich.edu 12 Oct 1995 */
1803 #endif /* LDAP_CHARSET_8859 */
1804 #endif /* STR_TRANSLATION */