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