11ab64890Smrg/* 21ab64890Smrg * Copyright 1992, 1993 by TOSHIBA Corp. 31ab64890Smrg * 41ab64890Smrg * Permission to use, copy, modify, and distribute this software and its 51ab64890Smrg * documentation for any purpose and without fee is hereby granted, provided 61ab64890Smrg * that the above copyright notice appear in all copies and that both that 71ab64890Smrg * copyright notice and this permission notice appear in supporting 81ab64890Smrg * documentation, and that the name of TOSHIBA not be used in advertising 91ab64890Smrg * or publicity pertaining to distribution of the software without specific, 101ab64890Smrg * written prior permission. TOSHIBA make no representations about the 111ab64890Smrg * suitability of this software for any purpose. It is provided "as is" 121ab64890Smrg * without express or implied warranty. 131ab64890Smrg * 141ab64890Smrg * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 151ab64890Smrg * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 161ab64890Smrg * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 171ab64890Smrg * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 181ab64890Smrg * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 191ab64890Smrg * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 201ab64890Smrg * SOFTWARE. 211ab64890Smrg * 221ab64890Smrg * Author: Katsuhisa Yano TOSHIBA Corp. 231ab64890Smrg * mopi@osa.ilab.toshiba.co.jp 241ab64890Smrg */ 251ab64890Smrg 261ab64890Smrg#ifdef HAVE_CONFIG_H 271ab64890Smrg#include <config.h> 281ab64890Smrg#endif 291ab64890Smrg#include <stdio.h> 301ab64890Smrg#include "Xlibint.h" 311ab64890Smrg#include "XlcPubI.h" 321ab64890Smrg 331ab64890Smrgstatic const char * 341ab64890Smrgdefault_string( 351ab64890Smrg XLCd lcd) 361ab64890Smrg{ 371ab64890Smrg return XLC_PUBLIC(lcd, default_string); 381ab64890Smrg} 391ab64890Smrg 401ab64890Smrgstatic XLCd create (const char *name, XLCdMethods methods); 411ab64890Smrgstatic Bool initialize (XLCd lcd); 421ab64890Smrgstatic void destroy (XLCd lcd); 431ab64890Smrgstatic char *get_values (XLCd lcd, XlcArgList args, int num_args); 441ab64890Smrg 451ab64890Smrgstatic XLCdPublicMethodsRec publicMethods = { 461ab64890Smrg { 471ab64890Smrg destroy, 481ab64890Smrg _XlcDefaultMapModifiers, 491ab64890Smrg NULL, 501ab64890Smrg NULL, 511ab64890Smrg _XrmDefaultInitParseInfo, 521ab64890Smrg _XmbTextPropertyToTextList, 531ab64890Smrg _XwcTextPropertyToTextList, 541ab64890Smrg _Xutf8TextPropertyToTextList, 551ab64890Smrg _XmbTextListToTextProperty, 561ab64890Smrg _XwcTextListToTextProperty, 571ab64890Smrg _Xutf8TextListToTextProperty, 581ab64890Smrg _XwcFreeStringList, 591ab64890Smrg default_string, 601ab64890Smrg NULL, 611ab64890Smrg NULL 6261b2299dSmrg }, 631ab64890Smrg { 641ab64890Smrg NULL, 651ab64890Smrg create, 661ab64890Smrg initialize, 671ab64890Smrg destroy, 681ab64890Smrg get_values, 691ab64890Smrg _XlcGetLocaleDataBase 701ab64890Smrg } 711ab64890Smrg}; 721ab64890Smrg 731ab64890SmrgXLCdMethods _XlcPublicMethods = (XLCdMethods) &publicMethods; 741ab64890Smrg 751ab64890Smrgstatic XLCd 761ab64890Smrgcreate( 771ab64890Smrg const char *name, 781ab64890Smrg XLCdMethods methods) 791ab64890Smrg{ 801ab64890Smrg XLCd lcd; 811ab64890Smrg XLCdPublicMethods new; 821ab64890Smrg 836cc2b21fSmrg lcd = Xcalloc(1, sizeof(XLCdRec)); 841ab64890Smrg if (lcd == NULL) 851ab64890Smrg return (XLCd) NULL; 861ab64890Smrg 876cc2b21fSmrg lcd->core = Xcalloc(1, sizeof(XLCdPublicRec)); 881ab64890Smrg if (lcd->core == NULL) 891ab64890Smrg goto err; 901ab64890Smrg 91818534a1Smrg new = Xmalloc(sizeof(XLCdPublicMethodsRec)); 921ab64890Smrg if (new == NULL) 931ab64890Smrg goto err; 941ab64890Smrg memcpy(new,methods,sizeof(XLCdPublicMethodsRec)); 951ab64890Smrg lcd->methods = (XLCdMethods) new; 961ab64890Smrg 971ab64890Smrg return lcd; 981ab64890Smrg 991ab64890Smrgerr: 1003233502eSmrg Xfree(lcd->core); 1011ab64890Smrg Xfree(lcd); 1021ab64890Smrg return (XLCd) NULL; 1031ab64890Smrg} 1041ab64890Smrg 1051ab64890Smrgstatic Bool 1061ab64890Smrgload_public( 1071ab64890Smrg XLCd lcd) 1081ab64890Smrg{ 1091ab64890Smrg XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd); 110818534a1Smrg char **values; 111818534a1Smrg const char *str; 1121ab64890Smrg int num; 1131ab64890Smrg 1141ab64890Smrg if(_XlcCreateLocaleDataBase(lcd) == NULL) 1151ab64890Smrg return False; 1161ab64890Smrg 1171ab64890Smrg _XlcGetResource(lcd, "XLC_XLOCALE", "mb_cur_max", &values, &num); 1181ab64890Smrg if (num > 0) { 1191ab64890Smrg pub->mb_cur_max = atoi(values[0]); 1201ab64890Smrg if (pub->mb_cur_max < 1) 1211ab64890Smrg pub->mb_cur_max = 1; 1221ab64890Smrg } else 1231ab64890Smrg pub->mb_cur_max = 1; 1241ab64890Smrg 1251ab64890Smrg _XlcGetResource(lcd, "XLC_XLOCALE", "state_depend_encoding", &values, &num); 1261ab64890Smrg if (num > 0 && !_XlcCompareISOLatin1(values[0], "True")) 1271ab64890Smrg pub->is_state_depend = True; 1281ab64890Smrg else 1291ab64890Smrg pub->is_state_depend = False; 1301ab64890Smrg 1311ab64890Smrg _XlcGetResource(lcd, "XLC_XLOCALE", "encoding_name", &values, &num); 1321ab64890Smrg str = (num > 0) ? values[0] : "STRING"; 1336cc2b21fSmrg pub->encoding_name = strdup(str); 1341ab64890Smrg if (pub->encoding_name == NULL) 1351ab64890Smrg return False; 1361ab64890Smrg 1371ab64890Smrg return True; 1381ab64890Smrg} 1391ab64890Smrg 1401ab64890Smrgstatic Bool 1411ab64890Smrginitialize_core( 1421ab64890Smrg XLCd lcd) 1431ab64890Smrg{ 1441ab64890Smrg XLCdMethods methods = lcd->methods; 1451ab64890Smrg XLCdMethods core = &publicMethods.core; 1461ab64890Smrg 1471ab64890Smrg if (methods->close == NULL) 1481ab64890Smrg methods->close = core->close; 1491ab64890Smrg 1501ab64890Smrg if (methods->map_modifiers == NULL) 1511ab64890Smrg methods->map_modifiers = core->map_modifiers; 1521ab64890Smrg 1531ab64890Smrg if (methods->open_om == NULL) 1541ab64890Smrg#ifdef USE_DYNAMIC_LC 1551ab64890Smrg _XInitDefaultOM(lcd); 1561ab64890Smrg#else 1571ab64890Smrg _XInitOM(lcd); 1581ab64890Smrg#endif 1591ab64890Smrg 1601ab64890Smrg if (methods->open_im == NULL) 1611ab64890Smrg#ifdef USE_DYNAMIC_LC 1621ab64890Smrg _XInitDefaultIM(lcd); 1631ab64890Smrg#else 1641ab64890Smrg _XInitIM(lcd); 1651ab64890Smrg#endif 1661ab64890Smrg 1671ab64890Smrg if (methods->init_parse_info == NULL) 1681ab64890Smrg methods->init_parse_info = core->init_parse_info; 1691ab64890Smrg 1701ab64890Smrg if (methods->mb_text_prop_to_list == NULL) 1711ab64890Smrg methods->mb_text_prop_to_list = core->mb_text_prop_to_list; 1721ab64890Smrg 1731ab64890Smrg if (methods->wc_text_prop_to_list == NULL) 1741ab64890Smrg methods->wc_text_prop_to_list = core->wc_text_prop_to_list; 1751ab64890Smrg 1761ab64890Smrg if (methods->utf8_text_prop_to_list == NULL) 1771ab64890Smrg methods->utf8_text_prop_to_list = core->utf8_text_prop_to_list; 1781ab64890Smrg 1791ab64890Smrg if (methods->mb_text_list_to_prop == NULL) 1801ab64890Smrg methods->mb_text_list_to_prop = core->mb_text_list_to_prop; 1811ab64890Smrg 1821ab64890Smrg if (methods->wc_text_list_to_prop == NULL) 1831ab64890Smrg methods->wc_text_list_to_prop = core->wc_text_list_to_prop; 1841ab64890Smrg 1851ab64890Smrg if (methods->utf8_text_list_to_prop == NULL) 1861ab64890Smrg methods->utf8_text_list_to_prop = core->utf8_text_list_to_prop; 1871ab64890Smrg 1881ab64890Smrg if (methods->wc_free_string_list == NULL) 1891ab64890Smrg methods->wc_free_string_list = core->wc_free_string_list; 1901ab64890Smrg 1911ab64890Smrg if (methods->default_string == NULL) 1921ab64890Smrg methods->default_string = core->default_string; 1931ab64890Smrg 1941ab64890Smrg return True; 1951ab64890Smrg} 1961ab64890Smrg 1971ab64890Smrgstatic Bool 1981ab64890Smrginitialize( 1991ab64890Smrg XLCd lcd) 2001ab64890Smrg{ 2011ab64890Smrg XLCdPublicMethodsPart *methods = XLC_PUBLIC_METHODS(lcd); 2021ab64890Smrg XLCdPublicMethodsPart *pub_methods = &publicMethods.pub; 2031ab64890Smrg XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd); 2041ab64890Smrg char *name; 2051ab64890Smrg#if !defined(X_LOCALE) 2061ab64890Smrg int len; 2071ab64890Smrg char sinamebuf[256]; 2081ab64890Smrg char* siname; 2091ab64890Smrg#endif 2101ab64890Smrg 2111ab64890Smrg _XlcInitCTInfo(); 2121ab64890Smrg 2131ab64890Smrg if (initialize_core(lcd) == False) 2141ab64890Smrg return False; 2151ab64890Smrg 2161ab64890Smrg name = lcd->core->name; 2171ab64890Smrg#if !defined(X_LOCALE) 21861b2299dSmrg /* 21961b2299dSmrg * _XlMapOSLocaleName will return the same string or a substring 22061b2299dSmrg * of name, so strlen(name) is okay 2211ab64890Smrg */ 2229c019ec5Smaya if ((len = (int) strlen(name)) < sizeof sinamebuf) 2231ab64890Smrg siname = sinamebuf; 2241ab64890Smrg else 2251ab64890Smrg siname = Xmalloc (len + 1); 2261ab64890Smrg if (siname == NULL) 2271ab64890Smrg return False; 2281ab64890Smrg name = _XlcMapOSLocaleName(name, siname); 2291ab64890Smrg#endif 2301ab64890Smrg /* _XlcResolveLocaleName will lookup the SI's name for the locale */ 2311ab64890Smrg if (_XlcResolveLocaleName(name, pub) == 0) { 2321ab64890Smrg#if !defined(X_LOCALE) 2331ab64890Smrg if (siname != sinamebuf) Xfree (siname); 2341ab64890Smrg#endif 2351ab64890Smrg return False; 2361ab64890Smrg } 2371ab64890Smrg#if !defined(X_LOCALE) 2381ab64890Smrg if (siname != sinamebuf) 2391ab64890Smrg Xfree (siname); 2401ab64890Smrg#endif 2411ab64890Smrg 2421ab64890Smrg if (pub->default_string == NULL) 2431ab64890Smrg pub->default_string = ""; 2441ab64890Smrg 2451ab64890Smrg if (methods->get_values == NULL) 2461ab64890Smrg methods->get_values = pub_methods->get_values; 2471ab64890Smrg 2481ab64890Smrg if (methods->get_resource == NULL) 2491ab64890Smrg methods->get_resource = pub_methods->get_resource; 2501ab64890Smrg 2511ab64890Smrg return load_public(lcd); 2521ab64890Smrg} 2531ab64890Smrg 2541ab64890Smrgstatic void 2551ab64890Smrgdestroy_core( 2561ab64890Smrg XLCd lcd) 2571ab64890Smrg{ 2580f8248bfSmrg if (lcd) { 2590f8248bfSmrg if (lcd->core) { 2601ab64890Smrg Xfree(lcd->core->name); 261d4a3aaf4Smrg Xfree(lcd->core->modifiers); 2620f8248bfSmrg Xfree(lcd->core); 2630f8248bfSmrg } 2640f8248bfSmrg Xfree(lcd->methods); 2650f8248bfSmrg Xfree(lcd); 2661ab64890Smrg } 2671ab64890Smrg} 2681ab64890Smrg 2691ab64890Smrgstatic void 2701ab64890Smrgdestroy( 2711ab64890Smrg XLCd lcd) 2721ab64890Smrg{ 2731ab64890Smrg XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd); 2741ab64890Smrg 2751ab64890Smrg _XlcDestroyLocaleDataBase(lcd); 2761ab64890Smrg 2770f8248bfSmrg Xfree(pub->siname); 2780f8248bfSmrg Xfree(pub->encoding_name); 2791ab64890Smrg 2801ab64890Smrg destroy_core(lcd); 2811ab64890Smrg} 2821ab64890Smrg 2831ab64890Smrgstatic XlcResource resources[] = { 2841ab64890Smrg { XlcNCodeset, NULLQUARK, sizeof(char *), 2851ab64890Smrg XOffsetOf(XLCdPublicRec, pub.codeset), XlcGetMask }, 2861ab64890Smrg { XlcNDefaultString, NULLQUARK, sizeof(char *), 2871ab64890Smrg XOffsetOf(XLCdPublicRec, pub.default_string), XlcGetMask }, 2881ab64890Smrg { XlcNEncodingName, NULLQUARK, sizeof(char *), 2891ab64890Smrg XOffsetOf(XLCdPublicRec, pub.encoding_name), XlcGetMask }, 2901ab64890Smrg { XlcNLanguage, NULLQUARK, sizeof(char *), 2911ab64890Smrg XOffsetOf(XLCdPublicRec, pub.language), XlcGetMask }, 2921ab64890Smrg { XlcNMbCurMax, NULLQUARK, sizeof(int), 2931ab64890Smrg XOffsetOf(XLCdPublicRec, pub.mb_cur_max), XlcGetMask }, 2941ab64890Smrg { XlcNStateDependentEncoding, NULLQUARK, sizeof(Bool), 2951ab64890Smrg XOffsetOf(XLCdPublicRec, pub.is_state_depend), XlcGetMask }, 2961ab64890Smrg { XlcNTerritory, NULLQUARK, sizeof(char *), 2971ab64890Smrg XOffsetOf(XLCdPublicRec, pub.territory), XlcGetMask } 2981ab64890Smrg}; 2991ab64890Smrg 3001ab64890Smrgstatic char * 3011ab64890Smrgget_values( 3021ab64890Smrg XLCd lcd, 3031ab64890Smrg XlcArgList args, 3041ab64890Smrg int num_args) 3051ab64890Smrg{ 3061ab64890Smrg XLCdPublic pub = (XLCdPublic) lcd->core; 3071ab64890Smrg 3081ab64890Smrg if (resources[0].xrm_name == NULLQUARK) 3091ab64890Smrg _XlcCompileResourceList(resources, XlcNumber(resources)); 3101ab64890Smrg 3111ab64890Smrg return _XlcGetValues((XPointer) pub, resources, XlcNumber(resources), args, 3121ab64890Smrg num_args, XlcGetMask); 3131ab64890Smrg} 314