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