| File: | src/xlibi18n/lcGeneric.c |
| Location: | line 471, column 9 |
| Description: | Access to field 'side' results in a dereference of a null pointer (loaded from variable 'charsetd') |
| 1 | /* | ||
| 2 | * Copyright 1992, 1993 by TOSHIBA Corp. | ||
| 3 | * | ||
| 4 | * Permission to use, copy, modify, and distribute this software and its | ||
| 5 | * documentation for any purpose and without fee is hereby granted, provided | ||
| 6 | * that the above copyright notice appear in all copies and that both that | ||
| 7 | * copyright notice and this permission notice appear in supporting | ||
| 8 | * documentation, and that the name of TOSHIBA not be used in advertising | ||
| 9 | * or publicity pertaining to distribution of the software without specific, | ||
| 10 | * written prior permission. TOSHIBA make no representations about the | ||
| 11 | * suitability of this software for any purpose. It is provided "as is" | ||
| 12 | * without express or implied warranty. | ||
| 13 | * | ||
| 14 | * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING | ||
| 15 | * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL | ||
| 16 | * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR | ||
| 17 | * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||
| 18 | * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | ||
| 19 | * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||
| 20 | * SOFTWARE. | ||
| 21 | * | ||
| 22 | * Author: Katsuhisa Yano TOSHIBA Corp. | ||
| 23 | * mopi@osa.ilab.toshiba.co.jp | ||
| 24 | */ | ||
| 25 | /* | ||
| 26 | * (c) Copyright 1995 FUJITSU LIMITED | ||
| 27 | * This is source code modified by FUJITSU LIMITED under the Joint | ||
| 28 | * Development Agreement for the CDE/Motif PST. | ||
| 29 | */ | ||
| 30 | |||
| 31 | #ifdef HAVE_CONFIG_H1 | ||
| 32 | #include <config.h> | ||
| 33 | #endif | ||
| 34 | #include <stdio.h> | ||
| 35 | #include "Xlibint.h" | ||
| 36 | #include "XlcGeneric.h" | ||
| 37 | |||
| 38 | static XLCd create (const char *name, XLCdMethods methods); | ||
| 39 | static Boolint initialize (XLCd lcd); | ||
| 40 | static void destroy (XLCd lcd); | ||
| 41 | |||
| 42 | static XLCdPublicMethodsRec genericMethods = { | ||
| 43 | { NULL((void*)0) }, /* use default methods */ | ||
| 44 | { | ||
| 45 | NULL((void*)0), | ||
| 46 | create, | ||
| 47 | initialize, | ||
| 48 | destroy, | ||
| 49 | NULL((void*)0) | ||
| 50 | } | ||
| 51 | }; | ||
| 52 | |||
| 53 | XLCdMethods _XlcGenericMethods = (XLCdMethods) &genericMethods; | ||
| 54 | |||
| 55 | static XLCd | ||
| 56 | create( | ||
| 57 | const char *name, | ||
| 58 | XLCdMethods methods) | ||
| 59 | { | ||
| 60 | XLCd lcd; | ||
| 61 | XLCdPublicMethods new; | ||
| 62 | |||
| 63 | lcd = Xcalloc(1, sizeof(XLCdRec))calloc(((1) == 0 ? 1 : (1)), (sizeof(XLCdRec))); | ||
| 64 | if (lcd == NULL((void*)0)) | ||
| 65 | return (XLCd) NULL((void*)0); | ||
| 66 | |||
| 67 | lcd->core = Xcalloc(1, sizeof(XLCdGenericRec))calloc(((1) == 0 ? 1 : (1)), (sizeof(XLCdGenericRec))); | ||
| 68 | if (lcd->core == NULL((void*)0)) | ||
| 69 | goto err; | ||
| 70 | |||
| 71 | new = (XLCdPublicMethods) Xmalloc(sizeof(XLCdPublicMethodsRec))malloc(((sizeof(XLCdPublicMethodsRec)) == 0 ? 1 : (sizeof(XLCdPublicMethodsRec )))); | ||
| 72 | if (new == NULL((void*)0)) | ||
| 73 | goto err; | ||
| 74 | memcpy(new,methods,sizeof(XLCdPublicMethodsRec)); | ||
| 75 | lcd->methods = (XLCdMethods) new; | ||
| 76 | |||
| 77 | return lcd; | ||
| 78 | |||
| 79 | err: | ||
| 80 | Xfree(lcd)free((lcd)); | ||
| 81 | return (XLCd) NULL((void*)0); | ||
| 82 | } | ||
| 83 | |||
| 84 | static Boolint | ||
| 85 | string_to_encoding( | ||
| 86 | const char *str, | ||
| 87 | char *encoding) | ||
| 88 | { | ||
| 89 | char *next; | ||
| 90 | long value; | ||
| 91 | int base; | ||
| 92 | |||
| 93 | while (*str) { | ||
| 94 | if (*str == '\\') { | ||
| 95 | switch (*(str + 1)) { | ||
| 96 | case 'x': | ||
| 97 | case 'X': | ||
| 98 | base = 16; | ||
| 99 | break; | ||
| 100 | default: | ||
| 101 | base = 8; | ||
| 102 | break; | ||
| 103 | } | ||
| 104 | value = strtol(str + 2, &next, base); | ||
| 105 | if (str + 2 != next) { | ||
| 106 | *((unsigned char *) encoding++) = (unsigned char) value; | ||
| 107 | str = next; | ||
| 108 | continue; | ||
| 109 | } | ||
| 110 | } | ||
| 111 | *encoding++ = *str++; | ||
| 112 | } | ||
| 113 | |||
| 114 | *encoding = '\0'; | ||
| 115 | |||
| 116 | return True1; | ||
| 117 | } | ||
| 118 | |||
| 119 | static Boolint | ||
| 120 | string_to_ulong( | ||
| 121 | const char *str, | ||
| 122 | unsigned long *value) | ||
| 123 | { | ||
| 124 | const char *tmp1 = str; | ||
| 125 | int base; | ||
| 126 | |||
| 127 | if (*tmp1++ != '\\') { | ||
| 128 | tmp1--; | ||
| 129 | base = 10; | ||
| 130 | } else { | ||
| 131 | switch (*tmp1++) { | ||
| 132 | case 'x': | ||
| 133 | base = 16; | ||
| 134 | break; | ||
| 135 | case 'o': | ||
| 136 | base = 8; | ||
| 137 | break; | ||
| 138 | case 'd': | ||
| 139 | base = 10; | ||
| 140 | break; | ||
| 141 | default: | ||
| 142 | return(False0); | ||
| 143 | } | ||
| 144 | } | ||
| 145 | *value = (unsigned long) strtol(tmp1, NULL((void*)0), base); | ||
| 146 | return(True1); | ||
| 147 | } | ||
| 148 | |||
| 149 | |||
| 150 | static Boolint | ||
| 151 | add_charset( | ||
| 152 | CodeSet codeset, | ||
| 153 | XlcCharSet charset) | ||
| 154 | { | ||
| 155 | XlcCharSet *new_list; | ||
| 156 | int num; | ||
| 157 | |||
| 158 | if ((num = codeset->num_charsets)) | ||
| 159 | new_list = (XlcCharSet *) Xrealloc(codeset->charset_list,realloc((codeset->charset_list), (((num + 1) * sizeof(XlcCharSet )) == 0 ? 1 : ((num + 1) * sizeof(XlcCharSet)))) | ||
| 160 | (num + 1) * sizeof(XlcCharSet))realloc((codeset->charset_list), (((num + 1) * sizeof(XlcCharSet )) == 0 ? 1 : ((num + 1) * sizeof(XlcCharSet)))); | ||
| 161 | else | ||
| 162 | new_list = (XlcCharSet *) Xmalloc(sizeof(XlcCharSet))malloc(((sizeof(XlcCharSet)) == 0 ? 1 : (sizeof(XlcCharSet))) ); | ||
| 163 | |||
| 164 | if (new_list == NULL((void*)0)) | ||
| 165 | return False0; | ||
| 166 | |||
| 167 | new_list[num] = charset; | ||
| 168 | codeset->charset_list = new_list; | ||
| 169 | codeset->num_charsets = num + 1; | ||
| 170 | |||
| 171 | return True1; | ||
| 172 | } | ||
| 173 | |||
| 174 | static CodeSet | ||
| 175 | add_codeset( | ||
| 176 | XLCdGenericPart *gen) | ||
| 177 | { | ||
| 178 | CodeSet new, *new_list; | ||
| 179 | int num; | ||
| 180 | |||
| 181 | new = Xcalloc(1, sizeof(CodeSetRec))calloc(((1) == 0 ? 1 : (1)), (sizeof(CodeSetRec))); | ||
| 182 | if (new == NULL((void*)0)) | ||
| 183 | return NULL((void*)0); | ||
| 184 | |||
| 185 | if ((num = gen->codeset_num)) | ||
| 186 | new_list = (CodeSet *) Xrealloc(gen->codeset_list,realloc((gen->codeset_list), (((num + 1) * sizeof(CodeSet) ) == 0 ? 1 : ((num + 1) * sizeof(CodeSet)))) | ||
| 187 | (num + 1) * sizeof(CodeSet))realloc((gen->codeset_list), (((num + 1) * sizeof(CodeSet) ) == 0 ? 1 : ((num + 1) * sizeof(CodeSet)))); | ||
| 188 | else | ||
| 189 | new_list = (CodeSet *) Xmalloc(sizeof(CodeSet))malloc(((sizeof(CodeSet)) == 0 ? 1 : (sizeof(CodeSet)))); | ||
| 190 | |||
| 191 | if (new_list == NULL((void*)0)) | ||
| 192 | goto err; | ||
| 193 | |||
| 194 | new_list[num] = new; | ||
| 195 | gen->codeset_list = new_list; | ||
| 196 | gen->codeset_num = num + 1; | ||
| 197 | |||
| 198 | return new; | ||
| 199 | |||
| 200 | err: | ||
| 201 | Xfree(new)free((new)); | ||
| 202 | |||
| 203 | return NULL((void*)0); | ||
| 204 | } | ||
| 205 | |||
| 206 | static Boolint | ||
| 207 | add_parse_list( | ||
| 208 | XLCdGenericPart *gen, | ||
| 209 | EncodingType type, | ||
| 210 | const char *encoding, | ||
| 211 | CodeSet codeset) | ||
| 212 | { | ||
| 213 | ParseInfo new, *new_list; | ||
| 214 | char *str; | ||
| 215 | unsigned char ch; | ||
| 216 | int num; | ||
| 217 | |||
| 218 | str = strdup(encoding); | ||
| 219 | if (str == NULL((void*)0)) | ||
| 220 | return False0; | ||
| 221 | |||
| 222 | new = Xcalloc(1, sizeof(ParseInfoRec))calloc(((1) == 0 ? 1 : (1)), (sizeof(ParseInfoRec))); | ||
| 223 | if (new == NULL((void*)0)) | ||
| 224 | goto err; | ||
| 225 | |||
| 226 | if (gen->mb_parse_table == NULL((void*)0)) { | ||
| 227 | gen->mb_parse_table = Xcalloc(1, 256)calloc(((1) == 0 ? 1 : (1)), (256)); /* 2^8 */ | ||
| 228 | if (gen->mb_parse_table == NULL((void*)0)) | ||
| 229 | goto err; | ||
| 230 | } | ||
| 231 | |||
| 232 | if ((num = gen->mb_parse_list_num)) | ||
| 233 | new_list = (ParseInfo *) Xrealloc(gen->mb_parse_list,realloc((gen->mb_parse_list), (((num + 2) * sizeof(ParseInfo )) == 0 ? 1 : ((num + 2) * sizeof(ParseInfo)))) | ||
| 234 | (num + 2) * sizeof(ParseInfo))realloc((gen->mb_parse_list), (((num + 2) * sizeof(ParseInfo )) == 0 ? 1 : ((num + 2) * sizeof(ParseInfo)))); | ||
| 235 | else { | ||
| 236 | new_list = (ParseInfo *) Xmalloc(2 * sizeof(ParseInfo))malloc(((2 * sizeof(ParseInfo)) == 0 ? 1 : (2 * sizeof(ParseInfo )))); | ||
| 237 | } | ||
| 238 | |||
| 239 | if (new_list == NULL((void*)0)) | ||
| 240 | goto err; | ||
| 241 | |||
| 242 | new_list[num] = new; | ||
| 243 | new_list[num + 1] = NULL((void*)0); | ||
| 244 | gen->mb_parse_list = new_list; | ||
| 245 | gen->mb_parse_list_num = num + 1; | ||
| 246 | |||
| 247 | ch = (unsigned char) *str; | ||
| 248 | if (gen->mb_parse_table[ch] == 0) | ||
| 249 | gen->mb_parse_table[ch] = num + 1; | ||
| 250 | |||
| 251 | new->type = type; | ||
| 252 | new->encoding = str; | ||
| 253 | new->codeset = codeset; | ||
| 254 | |||
| 255 | if (codeset->parse_info == NULL((void*)0)) | ||
| 256 | codeset->parse_info = new; | ||
| 257 | |||
| 258 | return True1; | ||
| 259 | |||
| 260 | err: | ||
| 261 | Xfree(str)free((str)); | ||
| 262 | if (new) | ||
| 263 | Xfree(new)free((new)); | ||
| 264 | |||
| 265 | return False0; | ||
| 266 | } | ||
| 267 | |||
| 268 | static void | ||
| 269 | free_charset( | ||
| 270 | XLCd lcd) | ||
| 271 | { | ||
| 272 | XLCdGenericPart *gen = XLC_GENERIC_PART(lcd)(&(((XLCdGeneric) lcd->core)->gen)); | ||
| 273 | ParseInfo *parse_info; | ||
| 274 | int num; | ||
| 275 | |||
| 276 | if (gen->mb_parse_table) | ||
| 277 | Xfree(gen->mb_parse_table)free((gen->mb_parse_table)); | ||
| 278 | if ((num = gen->mb_parse_list_num) > 0) { | ||
| 279 | for (parse_info = gen->mb_parse_list; num-- > 0; parse_info++) { | ||
| 280 | if ((*parse_info)->encoding) | ||
| 281 | Xfree((*parse_info)->encoding)free(((*parse_info)->encoding)); | ||
| 282 | Xfree(*parse_info)free((*parse_info)); | ||
| 283 | } | ||
| 284 | Xfree(gen->mb_parse_list)free((gen->mb_parse_list)); | ||
| 285 | } | ||
| 286 | |||
| 287 | if ((num = gen->codeset_num) > 0) | ||
| 288 | Xfree(gen->codeset_list)free((gen->codeset_list)); | ||
| 289 | } | ||
| 290 | |||
| 291 | /* For VW/UDC */ | ||
| 292 | |||
| 293 | #define FORWARD(unsigned long)'+' (unsigned long)'+' | ||
| 294 | #define BACKWARD(unsigned long)'-' (unsigned long)'-' | ||
| 295 | |||
| 296 | static const char * | ||
| 297 | getscope( | ||
| 298 | const char *str, | ||
| 299 | FontScope scp) | ||
| 300 | { | ||
| 301 | unsigned long start = 0; | ||
| 302 | unsigned long end = 0; | ||
| 303 | unsigned long dest = 0; | ||
| 304 | unsigned long shift = 0; | ||
| 305 | unsigned long direction = 0; | ||
| 306 | sscanf(str,"[\\x%lx,\\x%lx]->\\x%lx", &start, &end, &dest); | ||
| 307 | if (dest) { | ||
| 308 | if (dest >= start) { | ||
| 309 | shift = dest - start; | ||
| 310 | direction = FORWARD(unsigned long)'+' ; | ||
| 311 | } else { | ||
| 312 | shift = start - dest; | ||
| 313 | direction = BACKWARD(unsigned long)'-'; | ||
| 314 | } | ||
| 315 | } | ||
| 316 | scp->start = start ; | ||
| 317 | scp->end = end ; | ||
| 318 | scp->shift = shift ; | ||
| 319 | scp->shift_direction | ||
| 320 | = direction ; | ||
| 321 | /* .......... */ | ||
| 322 | while (*str) { | ||
| 323 | if (*str == ',' && *(str+1) == '[') | ||
| 324 | break; | ||
| 325 | str++; | ||
| 326 | } | ||
| 327 | return str+1; | ||
| 328 | } | ||
| 329 | |||
| 330 | static int | ||
| 331 | count_scopemap( | ||
| 332 | const char *str) | ||
| 333 | { | ||
| 334 | const char *ptr; | ||
| 335 | int num=0; | ||
| 336 | for (ptr=str; *ptr; ptr++) { | ||
| 337 | if (*ptr == ']') { | ||
| 338 | num++; | ||
| 339 | } | ||
| 340 | } | ||
| 341 | return num; | ||
| 342 | } | ||
| 343 | |||
| 344 | FontScope | ||
| 345 | _XlcParse_scopemaps( | ||
| 346 | const char *str, | ||
| 347 | int *size) | ||
| 348 | { | ||
| 349 | int num=0,i; | ||
| 350 | FontScope scope,sc_ptr; | ||
| 351 | const char *str_sc; | ||
| 352 | |||
| 353 | num = count_scopemap(str); | ||
| 354 | scope = (FontScope) Xmalloc(num * sizeof(FontScopeRec))malloc(((num * sizeof(FontScopeRec)) == 0 ? 1 : (num * sizeof (FontScopeRec)))); | ||
| 355 | if (scope == NULL((void*)0)) | ||
| 356 | return NULL((void*)0); | ||
| 357 | |||
| 358 | for (i=0, str_sc=str, sc_ptr=scope; i < num; i++, sc_ptr++) { | ||
| 359 | str_sc = getscope(str_sc, sc_ptr); | ||
| 360 | } | ||
| 361 | *size = num; | ||
| 362 | return scope; | ||
| 363 | } | ||
| 364 | |||
| 365 | void | ||
| 366 | _XlcDbg_printValue( | ||
| 367 | const char *str, | ||
| 368 | char **value, | ||
| 369 | int num) | ||
| 370 | { | ||
| 371 | /* | ||
| 372 | int i; | ||
| 373 | for (i = 0; i < num; i++) | ||
| 374 | fprintf(stderr, "%s value[%d] = %s\n", str, i, value[i]); | ||
| 375 | */ | ||
| 376 | } | ||
| 377 | |||
| 378 | static void | ||
| 379 | dmpscope( | ||
| 380 | const char* name, | ||
| 381 | FontScope sc, | ||
| 382 | int num) | ||
| 383 | { | ||
| 384 | /* | ||
| 385 | int i; | ||
| 386 | fprintf(stderr, "dmpscope %s\n", name); | ||
| 387 | for (i=0; i<num; i++) | ||
| 388 | fprintf(stderr,"%x %x %x %x \n", | ||
| 389 | sc[i].start, | ||
| 390 | sc[i].end, | ||
| 391 | sc[i].shift, | ||
| 392 | sc[i].shift_direction); | ||
| 393 | fprintf(stderr, "dmpscope end\n"); | ||
| 394 | */ | ||
| 395 | } | ||
| 396 | |||
| 397 | static XlcCharSet | ||
| 398 | srch_charset_define( | ||
| 399 | const char *name, | ||
| 400 | int *new) | ||
| 401 | { | ||
| 402 | XlcCharSet charset; | ||
| 403 | |||
| 404 | *new = 0; | ||
| 405 | charset = _XlcGetCharSet(name); | ||
| 406 | if (charset == NULL((void*)0) && | ||
| 407 | (charset = _XlcCreateDefaultCharSet(name, ""))) { | ||
| 408 | _XlcAddCharSet(charset); | ||
| 409 | *new = 1; | ||
| 410 | charset->source = CSsrcXLC; | ||
| 411 | } | ||
| 412 | return charset; | ||
| 413 | } | ||
| 414 | |||
| 415 | static void | ||
| 416 | read_charset_define( | ||
| 417 | XLCd lcd, | ||
| 418 | XLCdGenericPart *gen) | ||
| 419 | { | ||
| 420 | int i; | ||
| 421 | char csd[16], cset_name[256]; | ||
| 422 | char name[BUFSIZ8192]; | ||
| 423 | XlcCharSet charsetd; | ||
| 424 | char **value; | ||
| 425 | int num, new = 0; | ||
| 426 | XlcSide side = XlcUnknown; | ||
| 427 | char *tmp; | ||
| 428 | |||
| 429 | for (i=0; ; i++) { /* loop start */ | ||
| |||
| |||
| 430 | charsetd = 0; | ||
| 431 | sprintf(csd, "csd%d", i); | ||
| 432 | |||
| 433 | /* charset_name */ | ||
| 434 | sprintf(name, "%s.%s", csd, "charset_name"); | ||
| 435 | _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num); | ||
| 436 | _XlcDbg_printValue(name,value,num); | ||
| 437 | if (num > 0) { | ||
| |||
| |||
| |||
| |||
| 438 | /* hackers will get truncated -- C'est la vie */ | ||
| 439 | strncpy(cset_name,value[0], sizeof cset_name - 1); | ||
| 440 | cset_name[(sizeof cset_name) - 1] = '\0'; | ||
| 441 | sprintf(name, "%s.%s", csd , "side"); | ||
| 442 | _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num); | ||
| 443 | if (num > 0) { | ||
| |||
| |||
| 444 | _XlcDbg_printValue(name,value,num); | ||
| 445 | if (!_XlcNCompareISOLatin1(value[0], "none", 4)) { | ||
| 446 | side = XlcGLGR; | ||
| 447 | } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) { | ||
| 448 | side = XlcGL; | ||
| 449 | strcat(cset_name,":GL"); | ||
| 450 | } else { | ||
| 451 | side = XlcGR; | ||
| 452 | strcat(cset_name,":GR"); | ||
| 453 | } | ||
| 454 | if (charsetd == NULL((void*)0) && | ||
| 455 | (charsetd = srch_charset_define(cset_name,&new)) == NULL((void*)0)) | ||
| 456 | return; | ||
| 457 | } | ||
| 458 | } else { | ||
| 459 | if (i == 0) | ||
| |||
| 460 | continue; | ||
| |||
| 461 | else | ||
| 462 | break; | ||
| 463 | } | ||
| 464 | if (new) { | ||
| |||
| 465 | tmp = strdup(cset_name); | ||
| 466 | if (tmp == NULL((void*)0)) | ||
| 467 | return; | ||
| 468 | charsetd->name = tmp; | ||
| 469 | } | ||
| 470 | /* side */ | ||
| 471 | charsetd->side = side ; | ||
| |||
| 472 | /* length */ | ||
| 473 | sprintf(name, "%s.%s", csd, "length"); | ||
| 474 | _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num); | ||
| 475 | if (num > 0) { | ||
| 476 | _XlcDbg_printValue(name,value,num); | ||
| 477 | charsetd->char_size = atoi(value[0]); | ||
| 478 | } | ||
| 479 | /* gc_number */ | ||
| 480 | sprintf(name, "%s.%s", csd, "gc_number"); | ||
| 481 | _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num); | ||
| 482 | if (num > 0) { | ||
| 483 | _XlcDbg_printValue(name,value,num); | ||
| 484 | charsetd->set_size = atoi(value[0]); | ||
| 485 | } | ||
| 486 | /* string_encoding */ | ||
| 487 | sprintf(name, "%s.%s", csd, "string_encoding"); | ||
| 488 | _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num); | ||
| 489 | if (num > 0) { | ||
| 490 | _XlcDbg_printValue(name,value,num); | ||
| 491 | if (!strcmp("False",value[0])) { | ||
| 492 | charsetd->string_encoding = False0; | ||
| 493 | } else { | ||
| 494 | charsetd->string_encoding = True1; | ||
| 495 | } | ||
| 496 | } | ||
| 497 | /* sequence */ | ||
| 498 | sprintf(name, "%s.%s", csd, "sequence"); | ||
| 499 | _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num); | ||
| 500 | if (num > 0) { | ||
| 501 | _XlcDbg_printValue(name,value,num); | ||
| 502 | /* | ||
| 503 | if (charsetd->ct_sequence) { | ||
| 504 | Xfree(charsetd->ct_sequence); | ||
| 505 | } | ||
| 506 | */ | ||
| 507 | tmp = (char *)Xmalloc(strlen(value[0])+1)malloc(((strlen(value[0])+1) == 0 ? 1 : (strlen(value[0])+1)) ); | ||
| 508 | if (tmp == NULL((void*)0)) | ||
| 509 | return; | ||
| 510 | charsetd->ct_sequence = tmp; | ||
| 511 | string_to_encoding(value[0],tmp); | ||
| 512 | } | ||
| 513 | /* encoding_name */ | ||
| 514 | sprintf(name, "%s.%s", csd, "encoding_name"); | ||
| 515 | _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num); | ||
| 516 | if (num > 0) { | ||
| 517 | _XlcDbg_printValue(name,value,num); | ||
| 518 | /* | ||
| 519 | if (charsetd->encoding_name) { | ||
| 520 | Xfree(charsetd->encoding_name); | ||
| 521 | } | ||
| 522 | */ | ||
| 523 | tmp = strdup(value[0]); | ||
| 524 | charsetd->encoding_name = tmp; | ||
| 525 | charsetd->xrm_encoding_name = XrmStringToQuark(tmp); | ||
| 526 | } | ||
| 527 | _XlcAddCT(charsetd->name, charsetd->ct_sequence); | ||
| 528 | } | ||
| 529 | } | ||
| 530 | |||
| 531 | static SegConv | ||
| 532 | add_conversion( | ||
| 533 | XLCdGenericPart *gen) | ||
| 534 | { | ||
| 535 | SegConv new_list; | ||
| 536 | int num; | ||
| 537 | |||
| 538 | if ((num = gen->segment_conv_num) > 0) { | ||
| 539 | new_list = (SegConv) Xrealloc(gen->segment_conv,realloc((gen->segment_conv), (((num + 1) * sizeof(SegConvRec )) == 0 ? 1 : ((num + 1) * sizeof(SegConvRec)))) | ||
| 540 | (num + 1) * sizeof(SegConvRec))realloc((gen->segment_conv), (((num + 1) * sizeof(SegConvRec )) == 0 ? 1 : ((num + 1) * sizeof(SegConvRec)))); | ||
| 541 | } else { | ||
| 542 | new_list = (SegConv) Xmalloc(sizeof(SegConvRec))malloc(((sizeof(SegConvRec)) == 0 ? 1 : (sizeof(SegConvRec))) ); | ||
| 543 | } | ||
| 544 | |||
| 545 | if (new_list == NULL((void*)0)) | ||
| 546 | return NULL((void*)0); | ||
| 547 | |||
| 548 | gen->segment_conv = new_list; | ||
| 549 | gen->segment_conv_num = num + 1; | ||
| 550 | |||
| 551 | return &new_list[num]; | ||
| 552 | |||
| 553 | } | ||
| 554 | |||
| 555 | static void | ||
| 556 | read_segmentconversion( | ||
| 557 | XLCd lcd, | ||
| 558 | XLCdGenericPart *gen) | ||
| 559 | { | ||
| 560 | int i; | ||
| 561 | char conv[16]; | ||
| 562 | char name[BUFSIZ8192]; | ||
| 563 | char **value; | ||
| 564 | int num,new; | ||
| 565 | SegConv conversion; | ||
| 566 | for (i=0 ; ; i++) { /* loop start */ | ||
| 567 | conversion = 0; | ||
| 568 | sprintf(conv, "conv%d", i); | ||
| 569 | |||
| 570 | /* length */ | ||
| 571 | sprintf(name, "%s.%s", conv, "length"); | ||
| 572 | _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num); | ||
| 573 | if (num > 0) { | ||
| 574 | if (conversion == NULL((void*)0) && | ||
| 575 | (conversion = add_conversion(gen)) == NULL((void*)0)) { | ||
| 576 | return; | ||
| 577 | } | ||
| 578 | _XlcDbg_printValue(name,value,num); | ||
| 579 | } else { | ||
| 580 | if (i == 0) | ||
| 581 | continue; | ||
| 582 | else | ||
| 583 | break; | ||
| 584 | } | ||
| 585 | conversion->length = atoi(value[0]); | ||
| 586 | |||
| 587 | /* source_encoding */ | ||
| 588 | sprintf(name, "%s.%s", conv, "source_encoding"); | ||
| 589 | _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num); | ||
| 590 | if (num > 0) { | ||
| 591 | char *tmp; | ||
| 592 | _XlcDbg_printValue(name,value,num); | ||
| 593 | tmp = strdup(value[0]); | ||
| 594 | if (tmp == NULL((void*)0)) | ||
| 595 | return; | ||
| 596 | conversion->source_encoding = tmp; | ||
| 597 | conversion->source = srch_charset_define(tmp,&new); | ||
| 598 | } | ||
| 599 | /* destination_encoding */ | ||
| 600 | sprintf(name, "%s.%s", conv, "destination_encoding"); | ||
| 601 | _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num); | ||
| 602 | if (num > 0) { | ||
| 603 | char *tmp; | ||
| 604 | _XlcDbg_printValue(name,value,num); | ||
| 605 | tmp = strdup(value[0]); | ||
| 606 | if (tmp == NULL((void*)0)) | ||
| 607 | return; | ||
| 608 | conversion->destination_encoding = tmp; | ||
| 609 | conversion->dest = srch_charset_define(tmp,&new); | ||
| 610 | } | ||
| 611 | /* range */ | ||
| 612 | sprintf(name, "%s.%s", conv, "range"); | ||
| 613 | _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num); | ||
| 614 | if (num > 0) { | ||
| 615 | _XlcDbg_printValue(name,value,num); | ||
| 616 | sscanf(value[0],"\\x%lx,\\x%lx", | ||
| 617 | &(conversion->range.start), &(conversion->range.end)); | ||
| 618 | } | ||
| 619 | /* conversion */ | ||
| 620 | sprintf(name, "%s.%s", conv, "conversion"); | ||
| 621 | _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num); | ||
| 622 | if (num > 0) { | ||
| 623 | _XlcDbg_printValue(name,value,num); | ||
| 624 | conversion->conv = | ||
| 625 | _XlcParse_scopemaps(value[0],&conversion->conv_num); | ||
| 626 | } | ||
| 627 | } /* loop end */ | ||
| 628 | } | ||
| 629 | |||
| 630 | static ExtdSegment | ||
| 631 | create_ctextseg( | ||
| 632 | char **value, | ||
| 633 | int num) | ||
| 634 | { | ||
| 635 | ExtdSegment ret; | ||
| 636 | char* ptr; | ||
| 637 | char* cset_name = NULL((void*)0); | ||
| 638 | int i,new; | ||
| 639 | FontScope scope; | ||
| 640 | ret = (ExtdSegment)Xmalloc(sizeof(ExtdSegmentRec))malloc(((sizeof(ExtdSegmentRec)) == 0 ? 1 : (sizeof(ExtdSegmentRec )))); | ||
| 641 | if (ret == NULL((void*)0)) | ||
| 642 | return NULL((void*)0); | ||
| 643 | ret->name = strdup(value[0]); | ||
| 644 | if (ret->name == NULL((void*)0)) { | ||
| 645 | Xfree (ret)free((ret)); | ||
| 646 | return NULL((void*)0); | ||
| 647 | } | ||
| 648 | cset_name = (char*) Xmalloc (strlen(ret->name) + 1)malloc(((strlen(ret->name) + 1) == 0 ? 1 : (strlen(ret-> name) + 1))); | ||
| 649 | if (cset_name == NULL((void*)0)) { | ||
| 650 | Xfree (ret->name)free((ret->name)); | ||
| 651 | Xfree (ret)free((ret)); | ||
| 652 | return NULL((void*)0); | ||
| 653 | } | ||
| 654 | if (strchr(value[0],':')) { | ||
| 655 | ptr = strchr(ret->name,':'); | ||
| 656 | *ptr = '\0'; | ||
| 657 | ptr++; | ||
| 658 | if (!_XlcNCompareISOLatin1(ptr, "GL", 2)) { | ||
| 659 | ret->side = XlcGL; | ||
| 660 | sprintf(cset_name,"%s:%s",ret->name,"GL"); | ||
| 661 | } else { | ||
| 662 | ret->side = XlcGR; | ||
| 663 | sprintf(cset_name,"%s:%s",ret->name,"GR"); | ||
| 664 | } | ||
| 665 | } else { | ||
| 666 | ret->side = XlcGLGR; | ||
| 667 | strcpy(cset_name,ret->name); | ||
| 668 | } | ||
| 669 | ret->area = (FontScope)Xmalloc((num - 1)*sizeof(FontScopeRec))malloc((((num - 1)*sizeof(FontScopeRec)) == 0 ? 1 : ((num - 1 )*sizeof(FontScopeRec)))); | ||
| 670 | if (ret->area == NULL((void*)0)) { | ||
| 671 | Xfree (cset_name)free((cset_name)); | ||
| 672 | Xfree (ret->name)free((ret->name)); | ||
| 673 | Xfree (ret)free((ret)); | ||
| 674 | return NULL((void*)0); | ||
| 675 | } | ||
| 676 | ret->area_num = num - 1; | ||
| 677 | scope = ret->area ; | ||
| 678 | for (i = 1; i < num; i++) { | ||
| 679 | sscanf(value[i],"\\x%lx,\\x%lx", | ||
| 680 | &scope[i-1].start, &scope[i-1].end); | ||
| 681 | } | ||
| 682 | ret->charset = srch_charset_define(cset_name,&new); | ||
| 683 | Xfree (cset_name)free((cset_name)); | ||
| 684 | |||
| 685 | return ret; | ||
| 686 | } | ||
| 687 | /* For VW/UDC end */ | ||
| 688 | |||
| 689 | static Boolint | ||
| 690 | load_generic( | ||
| 691 | XLCd lcd) | ||
| 692 | { | ||
| 693 | XLCdGenericPart *gen = XLC_GENERIC_PART(lcd)(&(((XLCdGeneric) lcd->core)->gen)); | ||
| 694 | char **value; | ||
| 695 | int num; | ||
| 696 | unsigned long l; | ||
| 697 | int i; | ||
| 698 | int M,ii; | ||
| 699 | XlcCharSet charset; | ||
| 700 | |||
| 701 | gen->codeset_num = 0; | ||
| 702 | |||
| 703 | /***** wc_encoding_mask *****/ | ||
| 704 | _XlcGetResource(lcd, "XLC_XLOCALE", "wc_encoding_mask", &value, &num); | ||
| 705 | if (num > 0) { | ||
| 706 | if (string_to_ulong(value[0], &l) == False0) | ||
| 707 | goto err; | ||
| 708 | gen->wc_encode_mask = l; | ||
| 709 | } | ||
| 710 | /***** wc_shift_bits *****/ | ||
| 711 | _XlcGetResource(lcd, "XLC_XLOCALE", "wc_shift_bits", &value, &num); | ||
| 712 | if (num > 0) | ||
| 713 | gen->wc_shift_bits = atoi(value[0]); | ||
| 714 | if (gen->wc_shift_bits < 1) | ||
| 715 | gen->wc_shift_bits = 8; | ||
| 716 | /***** use_stdc_env *****/ | ||
| 717 | _XlcGetResource(lcd, "XLC_XLOCALE", "use_stdc_env", &value, &num); | ||
| 718 | if (num > 0 && !_XlcCompareISOLatin1(value[0], "True")) | ||
| 719 | gen->use_stdc_env = True1; | ||
| 720 | else | ||
| 721 | gen->use_stdc_env = False0; | ||
| 722 | /***** force_convert_to_mb *****/ | ||
| 723 | _XlcGetResource(lcd, "XLC_XLOCALE", "force_convert_to_mb", &value, &num); | ||
| 724 | if (num > 0 && !_XlcCompareISOLatin1(value[0], "True")) | ||
| 725 | gen->force_convert_to_mb = True1; | ||
| 726 | else | ||
| 727 | gen->force_convert_to_mb = False0; | ||
| 728 | |||
| 729 | for (i = 0; ; i++) { | ||
| 730 | CodeSetRec *codeset = NULL((void*)0); | ||
| 731 | char cs[16]; | ||
| 732 | char name[BUFSIZ8192]; | ||
| 733 | |||
| 734 | sprintf(cs, "cs%d", i); | ||
| 735 | |||
| 736 | /***** codeset.side *****/ | ||
| 737 | sprintf(name, "%s.%s", cs , "side"); | ||
| 738 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 739 | if (num > 0) { | ||
| 740 | char *tmp; | ||
| 741 | |||
| 742 | if (codeset == NULL((void*)0) && (codeset = add_codeset(gen)) == NULL((void*)0)) | ||
| 743 | goto err; | ||
| 744 | |||
| 745 | /* 3.4.1 side */ | ||
| 746 | if (!_XlcNCompareISOLatin1(value[0], "none", 4)) { | ||
| 747 | codeset->side = XlcNONE; | ||
| 748 | } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) { | ||
| 749 | codeset->side = XlcGL; | ||
| 750 | } else { | ||
| 751 | codeset->side = XlcGR; | ||
| 752 | } | ||
| 753 | |||
| 754 | tmp = strrchr(value[0], ':'); | ||
| 755 | if (tmp != NULL((void*)0) && !_XlcCompareISOLatin1(tmp + 1, "Default")) { | ||
| 756 | if (codeset->side == XlcGR) | ||
| 757 | gen->initial_state_GR = codeset; | ||
| 758 | else | ||
| 759 | gen->initial_state_GL = codeset; | ||
| 760 | } | ||
| 761 | } | ||
| 762 | |||
| 763 | /***** codeset.length *****/ | ||
| 764 | sprintf(name, "%s.%s", cs , "length"); | ||
| 765 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 766 | if (num > 0) { | ||
| 767 | if (codeset == NULL((void*)0) && (codeset = add_codeset(gen)) == NULL((void*)0)) | ||
| 768 | goto err; | ||
| 769 | codeset->length = atoi(value[0]); | ||
| 770 | if (codeset->length < 1) | ||
| 771 | codeset->length = 1; | ||
| 772 | } | ||
| 773 | |||
| 774 | /***** codeset.mb_encoding *****/ | ||
| 775 | sprintf(name, "%s.%s", cs, "mb_encoding"); | ||
| 776 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 777 | if (num > 0) { | ||
| 778 | static struct { | ||
| 779 | const char *str; | ||
| 780 | EncodingType type; | ||
| 781 | } shifts[] = { | ||
| 782 | {"<SS>", E_SS}, | ||
| 783 | {"<LSL>", E_LSL}, | ||
| 784 | {"<LSR>", E_LSR}, | ||
| 785 | {0} | ||
| 786 | }; | ||
| 787 | int j; | ||
| 788 | |||
| 789 | if (codeset == NULL((void*)0) && (codeset = add_codeset(gen)) == NULL((void*)0)) | ||
| 790 | goto err; | ||
| 791 | for ( ; num-- > 0; value++) { | ||
| 792 | char encoding[256]; | ||
| 793 | char *tmp = *value; | ||
| 794 | EncodingType type = E_SS; /* for BC */ | ||
| 795 | for (j = 0; shifts[j].str; j++) { | ||
| 796 | if (!_XlcNCompareISOLatin1(tmp, shifts[j].str, | ||
| 797 | strlen(shifts[j].str))) { | ||
| 798 | type = shifts[j].type; | ||
| 799 | tmp += strlen(shifts[j].str); | ||
| 800 | break; | ||
| 801 | } | ||
| 802 | } | ||
| 803 | if (strlen (tmp) > sizeof encoding || | ||
| 804 | string_to_encoding(tmp, encoding) == False0) | ||
| 805 | goto err; | ||
| 806 | add_parse_list(gen, type, encoding, codeset); | ||
| 807 | } | ||
| 808 | } | ||
| 809 | |||
| 810 | /***** codeset.wc_encoding *****/ | ||
| 811 | sprintf(name, "%s.%s", cs, "wc_encoding"); | ||
| 812 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 813 | if (num > 0) { | ||
| 814 | if (codeset == NULL((void*)0) && (codeset = add_codeset(gen)) == NULL((void*)0)) | ||
| 815 | goto err; | ||
| 816 | if (string_to_ulong(value[0], &l) == False0) | ||
| 817 | goto err; | ||
| 818 | codeset->wc_encoding = l; | ||
| 819 | } | ||
| 820 | |||
| 821 | /***** codeset.ct_encoding *****/ | ||
| 822 | sprintf(name, "%s.%s", cs, "ct_encoding"); | ||
| 823 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 824 | if (num > 0) { | ||
| 825 | char *encoding; | ||
| 826 | |||
| 827 | if (codeset == NULL((void*)0) && (codeset = add_codeset(gen)) == NULL((void*)0)) | ||
| 828 | goto err; | ||
| 829 | for ( ; num-- > 0; value++) { | ||
| 830 | if (strlen (*value) > sizeof name) | ||
| 831 | goto err; | ||
| 832 | string_to_encoding(*value, name); | ||
| 833 | charset = NULL((void*)0); | ||
| 834 | if ((encoding = strchr(name, ':')) && | ||
| 835 | (encoding = strchr(encoding + 1, ':'))) { | ||
| 836 | *encoding++ = '\0'; | ||
| 837 | charset = _XlcAddCT(name, encoding); | ||
| 838 | } | ||
| 839 | if (charset == NULL((void*)0)) { | ||
| 840 | charset = _XlcGetCharSet(name); | ||
| 841 | if (charset == NULL((void*)0) && | ||
| 842 | (charset = _XlcCreateDefaultCharSet(name, ""))) { | ||
| 843 | charset->side = codeset->side; | ||
| 844 | charset->char_size = codeset->length; | ||
| 845 | _XlcAddCharSet(charset); | ||
| 846 | } | ||
| 847 | } | ||
| 848 | if (charset) { | ||
| 849 | if (add_charset(codeset, charset) == False0) | ||
| 850 | goto err; | ||
| 851 | } | ||
| 852 | } | ||
| 853 | } | ||
| 854 | |||
| 855 | if (codeset == NULL((void*)0)) | ||
| 856 | break; | ||
| 857 | codeset->cs_num = i; | ||
| 858 | /* For VW/UDC */ | ||
| 859 | /***** 3.4.2 byteM (1 <= M <= length)*****/ | ||
| 860 | for (M=1; M-1 < codeset->length; M++) { | ||
| 861 | unsigned long start,end; | ||
| 862 | ByteInfo tmpb; | ||
| 863 | |||
| 864 | sprintf(name,"%s.%s%d",cs,"byte",M); | ||
| 865 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 866 | |||
| 867 | if (M == 1) { | ||
| 868 | if (num < 1) { | ||
| 869 | codeset->byteM = NULL((void*)0); | ||
| 870 | break ; | ||
| 871 | } | ||
| 872 | codeset->byteM = | ||
| 873 | (ByteInfoListRec *)Xmalloc(malloc((((codeset->length)*sizeof(ByteInfoListRec)) == 0 ? 1 : ((codeset->length)*sizeof(ByteInfoListRec)))) | ||
| 874 | (codeset->length)*sizeof(ByteInfoListRec))malloc((((codeset->length)*sizeof(ByteInfoListRec)) == 0 ? 1 : ((codeset->length)*sizeof(ByteInfoListRec)))); | ||
| 875 | if (codeset->byteM == NULL((void*)0)) { | ||
| 876 | goto err; | ||
| 877 | } | ||
| 878 | } | ||
| 879 | |||
| 880 | if (num > 0) { | ||
| 881 | _XlcDbg_printValue(name,value,num); | ||
| 882 | (codeset->byteM)[M-1].M = M; | ||
| 883 | (codeset->byteM)[M-1].byteinfo_num = num; | ||
| 884 | (codeset->byteM)[M-1].byteinfo = | ||
| 885 | (ByteInfo)Xmalloc( num * sizeof(ByteInfoRec))malloc(((num * sizeof(ByteInfoRec)) == 0 ? 1 : (num * sizeof( ByteInfoRec)))); | ||
| 886 | for (ii = 0 ; ii < num ; ii++) { | ||
| 887 | tmpb = (codeset->byteM)[M-1].byteinfo ; | ||
| 888 | /* default 0x00 - 0xff */ | ||
| 889 | sscanf(value[ii],"\\x%lx,\\x%lx",&start,&end); | ||
| 890 | tmpb[ii].start = (unsigned char)start; | ||
| 891 | tmpb[ii].end = (unsigned char)end; | ||
| 892 | } | ||
| 893 | } | ||
| 894 | /* .... */ | ||
| 895 | } | ||
| 896 | |||
| 897 | |||
| 898 | /***** codeset.mb_conversion *****/ | ||
| 899 | sprintf(name, "%s.%s", cs, "mb_conversion"); | ||
| 900 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 901 | if (num > 0) { | ||
| 902 | _XlcDbg_printValue(name,value,num); | ||
| 903 | codeset->mbconv = Xmalloc(sizeof(ConversionRec))malloc(((sizeof(ConversionRec)) == 0 ? 1 : (sizeof(ConversionRec )))); | ||
| 904 | codeset->mbconv->convlist = | ||
| 905 | _XlcParse_scopemaps(value[0],&(codeset->mbconv->conv_num)); | ||
| 906 | dmpscope("mb_conv",codeset->mbconv->convlist, | ||
| 907 | codeset->mbconv->conv_num); | ||
| 908 | /* [\x%x,\x%x]->\x%x,... */ | ||
| 909 | } | ||
| 910 | /***** codeset.ct_conversion *****/ | ||
| 911 | sprintf(name, "%s.%s", cs, "ct_conversion"); | ||
| 912 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 913 | if (num > 0) { | ||
| 914 | _XlcDbg_printValue(name,value,num); | ||
| 915 | codeset->ctconv = Xmalloc(sizeof(ConversionRec))malloc(((sizeof(ConversionRec)) == 0 ? 1 : (sizeof(ConversionRec )))); | ||
| 916 | codeset->ctconv->convlist = | ||
| 917 | _XlcParse_scopemaps(value[0],&(codeset->ctconv->conv_num)); | ||
| 918 | dmpscope("ctconv",codeset->ctconv->convlist, | ||
| 919 | codeset->ctconv->conv_num); | ||
| 920 | /* [\x%x,\x%x]->\x%x,... */ | ||
| 921 | } | ||
| 922 | /***** codeset.ct_conversion_file *****/ | ||
| 923 | sprintf(name, "%s.%s", cs, "ct_conversion_file"); | ||
| 924 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 925 | if (num > 0) { | ||
| 926 | _XlcDbg_printValue(name,value,num); | ||
| 927 | /* [\x%x,\x%x]->\x%x,... */ | ||
| 928 | } | ||
| 929 | /***** codeset.ct_extended_segment *****/ | ||
| 930 | sprintf(name, "%s.%s", cs, "ct_extended_segment"); | ||
| 931 | _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num); | ||
| 932 | if (num > 0) { | ||
| 933 | _XlcDbg_printValue(name,value,num); | ||
| 934 | codeset->ctextseg = create_ctextseg(value,num); | ||
| 935 | /* [\x%x,\x%x]->\x%x,... */ | ||
| 936 | } | ||
| 937 | /* For VW/UDC end */ | ||
| 938 | |||
| 939 | } | ||
| 940 | |||
| 941 | read_charset_define(lcd,gen); /* For VW/UDC */ | ||
| 942 | read_segmentconversion(lcd,gen); /* For VW/UDC */ | ||
| 943 | |||
| 944 | if (gen->initial_state_GL == NULL((void*)0)) { | ||
| 945 | CodeSetRec *codeset; | ||
| 946 | for (i = 0; i < gen->codeset_num; i++) { | ||
| 947 | codeset = gen->codeset_list[i]; | ||
| 948 | if (codeset->side == XlcGL) | ||
| 949 | gen->initial_state_GL = codeset; | ||
| 950 | } | ||
| 951 | } | ||
| 952 | |||
| 953 | if (gen->initial_state_GR == NULL((void*)0)) { | ||
| 954 | CodeSetRec *codeset; | ||
| 955 | for (i = 0; i < gen->codeset_num; i++) { | ||
| 956 | codeset = gen->codeset_list[i]; | ||
| 957 | if (codeset->side == XlcGR) | ||
| 958 | gen->initial_state_GR = codeset; | ||
| 959 | } | ||
| 960 | } | ||
| 961 | |||
| 962 | for (i = 0; i < gen->codeset_num; i++) { | ||
| 963 | CodeSetRec *codeset = gen->codeset_list[i]; | ||
| 964 | for (ii = 0; ii < codeset->num_charsets; ii++) { | ||
| 965 | charset = codeset->charset_list[ii]; | ||
| 966 | if (! strcmp(charset->encoding_name, "ISO8859-1")) | ||
| 967 | charset->string_encoding = True1; | ||
| 968 | if ( charset->string_encoding ) | ||
| 969 | codeset->string_encoding = True1; | ||
| 970 | } | ||
| 971 | } | ||
| 972 | return True1; | ||
| 973 | |||
| 974 | err: | ||
| 975 | free_charset(lcd); | ||
| 976 | |||
| 977 | return False0; | ||
| 978 | } | ||
| 979 | |||
| 980 | #ifdef USE_DYNAMIC_LC | ||
| 981 | /* override the open_om and open_im methods which were set by | ||
| 982 | super_class's initialize method() */ | ||
| 983 | |||
| 984 | static Boolint | ||
| 985 | initialize_core( | ||
| 986 | XLCd lcd) | ||
| 987 | { | ||
| 988 | _XInitDynamicOM(lcd); | ||
| 989 | |||
| 990 | _XInitDynamicIM(lcd); | ||
| 991 | |||
| 992 | return True1; | ||
| 993 | } | ||
| 994 | #endif | ||
| 995 | |||
| 996 | static Boolint | ||
| 997 | initialize(XLCd lcd) | ||
| 998 | { | ||
| 999 | XLCdPublicMethods superclass = (XLCdPublicMethods) _XlcPublicMethods; | ||
| 1000 | |||
| 1001 | XLC_PUBLIC_METHODS(lcd)(&(((XLCdPublicMethods) lcd->methods)->pub))->superclass = superclass; | ||
| 1002 | |||
| 1003 | if (superclass->pub.initialize) { | ||
| 1004 | if ((*superclass->pub.initialize)(lcd) == False0) | ||
| 1005 | return False0; | ||
| 1006 | } | ||
| 1007 | |||
| 1008 | #ifdef USE_DYNAMIC_LC | ||
| 1009 | if (initialize_core(lcd) == False0) | ||
| 1010 | return False0; | ||
| 1011 | #endif | ||
| 1012 | |||
| 1013 | if (load_generic(lcd) == False0) | ||
| 1014 | return False0; | ||
| 1015 | |||
| 1016 | return True1; | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | /* VW/UDC start 95.01.08 */ | ||
| 1020 | static void | ||
| 1021 | freeByteM( | ||
| 1022 | CodeSet codeset) | ||
| 1023 | { | ||
| 1024 | int i; | ||
| 1025 | ByteInfoList blst; | ||
| 1026 | if (codeset->byteM == NULL((void*)0)) { | ||
| 1027 | return ; | ||
| 1028 | } | ||
| 1029 | blst = codeset->byteM; | ||
| 1030 | for (i = 0; i < codeset->length; i++) { | ||
| 1031 | if (blst[i].byteinfo) { | ||
| 1032 | Xfree(blst[i].byteinfo)free((blst[i].byteinfo)); | ||
| 1033 | blst[i].byteinfo = NULL((void*)0); | ||
| 1034 | } | ||
| 1035 | } | ||
| 1036 | Xfree(codeset->byteM)free((codeset->byteM)); | ||
| 1037 | codeset->byteM = NULL((void*)0); | ||
| 1038 | } | ||
| 1039 | |||
| 1040 | static void | ||
| 1041 | freeConversion( | ||
| 1042 | CodeSet codeset) | ||
| 1043 | { | ||
| 1044 | Conversion mbconv,ctconv; | ||
| 1045 | if (codeset->mbconv) { | ||
| 1046 | mbconv = codeset->mbconv; | ||
| 1047 | /* ... */ | ||
| 1048 | if (mbconv->convlist) { | ||
| 1049 | Xfree(mbconv->convlist)free((mbconv->convlist)); | ||
| 1050 | mbconv->convlist = NULL((void*)0); | ||
| 1051 | } | ||
| 1052 | Xfree(mbconv)free((mbconv)); | ||
| 1053 | codeset->mbconv = NULL((void*)0); | ||
| 1054 | } | ||
| 1055 | if (codeset->ctconv) { | ||
| 1056 | ctconv = codeset->ctconv; | ||
| 1057 | /* ... */ | ||
| 1058 | if (ctconv->convlist) { | ||
| 1059 | Xfree(ctconv->convlist)free((ctconv->convlist)); | ||
| 1060 | ctconv->convlist = NULL((void*)0); | ||
| 1061 | } | ||
| 1062 | Xfree(ctconv)free((ctconv)); | ||
| 1063 | codeset->ctconv = NULL((void*)0); | ||
| 1064 | } | ||
| 1065 | } | ||
| 1066 | |||
| 1067 | static void | ||
| 1068 | freeExtdSegment( | ||
| 1069 | CodeSet codeset) | ||
| 1070 | { | ||
| 1071 | ExtdSegment ctextseg; | ||
| 1072 | if (codeset->ctextseg == NULL((void*)0)) { | ||
| 1073 | return; | ||
| 1074 | } | ||
| 1075 | ctextseg = codeset->ctextseg; | ||
| 1076 | if (ctextseg->name) { | ||
| 1077 | Xfree(ctextseg->name)free((ctextseg->name)); | ||
| 1078 | ctextseg->name = NULL((void*)0); | ||
| 1079 | } | ||
| 1080 | if (ctextseg->area) { | ||
| 1081 | Xfree(ctextseg->area)free((ctextseg->area)); | ||
| 1082 | ctextseg->area = NULL((void*)0); | ||
| 1083 | } | ||
| 1084 | Xfree(codeset->ctextseg)free((codeset->ctextseg)); | ||
| 1085 | codeset->ctextseg = NULL((void*)0); | ||
| 1086 | } | ||
| 1087 | |||
| 1088 | static void | ||
| 1089 | freeParseInfo( | ||
| 1090 | CodeSet codeset) | ||
| 1091 | { | ||
| 1092 | ParseInfo parse_info; | ||
| 1093 | if (codeset->parse_info == NULL((void*)0)) { | ||
| 1094 | return; | ||
| 1095 | } | ||
| 1096 | parse_info = codeset->parse_info; | ||
| 1097 | if (parse_info->encoding) { | ||
| 1098 | Xfree(parse_info->encoding)free((parse_info->encoding)); | ||
| 1099 | parse_info->encoding = NULL((void*)0); | ||
| 1100 | } | ||
| 1101 | Xfree(codeset->parse_info)free((codeset->parse_info)); | ||
| 1102 | codeset->parse_info = NULL((void*)0); | ||
| 1103 | } | ||
| 1104 | |||
| 1105 | static void | ||
| 1106 | destroy_CodeSetList( | ||
| 1107 | XLCdGenericPart *gen) | ||
| 1108 | { | ||
| 1109 | CodeSet *codeset = gen->codeset_list; | ||
| 1110 | int i; | ||
| 1111 | if (gen->codeset_num == 0) { | ||
| 1112 | return; | ||
| 1113 | } | ||
| 1114 | for (i=0;i<gen->codeset_num;i++) { | ||
| 1115 | freeByteM(codeset[i]); | ||
| 1116 | freeConversion(codeset[i]); | ||
| 1117 | freeExtdSegment(codeset[i]); | ||
| 1118 | freeParseInfo(codeset[i]); | ||
| 1119 | if (codeset[i]->charset_list) { | ||
| 1120 | Xfree(codeset[i]->charset_list)free((codeset[i]->charset_list)); | ||
| 1121 | codeset[i]->charset_list = NULL((void*)0); | ||
| 1122 | } | ||
| 1123 | Xfree(codeset[i])free((codeset[i])); codeset[i]=NULL((void*)0); | ||
| 1124 | } | ||
| 1125 | Xfree(codeset)free((codeset)); gen->codeset_list = NULL((void*)0); | ||
| 1126 | } | ||
| 1127 | |||
| 1128 | static void | ||
| 1129 | destroy_SegConv( | ||
| 1130 | XLCdGenericPart *gen) | ||
| 1131 | { | ||
| 1132 | SegConv seg = gen->segment_conv; | ||
| 1133 | int i; | ||
| 1134 | if (gen->segment_conv_num == 0) { | ||
| 1135 | return; | ||
| 1136 | } | ||
| 1137 | for (i=0;i<gen->segment_conv_num;i++) { | ||
| 1138 | if (seg[i].source_encoding) { | ||
| 1139 | Xfree(seg[i].source_encoding)free((seg[i].source_encoding)); | ||
| 1140 | seg[i].source_encoding = NULL((void*)0); | ||
| 1141 | } | ||
| 1142 | if (seg[i].destination_encoding) { | ||
| 1143 | Xfree(seg[i].destination_encoding)free((seg[i].destination_encoding)); | ||
| 1144 | seg[i].destination_encoding = NULL((void*)0); | ||
| 1145 | } | ||
| 1146 | if (seg[i].conv) { | ||
| 1147 | Xfree(seg[i].conv)free((seg[i].conv)); seg[i].conv = NULL((void*)0); | ||
| 1148 | } | ||
| 1149 | } | ||
| 1150 | Xfree(seg)free((seg)); gen->segment_conv = NULL((void*)0); | ||
| 1151 | } | ||
| 1152 | |||
| 1153 | static void | ||
| 1154 | destroy_gen( | ||
| 1155 | XLCd lcd) | ||
| 1156 | { | ||
| 1157 | XLCdGenericPart *gen = XLC_GENERIC_PART(lcd)(&(((XLCdGeneric) lcd->core)->gen)); | ||
| 1158 | destroy_SegConv(gen); | ||
| 1159 | destroy_CodeSetList(gen); | ||
| 1160 | if (gen->mb_parse_table) { | ||
| 1161 | Xfree(gen->mb_parse_table)free((gen->mb_parse_table)); | ||
| 1162 | gen->mb_parse_table = NULL((void*)0); | ||
| 1163 | } | ||
| 1164 | if (gen->mb_parse_list) { | ||
| 1165 | Xfree(gen->mb_parse_list)free((gen->mb_parse_list)); | ||
| 1166 | gen->mb_parse_list = NULL((void*)0); | ||
| 1167 | } | ||
| 1168 | } | ||
| 1169 | /* VW/UDC end 95.01.08 */ | ||
| 1170 | |||
| 1171 | static void | ||
| 1172 | destroy( | ||
| 1173 | XLCd lcd) | ||
| 1174 | { | ||
| 1175 | XLCdPublicMethods superclass = XLC_PUBLIC_METHODS(lcd)(&(((XLCdPublicMethods) lcd->methods)->pub))->superclass; | ||
| 1176 | |||
| 1177 | destroy_gen(lcd); /* ADD 1996.01.08 */ | ||
| 1178 | if (superclass && superclass->pub.destroy) | ||
| 1179 | (*superclass->pub.destroy)(lcd); | ||
| 1180 | } |