dmake: do not set MAKEFLAGS=k
[unleashed/tickless.git] / usr / src / lib / libldap5 / sources / ldap / common / charset.c
blob06674cdb478a8929322a8bca5f781e21984760de
1 /*
2 * Copyright (c) 2001 by Sun Microsystems, Inc.
3 * All rights reserved.
4 */
6 #pragma ident "%Z%%M% %I% %E% SMI"
8 /*
9 * The contents of this file are subject to the Netscape Public
10 * License Version 1.1 (the "License"); you may not use this file
11 * except in compliance with the License. You may obtain a copy of
12 * the License at http://www.mozilla.org/NPL/
14 * Software distributed under the License is distributed on an "AS
15 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
16 * implied. See the License for the specific language governing
17 * rights and limitations under the License.
19 * The Original Code is Mozilla Communicator client code, released
20 * March 31, 1998.
22 * The Initial Developer of the Original Code is Netscape
23 * Communications Corporation. Portions created by Netscape are
24 * Copyright (C) 1998-1999 Netscape Communications Corporation. All
25 * Rights Reserved.
27 * Contributor(s):
30 * Copyright (c) 1995 Regents of the University of Michigan.
31 * All rights reserved.
34 * charset.c
37 #include "ldap-int.h"
39 #ifdef STR_TRANSLATION
41 void
42 ldap_set_string_translators( LDAP *ld, BERTranslateProc encode_proc,
43 BERTranslateProc decode_proc )
45 if ( ld == NULL ) {
46 if ( !nsldapi_initialized ) {
47 nsldapi_initialize_defaults();
49 ld = &nsldapi_ld_defaults;
52 if ( NSLDAPI_VALID_LDAP_POINTER( ld )) {
53 ld->ld_lber_encode_translate_proc = encode_proc;
54 ld->ld_lber_decode_translate_proc = decode_proc;
59 void
60 ldap_enable_translation( LDAP *ld, LDAPMessage *entry, int enable )
62 char *optionsp;
64 if ( ld == NULL ) {
65 if ( !nsldapi_initialized ) {
66 nsldapi_initialize_defaults();
68 ld = &nsldapi_ld_defaults;
71 optionsp = ( entry == NULLMSG ) ? &ld->ld_lberoptions :
72 &entry->lm_ber->ber_options;
74 if ( enable ) {
75 *optionsp |= LBER_OPT_TRANSLATE_STRINGS;
76 } else {
77 *optionsp &= ~LBER_OPT_TRANSLATE_STRINGS;
82 int
83 ldap_translate_from_t61( LDAP *ld, char **bufp, unsigned long *lenp,
84 int free_input )
86 ber_len_t length = (ber_len_t)*lenp;
88 if ( ld->ld_lber_decode_translate_proc == NULL ) {
89 return( LDAP_SUCCESS );
92 return( (*ld->ld_lber_decode_translate_proc)( bufp, &length, free_input ));
96 int
97 ldap_translate_to_t61( LDAP *ld, char **bufp, unsigned long *lenp,
98 int free_input )
100 ber_len_t length = (ber_len_t)*lenp;
102 if ( ld->ld_lber_encode_translate_proc == NULL ) {
103 return( LDAP_SUCCESS );
106 return( (*ld->ld_lber_encode_translate_proc)( bufp, &length, free_input ));
111 ** Character translation routine notes:
113 * On entry: bufp points to a "string" to be converted (not necessarily
114 * zero-terminated) and buflenp points to the length of the buffer.
116 * On exit: bufp should point to a malloc'd result. If free_input is
117 * non-zero then the original bufp will be freed. *buflenp should be
118 * set to the new length. Zero bytes in the input buffer must be left
119 * as zero bytes.
121 * Return values: any ldap error code (LDAP_SUCCESS if all goes well).
125 #ifdef LDAP_CHARSET_8859
127 #if LDAP_CHARSET_8859 == 88591
128 #define ISO_8859 1
129 #elif LDAP_CHARSET_8859 == 88592
130 #define ISO_8859 2
131 #elif LDAP_CHARSET_8859 == 88593
132 #define ISO_8859 3
133 #elif LDAP_CHARSET_8859 == 88594
134 #define ISO_8859 4
135 #elif LDAP_CHARSET_8859 == 88595
136 #define ISO_8859 5
137 #elif LDAP_CHARSET_8859 == 88596
138 #define ISO_8859 6
139 #elif LDAP_CHARSET_8859 == 88597
140 #define ISO_8859 7
141 #elif LDAP_CHARSET_8859 == 88598
142 #define ISO_8859 8
143 #elif LDAP_CHARSET_8859 == 88599
144 #define ISO_8859 9
145 #elif LDAP_CHARSET_8859 == 885910
146 #define ISO_8859 10
147 #else
148 #define ISO_8859 0
149 #endif
152 * the following ISO_8859 to/afrom T.61 character set translation code is
153 * based on the code found in Enrique Silvestre Mora's iso-t61.c, found
154 * as part of this package:
155 * ftp://pereiii.uji.es/pub/uji-ftp/unix/ldap/iso-t61.translation.tar.Z
156 * Enrique is now (10/95) at this address: enrique.silvestre@uv.es
158 * changes made by mcs@umich.edu 12 October 1995:
159 * Change calling conventions of iso8859_t61() and t61_iso8859() to
160 * match libldap conventions; rename to ldap_8859_to_t61() and
161 * ldap_t61_to_8859().
162 * Change conversion routines to deal with non-zero terminated strings.
163 * ANSI-ize functions and include prototypes.
166 /* iso-t61.c - ISO-T61 translation routines (version: 0.2.1, July-1994) */
168 * Copyright (c) 1994 Enrique Silvestre Mora, Universitat Jaume I, Spain.
169 * All rights reserved.
171 * Redistribution and use in source and binary forms are permitted
172 * provided that this notice is preserved and that due credit is given
173 * to the Universitat Jaume I. The name of the University
174 * may not be used to endorse or promote products derived from this
175 * software without specific prior written permission. This software
176 * is provided ``as is'' without express or implied warranty.
180 #include <stdio.h>
181 #include <stdlib.h>
182 #include <string.h>
184 /* Character set used: ISO 8859-1, ISO 8859-2, ISO 8859-3, ... */
185 /* #define ISO_8859 1 */
187 #ifndef ISO_8859
188 # define ISO_8859 0
189 #endif
191 typedef unsigned char Byte;
192 typedef struct { Byte a, b; } Couple;
194 #ifdef NEEDPROTOS
195 static Byte *c_to_hh( Byte *o, Byte c );
196 static Byte *c_to_cc( Byte *o, Couple *cc, Byte c );
197 static int hh_to_c( Byte *h );
198 static Byte *cc_to_t61( Byte *o, Byte *s );
199 #else /* NEEDPROTOS */
200 static Byte *c_to_hh();
201 static Byte *c_to_cc();
202 static int hh_to_c();
203 static Byte *cc_to_t61();
204 #endif /* NEEDPROTOS */
207 Character choosed as base in diacritics alone: NO-BREAK SPACE.
208 (The standard say it must be a blank space, 0x20.)
210 #define ALONE 0xA0
212 static Couple diacritic[16] = {
213 #if (ISO_8859 == 1) || (ISO_8859 == 9)
214 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
215 {'~',0}, {0xaf,0}, {'(',ALONE}, {'.',ALONE},
216 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
217 {0,0}, {'"',ALONE}, {';',ALONE}, {'<',ALONE},
218 #elif (ISO_8859 == 2)
219 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
220 {'~',0}, {'-',ALONE}, {0xa2,0}, {0xff,0},
221 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
222 {0,0}, {0xbd,0}, {0xb2,0}, {0xb7,0}
223 #elif (ISO_8859 == 3)
224 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
225 {'~',0}, {'-',ALONE}, {0xa2,0}, {0xff,0},
226 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
227 {0,0}, {'"',ALONE}, {';',ALONE}, {'<',ALONE}
228 #elif (ISO_8859 == 4)
229 {0,0}, {'`',0}, {0xb4,0}, {'^',0},
230 {'~',0}, {0xaf,0}, {'(',ALONE}, {0xff,0},
231 {0xa8,0}, {0,0}, {'0',ALONE}, {0xb8,0},
232 {0,0}, {'"',ALONE}, {0xb2,0}, {0xb7,0}
233 #else
234 {0,0}, {'`',0}, {'\'',ALONE}, {'^',0},
235 {'~',0}, {'-',ALONE}, {'(',ALONE}, {'.',ALONE},
236 {':',ALONE}, {0,0}, {'0',ALONE}, {',',ALONE},
237 {0,0}, {'"',ALONE}, {';',ALONE}, {'<',ALONE}
238 #endif
242 --- T.61 (T.51) letters with diacritics: conversion to ISO 8859-n -----
243 A, C, D, E, G, H, I, J, K,
244 L, N, O, R, S, T, U, W, Y, Z.
245 -----------------------------------------------------------------------
247 static int letter_w_diacritic[16][38] = {
248 #if (ISO_8859 == 1)
249 0, 0, 0, 0, 0, 0, 0, 0, 0,
250 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
251 0, 0, 0, 0, 0, 0, 0, 0, 0,
252 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
253 0xc0,0, 0, 0xc8,0, 0, 0xcc,0, 0,
254 0, 0, 0xd2,0, 0, 0, 0xd9,0, 0, 0,
255 0xe0,0, 0, 0xe8,0, 0, 0xec,0, 0,
256 0, 0, 0xf2,0, 0, 0, 0xf9,0, 0, 0,
257 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
258 -1, -1, 0xd3,-1, -1, 0, 0xda,0, 0xdd,-1,
259 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
260 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, 0xfd,-1,
261 0xc2,-1, 0, 0xca,-1, -1, 0xce,-1, 0,
262 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
263 0xe2,-1, 0, 0xea,-1, -1, 0xee,-1, 0,
264 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
265 0xc3,0, 0, 0, 0, 0, -1, 0, 0,
266 0, 0xd1,0xd5,0, 0, 0, -1, 0, 0, 0,
267 0xe3,0, 0, 0, 0, 0, -1, 0, 0,
268 0, 0xf1,0xf5,0, 0, 0, -1, 0, 0, 0,
269 -1, 0, 0, -1, 0, 0, -1, 0, 0,
270 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
271 -1, 0, 0, -1, 0, 0, -1, 0, 0,
272 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
273 -1, 0, 0, 0, -1, 0, 0, 0, 0,
274 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
275 -1, 0, 0, 0, -1, 0, 0, 0, 0,
276 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
277 0, -1, 0, -1, -1, 0, -1, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
279 0, -1, 0, -1, -1, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
281 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
282 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
283 0xe4,0, 0, 0xeb,0, 0, 0xef,0, 0,
284 0, 0, 0xf6,0, 0, 0, 0xfc,0, 0xff,0,
285 0, 0, 0, 0, 0, 0, 0, 0, 0,
286 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
287 0, 0, 0, 0, 0, 0, 0, 0, 0,
288 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
289 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
290 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
291 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
292 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
293 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
294 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
295 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
296 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
297 0, 0, 0, 0, 0, 0, 0, 0, 0,
298 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
299 0, 0, 0, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
301 0, 0, 0, 0, 0, 0, 0, 0, 0,
302 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
303 0, 0, 0, 0, 0, 0, 0, 0, 0,
304 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
305 -1, 0, 0, -1, 0, 0, -1, 0, 0,
306 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
307 -1, 0, 0, -1, 0, 0, -1, 0, 0,
308 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
309 0, -1, -1, -1, 0, 0, 0, 0, 0,
310 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
311 0, -1, -1, -1, 0, 0, 0, 0, 0,
312 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
313 #elif (ISO_8859 == 2)
314 0, 0, 0, 0, 0, 0, 0, 0, 0,
315 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
316 0, 0, 0, 0, 0, 0, 0, 0, 0,
317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
318 -1, 0, 0, -1, 0, 0, -1, 0, 0,
319 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
320 -1, 0, 0, -1, 0, 0, -1, 0, 0,
321 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
322 0xc1,0xc6,0, 0xc9,0, 0, 0xcd,0, 0,
323 0xc5,0xd1,0xd3,0xc0,0xa6,0, 0xda,0, 0xdd,0xac,
324 0xe1,0xe6,0, 0xe9,0, 0, 0xed,0, 0,
325 0xe5,0xf1,0xf3,0xe0,0xb6,0, 0xfa,0, 0xfd,0xbc,
326 0xc2,-1, 0, -1, -1, -1, 0xce,-1, 0,
327 0, 0, 0xd4,0, -1, 0, -1, -1, -1, 0,
328 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
329 0, 0, 0xf4,0, -1, 0, -1, -1, -1, 0,
330 -1, 0, 0, 0, 0, 0, -1, 0, 0,
331 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
332 -1, 0, 0, 0, 0, 0, -1, 0, 0,
333 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
334 -1, 0, 0, -1, 0, 0, -1, 0, 0,
335 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
336 -1, 0, 0, -1, 0, 0, -1, 0, 0,
337 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
338 0xc3,0, 0, 0, -1, 0, 0, 0, 0,
339 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
340 0xe3,0, 0, 0, -1, 0, 0, 0, 0,
341 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
342 0, -1, 0, -1, -1, 0, -1, 0, 0,
343 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xaf,
344 0, -1, 0, -1, -1, 0, 0, 0, 0,
345 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xbf,
346 0xc4,0, 0, 0xcb,0, 0, -1, 0, 0,
347 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
348 0xe4,0, 0, 0xeb,0, 0, -1, 0, 0,
349 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
350 0, 0, 0, 0, 0, 0, 0, 0, 0,
351 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
352 0, 0, 0, 0, 0, 0, 0, 0, 0,
353 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
354 -1, 0, 0, 0, 0, 0, 0, 0, 0,
355 0, 0, 0, 0, 0, 0, 0xd9,0, 0, 0,
356 -1, 0, 0, 0, 0, 0, 0, 0, 0,
357 0, 0, 0, 0, 0, 0, 0xf9,0, 0, 0,
358 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
359 -1, -1, 0, -1, 0xaa,0xde,0, 0, 0, 0,
360 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
361 -1, -1, 0, -1, 0xba,0xfe,0, 0, 0, 0,
362 0, 0, 0, 0, 0, 0, 0, 0, 0,
363 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
364 0, 0, 0, 0, 0, 0, 0, 0, 0,
365 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
366 0, 0, 0, 0, 0, 0, 0, 0, 0,
367 0, 0, 0xd5,0, 0, 0, 0xdb,0, 0, 0,
368 0, 0, 0, 0, 0, 0, 0, 0, 0,
369 0, 0, 0xf5,0, 0, 0, 0xfb,0, 0, 0,
370 0xa1,0, 0, 0xca,0, 0, -1, 0, 0,
371 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
372 0xb1,0, 0, 0xea,0, 0, -1, 0, 0,
373 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
374 0, 0xc8,0xcf,0xcc,0, 0, 0, 0, 0,
375 0xa5,0xd2,0, 0xd8,0xa9,0xab,0, 0, 0, 0xae,
376 0, 0xe8,0xef,0xec,0, 0, 0, 0, 0,
377 0xb5,0xf2,0, 0xf8,0xb9,0xbb,0, 0, 0, 0xbe
378 #elif (ISO_8859 == 3)
379 0, 0, 0, 0, 0, 0, 0, 0, 0,
380 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
381 0, 0, 0, 0, 0, 0, 0, 0, 0,
382 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
383 0xc0,0, 0, 0xc8,0, 0, 0xcc,0, 0,
384 0, 0, 0xd2,0, 0, 0, 0xd9,0, 0, 0,
385 0xe0,0, 0, 0xe8,0, 0, 0xec,0, 0,
386 0, 0, 0xf2,0, 0, 0, 0xf9,0, 0, 0,
387 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
388 -1, -1, 0xd3,-1, -1, 0, 0xda,0, -1, -1,
389 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
390 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, -1, -1,
391 0xc2,0xc6,0, 0xca,0xd8,0xa6,0xce,0xac,0,
392 0, 0, 0xd4,0, 0xde,0, 0xdb,-1, -1, 0,
393 0xe2,0xe6,0, 0xea,0xf8,0xb6,0xee,0xbc,0,
394 0, 0, 0xf4,0, 0xfe,0, 0xfb,-1, -1, 0,
395 -1, 0, 0, 0, 0, 0, -1, 0, 0,
396 0, 0xd1,-1, 0, 0, 0, -1, 0, 0, 0,
397 -1, 0, 0, 0, 0, 0, -1, 0, 0,
398 0, 0xf1,-1, 0, 0, 0, -1, 0, 0, 0,
399 -1, 0, 0, -1, 0, 0, -1, 0, 0,
400 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
401 -1, 0, 0, -1, 0, 0, -1, 0, 0,
402 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
403 -1, 0, 0, 0, 0xab,0, 0, 0, 0,
404 0, 0, 0, 0, 0, 0, 0xdd,0, 0, 0,
405 -1, 0, 0, 0, 0xbb,0, 0, 0, 0,
406 0, 0, 0, 0, 0, 0, 0xfd,0, 0, 0,
407 0, 0xc5,0, -1, 0xd5,0, 0xa9,0, 0,
408 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xaf,
409 0, 0xe5,0, -1, 0xf5,0, 0, 0, 0,
410 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xbf,
411 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
412 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
413 0xe4,0, 0, 0xeb,0, 0, 0xef,0, 0,
414 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
415 0, 0, 0, 0, 0, 0, 0, 0, 0,
416 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
417 0, 0, 0, 0, 0, 0, 0, 0, 0,
418 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
419 -1, 0, 0, 0, 0, 0, 0, 0, 0,
420 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
421 -1, 0, 0, 0, 0, 0, 0, 0, 0,
422 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
423 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
424 -1, -1, 0, -1, 0xaa,-1, 0, 0, 0, 0,
425 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
426 -1, -1, 0, -1, 0xba,-1, 0, 0, 0, 0,
427 0, 0, 0, 0, 0, 0, 0, 0, 0,
428 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
429 0, 0, 0, 0, 0, 0, 0, 0, 0,
430 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
431 0, 0, 0, 0, 0, 0, 0, 0, 0,
432 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
433 0, 0, 0, 0, 0, 0, 0, 0, 0,
434 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
435 -1, 0, 0, -1, 0, 0, -1, 0, 0,
436 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
437 -1, 0, 0, -1, 0, 0, -1, 0, 0,
438 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
439 0, -1, -1, -1, 0, 0, 0, 0, 0,
440 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
441 0, -1, -1, -1, 0, 0, 0, 0, 0,
442 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
443 #elif (ISO_8859 == 4)
444 0, 0, 0, 0, 0, 0, 0, 0, 0,
445 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
446 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
448 -1, 0, 0, -1, 0, 0, -1, 0, 0,
449 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
450 -1, 0, 0, -1, 0, 0, -1, 0, 0,
451 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
452 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
453 -1, -1, -1, -1, -1, 0, 0xda,0, -1, -1,
454 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
455 -1, -1, -1, -1, -1, 0, 0xfa,0, -1, -1,
456 0xc2,-1, 0, -1, -1, -1, 0xce,-1, 0,
457 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
458 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
459 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
460 0xc3,0, 0, 0, 0, 0, 0xa5,0, 0,
461 0, -1, 0xd5,0, 0, 0, 0xdd,0, 0, 0,
462 0xe3,0, 0, 0, 0, 0, 0xb5,0, 0,
463 0, -1, 0xf5,0, 0, 0, 0xfd,0, 0, 0,
464 0xc0,0, 0, 0xaa,0, 0, 0xcf,0, 0,
465 0, 0, 0xd2,0, 0, 0, 0xde,0, 0, 0,
466 0xe0,0, 0, 0xba,0, 0, 0xef,0, 0,
467 0, 0, 0xf2,0, 0, 0, 0xfe,0, 0, 0,
468 -1, 0, 0, 0, -1, 0, 0, 0, 0,
469 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
470 -1, 0, 0, 0, -1, 0, 0, 0, 0,
471 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
472 0, -1, 0, 0xcc,-1, 0, -1, 0, 0,
473 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
474 0, -1, 0, 0xec,-1, 0, 0, 0, 0,
475 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
476 0xc4,0, 0, 0xcb,0, 0, -1, 0, 0,
477 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
478 0xe4,0, 0, 0xeb,0, 0, -1, 0, 0,
479 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
480 0, 0, 0, 0, 0, 0, 0, 0, 0,
481 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
482 0, 0, 0, 0, 0, 0, 0, 0, 0,
483 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
484 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
485 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
486 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
487 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
488 0, -1, 0, 0, 0xab,0, 0, 0, 0xd3,
489 0xa6,0xd1,0, 0xa3,-1, -1, 0, 0, 0, 0,
490 0, -1, 0, 0, 0xbb,0, 0, 0, 0xf3,
491 0xb6,0xf1,0, 0xb3,-1, -1, 0, 0, 0, 0,
492 0, 0, 0, 0, 0, 0, 0, 0, 0,
493 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
494 0, 0, 0, 0, 0, 0, 0, 0, 0,
495 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
496 0, 0, 0, 0, 0, 0, 0, 0, 0,
497 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
498 0, 0, 0, 0, 0, 0, 0, 0, 0,
499 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
500 0xa1,0, 0, 0xca,0, 0, 0xc7,0, 0,
501 0, 0, 0, 0, 0, 0, 0xd9,0, 0, 0,
502 0xb1,0, 0, 0xea,0, 0, 0xe7,0, 0,
503 0, 0, 0, 0, 0, 0, 0xf9,0, 0, 0,
504 0, 0xc8,-1, -1, 0, 0, 0, 0, 0,
505 -1, -1, 0, -1, 0xa9,-1, 0, 0, 0, 0xae,
506 0, 0xe8,-1, -1, 0, 0, 0, 0, 0,
507 -1, -1, 0, -1, 0xb9,-1, 0, 0, 0, 0xbe
508 #elif (ISO_8859 == 9)
509 0, 0, 0, 0, 0, 0, 0, 0, 0,
510 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
511 0, 0, 0, 0, 0, 0, 0, 0, 0,
512 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
513 0xc0,0, 0, 0xc8,0, 0, 0xcc,0, 0,
514 0, 0, 0xd2,0, 0, 0, 0xd9,0, 0, 0,
515 0xe0,0, 0, 0xe8,0, 0, -1, 0, 0,
516 0, 0, 0xf2,0, 0, 0, 0xf9,0, 0, 0,
517 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
518 -1, -1, 0xd3,-1, -1, 0, 0xda,0, -1, -1,
519 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
520 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, -1, -1,
521 0xc2,-1, 0, 0xca,-1, -1, 0xce,-1, 0,
522 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
523 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
524 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
525 0xc3,0, 0, 0, 0, 0, -1, 0, 0,
526 0, 0xd1,0xd5,0, 0, 0, -1, 0, 0, 0,
527 0xe3,0, 0, 0, 0, 0, -1, 0, 0,
528 0, 0xf1,0xf5,0, 0, 0, -1, 0, 0, 0,
529 -1, 0, 0, -1, 0, 0, -1, 0, 0,
530 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
531 -1, 0, 0, -1, 0, 0, 0xef,0, 0,
532 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
533 -1, 0, 0, 0, 0xd0,0, 0, 0, 0,
534 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
535 -1, 0, 0, 0, 0xf0,0, 0, 0, 0,
536 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
537 0, -1, 0, -1, -1, 0, 0xdd,0, 0,
538 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
539 0, -1, 0, 0xec,-1, 0, 0, 0, 0,
540 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
541 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
542 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
543 0xe4,0, 0, 0xeb,0, 0, -1, 0, 0,
544 0, 0, 0xf6,0, 0, 0, 0xfc,0, 0xff,0,
545 0, 0, 0, 0, 0, 0, 0, 0, 0,
546 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
547 0, 0, 0, 0, 0, 0, 0, 0, 0,
548 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
549 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
550 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
551 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
552 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
553 0, 0xc7,0, 0, -1, 0, 0, 0, -1,
554 -1, -1, 0, -1, 0xde,-1, 0, 0, 0, 0,
555 0, 0xe7,0, 0, -1, 0, 0, 0, -1,
556 -1, -1, 0, -1, 0xfe,-1, 0, 0, 0, 0,
557 0, 0, 0, 0, 0, 0, 0, 0, 0,
558 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
559 0, 0, 0, 0, 0, 0, 0, 0, 0,
560 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
561 0, 0, 0, 0, 0, 0, 0, 0, 0,
562 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
563 0, 0, 0, 0, 0, 0, 0, 0, 0,
564 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
565 -1, 0, 0, -1, 0, 0, -1, 0, 0,
566 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
567 -1, 0, 0, 0xea,0, 0, -1, 0, 0,
568 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
569 0, -1, -1, -1, 0, 0, 0, 0, 0,
570 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
571 0, -1, -1, -1, 0, 0, 0, 0, 0,
572 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
573 #elif (ISO_8859 == 10)
574 0, 0, 0, 0, 0, 0, 0, 0, 0,
575 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
576 0, 0, 0, 0, 0, 0, 0, 0, 0,
577 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
578 -1, 0, 0, -1, 0, 0, -1, 0, 0,
579 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
580 -1, 0, 0, -1, 0, 0, -1, 0, 0,
581 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
582 0xc1,-1, 0, 0xc9,0, 0, 0xcd,0, 0,
583 -1, -1, 0xd3,-1, -1, 0, 0xda,0, 0xdd,-1,
584 0xe1,-1, 0, 0xe9,0, 0, 0xed,0, 0,
585 -1, -1, 0xf3,-1, -1, 0, 0xfa,0, 0xfd,-1,
586 0xc2,-1, 0, -1, -1, -1, 0xce,-1, 0,
587 0, 0, 0xd4,0, -1, 0, 0xdb,-1, -1, 0,
588 0xe2,-1, 0, -1, -1, -1, 0xee,-1, 0,
589 0, 0, 0xf4,0, -1, 0, 0xfb,-1, -1, 0,
590 0xc3,0, 0, 0, 0, 0, 0xa5,0, 0,
591 0, -1, 0xd5,0, 0, 0, 0xd7,0, 0, 0,
592 0xe3,0, 0, 0, 0, 0, 0xb5,0, 0,
593 0, -1, 0xf5,0, 0, 0, 0xf7,0, 0, 0,
594 0xc0,0, 0, 0xa2,0, 0, 0xa4,0, 0,
595 0, 0, 0xd2,0, 0, 0, 0xae,0, 0, 0,
596 0xe0,0, 0, 0xb2,0, 0, 0xb4,0, 0,
597 0, 0, 0xf2,0, 0, 0, 0xbe,0, 0, 0,
598 -1, 0, 0, 0, -1, 0, 0, 0, 0,
599 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
600 -1, 0, 0, 0, -1, 0, 0, 0, 0,
601 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
602 0, -1, 0, 0xcc,-1, 0, -1, 0, 0,
603 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
604 0, -1, 0, 0xec,-1, 0, 0, 0, 0,
605 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
606 0xc4,0, 0, 0xcb,0, 0, 0xcf,0, 0,
607 0, 0, 0xd6,0, 0, 0, 0xdc,0, -1, 0,
608 0xe4,0, 0, 0xeb,0, 0, 0xef,0, 0,
609 0, 0, 0xf6,0, 0, 0, 0xfc,0, -1, 0,
610 0, 0, 0, 0, 0, 0, 0, 0, 0,
611 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
612 0, 0, 0, 0, 0, 0, 0, 0, 0,
613 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
614 0xc5,0, 0, 0, 0, 0, 0, 0, 0,
615 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
616 0xe5,0, 0, 0, 0, 0, 0, 0, 0,
617 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
618 0, -1, 0, 0, 0xa3,0, 0, 0, 0xa6,
619 0xa8,0xd1,0, -1, -1, -1, 0, 0, 0, 0,
620 0, -1, 0, 0, 0xb3,0, 0, 0, 0xb6,
621 0xb8,0xf1,0, -1, -1, -1, 0, 0, 0, 0,
622 0, 0, 0, 0, 0, 0, 0, 0, 0,
623 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
624 0, 0, 0, 0, 0, 0, 0, 0, 0,
625 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
626 0, 0, 0, 0, 0, 0, 0, 0, 0,
627 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
628 0, 0, 0, 0, 0, 0, 0, 0, 0,
629 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
630 0xa1,0, 0, 0xca,0, 0, 0xc7,0, 0,
631 0, 0, 0, 0, 0, 0, 0xd9,0, 0, 0,
632 0xb1,0, 0, 0xea,0, 0, 0xe7,0, 0,
633 0, 0, 0, 0, 0, 0, 0xf9,0, 0, 0,
634 0, 0xc8,-1, -1, 0, 0, 0, 0, 0,
635 -1, -1, 0, -1, 0xaa,-1, 0, 0, 0, 0xac,
636 0, 0xe8,-1, -1, 0, 0, 0, 0, 0,
637 -1, -1, 0, -1, 0xba,-1, 0, 0, 0, 0xbc
638 #else
639 0, 0, 0, 0, 0, 0, 0, 0, 0,
640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
641 0, 0, 0, 0, 0, 0, 0, 0, 0,
642 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
643 -1, 0, 0, -1, 0, 0, -1, 0, 0,
644 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
645 -1, 0, 0, -1, 0, 0, -1, 0, 0,
646 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
647 -1, -1, 0, -1, 0, 0, -1, 0, 0,
648 -1, -1, -1, -1, -1, 0, -1, 0, -1, -1,
649 -1, -1, 0, -1, 0, 0, -1, 0, 0,
650 -1, -1, -1, -1, -1, 0, -1, 0, -1, -1,
651 -1, -1, 0, -1, -1, -1, -1, -1, 0,
652 0, 0, -1, 0, -1, 0, -1, -1, -1, 0,
653 -1, -1, 0, -1, -1, -1, -1, -1, 0,
654 0, 0, -1, 0, -1, 0, -1, -1, -1, 0,
655 -1, 0, 0, 0, 0, 0, -1, 0, 0,
656 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
657 -1, 0, 0, 0, 0, 0, -1, 0, 0,
658 0, -1, -1, 0, 0, 0, -1, 0, 0, 0,
659 -1, 0, 0, -1, 0, 0, -1, 0, 0,
660 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
661 -1, 0, 0, -1, 0, 0, -1, 0, 0,
662 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
663 -1, 0, 0, 0, -1, 0, 0, 0, 0,
664 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
665 -1, 0, 0, 0, -1, 0, 0, 0, 0,
666 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
667 0, -1, 0, -1, -1, 0, -1, 0, 0,
668 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
669 0, -1, 0, -1, -1, 0, 0, 0, 0,
670 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
671 -1, 0, 0, -1, 0, 0, -1, 0, 0,
672 0, 0, -1, 0, 0, 0, -1, 0, -1, 0,
673 -1, 0, 0, -1, 0, 0, -1, 0, 0,
674 0, 0, -1, 0, 0, 0, -1, 0, -1, 0,
675 0, 0, 0, 0, 0, 0, 0, 0, 0,
676 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
677 0, 0, 0, 0, 0, 0, 0, 0, 0,
678 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
679 -1, 0, 0, 0, 0, 0, 0, 0, 0,
680 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
681 -1, 0, 0, 0, 0, 0, 0, 0, 0,
682 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
683 0, -1, 0, 0, -1, 0, 0, 0, -1,
684 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
685 0, -1, 0, 0, -1, 0, 0, 0, -1,
686 -1, -1, 0, -1, -1, -1, 0, 0, 0, 0,
687 0, 0, 0, 0, 0, 0, 0, 0, 0,
688 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
689 0, 0, 0, 0, 0, 0, 0, 0, 0,
690 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
691 0, 0, 0, 0, 0, 0, 0, 0, 0,
692 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
693 0, 0, 0, 0, 0, 0, 0, 0, 0,
694 0, 0, -1, 0, 0, 0, -1, 0, 0, 0,
695 -1, 0, 0, -1, 0, 0, -1, 0, 0,
696 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
697 -1, 0, 0, -1, 0, 0, -1, 0, 0,
698 0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
699 0, -1, -1, -1, 0, 0, 0, 0, 0,
700 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1,
701 0, -1, -1, -1, 0, 0, 0, 0, 0,
702 -1, -1, 0, -1, -1, -1, 0, 0, 0, -1
703 #endif
707 --- T.61 characters [0xA0 .. 0xBF] -----------------
709 static Couple trans_t61a_iso8859[32] = {
710 #if (ISO_8859 == 1) || (ISO_8859 == 9)
711 {'N','S'}, {0xa1,0}, {0xa2,0}, {0xa3,0},
712 {'D','O'}, {0xa5,0}, {'C','u'}, {0xa7,0},
713 {0xa4,0}, {'\'','6'},{'"','6'}, {0xab,0},
714 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
715 {0xb0,0}, {0xb1,0}, {0xb2,0}, {0xb3,0},
716 {0xd7,0}, {0xb5,0}, {0xb6,0}, {0xb7,0},
717 {0xf7,0}, {'\'','9'},{'"','9'}, {0xbb,0},
718 {0xbc,0}, {0xbd,0}, {0xbe,0}, {0xbf,0}
719 #elif (ISO_8859 == 2) || (ISO_8859 == 4)
720 {'N','S'}, {'!','I'}, {'C','t'}, {'P','d'},
721 {'D','O'}, {'Y','e'}, {'C','u'}, {0xa7,0},
722 {0xa4,0}, {'\'','6'},{'"','6'}, {'<','<'},
723 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
724 {0xb0,0}, {'+','-'}, {'2','S'}, {'3','S'},
725 {0xd7,0}, {'M','y'}, {'P','I'}, {'.','M'},
726 {0xf7,0}, {'\'','9'},{'"','9'}, {'>','>'},
727 {'1','4'}, {'1','2'}, {'3','4'}, {'?','I'},
728 #elif (ISO_8859 == 3)
729 {'N','S'}, {'!','I'}, {'C','t'}, {0xa3,0},
730 {'D','O'}, {'Y','e'}, {'C','u'}, {0xa7,0},
731 {0xa4,0}, {'\'','6'},{'"','6'}, {'<','<'},
732 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
733 {0xb0,0}, {'+','-'}, {0xb2,0}, {0xb3,0},
734 {0xd7,0}, {0xb5,0}, {'P','I'}, {0xb7,0},
735 {0xf7,0}, {'\'','9'},{'"','9'}, {'>','>'},
736 {'1','4'}, {0xbd,0}, {'3','4'}, {'?','I'}
737 #elif (ISO_8859 == 10)
738 {'N','S'}, {'!','I'}, {'C','t'}, {'P','d'},
739 {'D','O'}, {'Y','e'}, {'C','u'}, {0xa7,0},
740 {'C','u'}, {'\'','6'},{'"','6'}, {'<','<'},
741 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
742 {0xb0,0}, {'+','-'}, {'2','S'}, {'3','S'},
743 {'*','X'}, {'M','y'}, {'P','I'}, {0xb7,0},
744 {'-',':'}, {'\'','9'},{'"','9'}, {'>','>'},
745 {'1','4'}, {'1','2'}, {'3','4'}, {'?','I'}
746 #else
747 {'N','S'}, {'!','I'}, {'C','t'}, {'P','d'},
748 {'D','O'}, {'Y','e'}, {'C','u'}, {'S','E'},
749 {'X','O'}, {'\'','6'},{'"','6'}, {'<','<'},
750 {'<','-'}, {'-','!'}, {'-','>'}, {'-','v'},
751 {'D','G'}, {'+','-'}, {'2','S'}, {'3','S'},
752 {'*','X'}, {'M','y'}, {'P','I'}, {'.','M'},
753 {'-',':'}, {'\'','9'},{'"','9'}, {'>','>'},
754 {'1','4'}, {'1','2'}, {'3','4'}, {'?','I'}
755 #endif
759 --- T.61 characters [0xE0 .. 0xFF] -----------------
761 static Couple trans_t61b_iso8859[48] = {
762 #if (ISO_8859 == 1)
763 {'-','M'}, {0xb9,0}, {0xae,0}, {0xa9,0},
764 {'T','M'}, {'M','8'}, {0xac,0}, {0xa6,0},
765 {0,0}, {0,0}, {0,0}, {0,0},
766 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
767 {'O','m'}, {0xc6,0}, {0xd0,0}, {0xaa,0},
768 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
769 {'L','/'}, {0xd8,0}, {'O','E'}, {0xba,0},
770 {0xde,0}, {'T','/'}, {'N','G'}, {'\'','n'},
771 {'k','k'}, {0xe6,0}, {'d','/'}, {0xf0,0},
772 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
773 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
774 {0xfe,0}, {'t','/'}, {'n','g'}, {'-','-'}
775 #elif (ISO_8859 == 2)
776 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
777 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
778 {0,0}, {0,0}, {0,0}, {0,0},
779 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
780 {'O','m'}, {'A','E'}, {0xd0,0}, {'-','a'},
781 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
782 {0xa3,0}, {'O','/'}, {'O','E'}, {'-','o'},
783 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
784 {'k','k'}, {'a','e'}, {0xf0,0}, {'d','-'},
785 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
786 {0xb3,0}, {'o','/'}, {'o','e'}, {0xdf,0},
787 {'t','h'}, {'t','/'}, {'n','g'}, {'-','-'}
788 #elif (ISO_8859 == 3)
789 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
790 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
791 {0,0}, {0,0}, {0,0}, {0,0},
792 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
793 {'O','m'}, {'A','E'}, {'D','/'}, {'-','a'},
794 {0xa1,0}, {0,0}, {'I','J'}, {'L','.'},
795 {'L','/'}, {'O','/'}, {'O','E'}, {'-','o'},
796 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
797 {'k','k'}, {'a','e'}, {'d','/'}, {'d','-'},
798 {0xb1,0}, {0xb9,0}, {'i','j'}, {'l','.'},
799 {'l','/'}, {'o','/'}, {'o','e'}, {0xdf,0},
800 {'t','h'}, {'t','/'}, {'n','g'}, {'-','-'}
801 #elif (ISO_8859 == 4)
802 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
803 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
804 {0,0}, {0,0}, {0,0}, {0,0},
805 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
806 {'O','m'}, {0xc6,0}, {0xd0,0}, {'-','a'},
807 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
808 {'L','/'}, {0xd8,0}, {'O','E'}, {'-','o'},
809 {'T','H'}, {0xac,0}, {0xbd,0}, {'\'','n'},
810 {0xa2,0}, {0xe6,0}, {0xf0,0}, {'d','-'},
811 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
812 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
813 {'t','h'}, {0xbc,0}, {0xbf,0}, {'-','-'}
814 #elif (ISO_8859 == 9)
815 {'-','M'}, {0xb9,0}, {0xae,0}, {0xa9,0},
816 {'T','M'}, {'M','8'}, {0xac,0}, {0xa6,0},
817 {0,0}, {0,0}, {0,0}, {0,0},
818 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
819 {'O','m'}, {0xc6,0}, {'D','/'}, {0xaa,0},
820 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
821 {'L','/'}, {0xd8,0}, {'O','E'}, {0xba,0},
822 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
823 {'k','k'}, {0xe6,0}, {'d','/'}, {'d','-'},
824 {'h','/'}, {0xfd,0}, {'i','j'}, {'l','.'},
825 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
826 {'t','h'}, {'t','/'}, {'n','g'}, {'-','-'}
827 #elif (ISO_8859 == 10)
828 {0xbd,0}, {'1','S'}, {'R','g'}, {'C','o'},
829 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
830 {0,0}, {0,0}, {0,0}, {0,0},
831 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
832 {'O','m'}, {0xc6,0}, {0xa9,0}, {'-','a'},
833 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
834 {'L','/'}, {0xd8,0}, {'O','E'}, {'-','o'},
835 {0xde,0}, {0xab,0}, {0xaf,0}, {'\'','n'},
836 {0xff,0}, {0xe6,0}, {0xb9,0}, {0xf0,0},
837 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
838 {'l','/'}, {0xf8,0}, {'o','e'}, {0xdf,0},
839 {0xfe,0}, {0xbb,0}, {0xbf,0}, {'-','-'}
840 #else
841 {'-','M'}, {'1','S'}, {'R','g'}, {'C','o'},
842 {'T','M'}, {'M','8'}, {'N','O'}, {'B','B'},
843 {0,0}, {0,0}, {0,0}, {0,0},
844 {'1','8'}, {'3','8'}, {'5','8'}, {'7','8'},
845 {'O','m'}, {'A','E'}, {'D','/'}, {'-','a'},
846 {'H','/'}, {0,0}, {'I','J'}, {'L','.'},
847 {'L','/'}, {'O','/'}, {'O','E'}, {'-','o'},
848 {'T','H'}, {'T','/'}, {'N','G'}, {'\'','n'},
849 {'k','k'}, {'a','e'}, {'d','/'}, {'d','-'},
850 {'h','/'}, {'i','.'}, {'i','j'}, {'l','.'},
851 {'l','/'}, {'o','/'}, {'o','e'}, {'s','s'},
852 {'t','h'}, {'t','-'}, {'n','g'}, {'-','-'}
853 #endif
857 --- ISO 8859-n characters <0xA0 .. 0xFF> -------------------
859 #if (ISO_8859 == 1)
860 static Couple trans_iso8859_t61[96] = {
861 {0xa0,0}, {0xa1,0}, {0xa2,0}, {0xa3,0},
862 {0xa8,0}, {0xa5,0}, {0xd7,0}, {0xa7,0},
863 {0xc8,ALONE}, {0xd3,0}, {0xe3,0}, {0xab,0},
864 {0xd6,0}, {0xff,0}, {0xd2,0}, {0xc5,ALONE},
865 {0xb0,0}, {0xb1,0}, {0xb2,0}, {0xb3,0},
866 {0xc2,ALONE}, {0xb5,0}, {0xb6,0}, {0xb7,0},
867 {0xcb,ALONE}, {0xd1,0}, {0xeb,0}, {0xbb,0},
868 {0xbc,0}, {0xbd,0}, {0xbe,0}, {0xbf,0},
869 {0xc1,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
870 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xcb,'C'},
871 {0xc1,'E'}, {0xc2,'E'}, {0xc3,'E'}, {0xc8,'E'},
872 {0xc1,'I'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
873 {0xe2,0}, {0xc4,'N'}, {0xc1,'O'}, {0xc2,'O'},
874 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xb4,0},
875 {0xe9,0}, {0xc1,'U'}, {0xc2,'U'}, {0xc3,'U'},
876 {0xc8,'U'}, {0xc2,'Y'}, {0xec,0}, {0xfb,0},
877 {0xc1,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
878 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xcb,'c'},
879 {0xc1,'e'}, {0xc2,'e'}, {0xc3,'e'}, {0xc8,'e'},
880 {0xc1,'i'}, {0xc2,'i'}, {0xc3,'i'}, {0xc8,'i'},
881 {0xf3,0}, {0xc4,'n'}, {0xc1,'o'}, {0xc2,'o'},
882 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xb8,0},
883 {0xf9,0}, {0xc1,'u'}, {0xc2,'u'}, {0xc3,'u'},
884 {0xc8,'u'}, {0xc2,'y'}, {0xfc,0}, {0xc8,'y'}
886 #elif (ISO_8859 == 2)
887 static Couple trans_iso8859_t61[96] = {
888 {0xa0,0}, {0xce,'A'}, {0xc6,ALONE}, {0xe8,0},
889 {0xa8,0}, {0xcf,'L'}, {0xc2,'S'}, {0xa7,0},
890 {0xc8,ALONE}, {0xcf,'S'}, {0xcb,'S'}, {0xcf,'T'},
891 {0xc2,'Z'}, {0xff,0}, {0xcf,'Z'}, {0xc7,'Z'},
892 {0xb0,0}, {0xce,'a'}, {0xce,ALONE}, {0xf8,0},
893 {0xc2,ALONE}, {0xcf,'l'}, {0xc2,'s'}, {0xcf,ALONE},
894 {0xcb,ALONE}, {0xcf,'s'}, {0xcb,'s'}, {0xcf,'t'},
895 {0xc2,'z'}, {0xcd,ALONE}, {0xcf,'z'}, {0xc7,'z'},
896 {0xc2,'R'}, {0xc2,'A'}, {0xc3,'A'}, {0xc6,'A'},
897 {0xc8,'A'}, {0xc2,'L'}, {0xc2,'C'}, {0xcb,'C'},
898 {0xcf,'C'}, {0xc2,'E'}, {0xce,'E'}, {0xc8,'E'},
899 {0xcf,'E'}, {0xc2,'I'}, {0xc3,'I'}, {0xcf,'D'},
900 {0xe2,0}, {0xc2,'N'}, {0xcf,'N'}, {0xc2,'O'},
901 {0xc3,'O'}, {0xcd,'O'}, {0xc8,'O'}, {0xb4,0},
902 {0xcf,'R'}, {0xca,'U'}, {0xc2,'U'}, {0xcd,'U'},
903 {0xc8,'U'}, {0xc2,'Y'}, {0xcb,'T'}, {0xfb,0},
904 {0xc2,'r'}, {0xc2,'a'}, {0xc3,'a'}, {0xc6,'a'},
905 {0xc8,'a'}, {0xc2,'l'}, {0xc2,'c'}, {0xcb,'c'},
906 {0xcf,'c'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
907 {0xcf,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xcf,'d'},
908 {0xf2,0}, {0xc2,'n'}, {0xcf,'n'}, {0xc2,'o'},
909 {0xc3,'o'}, {0xcd,'o'}, {0xc8,'o'}, {0xb8,0},
910 {0xcf,'r'}, {0xca,'u'}, {0xc2,'u'}, {0xcd,'u'},
911 {0xc8,'u'}, {0xc2,'y'}, {0xcb,'t'}, {0xc7,ALONE}
913 #elif (ISO_8859 == 3)
914 static Couple trans_iso8859_t61[96] = {
915 {0xa0,0}, {0xe4,0}, {0xc6,ALONE}, {0xa3,0},
916 {0xa8,0}, {0,0}, {0xc3,'H'}, {0xa7,0},
917 {0xc8,ALONE}, {0xc7,'I'}, {0xcb,'S'}, {0xc6,'G'},
918 {0xc3,'J'}, {0xff,0}, {0,0}, {0xc7,'Z'},
919 {0xb0,0}, {0xf4,0}, {0xb2,0}, {0xb3,0},
920 {0xc2,ALONE}, {0xb5,0}, {0xc3,'h'}, {0xb7,0},
921 {0xcb,ALONE}, {0xf5,0}, {0xcb,'s'}, {0xc6,'g'},
922 {0xc3,'j'}, {0xbd,0}, {0,0}, {0xc7,'z'},
923 {0xc1,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0,0},
924 {0xc8,'A'}, {0xc7,'C'}, {0xc3,'C'}, {0xcb,'C'},
925 {0xc1,'E'}, {0xc2,'E'}, {0xc3,'E'}, {0xc8,'E'},
926 {0xc1,'I'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
927 {0,0}, {0xc4,'N'}, {0xc1,'O'}, {0xc2,'O'},
928 {0xc3,'O'}, {0xc7,'G'}, {0xc8,'O'}, {0xb4,0},
929 {0xc3,'G'}, {0xc1,'U'}, {0xc2,'U'}, {0xc3,'U'},
930 {0xc8,'U'}, {0xc6,'U'}, {0xc3,'S'}, {0xfb,0},
931 {0xc1,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0,0},
932 {0xc8,'a'}, {0xc7,'c'}, {0xc3,'c'}, {0xcb,'c'},
933 {0xc1,'e'}, {0xc2,'e'}, {0xc3,'e'}, {0xc8,'e'},
934 {0xc1,'i'}, {0xc2,'i'}, {0xc3,'i'}, {0xc8,'i'},
935 {0,0}, {0xc4,'n'}, {0xc1,'o'}, {0xc2,'o'},
936 {0xc3,'o'}, {0xc7,'g'}, {0xc8,'o'}, {0xb8,0},
937 {0xc3,'g'}, {0xc1,'u'}, {0xc2,'u'}, {0xc3,'u'},
938 {0xc8,'u'}, {0xc6,'u'}, {0xc3,'s'}, {0xc7,ALONE}
940 #elif (ISO_8859 == 4)
941 static Couple trans_iso8859_t61[96] = {
942 {0xa0,0}, {0xce,'A'}, {0xf0,0}, {0xcb,'R'},
943 {0xa8,0}, {0xc4,'I'}, {0xcb,'L'}, {0xa7,0},
944 {0xc8,ALONE}, {0xcf,'S'}, {0xc5,'E'}, {0xcb,'G'},
945 {0xed,0}, {0xff,0}, {0xcf,'Z'}, {0xc5,ALONE},
946 {0xb0,0}, {0xce,'a'}, {0xce,ALONE}, {0xcb,'r'},
947 {0xc2,ALONE}, {0xc4,'i'}, {0xcb,'l'}, {0xcf,ALONE},
948 {0xcb,ALONE}, {0xcf,'s'}, {0xc5,'e'}, {0xcb,'g'},
949 {0xfd,0}, {0xee,0}, {0xcf,'z'}, {0xfe,0},
950 {0xc5,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
951 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xce,'I'},
952 {0xcf,'C'}, {0xc2,'E'}, {0xce,'E'}, {0xc8,'E'},
953 {0xc7,'E'}, {0xc2,'I'}, {0xc3,'I'}, {0xc5,'I'},
954 {0xe2,0}, {0xcb,'N'}, {0xc5,'O'}, {0xcb,'K'},
955 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xb4,0},
956 {0xe9,0}, {0xce,'U'}, {0xc2,'U'}, {0xc3,'U'},
957 {0xc8,'U'}, {0xc4,'U'}, {0xc5,'U'}, {0xfb,0},
958 {0xc5,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
959 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xce,'i'},
960 {0xcf,'c'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
961 {0xc7,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xc5,'i'},
962 {0xf2,0}, {0xcb,'n'}, {0xc5,'o'}, {0xcb,'k'},
963 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xb8,0},
964 {0xf9,0}, {0xce,'u'}, {0xc2,'u'}, {0xc3,'u'},
965 {0xc8,'u'}, {0xc4,'u'}, {0xc5,'u'}, {0xc7,ALONE}
967 #elif (ISO_8859 == 9)
968 static Couple trans_iso8859_t61[96] = {
969 {0xa0,0}, {0xa1,0}, {0xa2,0}, {0xa3,0},
970 {0xa8,0}, {0xa5,0}, {0xd7,0}, {0xa7,0},
971 {0xc8,ALONE}, {0xd3,0}, {0xe3,0}, {0xab,0},
972 {0xd6,0}, {0xff,0}, {0xd2,0}, {0xc5,ALONE},
973 {0xb0,0}, {0xb1,0}, {0xb2,0}, {0xb3,0},
974 {0xc2,ALONE}, {0xb5,0}, {0xb6,0}, {0xb7,0},
975 {0xcb,ALONE}, {0xd1,0}, {0xeb,0}, {0xbb,0},
976 {0xbc,0}, {0xbd,0}, {0xbe,0}, {0xbf,0},
977 {0xc1,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
978 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xcb,'C'},
979 {0xc1,'E'}, {0xc2,'E'}, {0xc3,'E'}, {0xc8,'E'},
980 {0xc1,'I'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
981 {0xc6,'G'}, {0xc4,'N'}, {0xc1,'O'}, {0xc2,'O'},
982 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xb4,0},
983 {0xe9,0}, {0xc1,'U'}, {0xc2,'U'}, {0xc3,'U'},
984 {0xc8,'U'}, {0xc7,'I'}, {0xcb,'S'}, {0xfb,0},
985 {0xc1,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
986 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xcb,'c'},
987 {0xc1,'e'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
988 {0xc7,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xc5,'i'},
989 {0xc6,'g'}, {0xc4,'n'}, {0xc1,'o'}, {0xc2,'o'},
990 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xb8,0},
991 {0xf9,0}, {0xc1,'u'}, {0xc2,'u'}, {0xc3,'u'},
992 {0xc8,'u'}, {0xf5,0}, {0xcb,'s'}, {0xc8,'y'}
994 #elif (ISO_8859 == 10)
995 static Couple trans_iso8859_t61[96] = {
996 {0xa0,0}, {0xce,'A'}, {0xc5,'E'}, {0xcb,'G'},
997 {0xc5,'I'}, {0xc4,'I'}, {0xcb,'K'}, {0xa7,0},
998 {0xcb,'L'}, {0xe2,0}, {0xcf,'S'}, {0xed,0},
999 {0xcf,'Z'}, {0xff,0}, {0xc5,'U'}, {0xee,0},
1000 {0xb0,0}, {0xce,'a'}, {0xc5,'e'}, {0xcb,'g'},
1001 {0xc5,'i'}, {0xc4,'i'}, {0xcb,'k'}, {0xb7,0},
1002 {0xcb,'l'}, {0xf2,0}, {0xcf,'s'}, {0xfd,0},
1003 {0xcf,'z'}, {0xd0,0}, {0xc5,'u'}, {0xfe,0},
1004 {0xc5,'A'}, {0xc2,'A'}, {0xc3,'A'}, {0xc4,'A'},
1005 {0xc8,'A'}, {0xca,'A'}, {0xe1,0}, {0xce,'I'},
1006 {0xcf,'C'}, {0xc2,'E'}, {0xce,'E'}, {0xc8,'E'},
1007 {0xc7,'E'}, {0xc2,'I'}, {0xc3,'I'}, {0xc8,'I'},
1008 {0,0}, {0xcb,'N'}, {0xc5,'O'}, {0xc2,'O'},
1009 {0xc3,'O'}, {0xc4,'O'}, {0xc8,'O'}, {0xc4,'U'},
1010 {0xe9,0}, {0xce,'U'}, {0xc2,'U'}, {0xc3,'U'},
1011 {0xc8,'U'}, {0xc2,'Y'}, {0xec,0}, {0xfb,0},
1012 {0xc5,'a'}, {0xc2,'a'}, {0xc3,'a'}, {0xc4,'a'},
1013 {0xc8,'a'}, {0xca,'a'}, {0xf1,0}, {0xce,'i'},
1014 {0xcf,'c'}, {0xc2,'e'}, {0xce,'e'}, {0xc8,'e'},
1015 {0xc7,'e'}, {0xc2,'i'}, {0xc3,'i'}, {0xc8,'i'},
1016 {0xf3,0}, {0xcb,'n'}, {0xc5,'o'}, {0xc2,'o'},
1017 {0xc3,'o'}, {0xc4,'o'}, {0xc8,'o'}, {0xc4,'u'},
1018 {0xf9,0}, {0xce,'u'}, {0xc2,'u'}, {0xc3,'u'},
1019 {0xc8,'u'}, {0xc2,'y'}, {0xfc,0}, {0xf0,0}
1021 #endif
1024 static Byte *
1025 c_to_hh( Byte *o, Byte c )
1027 Byte n;
1029 *o++ = '{'; *o++ = 'x';
1030 n = c >> 4;
1031 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
1032 n = c & 0x0F;
1033 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
1034 *o++ = '}';
1035 return o;
1039 static Byte *
1040 c_to_cc( Byte *o, Couple *cc, Byte c )
1042 if ( (*cc).a != 0 ) {
1043 if ( (*cc).b == 0 )
1044 *o++ = (*cc).a;
1045 else {
1046 *o++ = '{';
1047 *o++ = (*cc).a;
1048 *o++ = (*cc).b;
1049 *o++ = '}';
1051 return o;
1053 else
1054 return c_to_hh( o, c );
1057 /* --- routine to convert from T.61 to ISO 8859-n --- */
1060 ldap_t61_to_8859( char **bufp, unsigned long *buflenp, int free_input )
1062 Byte *s, *oo, *o;
1063 unsigned int n;
1064 int c;
1065 unsigned long len;
1066 Couple *cc;
1068 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_t61_to_8859 input length: %ld\n",
1069 *buflenp, 0, 0 );
1071 len = *buflenp;
1072 s = (Byte *) *bufp;
1074 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * len + 64 )) == NULL ) {
1075 return( 1 );
1078 while ( (char *)s - *(char **)bufp < len ) {
1079 switch ( *s >> 4 ) {
1081 case 0xA: case 0xB:
1082 o = c_to_cc( o, &trans_t61a_iso8859[ *s - 0xA0 ], *s );
1083 s++;
1084 break;
1086 case 0xD: case 0xE: case 0xF:
1087 o = c_to_cc( o, &trans_t61b_iso8859[ *s - 0xD0 ], *s );
1088 s++;
1089 break;
1091 case 0xC:
1092 if ( (*s == 0xC0) || (*s == 0xC9) || (*s == 0xCC) ) {
1093 o = c_to_hh( o, *s++ );
1094 break;
1097 n = (*s++) - 0xC0;
1098 switch ( *s ) {
1100 case 'A': c = letter_w_diacritic[n][0]; break;
1101 case 'C': c = letter_w_diacritic[n][1]; break;
1102 case 'D': c = letter_w_diacritic[n][2]; break;
1103 case 'E': c = letter_w_diacritic[n][3]; break;
1104 case 'G': c = letter_w_diacritic[n][4]; break;
1105 case 'H': c = letter_w_diacritic[n][5]; break;
1106 case 'I': c = letter_w_diacritic[n][6]; break;
1107 case 'J': c = letter_w_diacritic[n][7]; break;
1108 case 'K': c = letter_w_diacritic[n][8]; break;
1109 case 'L': c = letter_w_diacritic[n][9]; break;
1110 case 'N': c = letter_w_diacritic[n][10]; break;
1111 case 'O': c = letter_w_diacritic[n][11]; break;
1112 case 'R': c = letter_w_diacritic[n][12]; break;
1113 case 'S': c = letter_w_diacritic[n][13]; break;
1114 case 'T': c = letter_w_diacritic[n][14]; break;
1115 case 'U': c = letter_w_diacritic[n][15]; break;
1116 case 'W': c = letter_w_diacritic[n][16]; break;
1117 case 'Y': c = letter_w_diacritic[n][17]; break;
1118 case 'Z': c = letter_w_diacritic[n][18]; break;
1120 case 'a': c = letter_w_diacritic[n][19]; break;
1121 case 'c': c = letter_w_diacritic[n][20]; break;
1122 case 'd': c = letter_w_diacritic[n][21]; break;
1123 case 'e': c = letter_w_diacritic[n][22]; break;
1124 case 'g': c = letter_w_diacritic[n][23]; break;
1125 case 'h': c = letter_w_diacritic[n][24]; break;
1126 case 'i': c = letter_w_diacritic[n][25]; break;
1127 case 'j': c = letter_w_diacritic[n][26]; break;
1128 case 'k': c = letter_w_diacritic[n][27]; break;
1129 case 'l': c = letter_w_diacritic[n][28]; break;
1130 case 'n': c = letter_w_diacritic[n][29]; break;
1131 case 'o': c = letter_w_diacritic[n][30]; break;
1132 case 'r': c = letter_w_diacritic[n][31]; break;
1133 case 's': c = letter_w_diacritic[n][32]; break;
1134 case 't': c = letter_w_diacritic[n][33]; break;
1135 case 'u': c = letter_w_diacritic[n][34]; break;
1136 case 'w': c = letter_w_diacritic[n][35]; break;
1137 case 'y': c = letter_w_diacritic[n][36]; break;
1138 case 'z': c = letter_w_diacritic[n][37]; break;
1140 case ALONE: c = (( !diacritic[n].b ) ? diacritic[n].a : -1);
1141 break;
1143 default: c = 0;
1146 if ( c > 0 ) {
1147 *o++ = c; s++;
1148 } else {
1149 *o++ = '{';
1150 if ( c == -1 ) {
1151 *o++ = ( ( *s == ALONE ) ? ' ' : *s );
1152 s++;
1153 } else {
1154 *o++ = '"';
1156 *o++ = diacritic[n].a;
1157 *o++ = '}';
1159 break;
1161 #if (ISO_8859 == 0)
1162 case 0x8: case 0x9:
1163 *o++ = 0x1B; /* <ESC> */
1164 *o++ = *s++ - 0x40;
1165 break;
1166 #endif
1168 default:
1169 *o++ = *s++;
1173 len = o - oo;
1174 o = oo;
1176 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, len )) == NULL ) {
1177 NSLDAPI_FREE( o );
1178 return( 1 );
1181 if ( free_input ) {
1182 NSLDAPI_FREE( *bufp );
1184 *bufp = (char *) oo;
1185 *buflenp = len;
1186 return( 0 );
1190 static int
1191 hh_to_c( Byte *h )
1193 Byte c;
1195 if ( (*h >= '0') && (*h <= '9') ) c = *h++ - '0';
1196 else if ( (*h >= 'A') && (*h <= 'F') ) c = *h++ - 'A' + 10;
1197 else if ( (*h >= 'a') && (*h <= 'f') ) c = *h++ - 'a' + 10;
1198 else return -1;
1200 c <<= 4;
1202 if ( (*h >= '0') && (*h <= '9') ) c |= *h - '0';
1203 else if ( (*h >= 'A') && (*h <= 'F') ) c |= *h - 'A' + 10;
1204 else if ( (*h >= 'a') && (*h <= 'f') ) c |= *h - 'a' + 10;
1205 else return -1;
1207 return c;
1211 static Byte *
1212 cc_to_t61( Byte *o, Byte *s )
1214 int n, c = 0;
1216 switch ( *(s + 1) ) {
1218 case '`': c = -1; break; /* <grave-accent> */
1220 case '!':
1221 switch ( *s ) {
1222 case '!': c = 0x7C; break; /* <vertical-line> */
1223 case '(': c = 0x7B; break; /* <left-curly-bracket> */
1224 case '-': c = 0xAD; break; /* <upwards-arrow> */
1225 default: c = -1; /* <grave-accent> */
1227 break;
1229 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1230 (ISO_8859 == 4) || (ISO_8859 == 9)
1231 case 0xB4:
1232 #endif
1233 case '\'': c = -2; break; /* <acute-accent> */
1235 case '^': c = -3; break; /* <circumflex-acent> */
1237 case '>':
1238 switch ( *s ) {
1239 case ')': c = 0x5D; break; /* <right-square-bracket> */
1240 case '>': c = 0xBB; break; /* <right-angle-quotation> */
1241 case '-': c = 0xAE; break; /* <rightwards-arrow> */
1242 default: c = -3; /* <circumflex-acent> */
1244 break;
1246 case '~':
1247 case '?': c = -4; break; /* <tilde> */
1249 #if (ISO_8859 == 1) || (ISO_8859 == 4) || (ISO_8859 == 9)
1250 case 0xAF: c = -5; break; /* <macron> */
1251 #endif
1253 case '-':
1254 switch ( *s ) {
1255 case '-': c = 0xFF; break; /* <soft-hyphen> */
1256 case '<': c = 0xAC; break; /* <leftwards arrow> */
1257 case '+': c = 0xB1; break; /* <plus-minus> */
1258 case 'd': c = 0xF3; break; /* <eth> */
1259 default: c = -5; /* <macron> */
1261 break;
1263 #if (ISO_8859 == 2) || (ISO_8859 == 3)
1264 case 0xA2: c = -6; break; /* <breve> */
1265 #endif
1267 case '(':
1268 if ( *s == '<' ) c = 0x5B; /* <left-square-bracket> */
1269 else c = -6; /* <breve> */
1270 break;
1272 #if (ISO_8859 == 2) || (ISO_8859 == 3) || (ISO_8859 == 4)
1273 case 0xFF: c = -7; break; /* <dot-accent> */
1274 #endif
1276 case '.':
1277 switch ( *s ) {
1278 case 'i': c = 0xF5; break; /* <dotless-i> */
1279 case 'L': c = 0xE7; break; /* <L-middle-dot> */
1280 case 'l': c = 0xF7; break; /* <l-middle-dot> */
1281 default: c = -7; /* <dot-accent> */
1283 break;
1285 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1286 (ISO_8859 == 4) || (ISO_8859 == 9)
1287 case 0xA8: c = -8; break; /* <diaeresis> */
1288 #endif
1290 case ':':
1291 if ( *s == '-') c = 0xB8; /* <division-sign> */
1292 else c = -8; /* <diaeresis> */
1293 break;
1295 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1296 (ISO_8859 == 4) || (ISO_8859 == 9) || (ISO_8859 == 10)
1297 case 0xB0:
1298 #endif
1299 case '0': c = -10; break; /* <ring-above> */
1301 #if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1302 (ISO_8859 == 4) || (ISO_8859 == 9)
1303 case 0xB8:
1304 #endif
1305 case ',': c = -11; break; /* <cedilla> */
1307 #if (ISO_8859 == 2)
1308 case 0xBD:
1309 #endif
1310 case '"': c = -13; break; /* <double-acute-accent> */
1312 #if (ISO_8859 == 2) || (ISO_8859 == 4)
1313 case 0xB2:
1314 #endif
1315 case ';': c = -14; break; /* <ogonek> */
1317 #if (ISO_8859 == 2) || (ISO_8859 == 4)
1318 case 0xB7: c = -15; break; /* <caron> */
1319 #endif
1321 case ')':
1322 if ( *s == '!' ) c = 0x7D; /* <left-curly-bracket> */
1323 break;
1325 case '<':
1326 if ( *s == '<' ) c = 0xAB; /* <left-angle-quotation> */
1327 else c = -15; /* <caron> */
1328 break;
1330 case '/':
1331 switch ( *s ) {
1332 case '/': c = 0x5C; break; /* <reverse-solidus> */
1333 case 'D': c = 0xE2; break; /* <D-stroke> */
1334 case 'd': c = 0xF2; break; /* <d-stroke> */
1335 case 'H': c = 0xE4; break; /* <H-stroke> */
1336 case 'h': c = 0xF4; break; /* <h-stroke> */
1337 case 'L': c = 0xE8; break; /* <L-stroke> */
1338 case 'l': c = 0xF8; break; /* <l-stroke> */
1339 case 'O': c = 0xE9; break; /* <O-stroke> */
1340 case 'o': c = 0xF9; break; /* <o-stroke> */
1341 case 'T': c = 0xED; break; /* <T-stroke> */
1342 case 't': c = 0xFD; break; /* <t-stroke> */
1344 break;
1346 case '2':
1347 if ( *s == '1' ) c = 0xBD; /* <one-half> */
1348 break;
1350 case '4':
1351 switch ( *s ) {
1352 case '1': c = 0xBC; break; /* <one-quarter> */
1353 case '3': c = 0xBE; break; /* <three-quarters> */
1355 break;
1357 case '6':
1358 switch ( *s ) {
1359 case '\'': c = 0xA9; break; /* <left-single-quotation> */
1360 case '"': c = 0xAA; break; /* <left-double-quotation> */
1362 break;
1364 case '8':
1365 switch ( *s ) {
1366 case '1': c = 0xDC; break; /* <one-eighth> */
1367 case '3': c = 0xDD; break; /* <three-eighths> */
1368 case '5': c = 0xDE; break; /* <five-eighths> */
1369 case '7': c = 0xDF; break; /* <seven-eighths> */
1370 case 'M': c = 0xD5; break; /* <eighth-note> */
1372 break;
1374 case '9':
1375 switch ( *s ) {
1376 case '\'': c = 0xB9; break; /* <right-single-quotation> */
1377 case '"': c = 0xBA; break; /* <right-double-quotation> */
1379 break;
1381 case 'A':
1382 if ( *s == 'A' ) c = -10; /* <ring-above> + <A> */
1383 break;
1385 case 'a':
1386 switch ( *s ) {
1387 case '-': c = 0xE3; break; /* <femenine-ordinal-a> */
1388 case 'a': c = -10; break; /* <ring-above> + <a> */
1390 break;
1392 case 'B':
1393 if ( *s == 'B' ) c = 0xD7; /* <broken-bar> */
1394 break;
1396 case 'b':
1397 if ( *s == 'N' ) c = 0xA6; /* <number-sign> */
1398 break;
1400 case 'd':
1401 if ( *s == 'P' ) c = 0xA3; /* <pound-sign> */
1402 break;
1404 case 'E':
1405 switch ( *s ) {
1406 case 'S': c = 0xA7; break; /* <section-sign> */
1407 case 'A': c = 0xE1; break; /* <AE> */
1408 case 'O': c = 0xEA; break; /* <OE> */
1410 break;
1412 case 'e':
1413 switch ( *s ) {
1414 case 'a': c = 0xF1; break; /* <ae> */
1415 case 'o': c = 0xFA; break; /* <oe> */
1416 case 'Y': c = 0xA5; break; /* <yen-sign> */
1418 break;
1420 case 'G':
1421 switch ( *s ) {
1422 case 'D': c = 0xB0; break; /* <degree-sign> */
1423 case 'N': c = 0xEE; break; /* <Eng> */
1425 break;
1427 case 'g':
1428 switch ( *s ) {
1429 case 'R': c = 0xD2; break; /* <registered-sign> */
1430 case 'n': c = 0xFE; break; /* <eng> */
1432 break;
1434 case 'H':
1435 if ( *s == 'T' ) c = 0xEC; /* <Thorn> */
1436 break;
1438 case 'h':
1439 if ( *s == 't' ) c = 0xFC; /* <thorn> */
1440 break;
1442 case 'I':
1443 switch ( *s ) {
1444 case 'P': c = 0xB6; break; /* <pilcrow-sign> */
1445 case '!': c = 0xA1; break; /* <inverted-exclamation> */
1446 case '?': c = 0xBF; break; /* <inverted-question> */
1448 break;
1450 case 'J':
1451 if ( *s == 'I' ) c = 0xE6; /* <IJ> */
1452 break;
1454 case 'j':
1455 if ( *s == 'i' ) c = 0xF6; /* <ij> */
1456 break;
1458 case 'k':
1459 if ( *s == 'k' ) c = 0xF0; /* <kra> */
1460 break;
1462 case 'M':
1463 switch ( *s ) {
1464 case '.': c = 0xB7; break; /* <middle-dot> */
1465 case '-': c = 0xD0; break; /* <em-dash> */
1466 case 'T': c = 0xD4; break; /* <trade-mark-sign> */
1468 break;
1470 case 'm':
1471 switch ( *s ) {
1472 case '\'': /* <macron> RFC 1345 */
1473 case ' ': c = -5; break; /* <macron> */
1474 case 'O': c = 0xE0; break; /* <Ohm sign> */
1476 break;
1478 case 'n':
1479 if ( *s == '\'' ) c = 0xEF; /* <n-preceded-by-apostrophe> */
1480 break;
1482 case 'O':
1483 switch ( *s ) {
1484 case 'D': c = 0xA4; break; /* <dollar-sign> */
1485 case 'N': c = 0xD6; break; /* <not-sign> */
1487 break;
1489 case 'o':
1490 switch ( *s ) {
1491 case 'C': c = 0xD3; break; /* <copyright-sign> */
1492 case '-': c = 0xEB; break; /* <masculine-ordinal-o> */
1494 break;
1496 case 'S':
1497 switch ( *s ) {
1498 case '1': c = 0xD1; break; /* <superscript-1> */
1499 case '2': c = 0xB2; break; /* <superscript-2> */
1500 case '3': c = 0xB3; break; /* <superscript-3> */
1501 case 'N': c = 0xA0; break; /* <no-break-space> */
1503 break;
1505 case 's':
1506 if ( *s == 's' ) c = 0xFB; /* <sharp-s> */
1507 break;
1509 case 't':
1510 if ( *s == 'C' ) c = 0xA2; /* <cent-sign> */
1511 break;
1513 case 'u':
1514 if ( *s == 'C' ) c = 0xA8; /* <currency-sign> */
1515 break;
1517 case 'v':
1518 if ( *s == '-' ) c = 0xAF; /* <downwards-arrow> */
1519 break;
1521 case 'X':
1522 if ( *s == '*' ) c = 0xB4; /* <multiplication-sign> */
1523 break;
1525 case 'y':
1526 if ( *s == 'M' ) c = 0xB5; /* <micro-sign> */
1527 break;
1530 if ( c > 0 ) {
1531 *o++ = c;
1532 return o;
1533 } else if ( !c )
1534 return NULL;
1536 /* else: c < 0 */
1537 n = -c;
1538 switch ( *s ) {
1540 case 'A': c = letter_w_diacritic[n][0]; break;
1541 case 'C': c = letter_w_diacritic[n][1]; break;
1542 case 'D': c = letter_w_diacritic[n][2]; break;
1543 case 'E': c = letter_w_diacritic[n][3]; break;
1544 case 'G': c = letter_w_diacritic[n][4]; break;
1545 case 'H': c = letter_w_diacritic[n][5]; break;
1546 case 'I': c = letter_w_diacritic[n][6]; break;
1547 case 'J': c = letter_w_diacritic[n][7]; break;
1548 case 'K': c = letter_w_diacritic[n][8]; break;
1549 case 'L': c = letter_w_diacritic[n][9]; break;
1550 case 'N': c = letter_w_diacritic[n][10]; break;
1551 case 'O': c = letter_w_diacritic[n][11]; break;
1552 case 'R': c = letter_w_diacritic[n][12]; break;
1553 case 'S': c = letter_w_diacritic[n][13]; break;
1554 case 'T': c = letter_w_diacritic[n][14]; break;
1555 case 'U': c = letter_w_diacritic[n][15]; break;
1556 case 'W': c = letter_w_diacritic[n][16]; break;
1557 case 'Y': c = letter_w_diacritic[n][17]; break;
1558 case 'Z': c = letter_w_diacritic[n][18]; break;
1560 case 'a': c = letter_w_diacritic[n][19]; break;
1561 case 'c': c = letter_w_diacritic[n][20]; break;
1562 case 'd': c = letter_w_diacritic[n][21]; break;
1563 case 'e': c = letter_w_diacritic[n][22]; break;
1564 case 'g': c = letter_w_diacritic[n][23]; break;
1565 case 'h': c = letter_w_diacritic[n][24]; break;
1566 case 'i': c = letter_w_diacritic[n][25]; break;
1567 case 'j': c = letter_w_diacritic[n][26]; break;
1568 case 'k': c = letter_w_diacritic[n][27]; break;
1569 case 'l': c = letter_w_diacritic[n][28]; break;
1570 case 'n': c = letter_w_diacritic[n][29]; break;
1571 case 'o': c = letter_w_diacritic[n][30]; break;
1572 case 'r': c = letter_w_diacritic[n][31]; break;
1573 case 's': c = letter_w_diacritic[n][32]; break;
1574 case 't': c = letter_w_diacritic[n][33]; break;
1575 case 'u': c = letter_w_diacritic[n][34]; break;
1576 case 'w': c = letter_w_diacritic[n][35]; break;
1577 case 'y': c = letter_w_diacritic[n][36]; break;
1578 case 'z': c = letter_w_diacritic[n][37]; break;
1580 case '\'':
1581 case ' ': c = -1; break;
1583 default: c = 0;
1586 if ( !c )
1587 return NULL;
1589 *o++ = n + 0xC0;
1590 *o++ = ( ( (*s == ' ') || (*s == '\'') ) ? ALONE : *s );
1591 return o;
1595 /* --- routine to convert from ISO 8859-n to T.61 --- */
1598 ldap_8859_to_t61( char **bufp, unsigned long *buflenp, int free_input )
1600 Byte *s, *oo, *o, *aux;
1601 int c;
1602 unsigned long len;
1603 Couple *cc;
1605 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_8859_to_t61 input length: %ld\n",
1606 *buflenp, 0, 0 );
1608 len = *buflenp;
1609 s = (Byte *) *bufp;
1611 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * len + 64 )) == NULL ) {
1612 return( 1 );
1615 while ( (char *)s - *(char **)bufp < len ) {
1616 switch( *s >> 5 ) {
1618 case 2:
1619 switch ( *s ) {
1621 case '^': *o++ = 0xC3; *o++ = ALONE; s++; break;
1623 case '\\':
1624 s++;
1625 if ( (c = hh_to_c( s )) != -1 ) {
1626 *o++ = c;
1627 s += 2;
1628 } else
1629 *o++ = '\\';
1630 break;
1632 default: *o++ = *s++;
1634 break;
1636 case 3:
1637 switch ( *s ) {
1639 case '`': *o++ = 0xC1; *o++ = ALONE; s++; break;
1640 case '~': *o++ = 0xC4; *o++ = ALONE; s++; break;
1642 case '{':
1643 s++;
1644 if ( *(s + 2) == '}' ) {
1645 if ( (aux = cc_to_t61( o, s )) != NULL ) {
1646 o = aux;
1647 s += 3;
1648 } else {
1649 *o++ = '{';
1651 } else if ( (*(s + 3) == '}') && ( (*s == 'x') || (*s == 'X') ) &&
1652 ( (c = hh_to_c( s + 1 )) != -1 ) ) {
1653 *o++ = c;
1654 s += 4;
1655 } else {
1656 *o++ = '{';
1658 break;
1660 default:
1661 *o++ = *s++;
1663 break;
1665 #if (ISO_8859 == 0)
1666 case 4: case 5: case 6: case 7:
1667 s++;
1668 break;
1669 #else
1670 case 5: case 6: case 7:
1671 # if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
1672 (ISO_8859 == 4) || (ISO_8859 == 9) || (ISO_8859 == 10)
1673 if ( (*(cc = &trans_iso8859_t61[ *s - 0xA0 ])).a ) {
1674 *o++ = (*cc).a;
1675 if ( (*cc).b ) *o++ = (*cc).b;
1677 # endif
1678 s++;
1679 break;
1680 #endif
1682 default:
1683 *o++ = *s++;
1687 len = o - oo;
1688 o = oo;
1690 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, len )) == NULL ) {
1691 NSLDAPI_FREE( o );
1692 return( 1 );
1695 if ( free_input ) {
1696 NSLDAPI_FREE( *bufp );
1698 *bufp = (char *) oo;
1699 *buflenp = len;
1700 return( 0 );
1704 #ifdef NOT_NEEDED_IN_LIBLDAP /* mcs@umich.edu 12 Oct 1995 */
1705 /* --- routine to convert "escaped" (\hh) characters to 8bits --- */
1707 void convert_escaped_to_8bit( s )
1708 char *s;
1710 char *o = s;
1711 int c;
1713 while ( *s ) {
1714 if ( *s == '\\' ) {
1715 if ( (c = hh_to_c( ++s )) != -1 ) {
1716 *o++ = c;
1717 s += 2;
1718 } else
1719 *o++ = '\\';
1720 } else
1721 *o++ = *s++;
1723 *o = '\0';
1726 /* --- routine to convert 8bits characters to the "escaped" (\hh) form --- */
1728 char *convert_8bit_to_escaped( s )
1729 Byte *s;
1731 Byte *o, *oo;
1732 Byte n;
1734 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * strlen( s ) + 64 )) == NULL ) {
1735 return( NULL );
1738 while ( *s ) {
1739 if ( *s < 0x80 )
1740 *o++ = *s++;
1741 else {
1742 *o++ = '\\';
1743 n = *s >> 4;
1744 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
1745 n = *s++ & 0x0F;
1746 *o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
1749 *o = '\0';
1751 o = oo;
1753 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, strlen( o ) + 1 )) == NULL ) {
1754 NSLDAPI_FREE( o );
1755 return( NULL );
1758 return( (char *)oo );
1761 /* --- routine to convert from T.61 to printable characters --- */
1764 printable characters [RFC 1488]: 'A'..'Z', 'a'..'z', '0'..'9',
1765 '\'', '(', ')', '+', ',', '-', '.', '/', ':', '?, ' '.
1767 that conversion is language dependent.
1770 static Couple last_t61_printabled[32] = {
1771 {0,0}, {'A','E'}, {'D',0}, {0,0},
1772 {'H',0}, {0,0}, {'I','J'}, {'L',0},
1773 {'L',0}, {'O',0}, {'O','E'}, {0,0},
1774 {'T','H'}, {'T',0}, {'N','G'}, {'n',0},
1775 {'k',0}, {'a','e'}, {'d',0}, {'d',0},
1776 {'h',0}, {'i',0}, {'i','j'}, {'l',0},
1777 {'l',0}, {'o',0}, {'o','e'}, {'s','s'},
1778 {'t','h'}, {'t',0}, {'n','g'}, {0,0}
1781 char *t61_printable( s )
1782 Byte *s;
1784 Byte *o, *oo;
1785 Byte n;
1786 Couple *cc;
1788 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * strlen( s ) + 64 )) == NULL ) {
1789 return( NULL );
1792 while ( *s ) {
1793 if ( ( (*s >= 'A') && (*s <= 'Z') ) ||
1794 ( (*s >= 'a') && (*s <= 'z') ) ||
1795 ( (*s >= '0') && (*s <= '9') ) ||
1796 ( (*s >= '\'') && (*s <= ')') ) ||
1797 ( (*s >= '+') && (*s <= '/') ) ||
1798 ( *s == '?' ) || ( *s == ' ' ) )
1799 *o++ = *s++;
1800 else {
1801 if ( *s >= 0xE0 ) {
1802 if ( (*(cc = &last_t61_printabled[ *s - 0xE0 ])).a ) {
1803 *o++ = (*cc).a;
1804 if ( (*cc).b ) *o++ = (*cc).b;
1807 else if ( (*s >> 4) == 0xC ) {
1808 switch ( *s ) {
1809 case 0xCA: /* ring */
1810 switch ( *(s + 1) ) {
1811 case 'A': *o++ = 'A'; *o++ = 'A'; s++; break; /* Swedish */
1812 case 'a': *o++ = 'a'; *o++ = 'a'; s++; break; /* Swedish */
1814 break;
1816 case 0xC8: /* diaeresis */
1817 switch ( *(s + 1) ) {
1818 case 'Y': *o++ = 'I'; *o++ = 'J'; s++; break; /* Dutch */
1819 case 'y': *o++ = 'i'; *o++ = 'j'; s++; break; /* Dutch */
1821 break;
1824 s++;
1827 *o = '\0';
1829 o = oo;
1831 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, strlen( o ) + 1 )) == NULL ) {
1832 NSLDAPI_FREE( o );
1833 return( NULL );
1836 return( (char *)oo );
1838 #endif /* NOT_NEEDED_IN_LIBLDAP */ /* mcs@umich.edu 12 Oct 1995 */
1840 #endif /* LDAP_CHARSET_8859 */
1841 #endif /* STR_TRANSLATION */