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