1 /*
2 * Copyright (c) 2001 by Sun Microsystems, Inc.
3 * All rights reserved.
4 */
5
6 #pragma ident "%Z%%M% %I% %E% SMI"
7
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/
13 *
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.
18 *
19 * The Original Code is Mozilla Communicator client code, released
20 * March 31, 1998.
21 *
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.
26 *
27 * Contributor(s):
28 */
29 /*
30 * Copyright (c) 1995 Regents of the University of Michigan.
31 * All rights reserved.
32 */
33 /*
34 * charset.c
35 */
36
37 #include "ldap-int.h"
38
39 #ifdef STR_TRANSLATION
40
41 void
ldap_set_string_translators(LDAP * ld,BERTranslateProc encode_proc,BERTranslateProc decode_proc)42 ldap_set_string_translators( LDAP *ld, BERTranslateProc encode_proc,
43 BERTranslateProc decode_proc )
44 {
45 if ( ld == NULL ) {
46 if ( !nsldapi_initialized ) {
47 nsldapi_initialize_defaults();
48 }
49 ld = &nsldapi_ld_defaults;
50 }
51
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;
55 }
56 }
57
58
59 void
ldap_enable_translation(LDAP * ld,LDAPMessage * entry,int enable)60 ldap_enable_translation( LDAP *ld, LDAPMessage *entry, int enable )
61 {
62 char *optionsp;
63
64 if ( ld == NULL ) {
65 if ( !nsldapi_initialized ) {
66 nsldapi_initialize_defaults();
67 }
68 ld = &nsldapi_ld_defaults;
69 }
70
71 optionsp = ( entry == NULLMSG ) ? &ld->ld_lberoptions :
72 &entry->lm_ber->ber_options;
73
74 if ( enable ) {
75 *optionsp |= LBER_OPT_TRANSLATE_STRINGS;
76 } else {
77 *optionsp &= ~LBER_OPT_TRANSLATE_STRINGS;
78 }
79 }
80
81
82 int
ldap_translate_from_t61(LDAP * ld,char ** bufp,unsigned long * lenp,int free_input)83 ldap_translate_from_t61( LDAP *ld, char **bufp, unsigned long *lenp,
84 int free_input )
85 {
86 ber_len_t length = (ber_len_t)*lenp;
87
88 if ( ld->ld_lber_decode_translate_proc == NULL ) {
89 return( LDAP_SUCCESS );
90 }
91
92 return( (*ld->ld_lber_decode_translate_proc)( bufp, &length, free_input ));
93 }
94
95
96 int
ldap_translate_to_t61(LDAP * ld,char ** bufp,unsigned long * lenp,int free_input)97 ldap_translate_to_t61( LDAP *ld, char **bufp, unsigned long *lenp,
98 int free_input )
99 {
100 ber_len_t length = (ber_len_t)*lenp;
101
102 if ( ld->ld_lber_encode_translate_proc == NULL ) {
103 return( LDAP_SUCCESS );
104 }
105
106 return( (*ld->ld_lber_encode_translate_proc)( bufp, &length, free_input ));
107 }
108
109
110 /*
111 ** Character translation routine notes:
112 *
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.
115 *
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.
120 *
121 * Return values: any ldap error code (LDAP_SUCCESS if all goes well).
122 */
123
124
125 #ifdef LDAP_CHARSET_8859
126
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
150
151 /*
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
157 *
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.
164 */
165
166 /* iso-t61.c - ISO-T61 translation routines (version: 0.2.1, July-1994) */
167 /*
168 * Copyright (c) 1994 Enrique Silvestre Mora, Universitat Jaume I, Spain.
169 * All rights reserved.
170 *
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.
177 */
178
179
180 #include <stdio.h>
181 #include <stdlib.h>
182 #include <string.h>
183
184 /* Character set used: ISO 8859-1, ISO 8859-2, ISO 8859-3, ... */
185 /* #define ISO_8859 1 */
186
187 #ifndef ISO_8859
188 # define ISO_8859 0
189 #endif
190
191 typedef unsigned char Byte;
192 typedef struct { Byte a, b; } Couple;
193
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 */
205
206 /*
207 Character choosed as base in diacritics alone: NO-BREAK SPACE.
208 (The standard say it must be a blank space, 0x20.)
209 */
210 #define ALONE 0xA0
211
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
239 };
240
241 /*
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 -----------------------------------------------------------------------
246 */
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
704 };
705
706 /*
707 --- T.61 characters [0xA0 .. 0xBF] -----------------
708 */
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
756 };
757
758 /*
759 --- T.61 characters [0xE0 .. 0xFF] -----------------
760 */
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
854 };
855
856 /*
857 --- ISO 8859-n characters <0xA0 .. 0xFF> -------------------
858 */
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'}
885 };
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}
912 };
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}
939 };
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}
966 };
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'}
993 };
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}
1020 };
1021 #endif
1022
1023
1024 static Byte *
c_to_hh(Byte * o,Byte c)1025 c_to_hh( Byte *o, Byte c )
1026 {
1027 Byte n;
1028
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;
1036 }
1037
1038
1039 static Byte *
c_to_cc(Byte * o,Couple * cc,Byte c)1040 c_to_cc( Byte *o, Couple *cc, Byte c )
1041 {
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++ = '}';
1050 }
1051 return o;
1052 }
1053 else
1054 return c_to_hh( o, c );
1055 }
1056
1057 /* --- routine to convert from T.61 to ISO 8859-n --- */
1058
1059 int
ldap_t61_to_8859(char ** bufp,unsigned long * buflenp,int free_input)1060 ldap_t61_to_8859( char **bufp, unsigned long *buflenp, int free_input )
1061 {
1062 Byte *s, *oo, *o;
1063 unsigned int n;
1064 int c;
1065 unsigned long len;
1066 Couple *cc;
1067
1068 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_t61_to_8859 input length: %ld\n",
1069 *buflenp, 0, 0 );
1070
1071 len = *buflenp;
1072 s = (Byte *) *bufp;
1073
1074 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * len + 64 )) == NULL ) {
1075 return( 1 );
1076 }
1077
1078 while ( (char *)s - *(char **)bufp < len ) {
1079 switch ( *s >> 4 ) {
1080
1081 case 0xA: case 0xB:
1082 o = c_to_cc( o, &trans_t61a_iso8859[ *s - 0xA0 ], *s );
1083 s++;
1084 break;
1085
1086 case 0xD: case 0xE: case 0xF:
1087 o = c_to_cc( o, &trans_t61b_iso8859[ *s - 0xD0 ], *s );
1088 s++;
1089 break;
1090
1091 case 0xC:
1092 if ( (*s == 0xC0) || (*s == 0xC9) || (*s == 0xCC) ) {
1093 o = c_to_hh( o, *s++ );
1094 break;
1095 }
1096
1097 n = (*s++) - 0xC0;
1098 switch ( *s ) {
1099
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;
1119
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;
1139
1140 case ALONE: c = (( !diacritic[n].b ) ? diacritic[n].a : -1);
1141 break;
1142
1143 default: c = 0;
1144 }
1145
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++ = '"';
1155 }
1156 *o++ = diacritic[n].a;
1157 *o++ = '}';
1158 }
1159 break;
1160
1161 #if (ISO_8859 == 0)
1162 case 0x8: case 0x9:
1163 *o++ = 0x1B; /* <ESC> */
1164 *o++ = *s++ - 0x40;
1165 break;
1166 #endif
1167
1168 default:
1169 *o++ = *s++;
1170 }
1171 }
1172
1173 len = o - oo;
1174 o = oo;
1175
1176 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, len )) == NULL ) {
1177 NSLDAPI_FREE( o );
1178 return( 1 );
1179 }
1180
1181 if ( free_input ) {
1182 NSLDAPI_FREE( *bufp );
1183 }
1184 *bufp = (char *) oo;
1185 *buflenp = len;
1186 return( 0 );
1187 }
1188
1189
1190 static int
hh_to_c(Byte * h)1191 hh_to_c( Byte *h )
1192 {
1193 Byte c;
1194
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;
1199
1200 c <<= 4;
1201
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;
1206
1207 return c;
1208 }
1209
1210
1211 static Byte *
cc_to_t61(Byte * o,Byte * s)1212 cc_to_t61( Byte *o, Byte *s )
1213 {
1214 int n, c = 0;
1215
1216 switch ( *(s + 1) ) {
1217
1218 case '`': c = -1; break; /* <grave-accent> */
1219
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> */
1226 }
1227 break;
1228
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> */
1234
1235 case '^': c = -3; break; /* <circumflex-acent> */
1236
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> */
1243 }
1244 break;
1245
1246 case '~':
1247 case '?': c = -4; break; /* <tilde> */
1248
1249 #if (ISO_8859 == 1) || (ISO_8859 == 4) || (ISO_8859 == 9)
1250 case 0xAF: c = -5; break; /* <macron> */
1251 #endif
1252
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> */
1260 }
1261 break;
1262
1263 #if (ISO_8859 == 2) || (ISO_8859 == 3)
1264 case 0xA2: c = -6; break; /* <breve> */
1265 #endif
1266
1267 case '(':
1268 if ( *s == '<' ) c = 0x5B; /* <left-square-bracket> */
1269 else c = -6; /* <breve> */
1270 break;
1271
1272 #if (ISO_8859 == 2) || (ISO_8859 == 3) || (ISO_8859 == 4)
1273 case 0xFF: c = -7; break; /* <dot-accent> */
1274 #endif
1275
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> */
1282 }
1283 break;
1284
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
1289
1290 case ':':
1291 if ( *s == '-') c = 0xB8; /* <division-sign> */
1292 else c = -8; /* <diaeresis> */
1293 break;
1294
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> */
1300
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> */
1306
1307 #if (ISO_8859 == 2)
1308 case 0xBD:
1309 #endif
1310 case '"': c = -13; break; /* <double-acute-accent> */
1311
1312 #if (ISO_8859 == 2) || (ISO_8859 == 4)
1313 case 0xB2:
1314 #endif
1315 case ';': c = -14; break; /* <ogonek> */
1316
1317 #if (ISO_8859 == 2) || (ISO_8859 == 4)
1318 case 0xB7: c = -15; break; /* <caron> */
1319 #endif
1320
1321 case ')':
1322 if ( *s == '!' ) c = 0x7D; /* <left-curly-bracket> */
1323 break;
1324
1325 case '<':
1326 if ( *s == '<' ) c = 0xAB; /* <left-angle-quotation> */
1327 else c = -15; /* <caron> */
1328 break;
1329
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> */
1343 }
1344 break;
1345
1346 case '2':
1347 if ( *s == '1' ) c = 0xBD; /* <one-half> */
1348 break;
1349
1350 case '4':
1351 switch ( *s ) {
1352 case '1': c = 0xBC; break; /* <one-quarter> */
1353 case '3': c = 0xBE; break; /* <three-quarters> */
1354 }
1355 break;
1356
1357 case '6':
1358 switch ( *s ) {
1359 case '\'': c = 0xA9; break; /* <left-single-quotation> */
1360 case '"': c = 0xAA; break; /* <left-double-quotation> */
1361 }
1362 break;
1363
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> */
1371 }
1372 break;
1373
1374 case '9':
1375 switch ( *s ) {
1376 case '\'': c = 0xB9; break; /* <right-single-quotation> */
1377 case '"': c = 0xBA; break; /* <right-double-quotation> */
1378 }
1379 break;
1380
1381 case 'A':
1382 if ( *s == 'A' ) c = -10; /* <ring-above> + <A> */
1383 break;
1384
1385 case 'a':
1386 switch ( *s ) {
1387 case '-': c = 0xE3; break; /* <femenine-ordinal-a> */
1388 case 'a': c = -10; break; /* <ring-above> + <a> */
1389 }
1390 break;
1391
1392 case 'B':
1393 if ( *s == 'B' ) c = 0xD7; /* <broken-bar> */
1394 break;
1395
1396 case 'b':
1397 if ( *s == 'N' ) c = 0xA6; /* <number-sign> */
1398 break;
1399
1400 case 'd':
1401 if ( *s == 'P' ) c = 0xA3; /* <pound-sign> */
1402 break;
1403
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> */
1409 }
1410 break;
1411
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> */
1417 }
1418 break;
1419
1420 case 'G':
1421 switch ( *s ) {
1422 case 'D': c = 0xB0; break; /* <degree-sign> */
1423 case 'N': c = 0xEE; break; /* <Eng> */
1424 }
1425 break;
1426
1427 case 'g':
1428 switch ( *s ) {
1429 case 'R': c = 0xD2; break; /* <registered-sign> */
1430 case 'n': c = 0xFE; break; /* <eng> */
1431 }
1432 break;
1433
1434 case 'H':
1435 if ( *s == 'T' ) c = 0xEC; /* <Thorn> */
1436 break;
1437
1438 case 'h':
1439 if ( *s == 't' ) c = 0xFC; /* <thorn> */
1440 break;
1441
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> */
1447 }
1448 break;
1449
1450 case 'J':
1451 if ( *s == 'I' ) c = 0xE6; /* <IJ> */
1452 break;
1453
1454 case 'j':
1455 if ( *s == 'i' ) c = 0xF6; /* <ij> */
1456 break;
1457
1458 case 'k':
1459 if ( *s == 'k' ) c = 0xF0; /* <kra> */
1460 break;
1461
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> */
1467 }
1468 break;
1469
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> */
1475 }
1476 break;
1477
1478 case 'n':
1479 if ( *s == '\'' ) c = 0xEF; /* <n-preceded-by-apostrophe> */
1480 break;
1481
1482 case 'O':
1483 switch ( *s ) {
1484 case 'D': c = 0xA4; break; /* <dollar-sign> */
1485 case 'N': c = 0xD6; break; /* <not-sign> */
1486 }
1487 break;
1488
1489 case 'o':
1490 switch ( *s ) {
1491 case 'C': c = 0xD3; break; /* <copyright-sign> */
1492 case '-': c = 0xEB; break; /* <masculine-ordinal-o> */
1493 }
1494 break;
1495
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> */
1502 }
1503 break;
1504
1505 case 's':
1506 if ( *s == 's' ) c = 0xFB; /* <sharp-s> */
1507 break;
1508
1509 case 't':
1510 if ( *s == 'C' ) c = 0xA2; /* <cent-sign> */
1511 break;
1512
1513 case 'u':
1514 if ( *s == 'C' ) c = 0xA8; /* <currency-sign> */
1515 break;
1516
1517 case 'v':
1518 if ( *s == '-' ) c = 0xAF; /* <downwards-arrow> */
1519 break;
1520
1521 case 'X':
1522 if ( *s == '*' ) c = 0xB4; /* <multiplication-sign> */
1523 break;
1524
1525 case 'y':
1526 if ( *s == 'M' ) c = 0xB5; /* <micro-sign> */
1527 break;
1528 }
1529
1530 if ( c > 0 ) {
1531 *o++ = c;
1532 return o;
1533 } else if ( !c )
1534 return NULL;
1535
1536 /* else: c < 0 */
1537 n = -c;
1538 switch ( *s ) {
1539
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;
1559
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;
1579
1580 case '\'':
1581 case ' ': c = -1; break;
1582
1583 default: c = 0;
1584 }
1585
1586 if ( !c )
1587 return NULL;
1588
1589 *o++ = n + 0xC0;
1590 *o++ = ( ( (*s == ' ') || (*s == '\'') ) ? ALONE : *s );
1591 return o;
1592 }
1593
1594
1595 /* --- routine to convert from ISO 8859-n to T.61 --- */
1596
1597 int
ldap_8859_to_t61(char ** bufp,unsigned long * buflenp,int free_input)1598 ldap_8859_to_t61( char **bufp, unsigned long *buflenp, int free_input )
1599 {
1600 Byte *s, *oo, *o, *aux;
1601 int c;
1602 unsigned long len;
1603 Couple *cc;
1604
1605 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_8859_to_t61 input length: %ld\n",
1606 *buflenp, 0, 0 );
1607
1608 len = *buflenp;
1609 s = (Byte *) *bufp;
1610
1611 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * len + 64 )) == NULL ) {
1612 return( 1 );
1613 }
1614
1615 while ( (char *)s - *(char **)bufp < len ) {
1616 switch( *s >> 5 ) {
1617
1618 case 2:
1619 switch ( *s ) {
1620
1621 case '^': *o++ = 0xC3; *o++ = ALONE; s++; break;
1622
1623 case '\\':
1624 s++;
1625 if ( (c = hh_to_c( s )) != -1 ) {
1626 *o++ = c;
1627 s += 2;
1628 } else
1629 *o++ = '\\';
1630 break;
1631
1632 default: *o++ = *s++;
1633 }
1634 break;
1635
1636 case 3:
1637 switch ( *s ) {
1638
1639 case '`': *o++ = 0xC1; *o++ = ALONE; s++; break;
1640 case '~': *o++ = 0xC4; *o++ = ALONE; s++; break;
1641
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++ = '{';
1650 }
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++ = '{';
1657 }
1658 break;
1659
1660 default:
1661 *o++ = *s++;
1662 }
1663 break;
1664
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;
1676 }
1677 # endif
1678 s++;
1679 break;
1680 #endif
1681
1682 default:
1683 *o++ = *s++;
1684 }
1685 }
1686
1687 len = o - oo;
1688 o = oo;
1689
1690 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, len )) == NULL ) {
1691 NSLDAPI_FREE( o );
1692 return( 1 );
1693 }
1694
1695 if ( free_input ) {
1696 NSLDAPI_FREE( *bufp );
1697 }
1698 *bufp = (char *) oo;
1699 *buflenp = len;
1700 return( 0 );
1701 }
1702
1703
1704 #ifdef NOT_NEEDED_IN_LIBLDAP /* mcs@umich.edu 12 Oct 1995 */
1705 /* --- routine to convert "escaped" (\hh) characters to 8bits --- */
1706
convert_escaped_to_8bit(s)1707 void convert_escaped_to_8bit( s )
1708 char *s;
1709 {
1710 char *o = s;
1711 int c;
1712
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++;
1722 }
1723 *o = '\0';
1724 }
1725
1726 /* --- routine to convert 8bits characters to the "escaped" (\hh) form --- */
1727
convert_8bit_to_escaped(s)1728 char *convert_8bit_to_escaped( s )
1729 Byte *s;
1730 {
1731 Byte *o, *oo;
1732 Byte n;
1733
1734 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * strlen( s ) + 64 )) == NULL ) {
1735 return( NULL );
1736 }
1737
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;
1747 }
1748 }
1749 *o = '\0';
1750
1751 o = oo;
1752
1753 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, strlen( o ) + 1 )) == NULL ) {
1754 NSLDAPI_FREE( o );
1755 return( NULL );
1756 }
1757
1758 return( (char *)oo );
1759 }
1760
1761 /* --- routine to convert from T.61 to printable characters --- */
1762
1763 /*
1764 printable characters [RFC 1488]: 'A'..'Z', 'a'..'z', '0'..'9',
1765 '\'', '(', ')', '+', ',', '-', '.', '/', ':', '?, ' '.
1766
1767 that conversion is language dependent.
1768 */
1769
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}
1779 };
1780
t61_printable(s)1781 char *t61_printable( s )
1782 Byte *s;
1783 {
1784 Byte *o, *oo;
1785 Byte n;
1786 Couple *cc;
1787
1788 if ( (o = oo = (Byte *)NSLDAPI_MALLOC( 2 * strlen( s ) + 64 )) == NULL ) {
1789 return( NULL );
1790 }
1791
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;
1805 }
1806 }
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 */
1813 }
1814 break;
1815
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 */
1820 }
1821 break;
1822 }
1823 }
1824 s++;
1825 }
1826 }
1827 *o = '\0';
1828
1829 o = oo;
1830
1831 if ( (oo = (Byte *)NSLDAPI_REALLOC( o, strlen( o ) + 1 )) == NULL ) {
1832 NSLDAPI_FREE( o );
1833 return( NULL );
1834 }
1835
1836 return( (char *)oo );
1837 }
1838 #endif /* NOT_NEEDED_IN_LIBLDAP */ /* mcs@umich.edu 12 Oct 1995 */
1839
1840 #endif /* LDAP_CHARSET_8859 */
1841 #endif /* STR_TRANSLATION */
1842