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