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