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