lcPublic.c revision 818534a1
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:
1001ab64890Smrg    Xfree(lcd);
1011ab64890Smrg    return (XLCd) NULL;
1021ab64890Smrg}
1031ab64890Smrg
1041ab64890Smrgstatic Bool
1051ab64890Smrgload_public(
1061ab64890Smrg    XLCd lcd)
1071ab64890Smrg{
1081ab64890Smrg    XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd);
109818534a1Smrg    char **values;
110818534a1Smrg    const char *str;
1111ab64890Smrg    int num;
1121ab64890Smrg
1131ab64890Smrg    if(_XlcCreateLocaleDataBase(lcd) == NULL)
1141ab64890Smrg	return False;
1151ab64890Smrg
1161ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "mb_cur_max", &values, &num);
1171ab64890Smrg    if (num > 0) {
1181ab64890Smrg	pub->mb_cur_max = atoi(values[0]);
1191ab64890Smrg	if (pub->mb_cur_max < 1)
1201ab64890Smrg	    pub->mb_cur_max = 1;
1211ab64890Smrg    } else
1221ab64890Smrg	pub->mb_cur_max = 1;
1231ab64890Smrg
1241ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "state_depend_encoding", &values, &num);
1251ab64890Smrg    if (num > 0 && !_XlcCompareISOLatin1(values[0], "True"))
1261ab64890Smrg	pub->is_state_depend = True;
1271ab64890Smrg    else
1281ab64890Smrg	pub->is_state_depend = False;
1291ab64890Smrg
1301ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "encoding_name", &values, &num);
1311ab64890Smrg    str = (num > 0) ? values[0] : "STRING";
1326cc2b21fSmrg    pub->encoding_name = strdup(str);
1331ab64890Smrg    if (pub->encoding_name == NULL)
1341ab64890Smrg	return False;
1351ab64890Smrg
1361ab64890Smrg    return True;
1371ab64890Smrg}
1381ab64890Smrg
1391ab64890Smrgstatic Bool
1401ab64890Smrginitialize_core(
1411ab64890Smrg    XLCd lcd)
1421ab64890Smrg{
1431ab64890Smrg    XLCdMethods methods = lcd->methods;
1441ab64890Smrg    XLCdMethods core = &publicMethods.core;
1451ab64890Smrg
1461ab64890Smrg    if (methods->close == NULL)
1471ab64890Smrg	methods->close = core->close;
1481ab64890Smrg
1491ab64890Smrg    if (methods->map_modifiers == NULL)
1501ab64890Smrg	methods->map_modifiers = core->map_modifiers;
1511ab64890Smrg
1521ab64890Smrg    if (methods->open_om == NULL)
1531ab64890Smrg#ifdef USE_DYNAMIC_LC
1541ab64890Smrg	_XInitDefaultOM(lcd);
1551ab64890Smrg#else
1561ab64890Smrg	_XInitOM(lcd);
1571ab64890Smrg#endif
1581ab64890Smrg
1591ab64890Smrg    if (methods->open_im == NULL)
1601ab64890Smrg#ifdef USE_DYNAMIC_LC
1611ab64890Smrg	_XInitDefaultIM(lcd);
1621ab64890Smrg#else
1631ab64890Smrg	_XInitIM(lcd);
1641ab64890Smrg#endif
1651ab64890Smrg
1661ab64890Smrg    if (methods->init_parse_info == NULL)
1671ab64890Smrg	methods->init_parse_info = core->init_parse_info;
1681ab64890Smrg
1691ab64890Smrg    if (methods->mb_text_prop_to_list == NULL)
1701ab64890Smrg	methods->mb_text_prop_to_list = core->mb_text_prop_to_list;
1711ab64890Smrg
1721ab64890Smrg    if (methods->wc_text_prop_to_list == NULL)
1731ab64890Smrg	methods->wc_text_prop_to_list = core->wc_text_prop_to_list;
1741ab64890Smrg
1751ab64890Smrg    if (methods->utf8_text_prop_to_list == NULL)
1761ab64890Smrg	methods->utf8_text_prop_to_list = core->utf8_text_prop_to_list;
1771ab64890Smrg
1781ab64890Smrg    if (methods->mb_text_list_to_prop == NULL)
1791ab64890Smrg	methods->mb_text_list_to_prop = core->mb_text_list_to_prop;
1801ab64890Smrg
1811ab64890Smrg    if (methods->wc_text_list_to_prop == NULL)
1821ab64890Smrg	methods->wc_text_list_to_prop = core->wc_text_list_to_prop;
1831ab64890Smrg
1841ab64890Smrg    if (methods->utf8_text_list_to_prop == NULL)
1851ab64890Smrg	methods->utf8_text_list_to_prop = core->utf8_text_list_to_prop;
1861ab64890Smrg
1871ab64890Smrg    if (methods->wc_free_string_list == NULL)
1881ab64890Smrg	methods->wc_free_string_list = core->wc_free_string_list;
1891ab64890Smrg
1901ab64890Smrg    if (methods->default_string == NULL)
1911ab64890Smrg	methods->default_string = core->default_string;
1921ab64890Smrg
1931ab64890Smrg    return True;
1941ab64890Smrg}
1951ab64890Smrg
1961ab64890Smrgstatic Bool
1971ab64890Smrginitialize(
1981ab64890Smrg    XLCd lcd)
1991ab64890Smrg{
2001ab64890Smrg    XLCdPublicMethodsPart *methods = XLC_PUBLIC_METHODS(lcd);
2011ab64890Smrg    XLCdPublicMethodsPart *pub_methods = &publicMethods.pub;
2021ab64890Smrg    XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd);
2031ab64890Smrg    char *name;
2041ab64890Smrg#if !defined(X_LOCALE)
2051ab64890Smrg    int len;
2061ab64890Smrg    char sinamebuf[256];
2071ab64890Smrg    char* siname;
2081ab64890Smrg#endif
2091ab64890Smrg
2101ab64890Smrg    _XlcInitCTInfo();
2111ab64890Smrg
2121ab64890Smrg    if (initialize_core(lcd) == False)
2131ab64890Smrg	return False;
2141ab64890Smrg
2151ab64890Smrg    name = lcd->core->name;
2161ab64890Smrg#if !defined(X_LOCALE)
21761b2299dSmrg    /*
21861b2299dSmrg     * _XlMapOSLocaleName will return the same string or a substring
21961b2299dSmrg     * of name, so strlen(name) is okay
2201ab64890Smrg     */
2211ab64890Smrg    if ((len = strlen(name)) < sizeof sinamebuf)
2221ab64890Smrg        siname = sinamebuf;
2231ab64890Smrg    else
2241ab64890Smrg        siname = Xmalloc (len + 1);
2251ab64890Smrg    if (siname == NULL)
2261ab64890Smrg        return False;
2271ab64890Smrg    name = _XlcMapOSLocaleName(name, siname);
2281ab64890Smrg#endif
2291ab64890Smrg    /* _XlcResolveLocaleName will lookup the SI's name for the locale */
2301ab64890Smrg    if (_XlcResolveLocaleName(name, pub) == 0) {
2311ab64890Smrg#if !defined(X_LOCALE)
2321ab64890Smrg	if (siname != sinamebuf) Xfree (siname);
2331ab64890Smrg#endif
2341ab64890Smrg	return False;
2351ab64890Smrg    }
2361ab64890Smrg#if !defined(X_LOCALE)
2371ab64890Smrg    if (siname != sinamebuf)
2381ab64890Smrg        Xfree (siname);
2391ab64890Smrg#endif
2401ab64890Smrg
2411ab64890Smrg    if (pub->default_string == NULL)
2421ab64890Smrg	pub->default_string = "";
2431ab64890Smrg
2441ab64890Smrg    if (methods->get_values == NULL)
2451ab64890Smrg	methods->get_values = pub_methods->get_values;
2461ab64890Smrg
2471ab64890Smrg    if (methods->get_resource == NULL)
2481ab64890Smrg	methods->get_resource = pub_methods->get_resource;
2491ab64890Smrg
2501ab64890Smrg    return load_public(lcd);
2511ab64890Smrg}
2521ab64890Smrg
2531ab64890Smrgstatic void
2541ab64890Smrgdestroy_core(
2551ab64890Smrg    XLCd lcd)
2561ab64890Smrg{
2571ab64890Smrg    if (lcd->core) {
2581ab64890Smrg	if (lcd->core->name)
2591ab64890Smrg            Xfree(lcd->core->name);
2601ab64890Smrg	Xfree(lcd->core);
2611ab64890Smrg    }
2621ab64890Smrg
2631ab64890Smrg    if (lcd->methods)
2641ab64890Smrg	Xfree(lcd->methods);
2651ab64890Smrg
2661ab64890Smrg    Xfree(lcd);
2671ab64890Smrg}
2681ab64890Smrg
2691ab64890Smrgstatic void
2701ab64890Smrgdestroy(
2711ab64890Smrg    XLCd lcd)
2721ab64890Smrg{
2731ab64890Smrg    XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd);
2741ab64890Smrg
2751ab64890Smrg    _XlcDestroyLocaleDataBase(lcd);
2761ab64890Smrg
2771ab64890Smrg    if (pub->siname)
2781ab64890Smrg	Xfree(pub->siname);
2791ab64890Smrg    if (pub->encoding_name)
2801ab64890Smrg	Xfree(pub->encoding_name);
2811ab64890Smrg
2821ab64890Smrg    destroy_core(lcd);
2831ab64890Smrg}
2841ab64890Smrg
2851ab64890Smrgstatic XlcResource resources[] = {
2861ab64890Smrg    { XlcNCodeset, NULLQUARK, sizeof(char *),
2871ab64890Smrg      XOffsetOf(XLCdPublicRec, pub.codeset), XlcGetMask },
2881ab64890Smrg    { XlcNDefaultString, NULLQUARK, sizeof(char *),
2891ab64890Smrg      XOffsetOf(XLCdPublicRec, pub.default_string), XlcGetMask },
2901ab64890Smrg    { XlcNEncodingName, NULLQUARK, sizeof(char *),
2911ab64890Smrg      XOffsetOf(XLCdPublicRec, pub.encoding_name), XlcGetMask },
2921ab64890Smrg    { XlcNLanguage, NULLQUARK, sizeof(char *),
2931ab64890Smrg      XOffsetOf(XLCdPublicRec, pub.language), XlcGetMask },
2941ab64890Smrg    { XlcNMbCurMax, NULLQUARK, sizeof(int),
2951ab64890Smrg      XOffsetOf(XLCdPublicRec, pub.mb_cur_max), XlcGetMask },
2961ab64890Smrg    { XlcNStateDependentEncoding, NULLQUARK, sizeof(Bool),
2971ab64890Smrg      XOffsetOf(XLCdPublicRec, pub.is_state_depend), XlcGetMask },
2981ab64890Smrg    { XlcNTerritory, NULLQUARK, sizeof(char *),
2991ab64890Smrg      XOffsetOf(XLCdPublicRec, pub.territory), XlcGetMask }
3001ab64890Smrg};
3011ab64890Smrg
3021ab64890Smrgstatic char *
3031ab64890Smrgget_values(
3041ab64890Smrg    XLCd lcd,
3051ab64890Smrg    XlcArgList args,
3061ab64890Smrg    int num_args)
3071ab64890Smrg{
3081ab64890Smrg    XLCdPublic pub = (XLCdPublic) lcd->core;
3091ab64890Smrg
3101ab64890Smrg    if (resources[0].xrm_name == NULLQUARK)
3111ab64890Smrg	_XlcCompileResourceList(resources, XlcNumber(resources));
3121ab64890Smrg
3131ab64890Smrg    return _XlcGetValues((XPointer) pub, resources, XlcNumber(resources), args,
3141ab64890Smrg			 num_args, XlcGetMask);
3151ab64890Smrg}
316