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