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