2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* lcUTF.c 1.1 - Fujitsu source for CDEnext 95/11/06 20:32:41 */
24 /* $XConsortium: _fallcUTF.c /main/2 1996/09/27 19:03:38 drk $ */
25 /******************************************************************
27 Copyright 1993 by SunSoft, Inc.
29 Permission to use, copy, modify, distribute, and sell this software
30 and its documentation for any purpose is hereby granted without fee,
31 provided that the above copyright notice appear in all copies and
32 that both that copyright notice and this permission notice appear
33 in supporting documentation, and that the name of SunSoft, Inc.
34 not be used in advertising or publicity pertaining to distribution
35 of the software without specific, written prior permission.
36 SunSoft, Inc. makes no representations about the suitability of
37 this software for any purpose. It is provided "as is" without
38 express or implied warranty.
40 SunSoft Inc. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
41 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
42 IN NO EVENT SHALL SunSoft, Inc. BE LIABLE FOR ANY SPECIAL, INDIRECT
43 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
44 OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
45 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
46 OR PERFORMANCE OF THIS SOFTWARE.
48 Author: Hiromu Inukai (inukai@Japan.Sun.COM) SunSoft, inc.
50 ******************************************************************/
51 #include "_fallcUTF.h"
53 static long getutfrune();
54 static void our_wctomb(
55 #if NeedFunctionPrototypes
61 static int our_mbtowc(
62 #if NeedFunctionPrototypes
68 static void latin2rune(
69 #if NeedFunctionPrototypes
74 static void jis02012rune(
75 #if NeedFunctionPrototypes
80 static void jis02082rune(
81 #if NeedFunctionPrototypes
87 #if NeedFunctionPrototypes
93 #if NeedFunctionPrototypes
98 static void init_latin1tab();
99 static void init_latin2tab();
100 static void init_latin3tab();
101 static void init_latin4tab();
102 static void init_latin5tab();
103 static void init_latin6tab();
104 static void init_latin7tab();
105 static void init_latin8tab();
106 static void init_latin9tab();
107 static void init_jis0201tab();
108 static void init_jis0208tab();
109 static void init_ksc5601tab();
110 static void init_gb2312tab();
113 static char *int_locale = NULL;
114 static long *tabkuten = NULL;
115 static long *tabksc5601 = NULL;
116 static long *tabgb = NULL;
118 static UtfData utfdata_list = (UtfData)NULL;
120 static XlcUTFDataRec default_utf_data[] =
122 {"ISO8859-1", XlcGL, init_latin1tab, latin2rune, N11n_none, 0x20},
123 {"ISO8859-1", XlcGR, init_latin1tab, latin2rune, N11n_none, 0x20},
124 {"ISO8859-1", XlcGL, init_latin2tab, latin2rune, N11n_none, 0x20},
125 {"ISO8859-1", XlcGR, init_latin2tab, latin2rune, N11n_none, 0x20},
126 {"ISO8859-1", XlcGL, init_latin3tab, latin2rune, N11n_none, 0x20},
127 {"ISO8859-1", XlcGR, init_latin3tab, latin2rune, N11n_none, 0x20},
128 {"ISO8859-1", XlcGL, init_latin4tab, latin2rune, N11n_none, 0x20},
129 {"ISO8859-1", XlcGR, init_latin4tab, latin2rune, N11n_none, 0x20},
130 {"ISO8859-1", XlcGL, init_latin5tab, latin2rune, N11n_none, 0x20},
131 {"ISO8859-1", XlcGR, init_latin5tab, latin2rune, N11n_none, 0x20},
132 {"ISO8859-1", XlcGL, init_latin6tab, latin2rune, N11n_none, 0x20},
133 {"ISO8859-1", XlcGR, init_latin6tab, latin2rune, N11n_none, 0x20},
134 {"ISO8859-1", XlcGL, init_latin7tab, latin2rune, N11n_none, 0x20},
135 {"ISO8859-1", XlcGR, init_latin7tab, latin2rune, N11n_none, 0x20},
136 {"ISO8859-1", XlcGL, init_latin8tab, latin2rune, N11n_none, 0x20},
137 {"ISO8859-1", XlcGR, init_latin8tab, latin2rune, N11n_none, 0x20},
138 {"ISO8859-1", XlcGL, init_latin9tab, latin2rune, N11n_none, 0x20},
139 {"ISO8859-1", XlcGR, init_latin9tab, latin2rune, N11n_none, 0x20},
140 {"JISX0201.1976-0", XlcGL, init_jis0201tab, jis02012rune, N11n_none, 0x20},
141 {"JISX0201.1976-0", XlcGR, init_jis0201tab, jis02012rune, N11n_none, 0x20},
142 {"JISX0208.1983-0", XlcGL, init_jis0208tab, jis02082rune, N11n_ja, 0x2222},
143 {"JISX0208.1983-0", XlcGR, init_jis0208tab, jis02082rune, N11n_ja, 0x2222},
144 {"KSC5601.1987-0", XlcGL, init_ksc5601tab, ksc2rune, N11n_ko, 0x2160},
145 {"KSC5601.1987-0", XlcGR, init_ksc5601tab, ksc2rune, N11n_ko, 0x2160},
146 {"GB2312.1980-0", XlcGL, init_gb2312tab, gb2rune, N11n_zh, 0x2175},
147 {"GB2312.1980-0", XlcGR, init_gb2312tab, gb2rune, N11n_zh, 0x2175},
152 set_latin_nop(table, default_val)
157 for(i = 0; i < 0x1fff; i++)
158 table[i] = default_val;
163 set_latin_tab(fptr, table, fb_default)
173 for(i = 0; i < NRUNE; i++)
175 while((rv = fscanf(fptr, "%lx", (long unsigned *) &value)) != EOF) {
176 if(rv != 0 && value >= 0) {
179 set_latin_nop(table, fb_default);
185 extern int _fallcResolveI18NPath();
186 #define TBL_DATA_DIR "tbl_data"
189 init_latin1tab(tbl, fb_default)
194 char dirname[BUFSIZE];
195 char filename[BUFSIZE];
198 _fallcResolveI18NPath(dirname);
205 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_1);
206 fp = fopen(filename, "r");
208 set_latin_tab(fp, tbl, fb_default);
219 set_latin_nop(tbl, fb_default);
224 init_latin2tab(tbl, fb_default)
229 char dirname[BUFSIZE];
230 char filename[BUFSIZE];
233 _fallcResolveI18NPath(dirname);
240 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_2);
241 fp = fopen(filename, "r");
243 set_latin_tab(fp, tbl, fb_default);
254 set_latin_nop(tbl, fb_default);
259 init_latin3tab(tbl, fb_default)
264 char dirname[BUFSIZE];
265 char filename[BUFSIZE];
268 _fallcResolveI18NPath(dirname);
275 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_3);
276 fp = fopen(filename, "r");
278 set_latin_tab(fp, tbl, fb_default);
289 set_latin_nop(tbl, fb_default);
294 init_latin4tab(tbl, fb_default)
299 char dirname[BUFSIZE];
300 char filename[BUFSIZE];
303 _fallcResolveI18NPath(dirname);
310 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_4);
311 fp = fopen(filename, "r");
313 set_latin_tab(fp, tbl, fb_default);
324 set_latin_nop(tbl, fb_default);
329 init_latin5tab(tbl, fb_default)
334 char dirname[BUFSIZE];
335 char filename[BUFSIZE];
338 _fallcResolveI18NPath(dirname);
345 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_5);
346 fp = fopen(filename, "r");
348 set_latin_tab(fp, tbl, fb_default);
359 set_latin_nop(tbl, fb_default);
364 init_latin6tab(tbl, fb_default)
369 char dirname[BUFSIZE];
370 char filename[BUFSIZE];
373 _fallcResolveI18NPath(dirname);
380 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_6);
381 fp = fopen(filename, "r");
383 set_latin_tab(fp, tbl, fb_default);
394 set_latin_nop(tbl, fb_default);
399 init_latin7tab(tbl, fb_default)
404 char dirname[BUFSIZE];
405 char filename[BUFSIZE];
408 _fallcResolveI18NPath(dirname);
415 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_7);
416 fp = fopen(filename, "r");
418 set_latin_tab(fp, tbl, fb_default);
429 set_latin_nop(tbl, fb_default);
434 init_latin8tab(tbl, fb_default)
439 char dirname[BUFSIZE];
440 char filename[BUFSIZE];
443 _fallcResolveI18NPath(dirname);
450 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_8);
451 fp = fopen(filename, "r");
453 set_latin_tab(fp, tbl, fb_default);
464 set_latin_nop(tbl, fb_default);
469 init_latin9tab(tbl, fb_default)
474 char dirname[BUFSIZE];
475 char filename[BUFSIZE];
478 _fallcResolveI18NPath(dirname);
485 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, tab8859_9);
486 fp = fopen(filename, "r");
488 set_latin_tab(fp, tbl, fb_default);
499 set_latin_nop(tbl, fb_default);
504 init_jis0201tab(tbl, fb_default)
509 for(i = 0; i < NRUNE; i++)
514 set_cjk_nop(to_tbl, to_max, default_val)
520 for(i = 0; i < to_max; i++)
521 (*to_tbl)[i] = default_val;
526 set_table(fptr, to_tbl, from_tbl, to_max, fb_default)
528 long **to_tbl, *from_tbl;
537 for(i = 0; i < NRUNE; i++)
539 while((rv = fscanf(fptr, "%lx", (long unsigned *) &value)) != EOF) {
541 (*to_tbl)[j++] = value;
543 set_cjk_nop(to_tbl, to_max, fb_default);
547 for(i = 0; i < to_max; i++) {
548 if((value = (*to_tbl)[i]) != -1){
549 from_tbl[abs(value)] = i;
557 init_jis0208tab(tbl, fb_default)
562 char dirname[BUFSIZE];
563 char filename[BUFSIZE];
566 if((tabkuten = (long *)Xmalloc(KUTENMAX * sizeof(long))) == NULL) {
569 _fallcResolveI18NPath(dirname);
576 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, jis0208);
577 fp = fopen(filename, "r");
579 set_table(fp, &tabkuten, tbl, KUTENMAX, fb_default);
590 set_cjk_nop(&tabkuten, KUTENMAX, fb_default);
595 init_ksc5601tab(tbl, fb_default)
600 char dirname[BUFSIZE];
601 char filename[BUFSIZE];
604 if((tabksc5601 = (long *)Xmalloc(KSCMAX * sizeof(long))) == NULL) {
607 _fallcResolveI18NPath(dirname);
614 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, ksc5601);
615 fp = fopen(filename, "r");
617 set_table(fp, &tabksc5601, tbl, KSCMAX, fb_default);
628 set_cjk_nop(&tabksc5601, KSCMAX, fb_default);
633 init_gb2312tab(tbl, fb_default)
638 char dirname[BUFSIZE];
639 char filename[BUFSIZE];
642 if((tabgb = (long *)Xmalloc(GBMAX * sizeof(long))) == NULL) {
645 _fallcResolveI18NPath(dirname);
652 sprintf(filename, "%s/%s/%s", p, TBL_DATA_DIR, gb2312);
653 fp = fopen(filename, "r");
655 set_table(fp, &tabgb, tbl, GBMAX, fb_default);
666 set_cjk_nop(&tabgb, GBMAX, fb_default);
673 UtfData tmp = (UtfData)Xmalloc(sizeof(UtfDataRec));
674 bzero(tmp, sizeof(UtfDataRec));
685 CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
686 int codeset_num = XLC_GENERIC(lcd, codeset_num);
690 utfdata_list = make_entry();
692 pdata = utfdata_list;
693 for(i=0; i < codeset_num; i++) {
694 XlcCharSet charset = *codeset_list[i]->charset_list;
696 if(charset == pdata->charset) {
705 for(j = 0; j < MAX_UTF_CHARSET; j++) {
706 if(_fallcCompareISOLatin1(charset->encoding_name, default_utf_data[j].name) ||
707 charset->side != default_utf_data[j].side) {
710 pdata->initialize = default_utf_data[j].initialize;
711 pdata->fromtbl = (long *)Xmalloc(NRUNE * sizeof(long));
712 (*pdata->initialize)(pdata->fromtbl, default_utf_data[j].fallback_value);
713 pdata->already_init = True;
714 pdata->charset = charset;
715 pdata->cstorune = default_utf_data[j].cstorune;
716 pdata->type = default_utf_data[j].type;
717 pdata->next = make_entry();
729 utftocs(conv, from, from_left, to, to_left, args, num_args)
740 int utf_len, buf_len;
742 XlcCharSet tmpcharset = (XlcCharSet)NULL;
743 UtfData pdata = utfdata_list;
745 if (from == NULL || *from == NULL)
750 utf_len = *from_left;
753 while(utf_len > 0 && buf_len > 0) {
755 if((l = getutfrune(&p, &utf_len)) == -2) {
762 tbl = pdata->fromtbl;
764 if((r = *tbl) == -1) {
773 if(!tmpcharset) tmpcharset = pdata->charset;
779 switch(pdata->type) {
781 *bufptr++ = (r/100 + ' ');
782 *bufptr++ = (r%100 + ' ');
785 *bufptr++ = (r/94 + 0x21);
786 *bufptr++ = (r%94 + 0x21);
789 *bufptr++ = 0x20 + (r/100);
790 *bufptr++ = 0x20 + (r%100);
799 if(!tmpcharset) return (-1); /* Unknown Codepoint */
803 if((num_args > 0) && tmpcharset)
804 *((XlcCharSet *) args[0]) = tmpcharset;
806 *from_left -= utfptr - *from;
809 *to_left -= bufptr - *to;
816 utf1tocs(conv, from, from_left, to, to_left, args, num_args)
826 char char_ptr[UTFmax];
828 unsigned long dummy = (unsigned long)0;
830 if (from == NULL || *from == NULL)
831 return utftocs(conv, from, from_left, to, to_left, args, num_args);
834 for(i = 0; i < UTFmax; char_ptr[i++] = *(*ptr)++);
836 while(our_mbtowc(&dummy, (char*)&char_ptr[0], i) <= 0)
838 utftocs(conv, from, &i, to, to_left, args, num_args);
842 ucstocs(conv, from, from_left, to, to_left, args, num_args)
853 int ucs_len, buf_len;
854 XlcCharSet tmpcharset = (XlcCharSet)NULL;
855 UtfData pdata = utfdata_list;
857 if (from == NULL || *from == NULL)
860 ucsptr = (wchar_t *)*from;
862 ucs_len = *from_left;
865 while(ucs_len > 0 && buf_len > 0) {
870 tbl = pdata->fromtbl;
872 if((r = *tbl) == -1) {
880 if(!tmpcharset) tmpcharset = pdata->charset;
888 switch(pdata->type) {
890 *bufptr++ = (r/100 + ' ');
891 *bufptr++ = (r%100 + ' ');
894 *bufptr++ = (r/94 + 0x21);
895 *bufptr++ = (r%94 + 0x21);
898 *bufptr++ = 0x20 + (r/100);
899 *bufptr++ = 0x20 + (r%100);
909 if(!tmpcharset) return (-1); /* Unknown Codepoint */
912 if((num_args > 0) && tmpcharset)
913 *((XlcCharSet *) args[0]) = tmpcharset;
915 *from_left -= ucsptr - (wchar_t *)*from;
916 *from = (XPointer)ucsptr;
918 *to_left -= bufptr - *to;
925 #if NeedFunctionPrototypes
926 getutfrune(char **read_from, int *from_len)
928 getutfrune(read_from, from_len)
934 char str[UTFmax]; /* MB_LEN_MAX really */
939 for(i = 0; i <= UTFmax;) {
943 n = our_mbtowc(&l, str, i);
955 cstoutf(conv, from, from_left, to, to_left, args, num_args)
965 char *csptr, *utfptr;
966 int csstr_len, utf_len;
969 #if NeedFunctionPrototypes
975 UtfData pdata = utfdata_list;
977 if (from == NULL || *from == NULL)
985 csstr_len = *from_left;
988 charset = (XlcCharSet)args[0];
989 cmp_len = strchr(charset->name, ':') - charset->name;
991 if(!_fallcNCompareISOLatin1(charset->name, pdata->charset->name, cmp_len)) {
992 putrune = pdata->cstorune;
1001 while(csstr_len-- > 0 && utf_len > 0) {
1002 (*putrune)(*csptr++, &r);
1006 our_wctomb(r, &utfptr, &utf_len);
1010 *from_left -= csptr - *from;
1013 *to_left -= utfptr - *to;
1020 cstoucs(conv, from, from_left, to, to_left, args, num_args)
1032 int csstr_len, ucs_len;
1035 #if NeedFunctionPrototypes
1041 UtfData pdata = utfdata_list;
1043 if (from == NULL || *from == NULL)
1050 ucsptr = (wchar_t *)*to;
1051 csstr_len = *from_left;
1053 charset = (XlcCharSet)args[0];
1054 cmp_len = strchr(charset->name, ':') - charset->name;
1056 while(pdata->next) {
1057 if(!_fallcNCompareISOLatin1(charset->name, pdata->charset->name, cmp_len)) {
1058 putrune = pdata->cstorune;
1061 pdata = pdata->next;
1067 while(csstr_len-- > 0 && ucs_len > 0) {
1068 (*putrune)(*csptr++, &r);
1078 *from_left -= csptr - *from;
1081 *to_left -= ucsptr - (wchar_t *)*to;
1082 *to = (XPointer)ucsptr;
1088 #if NeedFunctionPrototypes
1089 our_wctomb(Rune r, char **utfptr, int *utf_len)
1091 our_wctomb(r, utfptr, utf_len)
1099 if(!utfptr || !*utfptr)
1100 return; /* no shift states */
1105 *(*utfptr)++ = T6 | ((l >> 5*Bitx) & Mask6);
1106 *(*utfptr)++ = Tx | ((l >> 4*Bitx) & Maskx);
1107 *(*utfptr)++ = Tx | ((l >> 3*Bitx) & Maskx);
1108 *(*utfptr)++ = Tx | ((l >> 2*Bitx) & Maskx);
1109 *(*utfptr)++ = Tx | ((l >> 1*Bitx) & Maskx);
1110 *(*utfptr)++ = Tx | (l & Maskx);
1115 *(*utfptr)++ = T5 | (l >> 4*Bitx);
1116 *(*utfptr)++ = Tx | ((l >> 3*Bitx) & Maskx);
1117 *(*utfptr)++ = Tx | ((l >> 2*Bitx) & Maskx);
1118 *(*utfptr)++ = Tx | ((l >> 1*Bitx) & Maskx);
1119 *(*utfptr)++ = Tx | (l & Maskx);
1125 *(*utfptr)++ = T4 | (l >> 3*Bitx);
1126 *(*utfptr)++ = Tx | ((l >> 2*Bitx) & Maskx);
1127 *(*utfptr)++ = Tx | ((l >> 1*Bitx) & Maskx);
1128 *(*utfptr)++ = Tx | (l & Maskx);
1133 *(*utfptr)++ = T3 | (l >> 2*Bitx);
1134 *(*utfptr)++ = Tx | ((l >> 1*Bitx) & Maskx);
1135 *(*utfptr)++ = Tx | (l & Maskx);
1141 *(*utfptr)++ = T2 | (l >> 1*Bitx);
1142 *(*utfptr)++ = Tx | (l & Maskx);
1147 *(*utfptr)++ = T1 | l;
1153 #if NeedFunctionPrototypes
1154 latin2rune(unsigned char c, Rune *r)
1166 #if NeedFunctionPrototypes
1167 ksc2rune(unsigned char c, Rune *r)
1174 static enum { init, cs1last} state = init;
1175 static int korean646 = 1; /* fixed to 1 for now. */
1177 unsigned char ch = (c|0x80); /* XXX */
1185 if(korean646 && (ch=='\\')){
1196 case cs1last: /* 2nd byte of codeset 1 (KSC 5601) */
1197 n = ((lastc&0x7f)-33)*94 + (ch&0x7f)-33;
1198 if((l = tabksc5601[n]) == 0){
1209 #if NeedFunctionPrototypes
1210 jis02012rune(unsigned char c, Rune *r)
1217 /* To Be Implemented */
1221 #if NeedFunctionPrototypes
1222 gb2rune(unsigned char c, Rune *r)
1229 static enum { state0, state1 } state = state0;
1232 unsigned char ch1 = (c|0x80); /* XXX */
1237 case state0: /* idle state */
1246 case state1: /* seen a font spec */
1248 n = (lastc-0xA0)*100 + (ch1-0xA0);
1264 #if NeedFunctionPrototypes
1265 jis02082rune(unsigned char c, Rune *r)
1272 static enum { state0, state1} state = state0;
1274 unsigned char ch = (c|0x80); /* XXX */
1281 case state0: /* idle state */
1286 case state1: /* two part char */
1287 if((lastc&0x80) != (ch&0x80)){
1292 if(CANS2J(lastc, ch)){
1293 int h = lastc, l = ch;
1295 n = h*100 + l - 3232;
1297 n = (lastc&0x7F)*100 + (ch&0x7f) - 3232; /* kuten */
1298 if((l = tabkuten[n]) == -1){
1311 #if NeedFunctionPrototypes
1312 our_mbtowc(unsigned long *p, char *s, size_t n)
1321 int c0, c1, c2, c3, c4, c5;
1325 return 0; /* no shift states */
1329 us = (unsigned char*)s;
1355 wc = ((((((((((c0 & Mask6) << Bitx) |
1356 c1) << Bitx) | c2) << Bitx) |
1357 c3) << Bitx) | c4) << Bitx) | c5;
1365 wc = ((((((((c0 & Mask5) << Bitx) |
1366 c1) << Bitx) | c2) << Bitx) |
1382 wc = ((((((c0 & Mask4) << Bitx) |
1383 c1) << Bitx) | c2) << Bitx) |
1392 wc = ((((c0 & Mask3) << Bitx) |
1408 wc = ((c0 & Mask2) << Bitx) |
1431 close_converter(conv)
1434 Xfree((char *) conv);
1438 create_conv(lcd, methods)
1440 XlcConvMethods methods;
1444 conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
1445 if (conv == (XlcConv) NULL)
1446 return (XlcConv) NULL;
1448 conv->methods = methods;
1451 _XlcInitUTFInfo(lcd);
1456 close_converter(conv);
1458 return (XlcConv) NULL;
1461 static XlcConvMethodsRec mbtocs_methods = {
1468 open_mbtocs(from_lcd, from, to_lcd, to)
1474 return create_conv(from_lcd, &mbtocs_methods);
1477 static XlcConvMethodsRec mbstocs_methods = {
1484 open_mbstocs(from_lcd, from, to_lcd, to)
1490 return create_conv(from_lcd, &mbstocs_methods);
1493 static XlcConvMethodsRec wcstocs_methods = {
1500 open_wcstocs(from_lcd, from, to_lcd, to)
1506 return create_conv(from_lcd, &wcstocs_methods);
1509 static XlcConvMethodsRec cstombs_methods = {
1516 open_cstombs(from_lcd, from, to_lcd, to)
1522 return create_conv(from_lcd, &cstombs_methods);
1525 static XlcConvMethodsRec cstowcs_methods = {
1532 open_cstowcs(from_lcd, from, to_lcd, to)
1538 return create_conv(from_lcd, &cstowcs_methods);
1543 _fallcUtfLoader(name)
1548 lcd = _fallcCreateLC(name, _fallcGenericMethods);
1549 if (lcd == (XLCd) NULL)
1552 if ((_fallcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "utf"))) {
1553 _fallcDestroyLC(lcd);
1557 _fallcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
1558 _fallcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
1560 _fallcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
1562 _fallcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
1563 _fallcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);