lcGeneric.c revision 258a0ebe
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"
37258a0ebeSmrg#include "reallocarray.h"
381ab64890Smrg
391ab64890Smrgstatic XLCd create (const char *name, XLCdMethods methods);
401ab64890Smrgstatic Bool initialize (XLCd lcd);
411ab64890Smrgstatic void destroy (XLCd lcd);
421ab64890Smrg
431ab64890Smrgstatic XLCdPublicMethodsRec genericMethods = {
441ab64890Smrg    { NULL },                   /* use default methods */
451ab64890Smrg    {
461ab64890Smrg	NULL,
471ab64890Smrg	create,
481ab64890Smrg	initialize,
491ab64890Smrg	destroy,
501ab64890Smrg	NULL
511ab64890Smrg    }
521ab64890Smrg};
531ab64890Smrg
541ab64890SmrgXLCdMethods _XlcGenericMethods = (XLCdMethods) &genericMethods;
551ab64890Smrg
561ab64890Smrgstatic XLCd
571ab64890Smrgcreate(
581ab64890Smrg    const char *name,
591ab64890Smrg    XLCdMethods methods)
601ab64890Smrg{
611ab64890Smrg    XLCd lcd;
621ab64890Smrg    XLCdPublicMethods new;
631ab64890Smrg
646cc2b21fSmrg    lcd = Xcalloc(1, sizeof(XLCdRec));
651ab64890Smrg    if (lcd == NULL)
661ab64890Smrg        return (XLCd) NULL;
671ab64890Smrg
686cc2b21fSmrg    lcd->core = Xcalloc(1, sizeof(XLCdGenericRec));
691ab64890Smrg    if (lcd->core == NULL)
701ab64890Smrg	goto err;
711ab64890Smrg
72818534a1Smrg    new = Xmalloc(sizeof(XLCdPublicMethodsRec));
731ab64890Smrg    if (new == NULL)
741ab64890Smrg	goto err;
751ab64890Smrg    memcpy(new,methods,sizeof(XLCdPublicMethodsRec));
761ab64890Smrg    lcd->methods = (XLCdMethods) new;
771ab64890Smrg
781ab64890Smrg    return lcd;
791ab64890Smrg
801ab64890Smrgerr:
813233502eSmrg    Xfree(lcd->core);
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))
161258a0ebeSmrg        new_list = Xreallocarray(codeset->charset_list,
162258a0ebeSmrg                                 num + 1, sizeof(XlcCharSet));
1631ab64890Smrg    else
164818534a1Smrg        new_list = 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
1836cc2b21fSmrg    new = Xcalloc(1, sizeof(CodeSetRec));
1841ab64890Smrg    if (new == NULL)
1851ab64890Smrg        return NULL;
1861ab64890Smrg
1871ab64890Smrg    if ((num = gen->codeset_num))
188258a0ebeSmrg        new_list = Xreallocarray(gen->codeset_list,
189258a0ebeSmrg                                 num + 1, sizeof(CodeSet));
1901ab64890Smrg    else
191818534a1Smrg        new_list = Xmalloc(sizeof(CodeSet));
1921ab64890Smrg
1931ab64890Smrg    if (new_list == NULL)
1941ab64890Smrg        goto err;
1951ab64890Smrg
1961ab64890Smrg    new_list[num] = new;
1971ab64890Smrg    gen->codeset_list = new_list;
1981ab64890Smrg    gen->codeset_num = num + 1;
1991ab64890Smrg
2001ab64890Smrg    return new;
2011ab64890Smrg
2021ab64890Smrgerr:
2031ab64890Smrg    Xfree(new);
2041ab64890Smrg
2051ab64890Smrg    return NULL;
2061ab64890Smrg}
2071ab64890Smrg
2081ab64890Smrgstatic Bool
2091ab64890Smrgadd_parse_list(
2101ab64890Smrg    XLCdGenericPart *gen,
2111ab64890Smrg    EncodingType type,
2121ab64890Smrg    const char *encoding,
2131ab64890Smrg    CodeSet codeset)
2141ab64890Smrg{
2151ab64890Smrg    ParseInfo new, *new_list;
2161ab64890Smrg    char *str;
2171ab64890Smrg    unsigned char ch;
2181ab64890Smrg    int num;
2191ab64890Smrg
2206cc2b21fSmrg    str = strdup(encoding);
2211ab64890Smrg    if (str == NULL)
2221ab64890Smrg        return False;
2231ab64890Smrg
2246cc2b21fSmrg    new = Xcalloc(1, sizeof(ParseInfoRec));
2251ab64890Smrg    if (new == NULL)
2261ab64890Smrg        goto err;
2271ab64890Smrg
2281ab64890Smrg    if (gen->mb_parse_table == NULL) {
2296cc2b21fSmrg        gen->mb_parse_table = Xcalloc(1, 256); /* 2^8 */
2301ab64890Smrg        if (gen->mb_parse_table == NULL)
2311ab64890Smrg            goto err;
2321ab64890Smrg    }
2331ab64890Smrg
2341ab64890Smrg    if ((num = gen->mb_parse_list_num))
235258a0ebeSmrg        new_list = Xreallocarray(gen->mb_parse_list,
236258a0ebeSmrg                                 num + 2, sizeof(ParseInfo));
2371ab64890Smrg    else {
238818534a1Smrg        new_list = Xmalloc(2 * sizeof(ParseInfo));
2391ab64890Smrg    }
2401ab64890Smrg
2411ab64890Smrg    if (new_list == NULL)
2421ab64890Smrg        goto err;
2431ab64890Smrg
2441ab64890Smrg    new_list[num] = new;
2451ab64890Smrg    new_list[num + 1] = NULL;
2461ab64890Smrg    gen->mb_parse_list = new_list;
2471ab64890Smrg    gen->mb_parse_list_num = num + 1;
2481ab64890Smrg
2491ab64890Smrg    ch = (unsigned char) *str;
2501ab64890Smrg    if (gen->mb_parse_table[ch] == 0)
2511ab64890Smrg        gen->mb_parse_table[ch] = num + 1;
2521ab64890Smrg
2531ab64890Smrg    new->type = type;
2541ab64890Smrg    new->encoding = str;
2551ab64890Smrg    new->codeset = codeset;
2561ab64890Smrg
2571ab64890Smrg    if (codeset->parse_info == NULL)
2581ab64890Smrg        codeset->parse_info = new;
2591ab64890Smrg
2601ab64890Smrg    return True;
2611ab64890Smrg
2621ab64890Smrgerr:
2631ab64890Smrg    Xfree(str);
2640f8248bfSmrg
2650f8248bfSmrg    Xfree(new);
2661ab64890Smrg
2671ab64890Smrg    return False;
2681ab64890Smrg}
2691ab64890Smrg
2701ab64890Smrgstatic void
2711ab64890Smrgfree_charset(
2721ab64890Smrg    XLCd lcd)
2731ab64890Smrg{
2741ab64890Smrg    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
2751ab64890Smrg    ParseInfo *parse_info;
2761ab64890Smrg    int num;
2771ab64890Smrg
2780f8248bfSmrg    Xfree(gen->mb_parse_table);
2791ab64890Smrg    if ((num = gen->mb_parse_list_num) > 0) {
2801ab64890Smrg        for (parse_info = gen->mb_parse_list; num-- > 0; parse_info++) {
2810f8248bfSmrg            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);
354258a0ebeSmrg    scope = Xmallocarray(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;
431818534a1Smrg        snprintf(csd, sizeof(csd), "csd%d", i);
4321ab64890Smrg
4331ab64890Smrg        /* charset_name  */
434818534a1Smrg        snprintf(name, sizeof(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';
441818534a1Smrg            snprintf(name, sizeof(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 */
473818534a1Smrg        snprintf(name, sizeof(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 */
480818534a1Smrg        snprintf(name, sizeof(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 */
487818534a1Smrg        snprintf(name, sizeof(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 */
498818534a1Smrg        snprintf(name, sizeof(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*/
507818534a1Smrg            tmp = 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 */
514818534a1Smrg        snprintf(name, sizeof(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) {
539258a0ebeSmrg        new_list = Xreallocarray(gen->segment_conv,
540258a0ebeSmrg                                 num + 1, sizeof(SegConvRec));
5411ab64890Smrg    } else {
542818534a1Smrg        new_list = 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;
568818534a1Smrg        snprintf(conv, sizeof(conv), "conv%d", i);
5691ab64890Smrg
5701ab64890Smrg        /* length                */
571818534a1Smrg        snprintf(name, sizeof(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       */
588818534a1Smrg        snprintf(name, sizeof(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  */
600818534a1Smrg        snprintf(name, sizeof(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                 */
612818534a1Smrg        snprintf(name, sizeof(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            */
620818534a1Smrg        snprintf(name, sizeof(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;
638818534a1Smrg    size_t cset_len;
6391ab64890Smrg    int i,new;
6401ab64890Smrg    FontScope scope;
641818534a1Smrg    ret = Xmalloc(sizeof(ExtdSegmentRec));
6421ab64890Smrg    if (ret == NULL)
6431ab64890Smrg        return NULL;
6446cc2b21fSmrg    ret->name = strdup(value[0]);
6451ab64890Smrg    if (ret->name == NULL) {
6461ab64890Smrg        Xfree (ret);
6471ab64890Smrg        return NULL;
6481ab64890Smrg    }
649818534a1Smrg    cset_len = strlen(ret->name) + 1;
650818534a1Smrg    cset_name = Xmalloc (cset_len);
6511ab64890Smrg    if (cset_name == NULL) {
6521ab64890Smrg        Xfree (ret->name);
6531ab64890Smrg        Xfree (ret);
6541ab64890Smrg        return NULL;
6551ab64890Smrg    }
6561ab64890Smrg    if (strchr(value[0],':')) {
6571ab64890Smrg        ptr = strchr(ret->name,':');
6581ab64890Smrg        *ptr = '\0';
6591ab64890Smrg        ptr++;
6601ab64890Smrg        if (!_XlcNCompareISOLatin1(ptr, "GL", 2)) {
6611ab64890Smrg            ret->side =  XlcGL;
662818534a1Smrg            snprintf(cset_name, cset_len, "%s:%s", ret->name, "GL");
6631ab64890Smrg        } else {
6641ab64890Smrg            ret->side =  XlcGR;
665818534a1Smrg            snprintf(cset_name, cset_len, "%s:%s", ret->name, "GR");
6661ab64890Smrg        }
6671ab64890Smrg    } else {
6681ab64890Smrg        ret->side =  XlcGLGR;
6691ab64890Smrg        strcpy(cset_name,ret->name);
6701ab64890Smrg    }
671258a0ebeSmrg    ret->area = Xmallocarray(num - 1, sizeof(FontScopeRec));
6721ab64890Smrg    if (ret->area == NULL) {
6731ab64890Smrg	Xfree (cset_name);
6741ab64890Smrg	Xfree (ret->name);
6751ab64890Smrg	Xfree (ret);
6761ab64890Smrg        return NULL;
6771ab64890Smrg    }
6781ab64890Smrg    ret->area_num = num - 1;
6791ab64890Smrg    scope = ret->area ;
6801ab64890Smrg    for (i = 1; i < num; i++) {
6811ab64890Smrg        sscanf(value[i],"\\x%lx,\\x%lx",
6821ab64890Smrg               &scope[i-1].start, &scope[i-1].end);
6831ab64890Smrg    }
6841ab64890Smrg    ret->charset = srch_charset_define(cset_name,&new);
6851ab64890Smrg    Xfree (cset_name);
6861ab64890Smrg
6871ab64890Smrg    return ret;
6881ab64890Smrg}
6891ab64890Smrg/* For VW/UDC end */
6901ab64890Smrg
6911ab64890Smrgstatic Bool
6921ab64890Smrgload_generic(
6931ab64890Smrg    XLCd lcd)
6941ab64890Smrg{
6951ab64890Smrg    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
6961ab64890Smrg    char **value;
6971ab64890Smrg    int num;
6981ab64890Smrg    unsigned long l;
6991ab64890Smrg    int i;
7001ab64890Smrg    int M,ii;
7011ab64890Smrg    XlcCharSet charset;
7021ab64890Smrg
7031ab64890Smrg    gen->codeset_num = 0;
7041ab64890Smrg
7051ab64890Smrg    /***** wc_encoding_mask *****/
7061ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "wc_encoding_mask", &value, &num);
7071ab64890Smrg    if (num > 0) {
70861b2299dSmrg	if (string_to_ulong(value[0], &l) == False)
7091ab64890Smrg	    goto err;
7101ab64890Smrg	gen->wc_encode_mask = l;
7111ab64890Smrg    }
7121ab64890Smrg    /***** wc_shift_bits *****/
7131ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "wc_shift_bits", &value, &num);
7141ab64890Smrg    if (num > 0)
7151ab64890Smrg	gen->wc_shift_bits = atoi(value[0]);
7161ab64890Smrg    if (gen->wc_shift_bits < 1)
7171ab64890Smrg	gen->wc_shift_bits = 8;
7181ab64890Smrg    /***** use_stdc_env *****/
7191ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "use_stdc_env", &value, &num);
7201ab64890Smrg    if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
7211ab64890Smrg	gen->use_stdc_env = True;
7221ab64890Smrg    else
7231ab64890Smrg	gen->use_stdc_env = False;
7241ab64890Smrg    /***** force_convert_to_mb *****/
7251ab64890Smrg    _XlcGetResource(lcd, "XLC_XLOCALE", "force_convert_to_mb", &value, &num);
7261ab64890Smrg    if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
7271ab64890Smrg	gen->force_convert_to_mb = True;
7281ab64890Smrg    else
7291ab64890Smrg	gen->force_convert_to_mb = False;
73061b2299dSmrg
7311ab64890Smrg    for (i = 0; ; i++) {
7321ab64890Smrg	CodeSetRec *codeset = NULL;
7331ab64890Smrg	char cs[16];
7341ab64890Smrg	char name[BUFSIZ];
7351ab64890Smrg
736818534a1Smrg	snprintf(cs, sizeof(cs), "cs%d", i);
7371ab64890Smrg
7381ab64890Smrg	/***** codeset.side *****/
739818534a1Smrg	snprintf(name, sizeof(name), "%s.%s", cs , "side");
7401ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
7411ab64890Smrg	if (num > 0) {
7421ab64890Smrg	    char *tmp;
7431ab64890Smrg
7441ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
7451ab64890Smrg		goto err;
7461ab64890Smrg
7471ab64890Smrg            /* 3.4.1 side */
7481ab64890Smrg            if (!_XlcNCompareISOLatin1(value[0], "none", 4)) {
7491ab64890Smrg                codeset->side =  XlcNONE;
7501ab64890Smrg            } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) {
7511ab64890Smrg                codeset->side =  XlcGL;
7521ab64890Smrg            } else {
7531ab64890Smrg                codeset->side =  XlcGR;
7541ab64890Smrg            }
7551ab64890Smrg
7561ab64890Smrg	    tmp = strrchr(value[0], ':');
7571ab64890Smrg	    if (tmp != NULL && !_XlcCompareISOLatin1(tmp + 1, "Default")) {
7581ab64890Smrg		if (codeset->side == XlcGR)
7591ab64890Smrg		    gen->initial_state_GR = codeset;
7601ab64890Smrg		else
7611ab64890Smrg		    gen->initial_state_GL = codeset;
7621ab64890Smrg	    }
7631ab64890Smrg	}
7641ab64890Smrg
7651ab64890Smrg	/***** codeset.length *****/
766818534a1Smrg	snprintf(name, sizeof(name), "%s.%s", cs , "length");
7671ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
7681ab64890Smrg	if (num > 0) {
7691ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
7701ab64890Smrg		goto err;
7711ab64890Smrg	    codeset->length = atoi(value[0]);
7721ab64890Smrg	    if (codeset->length < 1)
7731ab64890Smrg		codeset->length = 1;
7741ab64890Smrg	}
7751ab64890Smrg
7761ab64890Smrg	/***** codeset.mb_encoding *****/
777818534a1Smrg	snprintf(name, sizeof(name), "%s.%s", cs, "mb_encoding");
7781ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
7791ab64890Smrg	if (num > 0) {
78061b2299dSmrg	    static struct {
7811ab64890Smrg		const char *str;
7821ab64890Smrg		EncodingType type;
7831ab64890Smrg	    } shifts[] = {
7841ab64890Smrg		{"<SS>", E_SS},
7851ab64890Smrg		{"<LSL>", E_LSL},
7861ab64890Smrg		{"<LSR>", E_LSR},
7871ab64890Smrg		{0}
7881ab64890Smrg	    };
7891ab64890Smrg	    int j;
7901ab64890Smrg
7911ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
7921ab64890Smrg		goto err;
7931ab64890Smrg	    for ( ; num-- > 0; value++) {
7941ab64890Smrg		char encoding[256];
7951ab64890Smrg		char *tmp = *value;
7961ab64890Smrg		EncodingType type = E_SS;    /* for BC */
7971ab64890Smrg		for (j = 0; shifts[j].str; j++) {
7981ab64890Smrg		    if (!_XlcNCompareISOLatin1(tmp, shifts[j].str,
7991ab64890Smrg					       strlen(shifts[j].str))) {
8001ab64890Smrg			type = shifts[j].type;
8011ab64890Smrg			tmp += strlen(shifts[j].str);
8021ab64890Smrg			break;
8031ab64890Smrg		    }
8041ab64890Smrg		}
80561b2299dSmrg		if (strlen (tmp) > sizeof encoding ||
8061ab64890Smrg		    string_to_encoding(tmp, encoding) == False)
8071ab64890Smrg			goto err;
8081ab64890Smrg		add_parse_list(gen, type, encoding, codeset);
8091ab64890Smrg	    }
8101ab64890Smrg	}
8111ab64890Smrg
8121ab64890Smrg	/***** codeset.wc_encoding *****/
813818534a1Smrg	snprintf(name, sizeof(name), "%s.%s", cs, "wc_encoding");
8141ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
8151ab64890Smrg	if (num > 0) {
8161ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
8171ab64890Smrg		goto err;
81861b2299dSmrg	    if (string_to_ulong(value[0], &l) == False)
8191ab64890Smrg		goto err;
8201ab64890Smrg	    codeset->wc_encoding = l;
8211ab64890Smrg	}
82261b2299dSmrg
8231ab64890Smrg	/***** codeset.ct_encoding *****/
824818534a1Smrg	snprintf(name, sizeof(name), "%s.%s", cs, "ct_encoding");
8251ab64890Smrg	_XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
8261ab64890Smrg	if (num > 0) {
8271ab64890Smrg	    char *encoding;
8281ab64890Smrg
8291ab64890Smrg	    if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
8301ab64890Smrg		goto err;
8311ab64890Smrg	    for ( ; num-- > 0; value++) {
8321ab64890Smrg		if (strlen (*value) > sizeof name)
8331ab64890Smrg		    goto err;
8341ab64890Smrg		string_to_encoding(*value, name);
8351ab64890Smrg		charset = NULL;
8361ab64890Smrg		if ((encoding = strchr(name, ':')) &&
8371ab64890Smrg		    (encoding = strchr(encoding + 1, ':'))) {
8381ab64890Smrg		    *encoding++ = '\0';
8391ab64890Smrg		    charset = _XlcAddCT(name, encoding);
8401ab64890Smrg		}
8411ab64890Smrg		if (charset == NULL) {
8421ab64890Smrg		    charset = _XlcGetCharSet(name);
8431ab64890Smrg		    if (charset == NULL &&
8441ab64890Smrg			(charset = _XlcCreateDefaultCharSet(name, ""))) {
8451ab64890Smrg			charset->side = codeset->side;
8461ab64890Smrg			charset->char_size = codeset->length;
8471ab64890Smrg			_XlcAddCharSet(charset);
8481ab64890Smrg		    }
8491ab64890Smrg		}
8501ab64890Smrg		if (charset) {
8511ab64890Smrg		    if (add_charset(codeset, charset) == False)
8521ab64890Smrg			goto err;
8531ab64890Smrg		}
8541ab64890Smrg	    }
8551ab64890Smrg	}
8561ab64890Smrg
8571ab64890Smrg	if (codeset == NULL)
8581ab64890Smrg	    break;
8591ab64890Smrg	codeset->cs_num = i;
8601ab64890Smrg        /* For VW/UDC */
8611ab64890Smrg        /***** 3.4.2 byteM (1 <= M <= length)*****/
8621ab64890Smrg        for (M=1; M-1  < codeset->length; M++) {
8631ab64890Smrg            unsigned long start,end;
8641ab64890Smrg            ByteInfo tmpb;
8651ab64890Smrg
866818534a1Smrg            snprintf(name, sizeof(name),"%s.%s%d",cs,"byte",M);
8671ab64890Smrg            _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
8681ab64890Smrg
8691ab64890Smrg            if (M == 1) {
8701ab64890Smrg                if (num < 1) {
8711ab64890Smrg                    codeset->byteM = NULL;
8721ab64890Smrg                    break ;
8731ab64890Smrg                }
874258a0ebeSmrg                codeset->byteM = Xmallocarray(codeset->length,
875258a0ebeSmrg                                              sizeof(ByteInfoListRec));
8761ab64890Smrg                if (codeset->byteM == NULL) {
8771ab64890Smrg                    goto err;
8781ab64890Smrg                }
8791ab64890Smrg            }
8801ab64890Smrg
8811ab64890Smrg            if (num > 0) {
8821ab64890Smrg                _XlcDbg_printValue(name,value,num);
8831ab64890Smrg                (codeset->byteM)[M-1].M = M;
8841ab64890Smrg                (codeset->byteM)[M-1].byteinfo_num = num;
8851ab64890Smrg                (codeset->byteM)[M-1].byteinfo =
886258a0ebeSmrg		    Xmallocarray(num, sizeof(ByteInfoRec));
8871ab64890Smrg                for (ii = 0 ; ii < num ; ii++) {
8881ab64890Smrg                    tmpb = (codeset->byteM)[M-1].byteinfo ;
8891ab64890Smrg                    /* default 0x00 - 0xff */
8901ab64890Smrg                    sscanf(value[ii],"\\x%lx,\\x%lx",&start,&end);
8911ab64890Smrg                    tmpb[ii].start = (unsigned char)start;
8921ab64890Smrg                    tmpb[ii].end  = (unsigned char)end;
8931ab64890Smrg                }
8941ab64890Smrg            }
8951ab64890Smrg            /* .... */
8961ab64890Smrg        }
8971ab64890Smrg
8981ab64890Smrg
8991ab64890Smrg        /***** codeset.mb_conversion *****/
900818534a1Smrg        snprintf(name, sizeof(name), "%s.%s", cs, "mb_conversion");
9011ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9021ab64890Smrg        if (num > 0) {
9031ab64890Smrg                _XlcDbg_printValue(name,value,num);
9041ab64890Smrg                codeset->mbconv = Xmalloc(sizeof(ConversionRec));
9051ab64890Smrg                codeset->mbconv->convlist =
9061ab64890Smrg                _XlcParse_scopemaps(value[0],&(codeset->mbconv->conv_num));
9071ab64890Smrg                dmpscope("mb_conv",codeset->mbconv->convlist,
9081ab64890Smrg                         codeset->mbconv->conv_num);
9091ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9101ab64890Smrg        }
9111ab64890Smrg        /***** codeset.ct_conversion *****/
912818534a1Smrg        snprintf(name, sizeof(name), "%s.%s", cs, "ct_conversion");
9131ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9141ab64890Smrg        if (num > 0) {
9151ab64890Smrg                _XlcDbg_printValue(name,value,num);
9161ab64890Smrg                codeset->ctconv = Xmalloc(sizeof(ConversionRec));
9171ab64890Smrg                codeset->ctconv->convlist =
9181ab64890Smrg                _XlcParse_scopemaps(value[0],&(codeset->ctconv->conv_num));
9191ab64890Smrg                dmpscope("ctconv",codeset->ctconv->convlist,
9201ab64890Smrg                         codeset->ctconv->conv_num);
9211ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9221ab64890Smrg        }
9231ab64890Smrg        /***** codeset.ct_conversion_file *****/
924818534a1Smrg        snprintf(name, sizeof(name), "%s.%s", cs, "ct_conversion_file");
9251ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9261ab64890Smrg        if (num > 0) {
9271ab64890Smrg                _XlcDbg_printValue(name,value,num);
9281ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9291ab64890Smrg        }
9301ab64890Smrg        /***** codeset.ct_extended_segment *****/
931818534a1Smrg        snprintf(name, sizeof(name), "%s.%s", cs, "ct_extended_segment");
9321ab64890Smrg        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
9331ab64890Smrg        if (num > 0) {
9341ab64890Smrg                _XlcDbg_printValue(name,value,num);
9351ab64890Smrg                codeset->ctextseg = create_ctextseg(value,num);
9361ab64890Smrg                /* [\x%x,\x%x]->\x%x,... */
9371ab64890Smrg        }
9381ab64890Smrg        /* For VW/UDC end */
9391ab64890Smrg
9401ab64890Smrg    }
94161b2299dSmrg
9421ab64890Smrg    read_charset_define(lcd,gen);       /* For VW/UDC */
9431ab64890Smrg    read_segmentconversion(lcd,gen);    /* For VW/UDC */
9441ab64890Smrg
9451ab64890Smrg    if (gen->initial_state_GL == NULL) {
9461ab64890Smrg       CodeSetRec *codeset;
9471ab64890Smrg       for (i = 0; i < gen->codeset_num; i++) {
9481ab64890Smrg          codeset = gen->codeset_list[i];
9491ab64890Smrg          if (codeset->side == XlcGL)
9501ab64890Smrg             gen->initial_state_GL = codeset;
9511ab64890Smrg       }
9521ab64890Smrg    }
9531ab64890Smrg
9541ab64890Smrg    if (gen->initial_state_GR == NULL) {
9551ab64890Smrg       CodeSetRec *codeset;
9561ab64890Smrg       for (i = 0; i < gen->codeset_num; i++) {
9571ab64890Smrg          codeset = gen->codeset_list[i];
9581ab64890Smrg          if (codeset->side == XlcGR)
9591ab64890Smrg             gen->initial_state_GR = codeset;
9601ab64890Smrg       }
9611ab64890Smrg    }
9621ab64890Smrg
9631ab64890Smrg    for (i = 0; i < gen->codeset_num; i++) {
9641ab64890Smrg       CodeSetRec *codeset = gen->codeset_list[i];
9651ab64890Smrg       for (ii = 0; ii < codeset->num_charsets; ii++) {
9661ab64890Smrg          charset = codeset->charset_list[ii];
9671ab64890Smrg          if (! strcmp(charset->encoding_name, "ISO8859-1"))
9681ab64890Smrg              charset->string_encoding = True;
9691ab64890Smrg          if ( charset->string_encoding )
9701ab64890Smrg              codeset->string_encoding = True;
9711ab64890Smrg       }
9721ab64890Smrg    }
9731ab64890Smrg    return True;
9741ab64890Smrg
9751ab64890Smrgerr:
9761ab64890Smrg    free_charset(lcd);
9771ab64890Smrg
9781ab64890Smrg    return False;
9791ab64890Smrg}
9801ab64890Smrg
9811ab64890Smrg#ifdef USE_DYNAMIC_LC
9821ab64890Smrg/* override the open_om and open_im methods which were set by
9831ab64890Smrg   super_class's initialize method() */
9841ab64890Smrg
9851ab64890Smrgstatic Bool
9861ab64890Smrginitialize_core(
9871ab64890Smrg    XLCd lcd)
9881ab64890Smrg{
9891ab64890Smrg    _XInitDynamicOM(lcd);
9901ab64890Smrg
9911ab64890Smrg    _XInitDynamicIM(lcd);
9921ab64890Smrg
9931ab64890Smrg    return True;
9941ab64890Smrg}
9951ab64890Smrg#endif
9961ab64890Smrg
9971ab64890Smrgstatic Bool
99861b2299dSmrginitialize(XLCd lcd)
9991ab64890Smrg{
10001ab64890Smrg    XLCdPublicMethods superclass = (XLCdPublicMethods) _XlcPublicMethods;
10011ab64890Smrg
10021ab64890Smrg    XLC_PUBLIC_METHODS(lcd)->superclass = superclass;
10031ab64890Smrg
10041ab64890Smrg    if (superclass->pub.initialize) {
10051ab64890Smrg	if ((*superclass->pub.initialize)(lcd) == False)
10061ab64890Smrg	    return False;
10071ab64890Smrg    }
10081ab64890Smrg
10091ab64890Smrg#ifdef USE_DYNAMIC_LC
10101ab64890Smrg    if (initialize_core(lcd) == False)
10111ab64890Smrg	return False;
10121ab64890Smrg#endif
10131ab64890Smrg
10141ab64890Smrg    if (load_generic(lcd) == False)
10151ab64890Smrg	return False;
10161ab64890Smrg
10171ab64890Smrg    return True;
10181ab64890Smrg}
10191ab64890Smrg
10201ab64890Smrg/* VW/UDC start 95.01.08 */
102161b2299dSmrgstatic void
10221ab64890SmrgfreeByteM(
10231ab64890Smrg    CodeSet codeset)
10241ab64890Smrg{
10251ab64890Smrg    int i;
10261ab64890Smrg    ByteInfoList blst;
10271ab64890Smrg    if (codeset->byteM == NULL) {
10281ab64890Smrg	return ;
10291ab64890Smrg    }
10301ab64890Smrg    blst = codeset->byteM;
10311ab64890Smrg    for (i = 0; i < codeset->length; i++) {
10321ab64890Smrg	    Xfree(blst[i].byteinfo);
10331ab64890Smrg	    blst[i].byteinfo = NULL;
10341ab64890Smrg    }
103561b2299dSmrg    Xfree(codeset->byteM);
10361ab64890Smrg    codeset->byteM = NULL;
10371ab64890Smrg}
10381ab64890Smrg
103961b2299dSmrgstatic void
10401ab64890SmrgfreeConversion(
10411ab64890Smrg    CodeSet codeset)
10421ab64890Smrg{
10431ab64890Smrg    Conversion mbconv,ctconv;
10441ab64890Smrg    if (codeset->mbconv) {
10451ab64890Smrg	mbconv = codeset->mbconv;
10461ab64890Smrg	/*  ...  */
10473233502eSmrg	Xfree(mbconv->convlist);
10483233502eSmrg	mbconv->convlist = NULL;
10493233502eSmrg
10501ab64890Smrg	Xfree(mbconv);
10511ab64890Smrg	codeset->mbconv = NULL;
10521ab64890Smrg    }
10531ab64890Smrg    if (codeset->ctconv) {
10541ab64890Smrg	ctconv = codeset->ctconv;
10551ab64890Smrg	/*  ...  */
10563233502eSmrg	Xfree(ctconv->convlist);
10573233502eSmrg	ctconv->convlist = NULL;
10583233502eSmrg
10591ab64890Smrg	Xfree(ctconv);
10601ab64890Smrg	codeset->ctconv = NULL;
10611ab64890Smrg    }
10621ab64890Smrg}
10631ab64890Smrg
106461b2299dSmrgstatic void
10651ab64890SmrgfreeExtdSegment(
10661ab64890Smrg    CodeSet codeset)
10671ab64890Smrg{
10681ab64890Smrg    ExtdSegment ctextseg;
10691ab64890Smrg    if (codeset->ctextseg == NULL) {
10701ab64890Smrg	return;
10711ab64890Smrg    }
10721ab64890Smrg    ctextseg = codeset->ctextseg;
10733233502eSmrg    Xfree(ctextseg->name);
10743233502eSmrg    ctextseg->name = NULL;
10753233502eSmrg
10763233502eSmrg    Xfree(ctextseg->area);
10773233502eSmrg    ctextseg->area = NULL;
10783233502eSmrg
107961b2299dSmrg    Xfree(codeset->ctextseg);
10801ab64890Smrg    codeset->ctextseg = NULL;
10811ab64890Smrg}
10821ab64890Smrg
108361b2299dSmrgstatic void
10841ab64890SmrgfreeParseInfo(
10851ab64890Smrg    CodeSet codeset)
10861ab64890Smrg{
10871ab64890Smrg    ParseInfo parse_info;
10881ab64890Smrg    if (codeset->parse_info == NULL) {
10891ab64890Smrg	return;
10901ab64890Smrg    }
10911ab64890Smrg    parse_info = codeset->parse_info;
10923233502eSmrg
10933233502eSmrg    Xfree(parse_info->encoding);
10943233502eSmrg    parse_info->encoding = NULL;
10953233502eSmrg
109661b2299dSmrg    Xfree(codeset->parse_info);
10971ab64890Smrg    codeset->parse_info = NULL;
10981ab64890Smrg}
10991ab64890Smrg
11001ab64890Smrgstatic void
11011ab64890Smrgdestroy_CodeSetList(
11021ab64890Smrg    XLCdGenericPart *gen)
11031ab64890Smrg{
11041ab64890Smrg    CodeSet *codeset = gen->codeset_list;
11051ab64890Smrg    int i;
11061ab64890Smrg    if (gen->codeset_num == 0) {
11071ab64890Smrg	return;
11081ab64890Smrg    }
11091ab64890Smrg    for (i=0;i<gen->codeset_num;i++) {
11101ab64890Smrg        freeByteM(codeset[i]);
11111ab64890Smrg	freeConversion(codeset[i]);
11121ab64890Smrg	freeExtdSegment(codeset[i]);
11131ab64890Smrg	freeParseInfo(codeset[i]);
11143233502eSmrg
11153233502eSmrg	Xfree(codeset[i]->charset_list);
11163233502eSmrg	codeset[i]->charset_list = NULL;
11173233502eSmrg
11181ab64890Smrg	Xfree(codeset[i]); codeset[i]=NULL;
11191ab64890Smrg    }
11201ab64890Smrg    Xfree(codeset); gen->codeset_list = NULL;
11211ab64890Smrg}
11221ab64890Smrg
11231ab64890Smrgstatic void
11241ab64890Smrgdestroy_SegConv(
11251ab64890Smrg    XLCdGenericPart *gen)
11261ab64890Smrg{
11271ab64890Smrg    SegConv seg = gen->segment_conv;
11281ab64890Smrg    int i;
11293233502eSmrg
11301ab64890Smrg    if (gen->segment_conv_num == 0) {
11311ab64890Smrg	return;
11321ab64890Smrg    }
11331ab64890Smrg    for (i=0;i<gen->segment_conv_num;i++) {
11343233502eSmrg
11351ab64890Smrg	    Xfree(seg[i].source_encoding);
11361ab64890Smrg	    seg[i].source_encoding = NULL;
11373233502eSmrg
113861b2299dSmrg	    Xfree(seg[i].destination_encoding);
11391ab64890Smrg	    seg[i].destination_encoding = NULL;
11403233502eSmrg
11413233502eSmrg	    Xfree(seg[i].conv);
11423233502eSmrg            seg[i].conv = NULL;
11431ab64890Smrg    }
11441ab64890Smrg    Xfree(seg); gen->segment_conv = NULL;
11451ab64890Smrg}
11461ab64890Smrg
11471ab64890Smrgstatic void
11481ab64890Smrgdestroy_gen(
11491ab64890Smrg    XLCd lcd)
11501ab64890Smrg{
11511ab64890Smrg    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
11521ab64890Smrg    destroy_SegConv(gen);
11531ab64890Smrg    destroy_CodeSetList(gen);
11543233502eSmrg
11553233502eSmrg    Xfree(gen->mb_parse_table);
11563233502eSmrg    gen->mb_parse_table = NULL;
11573233502eSmrg
11583233502eSmrg    Xfree(gen->mb_parse_list);
11593233502eSmrg    gen->mb_parse_list = NULL;
11603233502eSmrg
11611ab64890Smrg}
11621ab64890Smrg/* VW/UDC end 95.01.08 */
11631ab64890Smrg
11641ab64890Smrgstatic void
11651ab64890Smrgdestroy(
11661ab64890Smrg    XLCd lcd)
11671ab64890Smrg{
11681ab64890Smrg    XLCdPublicMethods superclass = XLC_PUBLIC_METHODS(lcd)->superclass;
11691ab64890Smrg
11701ab64890Smrg    destroy_gen(lcd); /* ADD 1996.01.08 */
11711ab64890Smrg    if (superclass && superclass->pub.destroy)
11721ab64890Smrg	(*superclass->pub.destroy)(lcd);
11731ab64890Smrg}
1174