1 /* "$Id: $"
2  *
3  * Author: Jean-Marc Lienher ( http://oksid.ch )
4  * Copyright 2000-2003 by O'ksi'D.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19  * USA.
20  *
21  * Please report all bugs and problems on the following page:
22  *
23  *     http://www.fltk.org/str.php
24  */
25 
26 #include <stdlib.h>
27 #include <string.h>
28 
29 #define RET_ILSEQ -1
30 #define RET_TOOFEW(x) (-10 - x)
31 #define RET_TOOSMALL -2
32 #define conv_t void*
33 #define ucs4_t unsigned int
34 typedef struct {
35   unsigned short indx;
36   unsigned short used;
37 } Summary16;
38 
39 #define NEED_TOMB /* indicates what part of these include files is needed here (avoid compilation warnings) */
40 #include "lcUniConv/cp936ext.h"
41 #include "lcUniConv/big5.h"
42 #include "lcUniConv/gb2312.h"
43 #include "lcUniConv/iso8859_10.h"
44 #include "lcUniConv/iso8859_11.h"
45 #include "lcUniConv/iso8859_13.h"
46 #include "lcUniConv/iso8859_14.h"
47 #include "lcUniConv/iso8859_15.h"
48 #include "lcUniConv/iso8859_2.h"
49 #include "lcUniConv/iso8859_3.h"
50 #include "lcUniConv/iso8859_4.h"
51 #include "lcUniConv/iso8859_5.h"
52 #include "lcUniConv/iso8859_6.h"
53 #include "lcUniConv/iso8859_7.h"
54 #include "lcUniConv/iso8859_8.h"
55 #include "lcUniConv/iso8859_9.h"
56 #include "lcUniConv/jisx0201.h"
57 #include "lcUniConv/jisx0208.h"
58 #include "lcUniConv/jisx0212.h"
59 #include "lcUniConv/koi8_r.h"
60 #include "lcUniConv/koi8_u.h"
61 #include "lcUniConv/ksc5601.h"
62 #include "lcUniConv/cp1251.h"
63 #include "headers/symbol_.h"
64 #include "headers/dingbats_.h"
65 
66 /*************** conv_gen.c ************/
67 
68 /*const*/
ucs2fontmap(char * s,unsigned int ucs,int enc)69 int ucs2fontmap(char *s, unsigned int ucs, int enc) {
70   switch(enc) {
71   case 0:	/* iso10646-1 */
72     s[0] = (char) ((ucs & 0xFF00) >> 8);
73     s[1] = (char) (ucs & 0xFF);
74     return 0;
75     break;
76   case 1:	/* iso8859-1 */
77     if (ucs <= 0x00FF) {
78       if (ucs >= 0x0001) {
79         s[0] = 0;
80         s[1] = (char) (ucs & 0xFF);
81         return 1;
82       }
83     }
84     break;
85   case 2:	/* iso8859-2 */
86     if (ucs <= 0x00a0) {
87       s[0] = 0;
88       s[1] = (char) ucs;
89       return 2;
90     } else if (ucs < 0x0180) {
91       if (ucs >= 0x00a0) {
92 	s[0] = 0;
93 	s[1] = (char)  iso8859_2_page00[ucs-0x00a0];
94         if (s[1]) return 2;
95       }
96     } else if (ucs < 0x02e0) {
97       if (ucs >= 0x02c0) {
98         s[0] = 0;
99         s[1] = (char) iso8859_2_page02[ucs-0x02c0];
100         if (s[1]) return 2;
101       }
102     }
103     break;
104   case 3:	/* iso8859-3 */
105     if (iso8859_3_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
106       return 3;
107     }
108     break;
109   case 4:	/* iso8859-4 */
110     if (iso8859_4_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
111       return 4;
112     }
113     break;
114   case 5:	/* iso8859-5 */
115     if (iso8859_5_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
116       return 5;
117     }
118     break;
119   case 6:	/* iso8859-6 */
120     if (iso8859_6_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
121       return 6;
122     }
123     break;
124   case 7:	/* iso8859-7 */
125     if (iso8859_7_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
126       return 7;
127     }
128     break;
129   case 8:	/* iso8859-8 */
130     if (iso8859_8_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
131       return 8;
132     }
133     break;
134   case 9:	/* iso8859-9 */
135     if (iso8859_9_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
136       return 9;
137     }
138     break;
139   case 10:	/* iso8859-10 */
140     if (iso8859_10_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
141       return 10;
142     }
143     break;
144   case 25:	/* iso8859-11 */
145     if (iso8859_11_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
146       return 25;
147     }
148     break;
149   case 11:	/* iso8859-13 */
150     if (iso8859_13_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
151       return 11;
152     }
153     break;
154   case 12:	/* iso8859-14 */
155     if (iso8859_14_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
156       return 12;
157     }
158     break;
159   case 13:	/* iso8859-15 */
160     if (iso8859_15_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
161       return 13;
162     }
163     break;
164   case 14:	/* koi8-r */
165     if (koi8_r_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
166       return 14;
167     }
168     break;
169   case 15:	/* big5 */
170     if (big5_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
171       return 15;
172     }
173     break;
174   case 16:	/* ksc5601.1987-0 */
175     if (ksc5601_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
176       return 16;
177     }
178     break;
179   case 17:	/* gb2312.1980-0 */
180     if (gb2312_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
181       return 17;
182     }
183     break;
184   case 18:	/* jisx0201.1976-0 */
185     if (jisx0201_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
186       return 18;
187     }
188     break;
189   case 19:	/* jisx0208.1983-0 */
190     if (jisx0208_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
191       return 19;
192     }
193     break;
194   case 20:	/* jisx0212.1990-0 */
195     if (jisx0212_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
196       return 20;
197     }
198     break;
199   case 21:	/* symbol */
200     if (ucs <= 0x00F7) {
201       if (ucs >= 0x0020) {
202         s[0] = 0;
203         s[1] = unicode_to_symbol_1b_0020[ucs - 0x0020];
204         if (s[1]) return 21;
205       }
206     } else if (ucs <= 0x0192) {
207       if (ucs >= 0x0192) {
208         s[0] = 0;
209         s[1] = unicode_to_symbol_1b_0192[ucs - 0x0192];
210         if (s[1]) return 21;
211       }
212     } else if (ucs <= 0x03D6) {
213       if (ucs >= 0x0391) {
214         s[0] = 0;
215         s[1] = unicode_to_symbol_1b_0391[ucs - 0x0391];
216         if (s[1]) return 21;
217       }
218     } else if (ucs <= 0x232A) {
219       if (ucs >= 0x2022) {
220         s[0] = 0;
221         s[1] = unicode_to_symbol_1b_2022[ucs - 0x2022];
222         if (s[1]) return 21;
223       }
224     } else if (ucs <= 0x25CA) {
225       if (ucs >= 0x25CA) {
226         s[0] = 0;
227         s[1] = unicode_to_symbol_1b_25CA[ucs - 0x25CA];
228         if (s[1]) return 21;
229       }
230     } else if (ucs <= 0x2666) {
231       if (ucs >= 0x2660) {
232         s[0] = 0;
233         s[1] = unicode_to_symbol_1b_2660[ucs - 0x2660];
234         if (s[1]) return 21;
235       }
236     } else if (ucs <= 0xF6DB) {
237       if (ucs >= 0xF6D9) {
238         s[0] = 0;
239         s[1] = unicode_to_symbol_1b_F6D9[ucs - 0xF6D9];
240         if (s[1]) return 21;
241       }
242     } else if (ucs <= 0xF8FE) {
243       if (ucs >= 0xF8E5) {
244         s[0] = 0;
245         s[1] = unicode_to_symbol_1b_F8E5[ucs - 0xF8E5];
246         if (s[1]) return 21;
247       }
248     }
249     break;
250   case 22:	/* dingbats */
251     if (ucs <= 0x00A0) {
252       if (ucs >= 0x0020) {
253         s[0] = 0;
254         s[1] = unicode_to_dingbats_1b_0020[ucs - 0x0020];
255         if (s[1]) return 22;
256       }
257     } else if (ucs <= 0x2195) {
258       if (ucs >= 0x2192) {
259         s[0] = 0;
260         s[1] = unicode_to_dingbats_1b_2192[ucs - 0x2192];
261         if (s[1]) return 22;
262       }
263     } else if (ucs <= 0x2469) {
264       if (ucs >= 0x2460) {
265         s[0] = 0;
266         s[1] = unicode_to_dingbats_1b_2460[ucs - 0x2460];
267         if (s[1]) return 22;
268       }
269     } else if (ucs <= 0x2666) {
270       if (ucs >= 0x25A0) {
271         s[0] = 0;
272         s[1] = unicode_to_dingbats_1b_25A0[ucs - 0x25A0];
273         if (s[1]) return 22;
274       }
275     } else if (ucs <= 0x27BE) {
276       if (ucs >= 0x2701) {
277         s[0] = 0;
278         s[1] = unicode_to_dingbats_1b_2701[ucs - 0x2701];
279         if (s[1]) return 22;
280       }
281     } else if (ucs <= 0xF8E4) {
282       if (ucs >= 0xF8D7) {
283         s[0] = 0;
284         s[1] = unicode_to_dingbats_1b_F8D7[ucs - 0xF8D7];
285         if (s[1]) return 22;
286       }
287     }
288     break;
289   case 23:	/* koi8-u */
290     if (koi8_u_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
291       return 23;
292     }
293     break;
294   case 24:	/* microsoft-cp1251 */
295     if (cp1251_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
296       return 24;
297     }
298     break;
299   case 26: /* gbk/cp936ext */
300     if (cp936ext_wctomb(NULL, (unsigned char*)s, ucs, 2) > 0) {
301       return 26;
302     }
303     break;
304   default:
305     break;
306   };
307   return -1;
308 }
309 
310 /*const*/
encoding_number(const char * enc)311 int encoding_number(const char *enc) {
312   if (!enc || !strncmp(enc, "iso10646-1", 10)) {
313     return 0;
314   } else if (!strcmp(enc, "iso8859-1")) {
315     return 1;
316   } else if (!strcmp(enc, "iso8859-2")) {
317     return 2;
318   } else if (!strcmp(enc, "iso8859-3")) {
319     return 3;
320   } else if (!strcmp(enc, "iso8859-4")) {
321     return 4;
322   } else if (!strcmp(enc, "iso8859-5")) {
323     return 5;
324   } else if (!strcmp(enc, "iso8859-6")) {
325     return 6;
326   } else if (!strcmp(enc, "iso8859-7")) {
327     return 7;
328   } else if (!strcmp(enc, "iso8859-8")) {
329     return 8;
330   } else if (!strcmp(enc, "iso8859-9")) {
331     return 9;
332   } else if (!strcmp(enc, "iso8859-10")) {
333     return 10;
334   } else if (!strcmp(enc, "iso8859-13")) {
335     return 11;
336   } else if (!strcmp(enc, "iso8859-14")) {
337     return 12;
338   } else if (!strcmp(enc, "iso8859-15")) {
339     return 13;
340   } else if (!strcmp(enc, "koi8-r")) {
341     return 14;
342   } else if (!strcmp(enc, "big5-0") || !strcmp(enc, "big5.eten-0") ||
343     !strcmp(enc, "big5p-0"))
344   {
345     return 15;
346   } else if (!strcmp(enc, "ksc5601.1987-0")) {
347     return 16;
348   } else if (!strcmp(enc, "gb2312.1980-0") || !strcmp(enc, "gb2312.80-0") ||
349      !strcmp(enc, "gb2312.80&gb8565.88") ||  !strcmp(enc, "gb2312.80-0"))
350   {
351     return 17;
352   } else if (!strcmp(enc, "jisx0201.1976-0")) {
353     return 18;
354   } else if (!strcmp(enc, "jisx0208.1983-0") || !strcmp(enc, "jisx0208.1990-0")
355     || !strcmp(enc, "jisx0208.1978-0"))
356   {
357     return 19;
358   } else if (!strcmp(enc, "jisx0212.1990-0")) {
359     return 20;
360   } else if (!strcmp(enc, "symbol")) {
361     return 21;
362   } else if (!strcmp(enc, "dingbats") || !strcmp(enc, "zapfdingbats") ||
363     !strcmp(enc, "zapf dingbats") || !strcmp(enc, "itc zapf dingbats"))
364   {
365     return 22;
366   } else if (!strcmp(enc, "koi8-u")) {
367     return 23;
368   } else if (!strcmp(enc, "microsoft-cp1251")) {
369     return 24;
370   } else if (!strcmp(enc, "iso8859-11")) {
371     return 25;
372   } else if (!strcmp(enc, "gbk-0") || !strcmp(enc, "cp936") || !strcmp(enc, "gbk")) {
373     return 26;
374   };
375   return -1;
376 }
377 
378 /*
379  * End of "$Id$".
380  */
381