lcGeneric.c revision 6cc2b21f
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 *  (c) Copyright 1995 FUJITSU LIMITED
271ab64890Smrg *  This is source code modified by FUJITSU LIMITED under the Joint
281ab64890Smrg *  Development Agreement for the CDE/Motif PST.
291ab64890Smrg */
301ab64890Smrg
311ab64890Smrg#ifdef HAVE_CONFIG_H
321ab64890Smrg#include <config.h>
331ab64890Smrg#endif
341ab64890Smrg#include <stdio.h>
351ab64890Smrg#include "Xlibint.h"
361ab64890Smrg#include "XlcGeneric.h"
371ab64890Smrg
381ab64890Smrgstatic XLCd create (const char *name, XLCdMethods methods);
391ab64890Smrgstatic Bool initialize (XLCd lcd);
401ab64890Smrgstatic void destroy (XLCd lcd);
411ab64890Smrg
421ab64890Smrgstatic XLCdPublicMethodsRec genericMethods = {
431ab64890Smrg    { NULL },                   /* use default methods */
441ab64890Smrg    {
451ab64890Smrg	NULL,
461ab64890Smrg	create,
471ab64890Smrg	initialize,
481ab64890Smrg	destroy,
491ab64890Smrg	NULL
501ab64890Smrg    }
511ab64890Smrg};
521ab64890Smrg
531ab64890SmrgXLCdMethods _XlcGenericMethods = (XLCdMethods) &genericMethods;
541ab64890Smrg
551ab64890Smrgstatic XLCd
561ab64890Smrgcreate(
571ab64890Smrg    const char *name,
581ab64890Smrg    XLCdMethods methods)
591ab64890Smrg{
601ab64890Smrg    XLCd lcd;
611ab64890Smrg    XLCdPublicMethods new;
621ab64890Smrg
636cc2b21fSmrg    lcd = Xcalloc(1, sizeof(XLCdRec));
641ab64890Smrg    if (lcd == NULL)
651ab64890Smrg        return (XLCd) NULL;
661ab64890Smrg
676cc2b21fSmrg    lcd->core = Xcalloc(1, sizeof(XLCdGenericRec));
681ab64890Smrg    if (lcd->core == NULL)
691ab64890Smrg	goto err;
701ab64890Smrg
711ab64890Smrg    new = (XLCdPublicMethods) Xmalloc(sizeof(XLCdPublicMethodsRec));
721ab64890Smrg    if (new == NULL)
731ab64890Smrg	goto err;
741ab64890Smrg    memcpy(new,methods,sizeof(XLCdPublicMethodsRec));
751ab64890Smrg    lcd->methods = (XLCdMethods) new;
761ab64890Smrg
771ab64890Smrg    return lcd;
781ab64890Smrg
791ab64890Smrgerr:
801ab64890Smrg    Xfree(lcd);
811ab64890Smrg    return (XLCd) NULL;
821ab64890Smrg}
831ab64890Smrg
841ab64890Smrgstatic Bool
851ab64890Smrgstring_to_encoding(
861ab64890Smrg    const char *str,
871ab64890Smrg    char *encoding)
881ab64890Smrg{
891ab64890Smrg    char *next;
901ab64890Smrg    long value;
911ab64890Smrg    int base;
921ab64890Smrg
931ab64890Smrg    while (*str) {
941ab64890Smrg	if (*str == '\\') {
951ab64890Smrg	    switch (*(str + 1)) {
961ab64890Smrg		case 'x':
971ab64890Smrg		case 'X':
981ab64890Smrg		    base = 16;
991ab64890Smrg		    break;
1001ab64890Smrg		default:
1011ab64890Smrg		    base = 8;
1021ab64890Smrg		    break;
1031ab64890Smrg	    }
1041ab64890Smrg	    value = strtol(str + 2, &next, base);
1051ab64890Smrg	    if (str + 2 != next) {
1061ab64890Smrg		*((unsigned char *) encoding++) = (unsigned char) value;
1071ab64890Smrg		str = next;
1081ab64890Smrg		continue;
1091ab64890Smrg	    }
1101ab64890Smrg	}
1111ab64890Smrg	*encoding++ = *str++;
1121ab64890Smrg    }
1131ab64890Smrg
1141ab64890Smrg    *encoding = '\0';
1151ab64890Smrg
1161ab64890Smrg    return True;
1171ab64890Smrg}
1181ab64890Smrg
1191ab64890Smrgstatic Bool
1201ab64890Smrgstring_to_ulong(
1211ab64890Smrg    const char *str,
1221ab64890Smrg    unsigned long *value)
1231ab64890Smrg{
1241ab64890Smrg     const char *tmp1 = str;
1251ab64890Smrg     int base;
1261ab64890Smrg
1271ab64890Smrg     if (*tmp1++ != '\\') {
1281ab64890Smrg	  tmp1--;
1291ab64890Smrg	  base = 10;
1301ab64890Smrg     } else {
1311ab64890Smrg	  switch (*tmp1++) {
1321ab64890Smrg	  case 'x':
1331ab64890Smrg	       base = 16;
1341ab64890Smrg	       break;
1351ab64890Smrg	  case 'o':
1361ab64890Smrg	       base = 8;
1371ab64890Smrg	       break;
1381ab64890Smrg	  case 'd':
1391ab64890Smrg	       base = 10;
1401ab64890Smrg	       break;
1411ab64890Smrg	  default:
1421ab64890Smrg	       return(False);
1431ab64890Smrg	  }
1441ab64890Smrg     }
1451ab64890Smrg     *value = (unsigned long) strtol(tmp1, NULL, base);
1461ab64890Smrg     return(True);
1471ab64890Smrg}
1481ab64890Smrg
1491ab64890Smrg
1501ab64890Smrgstatic Bool
1511ab64890Smrgadd_charset(
1521ab64890Smrg    CodeSet codeset,
1531ab64890Smrg    XlcCharSet charset)
1541ab64890Smrg{
1551ab64890Smrg    XlcCharSet *new_list;
1561ab64890Smrg    int num;
1571ab64890Smrg
1581ab64890Smrg    if ((num = codeset->num_charsets))
1591ab64890Smrg        new_list = (XlcCharSet *) Xrealloc(codeset->charset_list,
1601ab64890Smrg                                        (num + 1) * sizeof(XlcCharSet));
1611ab64890Smrg    else
1621ab64890Smrg        new_list = (XlcCharSet *) Xmalloc(sizeof(XlcCharSet));
1631ab64890Smrg
1641ab64890Smrg    if (new_list == NULL)
1651ab64890Smrg	return False;
1661ab64890Smrg
1671ab64890Smrg    new_list[num] = charset;
1681ab64890Smrg    codeset->charset_list = new_list;
1691ab64890Smrg    codeset->num_charsets = num + 1;
1701ab64890Smrg
1711ab64890Smrg    return True;
1721ab64890Smrg}
1731ab64890Smrg
1741ab64890Smrgstatic CodeSet
1751ab64890Smrgadd_codeset(
1761ab64890Smrg    XLCdGenericPart *gen)
1771ab64890Smrg{
1781ab64890Smrg    CodeSet new, *new_list;
1791ab64890Smrg    int num;
1801ab64890Smrg
1816cc2b21fSmrg    new = Xcalloc(1, sizeof(CodeSetRec));
1821ab64890Smrg    if (new == NULL)
1831ab64890Smrg        return NULL;
1841ab64890Smrg
1851ab64890Smrg    if ((num = gen->codeset_num))
1861ab64890Smrg        new_list = (CodeSet *) Xrealloc(gen->codeset_list,
1871ab64890Smrg                                        (num + 1) * sizeof(CodeSet));
1881ab64890Smrg    else
1891ab64890Smrg        new_list = (CodeSet *) Xmalloc(sizeof(CodeSet));
1901ab64890Smrg
1911ab64890Smrg    if (new_list == NULL)
1921ab64890Smrg        goto err;
1931ab64890Smrg
1941ab64890Smrg    new_list[num] = new;
1951ab64890Smrg    gen->codeset_list = new_list;
1961ab64890Smrg    gen->codeset_num = num + 1;
1971ab64890Smrg
1981ab64890Smrg    return new;
1991ab64890Smrg
2001ab64890Smrgerr:
2011ab64890Smrg    Xfree(new);
2021ab64890Smrg
2031ab64890Smrg    return NULL;
2041ab64890Smrg}
2051ab64890Smrg
2061ab64890Smrgstatic Bool
2071ab64890Smrgadd_parse_list(
2081ab64890Smrg    XLCdGenericPart *gen,
2091ab64890Smrg    EncodingType type,
2101ab64890Smrg    const char *encoding,
2111ab64890Smrg    CodeSet codeset)
2121ab64890Smrg{
2131ab64890Smrg    ParseInfo new, *new_list;
2141ab64890Smrg    char *str;
2151ab64890Smrg    unsigned char ch;
2161ab64890Smrg    int num;
2171ab64890Smrg
2186cc2b21fSmrg    str = strdup(encoding);
2191ab64890Smrg    if (str == NULL)
2201ab64890Smrg        return False;
2211ab64890Smrg
2226cc2b21fSmrg    new = Xcalloc(1, sizeof(ParseInfoRec));
2231ab64890Smrg    if (new == NULL)
2241ab64890Smrg        goto err;
2251ab64890Smrg
2261ab64890Smrg    if (gen->mb_parse_table == NULL) {
2276cc2b21fSmrg        gen->mb_parse_table = Xcalloc(1, 256); /* 2^8 */
2281ab64890Smrg        if (gen->mb_parse_table == NULL)
2291ab64890Smrg            goto err;
2301ab64890Smrg    }
2311ab64890Smrg
2321ab64890Smrg    if ((num = gen->mb_parse_list_num))
2331ab64890Smrg        new_list = (ParseInfo *) Xrealloc(gen->mb_parse_list,
2341ab64890Smrg                                          (num + 2) * sizeof(ParseInfo));
2351ab64890Smrg    else {
2361ab64890Smrg        new_list = (ParseInfo *) Xmalloc(2 * sizeof(ParseInfo));
2371ab64890Smrg    }
2381ab64890Smrg
2391ab64890Smrg    if (new_list == NULL)
2401ab64890Smrg        goto err;
2411ab64890Smrg
2421ab64890Smrg    new_list[num] = new;
2431ab64890Smrg    new_list[num + 1] = NULL;
2441ab64890Smrg    gen->mb_parse_list = new_list;
2451ab64890Smrg    gen->mb_parse_list_num = num + 1;
2461ab64890Smrg
2471ab64890Smrg    ch = (unsigned char) *str;
2481ab64890Smrg    if (gen->mb_parse_table[ch] == 0)
2491ab64890Smrg        gen->mb_parse_table[ch] = num + 1;
2501ab64890Smrg
2511ab64890Smrg    new->type = type;
2521ab64890Smrg    new->encoding = str;
2531ab64890Smrg    new->codeset = codeset;
2541ab64890Smrg
2551ab64890Smrg    if (codeset->parse_info == NULL)
2561ab64890Smrg        codeset->parse_info = new;
2571ab64890Smrg
2581ab64890Smrg    return True;
2591ab64890Smrg
2601ab64890Smrgerr:
2611ab64890Smrg    Xfree(str);
2621ab64890Smrg    if (new)
2631ab64890Smrg        Xfree(new);
2641ab64890Smrg
2651ab64890Smrg    return False;
2661ab64890Smrg}
2671ab64890Smrg
2681ab64890Smrgstatic void
2691ab64890Smrgfree_charset(
2701ab64890Smrg    XLCd lcd)
2711ab64890Smrg{
2721ab64890Smrg    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
2731ab64890Smrg    ParseInfo *parse_info;
2741ab64890Smrg    int num;
2751ab64890Smrg
2761ab64890Smrg    if (gen->mb_parse_table)
2771ab64890Smrg        Xfree(gen->mb_parse_table);
2781ab64890Smrg    if ((num = gen->mb_parse_list_num) > 0) {
2791ab64890Smrg        for (parse_info = gen->mb_parse_list; num-- > 0; parse_info++) {
2801ab64890Smrg            if ((*parse_info)->encoding)
2811ab64890Smrg                Xfree((*parse_info)->encoding);
2821ab64890Smrg            Xfree(*parse_info);
2831ab64890Smrg        }
2841ab64890Smrg        Xfree(gen->mb_parse_list);
2851ab64890Smrg    }
2861ab64890Smrg
2871ab64890Smrg    if ((num = gen->codeset_num) > 0)
2881ab64890Smrg        Xfree(gen->codeset_list);
2891ab64890Smrg}
2901ab64890Smrg
2911ab64890Smrg/* For VW/UDC */
2921ab64890Smrg
2931ab64890Smrg#define FORWARD  (unsigned long)'+'
2941ab64890Smrg#define BACKWARD (unsigned long)'-'
2951ab64890Smrg
2961ab64890Smrgstatic const char *
2971ab64890Smrggetscope(
2981ab64890Smrg    const char *str,
2991ab64890Smrg    FontScope scp)
3001ab64890Smrg{
3011ab64890Smrg    unsigned long start = 0;
3021ab64890Smrg    unsigned long end = 0;
3031ab64890Smrg    unsigned long dest = 0;
3041ab64890Smrg    unsigned long shift = 0;
3051ab64890Smrg    unsigned long direction = 0;
3061ab64890Smrg    sscanf(str,"[\\x%lx,\\x%lx]->\\x%lx", &start, &end, &dest);
3071ab64890Smrg    if (dest) {
3081ab64890Smrg        if (dest >= start) {
3091ab64890Smrg            shift = dest - start;
3101ab64890Smrg            direction = FORWARD ;
3111ab64890Smrg        } else {
3121ab64890Smrg            shift = start - dest;
3131ab64890Smrg            direction = BACKWARD;
3141ab64890Smrg        }
3151ab64890Smrg    }
3161ab64890Smrg    scp->start = start      ;
3171ab64890Smrg    scp->end   = end        ;
3181ab64890Smrg    scp->shift = shift      ;
3191ab64890Smrg    scp->shift_direction
3201ab64890Smrg               = direction  ;
3211ab64890Smrg    /* .......... */
3221ab64890Smrg    while (*str) {
3231ab64890Smrg        if (*str == ',' && *(str+1) == '[')
3241ab64890Smrg            break;
3251ab64890Smrg        str++;
3261ab64890Smrg    }
3271ab64890Smrg    return str+1;
3281ab64890Smrg}
3291ab64890Smrg
3301ab64890Smrgstatic int
3311ab64890Smrgcount_scopemap(
3321ab64890Smrg    const char *str)
3331ab64890Smrg{
3341ab64890Smrg    const char *ptr;
3351ab64890Smrg    int num=0;
3361ab64890Smrg    for (ptr=str; *ptr; ptr++) {
3371ab64890Smrg        if (*ptr == ']') {
3381ab64890Smrg            num++;
3391ab64890Smrg        }
3401ab64890Smrg    }
3411ab64890Smrg    return num;
3421ab64890Smrg}
3431ab64890Smrg
3441ab64890SmrgFontScope
3451ab64890Smrg_XlcParse_scopemaps(
3461ab64890Smrg    const char *str,
3471ab64890Smrg    int *size)
3481ab64890Smrg{
3491ab64890Smrg    int num=0,i;
3501ab64890Smrg    FontScope scope,sc_ptr;
3511ab64890Smrg    const char *str_sc;
3521ab64890Smrg
3531ab64890Smrg    num = count_scopemap(str);
3541ab64890Smrg    scope = (FontScope) Xmalloc(num * sizeof(FontScopeRec));
3551ab64890Smrg    if (scope == NULL)
3561ab64890Smrg	return NULL;
3571ab64890Smrg
3581ab64890Smrg    for (i=0, str_sc=str, sc_ptr=scope; i < num; i++, sc_ptr++) {
3591ab64890Smrg	str_sc = getscope(str_sc, sc_ptr);
3601ab64890Smrg    }
3611ab64890Smrg    *size = num;
3621ab64890Smrg    return scope;
3631ab64890Smrg}
3641ab64890Smrg
3651ab64890Smrgvoid
3661ab64890Smrg_XlcDbg_printValue(
3671ab64890Smrg    const char *str,
3681ab64890Smrg    char **value,
3691ab64890Smrg    int num)
3701ab64890Smrg{
3711ab64890Smrg/*
3721ab64890Smrg    int i;
3731ab64890Smrg    for (i = 0; i < num; i++)
3741ab64890Smrg        fprintf(stderr, "%s value[%d] = %s\n", str, i, value[i]);
3751ab64890Smrg*/
3761ab64890Smrg}
3771ab64890Smrg
3781ab64890Smrgstatic void
3791ab64890Smrgdmpscope(
3801ab64890Smrg    const char* name,
3811ab64890Smrg    FontScope sc,
3821ab64890Smrg    int num)
3831ab64890Smrg{
3841ab64890Smrg/*
3851ab64890Smrg    int i;
3861ab64890Smrg    fprintf(stderr, "dmpscope %s\n", name);
3871ab64890Smrg    for (i=0; i<num; i++)
3881ab64890Smrg        fprintf(stderr,"%x %x %x %x \n",
3891ab64890Smrg                sc[i].start,
3901ab64890Smrg                sc[i].end,
3911ab64890Smrg                sc[i].shift,
3921ab64890Smrg                sc[i].shift_direction);
3931ab64890Smrg    fprintf(stderr, "dmpscope end\n");
3941ab64890Smrg*/
3951ab64890Smrg}
3961ab64890Smrg
3971ab64890Smrgstatic XlcCharSet
3981ab64890Smrgsrch_charset_define(
3991ab64890Smrg    const char *name,
4001ab64890Smrg    int *new)
4011ab64890Smrg{
4021ab64890Smrg    XlcCharSet charset;
4031ab64890Smrg
4041ab64890Smrg    *new = 0;
4051ab64890Smrg    charset = _XlcGetCharSet(name);
4061ab64890Smrg    if (charset == NULL &&
4071ab64890Smrg        (charset = _XlcCreateDefaultCharSet(name, ""))) {
4081ab64890Smrg        _XlcAddCharSet(charset);
4091ab64890Smrg        *new = 1;
4101ab64890Smrg        charset->source = CSsrcXLC;
4111ab64890Smrg    }
4121ab64890Smrg    return charset;
4131ab64890Smrg}
4141ab64890Smrg
4151ab64890Smrgstatic void
4161ab64890Smrgread_charset_define(
4171ab64890Smrg    XLCd lcd,
4181ab64890Smrg    XLCdGenericPart *gen)
4191ab64890Smrg{
4201ab64890Smrg    int i;
4211ab64890Smrg    char csd[16], cset_name[256];
4221ab64890Smrg    char name[BUFSIZ];
4231ab64890Smrg    XlcCharSet charsetd;
4241ab64890Smrg    char **value;
42557f47464Smrg    int num, new = 0;
4261ab64890Smrg    XlcSide side = XlcUnknown;
4271ab64890Smrg    char *tmp;
4281ab64890Smrg
4291ab64890Smrg    for (i=0; ; i++) { /* loop start */
4301ab64890Smrg        charsetd = 0;
4311ab64890Smrg        sprintf(csd, "csd%d", i);
4321ab64890Smrg
4331ab64890Smrg        /* charset_name  */
4341ab64890Smrg        sprintf(name, "%s.%s", csd, "charset_name");
4351ab64890Smrg        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
4361ab64890Smrg        _XlcDbg_printValue(name,value,num);
4371ab64890Smrg        if (num > 0) {
4381ab64890Smrg	    /* hackers will get truncated -- C'est la vie */
4391ab64890Smrg            strncpy(cset_name,value[0], sizeof cset_name - 1);
4401ab64890Smrg	    cset_name[(sizeof cset_name) - 1] = '\0';
4411ab64890Smrg            sprintf(name, "%s.%s", csd , "side");
4421ab64890Smrg            _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
4431ab64890Smrg            if (num > 0) {
4441ab64890Smrg                _XlcDbg_printValue(name,value,num);
4451ab64890Smrg                if (!_XlcNCompareISOLatin1(value[0], "none", 4)) {
4461ab64890Smrg                    side =  XlcGLGR;
4471ab64890Smrg                } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) {
4481ab64890Smrg                    side =  XlcGL;
4491ab64890Smrg                    strcat(cset_name,":GL");
4501ab64890Smrg                } else {
4511ab64890Smrg                    side =  XlcGR;
4521ab64890Smrg                    strcat(cset_name,":GR");
4531ab64890Smrg                }
4541ab64890Smrg                if (charsetd == NULL &&
4551ab64890Smrg                    (charsetd = srch_charset_define(cset_name,&new)) == NULL)
4561ab64890Smrg                    return;
4571ab64890Smrg            }
4581ab64890Smrg        } else {
4591ab64890Smrg            if (i == 0)
4601ab64890Smrg                continue;
4611ab64890Smrg            else
4621ab64890Smrg                break;
4631ab64890Smrg        }
4641ab64890Smrg        if (new) {
4656cc2b21fSmrg            tmp = strdup(cset_name);
4661ab64890Smrg            if (tmp == NULL)
4671ab64890Smrg                return;
4681ab64890Smrg            charsetd->name = tmp;
4691ab64890Smrg        }
4701ab64890Smrg        /* side   */
4711ab64890Smrg        charsetd->side = side ;
4721ab64890Smrg        /* length */
4731ab64890Smrg        sprintf(name, "%s.%s", csd, "length");
4741ab64890Smrg        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
4751ab64890Smrg        if (num > 0) {
4761ab64890Smrg            _XlcDbg_printValue(name,value,num);
4771ab64890Smrg            charsetd->char_size = atoi(value[0]);
4781ab64890Smrg        }
4791ab64890Smrg        /* gc_number */
4801ab64890Smrg        sprintf(name, "%s.%s", csd, "gc_number");
4811ab64890Smrg        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
4821ab64890Smrg        if (num > 0) {
4831ab64890Smrg            _XlcDbg_printValue(name,value,num);
4841ab64890Smrg            charsetd->set_size = atoi(value[0]);
4851ab64890Smrg        }
4861ab64890Smrg        /* string_encoding */
4871ab64890Smrg        sprintf(name, "%s.%s", csd, "string_encoding");
4881ab64890Smrg        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
4891ab64890Smrg        if (num > 0) {
4901ab64890Smrg            _XlcDbg_printValue(name,value,num);
4911ab64890Smrg            if (!strcmp("False",value[0])) {
4921ab64890Smrg                charsetd->string_encoding = False;
4931ab64890Smrg            } else {
4941ab64890Smrg                charsetd->string_encoding = True;
4951ab64890Smrg            }
4961ab64890Smrg        }
4971ab64890Smrg        /* sequence */
4981ab64890Smrg        sprintf(name, "%s.%s", csd, "sequence");
4991ab64890Smrg        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
5001ab64890Smrg        if (num > 0) {
5011ab64890Smrg            _XlcDbg_printValue(name,value,num);
5021ab64890Smrg/*
5031ab64890Smrg            if (charsetd->ct_sequence) {
5041ab64890Smrg                Xfree(charsetd->ct_sequence);
5051ab64890Smrg            }
5061ab64890Smrg*/
5071ab64890Smrg            tmp = (char *)Xmalloc(strlen(value[0])+1);
5081ab64890Smrg            if (tmp == NULL)
5091ab64890Smrg                return;
5101ab64890Smrg            charsetd->ct_sequence = tmp;
5111ab64890Smrg            string_to_encoding(value[0],tmp);
5121ab64890Smrg        }
5131ab64890Smrg        /* encoding_name */
5141ab64890Smrg        sprintf(name, "%s.%s", csd, "encoding_name");
5151ab64890Smrg        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
5161ab64890Smrg        if (num > 0) {
5171ab64890Smrg            _XlcDbg_printValue(name,value,num);
5181ab64890Smrg/*
5191ab64890Smrg            if (charsetd->encoding_name) {
5201ab64890Smrg                Xfree(charsetd->encoding_name);
5211ab64890Smrg            }
5221ab64890Smrg*/
5236cc2b21fSmrg            tmp = strdup(value[0]);
5241ab64890Smrg            charsetd->encoding_name = tmp;
5251ab64890Smrg            charsetd->xrm_encoding_name = XrmStringToQuark(tmp);
5261ab64890Smrg        }
5271ab64890Smrg        _XlcAddCT(charsetd->name, charsetd->ct_sequence);
5281ab64890Smrg    }
5291ab64890Smrg}
5301ab64890Smrg
5311ab64890Smrgstatic SegConv
5321ab64890Smrgadd_conversion(
5331ab64890Smrg    XLCdGenericPart *gen)
5341ab64890Smrg{
5351ab64890Smrg    SegConv new_list;
5361ab64890Smrg    int num;
5371ab64890Smrg
5381ab64890Smrg    if ((num = gen->segment_conv_num) > 0) {
5391ab64890Smrg        new_list = (SegConv) Xrealloc(gen->segment_conv,
5401ab64890Smrg                                        (num + 1) * sizeof(SegConvRec));
5411ab64890Smrg    } else {
5421ab64890Smrg        new_list = (SegConv) Xmalloc(sizeof(SegConvRec));
5431ab64890Smrg    }
5441ab64890Smrg
5451ab64890Smrg    if (new_list == NULL)
5461ab64890Smrg        return NULL;
5471ab64890Smrg
5481ab64890Smrg    gen->segment_conv = new_list;
5491ab64890Smrg    gen->segment_conv_num = num + 1;
5501ab64890Smrg
5511ab64890Smrg    return &new_list[num];
5521ab64890Smrg
5531ab64890Smrg}
5541ab64890Smrg
5551ab64890Smrgstatic void
5561ab64890Smrgread_segmentconversion(
5571ab64890Smrg    XLCd lcd,
5581ab64890Smrg    XLCdGenericPart *gen)
5591ab64890Smrg{
5601ab64890Smrg    int i;
5611ab64890Smrg    char conv[16];
5621ab64890Smrg    char name[BUFSIZ];
5631ab64890Smrg    char **value;
5641ab64890Smrg    int num,new;
5651ab64890Smrg    SegConv conversion;
5661ab64890Smrg    for (i=0 ; ; i++) { /* loop start */
5671ab64890Smrg        conversion = 0;
5681ab64890Smrg        sprintf(conv, "conv%d", i);
5691ab64890Smrg
5701ab64890Smrg        /* length                */
5711ab64890Smrg        sprintf(name, "%s.%s", conv, "length");
5721ab64890Smrg        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
5731ab64890Smrg        if (num > 0) {
5741ab64890Smrg            if (conversion == NULL &&
5751ab64890Smrg                (conversion = add_conversion(gen)) == NULL) {
5761ab64890Smrg                return;
5771ab64890Smrg            }
5781ab64890Smrg            _XlcDbg_printValue(name,value,num);
5791ab64890Smrg        } else {
5801ab64890Smrg            if (i == 0)
5811ab64890Smrg                continue;
5821ab64890Smrg            else
5831ab64890Smrg                break;
5841ab64890Smrg        }
5851ab64890Smrg        conversion->length = atoi(value[0]);
5861ab64890Smrg
5871ab64890Smrg        /* source_encoding       */
5881ab64890Smrg        sprintf(name, "%s.%s", conv, "source_encoding");
5891ab64890Smrg        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
5901ab64890Smrg        if (num > 0) {
5911ab64890Smrg            char *tmp;
5921ab64890Smrg            _XlcDbg_printValue(name,value,num);
5936cc2b21fSmrg            tmp = strdup(value[0]);
5941ab64890Smrg            if (tmp == NULL)
5951ab64890Smrg                return;
5961ab64890Smrg            conversion->source_encoding = tmp;
5971ab64890Smrg            conversion->source = srch_charset_define(tmp,&new);
5981ab64890Smrg        }
5991ab64890Smrg        /* destination_encoding  */
6001ab64890Smrg        sprintf(name, "%s.%s", conv, "destination_encoding");
6011ab64890Smrg        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
6021ab64890Smrg        if (num > 0) {
6031ab64890Smrg            char *tmp;
6041ab64890Smrg            _XlcDbg_printValue(name,value,num);
6056cc2b21fSmrg            tmp = strdup(value[0]);
6061ab64890Smrg            if (tmp == NULL)
6071ab64890Smrg                return;
6081ab64890Smrg            conversion->destination_encoding = tmp;
6091ab64890Smrg            conversion->dest = srch_charset_define(tmp,&new);
6101ab64890Smrg        }
6111ab64890Smrg        /* range                 */
6121ab64890Smrg        sprintf(name, "%s.%s", conv, "range");
6131ab64890Smrg        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
6141ab64890Smrg        if (num > 0) {
6151ab64890Smrg            _XlcDbg_printValue(name,value,num);
6161ab64890Smrg            sscanf(value[0],"\\x%lx,\\x%lx",
6171ab64890Smrg                   &(conversion->range.start), &(conversion->range.end));
6181ab64890Smrg        }
6191ab64890Smrg        /* conversion            */
6201ab64890Smrg        sprintf(name, "%s.%s", conv, "conversion");
6211ab64890Smrg        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
6221ab64890Smrg        if (num > 0) {
6231ab64890Smrg            _XlcDbg_printValue(name,value,num);
6241ab64890Smrg            conversion->conv =
6251ab64890Smrg                _XlcParse_scopemaps(value[0],&conversion->conv_num);
6261ab64890Smrg        }
6271ab64890Smrg    }  /* loop end */
6281ab64890Smrg}
6291ab64890Smrg
6301ab64890Smrgstatic ExtdSegment
6311ab64890Smrgcreate_ctextseg(
6321ab64890Smrg    char **value,
6331ab64890Smrg    int num)
6341ab64890Smrg{
6351ab64890Smrg    ExtdSegment ret;
6361ab64890Smrg    char* ptr;
6371ab64890Smrg    char* cset_name = NULL;
6381ab64890Smrg    int i,new;
6391ab64890Smrg    FontScope scope;
6401ab64890Smrg    ret = (ExtdSegment)Xmalloc(sizeof(ExtdSegmentRec));
6411ab64890Smrg    if (ret == NULL)
6421ab64890Smrg        return NULL;
6436cc2b21fSmrg    ret->name = strdup(value[0]);
6441ab64890Smrg    if (ret->name == NULL) {
6451ab64890Smrg        Xfree (ret);
6461ab64890Smrg        return NULL;
6471ab64890Smrg    }
6481ab64890Smrg    cset_name = (char*) Xmalloc (strlen(ret->name) + 1);
6491ab64890Smrg    if (cset_name == NULL) {
6501ab64890Smrg        Xfree (ret->name);
6511ab64890Smrg        Xfree (ret);
6521ab64890Smrg        return NULL;
6531ab64890Smrg    }
6541ab64890Smrg    if (strchr(value[0],':')) {
6551ab64890Smrg        ptr = strchr(ret->name,':');
6561ab64890Smrg        *ptr = '\0';
6571ab64890Smrg        ptr++;
6581ab64890Smrg        if (!_XlcNCompareISOLatin1(ptr, "GL", 2)) {
6591ab64890Smrg            ret->side =  XlcGL;
6601ab64890Smrg            sprintf(cset_name,"%s:%s",ret->name,"GL");
6611ab64890Smrg        } else {
6621ab64890Smrg            ret->side =  XlcGR;
6631ab64890Smrg            sprintf(cset_name,"%s:%s",ret->name,"GR");
6641ab64890Smrg        }
6651ab64890Smrg    } else {
6661ab64890Smrg        ret->side =  XlcGLGR;
6671ab64890Smrg        strcpy(cset_name,ret->name);
6681ab64890Smrg    }
6691ab64890Smrg    ret->area = (FontScope)Xmalloc((num - 1)*sizeof(FontScopeRec));
6701ab64890Smrg    if (ret->area == NULL) {
6711ab64890Smrg	Xfree (cset_name);
6721ab64890Smrg	Xfree (ret->name);
6731ab64890Smrg	Xfree (ret);
6741ab64890Smrg        return NULL;
6751ab64890Smrg    }
6761ab64890Smrg    ret->area_num = num - 1;
6771ab64890Smrg    scope = ret->area ;
6781ab64890Smrg    for (i = 1; i < num; i++) {
6791ab64890Smrg        sscanf(value[i],"\\x%lx,\\x%lx",
6801ab64890Smrg               &scope[i-1].start, &scope[i-1].end);
6811ab64890Smrg    }
6821ab64890Smrg    ret->charset = srch_charset_define(cset_name,&new);
6831ab64890Smrg    Xfree (cset_name);
6841ab64890Smrg
6851ab64890Smrg    return ret;
6861ab64890Smrg}
6871ab64890Smrg/* For VW/UDC end */
6881ab64890Smrg
6891ab64890Smrgstatic Bool
6901ab64890Smrgload_generic(
6911ab64890Smrg    XLCd lcd)
6921ab64890Smrg{
6931ab64890Smrg    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
6941ab64890Smrg    char **value;
6951ab64890Smrg    int num;
6961ab64890Smrg    unsigned long l;
6971ab64890Smrg    int i;
6981ab64890Smrg    int M,ii;
6991ab64890Smrg    XlcCharSet charset;
7001ab64890Smrg
7011ab64890Smrg    gen->codeset_num = 0;
7021ab64890Smrg
7031ab64890Smrg    /***** wc_encoding_mask *****/
7041ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "wc_encoding_mask", &value, &num);
7051ab64890Smrg    if (num > 0) {
70661b2299dSmrg	if (string_to_ulong(value[0], &l) == False)
7071ab64890Smrg	    goto err;
7081ab64890Smrg	gen->wc_encode_mask = l;
7091ab64890Smrg    }
7101ab64890Smrg    /***** wc_shift_bits *****/
7111ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "wc_shift_bits", &value, &num);
7121ab64890Smrg    if (num > 0)
7131ab64890Smrg	gen->wc_shift_bits = atoi(value[0]);
7141ab64890Smrg    if (gen->wc_shift_bits < 1)
7151ab64890Smrg	gen->wc_shift_bits = 8;
7161ab64890Smrg    /***** use_stdc_env *****/
7171ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "use_stdc_env", &value, &num);
7181ab64890Smrg    if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
7191ab64890Smrg	gen->use_stdc_env = True;
7201ab64890Smrg    else
7211ab64890Smrg	gen->use_stdc_env = False;
7221ab64890Smrg    /***** force_convert_to_mb *****/
7231ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "force_convert_to_mb", &value, &num);
7241ab64890Smrg    if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
7251ab64890Smrg	gen->force_convert_to_mb = True;
7261ab64890Smrg    else
7271ab64890Smrg	gen->force_convert_to_mb = False;
72861b2299dSmrg
7291ab64890Smrg    for (i = 0; ; i++) {
7301ab64890Smrg	CodeSetRec *codeset = NULL;
7311ab64890Smrg	char cs[16];
7321ab64890Smrg	char name[BUFSIZ];
7331ab64890Smrg
7341ab64890Smrg	sprintf(cs, "cs%d", i);
7351ab64890Smrg
7361ab64890Smrg	/***** codeset.side *****/
7371ab64890Smrg	sprintf(name, "%s.%s", cs , "side");
7381ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
7391ab64890Smrg	if (num > 0) {
7401ab64890Smrg	    char *tmp;
7411ab64890Smrg
7421ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
7431ab64890Smrg		goto err;
7441ab64890Smrg
7451ab64890Smrg            /* 3.4.1 side */
7461ab64890Smrg            if (!_XlcNCompareISOLatin1(value[0], "none", 4)) {
7471ab64890Smrg                codeset->side =  XlcNONE;
7481ab64890Smrg            } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) {
7491ab64890Smrg                codeset->side =  XlcGL;
7501ab64890Smrg            } else {
7511ab64890Smrg                codeset->side =  XlcGR;
7521ab64890Smrg            }
7531ab64890Smrg
7541ab64890Smrg	    tmp = strrchr(value[0], ':');
7551ab64890Smrg	    if (tmp != NULL && !_XlcCompareISOLatin1(tmp + 1, "Default")) {
7561ab64890Smrg		if (codeset->side == XlcGR)
7571ab64890Smrg		    gen->initial_state_GR = codeset;
7581ab64890Smrg		else
7591ab64890Smrg		    gen->initial_state_GL = codeset;
7601ab64890Smrg	    }
7611ab64890Smrg	}
7621ab64890Smrg
7631ab64890Smrg	/***** codeset.length *****/
7641ab64890Smrg	sprintf(name, "%s.%s", cs , "length");
7651ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
7661ab64890Smrg	if (num > 0) {
7671ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
7681ab64890Smrg		goto err;
7691ab64890Smrg	    codeset->length = atoi(value[0]);
7701ab64890Smrg	    if (codeset->length < 1)
7711ab64890Smrg		codeset->length = 1;
7721ab64890Smrg	}
7731ab64890Smrg
7741ab64890Smrg	/***** codeset.mb_encoding *****/
7751ab64890Smrg	sprintf(name, "%s.%s", cs, "mb_encoding");
7761ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
7771ab64890Smrg	if (num > 0) {
77861b2299dSmrg	    static struct {
7791ab64890Smrg		const char *str;
7801ab64890Smrg		EncodingType type;
7811ab64890Smrg	    } shifts[] = {
7821ab64890Smrg		{"<SS>", E_SS},
7831ab64890Smrg		{"<LSL>", E_LSL},
7841ab64890Smrg		{"<LSR>", E_LSR},
7851ab64890Smrg		{0}
7861ab64890Smrg	    };
7871ab64890Smrg	    int j;
7881ab64890Smrg
7891ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
7901ab64890Smrg		goto err;
7911ab64890Smrg	    for ( ; num-- > 0; value++) {
7921ab64890Smrg		char encoding[256];
7931ab64890Smrg		char *tmp = *value;
7941ab64890Smrg		EncodingType type = E_SS;    /* for BC */
7951ab64890Smrg		for (j = 0; shifts[j].str; j++) {
7961ab64890Smrg		    if (!_XlcNCompareISOLatin1(tmp, shifts[j].str,
7971ab64890Smrg					       strlen(shifts[j].str))) {
7981ab64890Smrg			type = shifts[j].type;
7991ab64890Smrg			tmp += strlen(shifts[j].str);
8001ab64890Smrg			break;
8011ab64890Smrg		    }
8021ab64890Smrg		}
80361b2299dSmrg		if (strlen (tmp) > sizeof encoding ||
8041ab64890Smrg		    string_to_encoding(tmp, encoding) == False)
8051ab64890Smrg			goto err;
8061ab64890Smrg		add_parse_list(gen, type, encoding, codeset);
8071ab64890Smrg	    }
8081ab64890Smrg	}
8091ab64890Smrg
8101ab64890Smrg	/***** codeset.wc_encoding *****/
8111ab64890Smrg	sprintf(name, "%s.%s", cs, "wc_encoding");
8121ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
8131ab64890Smrg	if (num > 0) {
8141ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
8151ab64890Smrg		goto err;
81661b2299dSmrg	    if (string_to_ulong(value[0], &l) == False)
8171ab64890Smrg		goto err;
8181ab64890Smrg	    codeset->wc_encoding = l;
8191ab64890Smrg	}
82061b2299dSmrg
8211ab64890Smrg	/***** codeset.ct_encoding *****/
8221ab64890Smrg	sprintf(name, "%s.%s", cs, "ct_encoding");
8231ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
8241ab64890Smrg	if (num > 0) {
8251ab64890Smrg	    char *encoding;
8261ab64890Smrg
8271ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
8281ab64890Smrg		goto err;
8291ab64890Smrg	    for ( ; num-- > 0; value++) {
8301ab64890Smrg		if (strlen (*value) > sizeof name)
8311ab64890Smrg		    goto err;
8321ab64890Smrg		string_to_encoding(*value, name);
8331ab64890Smrg		charset = NULL;
8341ab64890Smrg		if ((encoding = strchr(name, ':')) &&
8351ab64890Smrg		    (encoding = strchr(encoding + 1, ':'))) {
8361ab64890Smrg		    *encoding++ = '\0';
8371ab64890Smrg		    charset = _XlcAddCT(name, encoding);
8381ab64890Smrg		}
8391ab64890Smrg		if (charset == NULL) {
8401ab64890Smrg		    charset = _XlcGetCharSet(name);
8411ab64890Smrg		    if (charset == NULL &&
8421ab64890Smrg			(charset = _XlcCreateDefaultCharSet(name, ""))) {
8431ab64890Smrg			charset->side = codeset->side;
8441ab64890Smrg			charset->char_size = codeset->length;
8451ab64890Smrg			_XlcAddCharSet(charset);
8461ab64890Smrg		    }
8471ab64890Smrg		}
8481ab64890Smrg		if (charset) {
8491ab64890Smrg		    if (add_charset(codeset, charset) == False)
8501ab64890Smrg			goto err;
8511ab64890Smrg		}
8521ab64890Smrg	    }
8531ab64890Smrg	}
8541ab64890Smrg
8551ab64890Smrg	if (codeset == NULL)
8561ab64890Smrg	    break;
8571ab64890Smrg	codeset->cs_num = i;
8581ab64890Smrg        /* For VW/UDC */
8591ab64890Smrg        /***** 3.4.2 byteM (1 <= M <= length)*****/
8601ab64890Smrg        for (M=1; M-1  < codeset->length; M++) {
8611ab64890Smrg            unsigned long start,end;
8621ab64890Smrg            ByteInfo tmpb;
8631ab64890Smrg
8641ab64890Smrg            sprintf(name,"%s.%s%d",cs,"byte",M);
8651ab64890Smrg            _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
8661ab64890Smrg
8671ab64890Smrg            if (M == 1) {
8681ab64890Smrg                if (num < 1) {
8691ab64890Smrg                    codeset->byteM = NULL;
8701ab64890Smrg                    break ;
8711ab64890Smrg                }
8721ab64890Smrg                codeset->byteM =
8731ab64890Smrg                    (ByteInfoListRec *)Xmalloc(
8741ab64890Smrg                         (codeset->length)*sizeof(ByteInfoListRec));
8751ab64890Smrg                if (codeset->byteM == NULL) {
8761ab64890Smrg                    goto err;
8771ab64890Smrg                }
8781ab64890Smrg            }
8791ab64890Smrg
8801ab64890Smrg            if (num > 0) {
8811ab64890Smrg                _XlcDbg_printValue(name,value,num);
8821ab64890Smrg                (codeset->byteM)[M-1].M = M;
8831ab64890Smrg                (codeset->byteM)[M-1].byteinfo_num = num;
8841ab64890Smrg                (codeset->byteM)[M-1].byteinfo =
8851ab64890Smrg                    (ByteInfo)Xmalloc( num * sizeof(ByteInfoRec));
8861ab64890Smrg                for (ii = 0 ; ii < num ; ii++) {
8871ab64890Smrg                    tmpb = (codeset->byteM)[M-1].byteinfo ;
8881ab64890Smrg                    /* default 0x00 - 0xff */
8891ab64890Smrg                    sscanf(value[ii],"\\x%lx,\\x%lx",&start,&end);
8901ab64890Smrg                    tmpb[ii].start = (unsigned char)start;
8911ab64890Smrg                    tmpb[ii].end  = (unsigned char)end;
8921ab64890Smrg                }
8931ab64890Smrg            }
8941ab64890Smrg            /* .... */
8951ab64890Smrg        }
8961ab64890Smrg
8971ab64890Smrg
8981ab64890Smrg        /***** codeset.mb_conversion *****/
8991ab64890Smrg        sprintf(name, "%s.%s", cs, "mb_conversion");
9001ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9011ab64890Smrg        if (num > 0) {
9021ab64890Smrg                _XlcDbg_printValue(name,value,num);
9031ab64890Smrg                codeset->mbconv = Xmalloc(sizeof(ConversionRec));
9041ab64890Smrg                codeset->mbconv->convlist =
9051ab64890Smrg                _XlcParse_scopemaps(value[0],&(codeset->mbconv->conv_num));
9061ab64890Smrg                dmpscope("mb_conv",codeset->mbconv->convlist,
9071ab64890Smrg                         codeset->mbconv->conv_num);
9081ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9091ab64890Smrg        }
9101ab64890Smrg        /***** codeset.ct_conversion *****/
9111ab64890Smrg        sprintf(name, "%s.%s", cs, "ct_conversion");
9121ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9131ab64890Smrg        if (num > 0) {
9141ab64890Smrg                _XlcDbg_printValue(name,value,num);
9151ab64890Smrg                codeset->ctconv = Xmalloc(sizeof(ConversionRec));
9161ab64890Smrg                codeset->ctconv->convlist =
9171ab64890Smrg                _XlcParse_scopemaps(value[0],&(codeset->ctconv->conv_num));
9181ab64890Smrg                dmpscope("ctconv",codeset->ctconv->convlist,
9191ab64890Smrg                         codeset->ctconv->conv_num);
9201ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9211ab64890Smrg        }
9221ab64890Smrg        /***** codeset.ct_conversion_file *****/
9231ab64890Smrg        sprintf(name, "%s.%s", cs, "ct_conversion_file");
9241ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9251ab64890Smrg        if (num > 0) {
9261ab64890Smrg                _XlcDbg_printValue(name,value,num);
9271ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9281ab64890Smrg        }
9291ab64890Smrg        /***** codeset.ct_extended_segment *****/
9301ab64890Smrg        sprintf(name, "%s.%s", cs, "ct_extended_segment");
9311ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9321ab64890Smrg        if (num > 0) {
9331ab64890Smrg                _XlcDbg_printValue(name,value,num);
9341ab64890Smrg                codeset->ctextseg = create_ctextseg(value,num);
9351ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9361ab64890Smrg        }
9371ab64890Smrg        /* For VW/UDC end */
9381ab64890Smrg
9391ab64890Smrg    }
94061b2299dSmrg
9411ab64890Smrg    read_charset_define(lcd,gen);       /* For VW/UDC */
9421ab64890Smrg    read_segmentconversion(lcd,gen);    /* For VW/UDC */
9431ab64890Smrg
9441ab64890Smrg    if (gen->initial_state_GL == NULL) {
9451ab64890Smrg       CodeSetRec *codeset;
9461ab64890Smrg       for (i = 0; i < gen->codeset_num; i++) {
9471ab64890Smrg          codeset = gen->codeset_list[i];
9481ab64890Smrg          if (codeset->side == XlcGL)
9491ab64890Smrg             gen->initial_state_GL = codeset;
9501ab64890Smrg       }
9511ab64890Smrg    }
9521ab64890Smrg
9531ab64890Smrg    if (gen->initial_state_GR == NULL) {
9541ab64890Smrg       CodeSetRec *codeset;
9551ab64890Smrg       for (i = 0; i < gen->codeset_num; i++) {
9561ab64890Smrg          codeset = gen->codeset_list[i];
9571ab64890Smrg          if (codeset->side == XlcGR)
9581ab64890Smrg             gen->initial_state_GR = codeset;
9591ab64890Smrg       }
9601ab64890Smrg    }
9611ab64890Smrg
9621ab64890Smrg    for (i = 0; i < gen->codeset_num; i++) {
9631ab64890Smrg       CodeSetRec *codeset = gen->codeset_list[i];
9641ab64890Smrg       for (ii = 0; ii < codeset->num_charsets; ii++) {
9651ab64890Smrg          charset = codeset->charset_list[ii];
9661ab64890Smrg          if (! strcmp(charset->encoding_name, "ISO8859-1"))
9671ab64890Smrg              charset->string_encoding = True;
9681ab64890Smrg          if ( charset->string_encoding )
9691ab64890Smrg              codeset->string_encoding = True;
9701ab64890Smrg       }
9711ab64890Smrg    }
9721ab64890Smrg    return True;
9731ab64890Smrg
9741ab64890Smrgerr:
9751ab64890Smrg    free_charset(lcd);
9761ab64890Smrg
9771ab64890Smrg    return False;
9781ab64890Smrg}
9791ab64890Smrg
9801ab64890Smrg#ifdef USE_DYNAMIC_LC
9811ab64890Smrg/* override the open_om and open_im methods which were set by
9821ab64890Smrg   super_class's initialize method() */
9831ab64890Smrg
9841ab64890Smrgstatic Bool
9851ab64890Smrginitialize_core(
9861ab64890Smrg    XLCd lcd)
9871ab64890Smrg{
9881ab64890Smrg    _XInitDynamicOM(lcd);
9891ab64890Smrg
9901ab64890Smrg    _XInitDynamicIM(lcd);
9911ab64890Smrg
9921ab64890Smrg    return True;
9931ab64890Smrg}
9941ab64890Smrg#endif
9951ab64890Smrg
9961ab64890Smrgstatic Bool
99761b2299dSmrginitialize(XLCd lcd)
9981ab64890Smrg{
9991ab64890Smrg    XLCdPublicMethods superclass = (XLCdPublicMethods) _XlcPublicMethods;
10001ab64890Smrg
10011ab64890Smrg    XLC_PUBLIC_METHODS(lcd)->superclass = superclass;
10021ab64890Smrg
10031ab64890Smrg    if (superclass->pub.initialize) {
10041ab64890Smrg	if ((*superclass->pub.initialize)(lcd) == False)
10051ab64890Smrg	    return False;
10061ab64890Smrg    }
10071ab64890Smrg
10081ab64890Smrg#ifdef USE_DYNAMIC_LC
10091ab64890Smrg    if (initialize_core(lcd) == False)
10101ab64890Smrg	return False;
10111ab64890Smrg#endif
10121ab64890Smrg
10131ab64890Smrg    if (load_generic(lcd) == False)
10141ab64890Smrg	return False;
10151ab64890Smrg
10161ab64890Smrg    return True;
10171ab64890Smrg}
10181ab64890Smrg
10191ab64890Smrg/* VW/UDC start 95.01.08 */
102061b2299dSmrgstatic void
10211ab64890SmrgfreeByteM(
10221ab64890Smrg    CodeSet codeset)
10231ab64890Smrg{
10241ab64890Smrg    int i;
10251ab64890Smrg    ByteInfoList blst;
10261ab64890Smrg    if (codeset->byteM == NULL) {
10271ab64890Smrg	return ;
10281ab64890Smrg    }
10291ab64890Smrg    blst = codeset->byteM;
10301ab64890Smrg    for (i = 0; i < codeset->length; i++) {
10311ab64890Smrg	if (blst[i].byteinfo) {
10321ab64890Smrg	    Xfree(blst[i].byteinfo);
10331ab64890Smrg	    blst[i].byteinfo = NULL;
10341ab64890Smrg	}
10351ab64890Smrg    }
103661b2299dSmrg    Xfree(codeset->byteM);
10371ab64890Smrg    codeset->byteM = NULL;
10381ab64890Smrg}
10391ab64890Smrg
104061b2299dSmrgstatic void
10411ab64890SmrgfreeConversion(
10421ab64890Smrg    CodeSet codeset)
10431ab64890Smrg{
10441ab64890Smrg    Conversion mbconv,ctconv;
10451ab64890Smrg    if (codeset->mbconv) {
10461ab64890Smrg	mbconv = codeset->mbconv;
10471ab64890Smrg	/*  ...  */
10481ab64890Smrg	if (mbconv->convlist) {
10491ab64890Smrg	    Xfree(mbconv->convlist);
10501ab64890Smrg	    mbconv->convlist = NULL;
10511ab64890Smrg	}
10521ab64890Smrg	Xfree(mbconv);
10531ab64890Smrg	codeset->mbconv = NULL;
10541ab64890Smrg    }
10551ab64890Smrg    if (codeset->ctconv) {
10561ab64890Smrg	ctconv = codeset->ctconv;
10571ab64890Smrg	/*  ...  */
10581ab64890Smrg	if (ctconv->convlist) {
10591ab64890Smrg	    Xfree(ctconv->convlist);
10601ab64890Smrg	    ctconv->convlist = NULL;
10611ab64890Smrg	}
10621ab64890Smrg	Xfree(ctconv);
10631ab64890Smrg	codeset->ctconv = NULL;
10641ab64890Smrg    }
10651ab64890Smrg}
10661ab64890Smrg
106761b2299dSmrgstatic void
10681ab64890SmrgfreeExtdSegment(
10691ab64890Smrg    CodeSet codeset)
10701ab64890Smrg{
10711ab64890Smrg    ExtdSegment ctextseg;
10721ab64890Smrg    if (codeset->ctextseg == NULL) {
10731ab64890Smrg	return;
10741ab64890Smrg    }
10751ab64890Smrg    ctextseg = codeset->ctextseg;
10761ab64890Smrg    if (ctextseg->name) {
10771ab64890Smrg	Xfree(ctextseg->name);
10781ab64890Smrg	ctextseg->name = NULL;
10791ab64890Smrg    }
10801ab64890Smrg    if (ctextseg->area) {
10811ab64890Smrg	Xfree(ctextseg->area);
10821ab64890Smrg	ctextseg->area = NULL;
10831ab64890Smrg    }
108461b2299dSmrg    Xfree(codeset->ctextseg);
10851ab64890Smrg    codeset->ctextseg = NULL;
10861ab64890Smrg}
10871ab64890Smrg
108861b2299dSmrgstatic void
10891ab64890SmrgfreeParseInfo(
10901ab64890Smrg    CodeSet codeset)
10911ab64890Smrg{
10921ab64890Smrg    ParseInfo parse_info;
10931ab64890Smrg    if (codeset->parse_info == NULL) {
10941ab64890Smrg	return;
10951ab64890Smrg    }
10961ab64890Smrg    parse_info = codeset->parse_info;
10971ab64890Smrg    if (parse_info->encoding) {
10981ab64890Smrg	Xfree(parse_info->encoding);
10991ab64890Smrg	parse_info->encoding = NULL;
11001ab64890Smrg    }
110161b2299dSmrg    Xfree(codeset->parse_info);
11021ab64890Smrg    codeset->parse_info = NULL;
11031ab64890Smrg}
11041ab64890Smrg
11051ab64890Smrgstatic void
11061ab64890Smrgdestroy_CodeSetList(
11071ab64890Smrg    XLCdGenericPart *gen)
11081ab64890Smrg{
11091ab64890Smrg    CodeSet *codeset = gen->codeset_list;
11101ab64890Smrg    int i;
11111ab64890Smrg    if (gen->codeset_num == 0) {
11121ab64890Smrg	return;
11131ab64890Smrg    }
11141ab64890Smrg    for (i=0;i<gen->codeset_num;i++) {
11151ab64890Smrg        freeByteM(codeset[i]);
11161ab64890Smrg	freeConversion(codeset[i]);
11171ab64890Smrg	freeExtdSegment(codeset[i]);
11181ab64890Smrg	freeParseInfo(codeset[i]);
11191ab64890Smrg	if (codeset[i]->charset_list) {
11201ab64890Smrg	    Xfree(codeset[i]->charset_list);
11211ab64890Smrg	    codeset[i]->charset_list = NULL;
11221ab64890Smrg	}
11231ab64890Smrg	Xfree(codeset[i]); codeset[i]=NULL;
11241ab64890Smrg    }
11251ab64890Smrg    Xfree(codeset); gen->codeset_list = NULL;
11261ab64890Smrg}
11271ab64890Smrg
11281ab64890Smrgstatic void
11291ab64890Smrgdestroy_SegConv(
11301ab64890Smrg    XLCdGenericPart *gen)
11311ab64890Smrg{
11321ab64890Smrg    SegConv seg = gen->segment_conv;
11331ab64890Smrg    int i;
11341ab64890Smrg    if (gen->segment_conv_num == 0) {
11351ab64890Smrg	return;
11361ab64890Smrg    }
11371ab64890Smrg    for (i=0;i<gen->segment_conv_num;i++) {
11381ab64890Smrg	if (seg[i].source_encoding) {
11391ab64890Smrg	    Xfree(seg[i].source_encoding);
11401ab64890Smrg	    seg[i].source_encoding = NULL;
11411ab64890Smrg	}
11421ab64890Smrg	if (seg[i].destination_encoding) {
114361b2299dSmrg	    Xfree(seg[i].destination_encoding);
11441ab64890Smrg	    seg[i].destination_encoding = NULL;
11451ab64890Smrg	}
11461ab64890Smrg	if (seg[i].conv) {
11471ab64890Smrg	    Xfree(seg[i].conv); seg[i].conv = NULL;
11481ab64890Smrg	}
11491ab64890Smrg    }
11501ab64890Smrg    Xfree(seg); gen->segment_conv = NULL;
11511ab64890Smrg}
11521ab64890Smrg
11531ab64890Smrgstatic void
11541ab64890Smrgdestroy_gen(
11551ab64890Smrg    XLCd lcd)
11561ab64890Smrg{
11571ab64890Smrg    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
11581ab64890Smrg    destroy_SegConv(gen);
11591ab64890Smrg    destroy_CodeSetList(gen);
11601ab64890Smrg    if (gen->mb_parse_table) {
11611ab64890Smrg	Xfree(gen->mb_parse_table);
11621ab64890Smrg	gen->mb_parse_table = NULL;
11631ab64890Smrg    }
11641ab64890Smrg    if (gen->mb_parse_list) {
11651ab64890Smrg	Xfree(gen->mb_parse_list);
11661ab64890Smrg	gen->mb_parse_list = NULL;
11671ab64890Smrg    }
11681ab64890Smrg}
11691ab64890Smrg/* VW/UDC end 95.01.08 */
11701ab64890Smrg
11711ab64890Smrgstatic void
11721ab64890Smrgdestroy(
11731ab64890Smrg    XLCd lcd)
11741ab64890Smrg{
11751ab64890Smrg    XLCdPublicMethods superclass = XLC_PUBLIC_METHODS(lcd)->superclass;
11761ab64890Smrg
11771ab64890Smrg    destroy_gen(lcd); /* ADD 1996.01.08 */
11781ab64890Smrg    if (superclass && superclass->pub.destroy)
11791ab64890Smrg	(*superclass->pub.destroy)(lcd);
11801ab64890Smrg}
1181