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