Bug Summary

File:modules/om/generic/omGeneric.c
Location:line 1848, column 9
Description:Size argument is greater than the length of the destination buffer

Annotated Source Code

1/* #define FONTDEBUG */
2/*
3 * Copyright 1992, 1993 by TOSHIBA Corp.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation for any purpose and without fee is hereby granted, provided
7 * that the above copyright notice appear in all copies and that both that
8 * copyright notice and this permission notice appear in supporting
9 * documentation, and that the name of TOSHIBA not be used in advertising
10 * or publicity pertaining to distribution of the software without specific,
11 * written prior permission. TOSHIBA make no representations about the
12 * suitability of this software for any purpose. It is provided "as is"
13 * without express or implied warranty.
14 *
15 * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17 * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21 * SOFTWARE.
22 *
23 * Author: Katsuhisa Yano TOSHIBA Corp.
24 * mopi@osa.ilab.toshiba.co.jp
25 */
26/*
27 * Copyright 1995 by FUJITSU LIMITED
28 * This is source code modified by FUJITSU LIMITED under the Joint
29 * Development Agreement for the CDE/Motif PST.
30 *
31 * Modifier: Takanori Tateno FUJITSU LIMITED
32 *
33 */
34
35/*
36 * Fixed the algorithms in parse_fontname() and parse_fontdata()
37 * to improve the logic for determining which font should be
38 * returned for a given CharSet. We even added some comments
39 * so that you can figure out what in the heck we're doing. We
40 * realize this is a departure from the norm, but hey, we're
41 * rebels! :-) :-)
42 *
43 * Modifiers: Jeff Walls, Paul Anderson: HEWLETT-PACKARD
44 */
45/*
46 * Cleaned up mess, removed some blabla
47 * Egbert Eich, SuSE Linux AG
48 */
49
50#ifdef HAVE_CONFIG_H1
51#include <config.h>
52#endif
53#include "Xlibint.h"
54#include "XomGeneric.h"
55#include "XlcGeneric.h"
56#include <X11/Xos.h>
57#include <X11/Xatom.h>
58#include <stdio.h>
59#include <string.h>
60#include <ctype.h>
61
62#define MAXFONTS100 100
63#define PIXEL_SIZE_FIELD7 7
64#define POINT_SIZE_FIELD8 8
65#define CHARSET_ENCODING_FIELD14 14
66#define XLFD_MAX_LEN255 255
67
68/* For VW/UDC start */
69
70static FontData
71init_fontdata(
72 FontData font_data,
73 int font_data_count)
74{
75 FontData fd;
76 int i;
77
78 fd = Xcalloc(font_data_count, sizeof(FontDataRec))calloc(((font_data_count) == 0 ? 1 : (font_data_count)), (sizeof
(FontDataRec)))
;
79 if(fd == (FontData) NULL((void*)0))
80 return False0;
81
82 for(i = 0 ; i < font_data_count ; i++)
83 fd[i] = font_data[i];
84
85 return fd;
86}
87
88static VRotate
89init_vrotate(
90 FontData font_data,
91 int font_data_count,
92 int type,
93 CodeRange code_range,
94 int code_range_num)
95{
96 VRotate vrotate;
97 int i;
98
99 if(type == VROTATE_NONE0)
100 return (VRotate)NULL((void*)0);
101
102 vrotate = Xcalloc(font_data_count, sizeof(VRotateRec))calloc(((font_data_count) == 0 ? 1 : (font_data_count)), (sizeof
(VRotateRec)))
;
103 if(vrotate == (VRotate) NULL((void*)0))
104 return False0;
105
106 for(i = 0 ; i < font_data_count ; i++) {
107 vrotate[i].charset_name = font_data[i].name;
108 vrotate[i].side = font_data[i].side;
109 if(type == VROTATE_PART1) {
110 vrotate[i].num_cr = code_range_num;
111 vrotate[i].code_range = code_range;
112 }
113 }
114
115 return vrotate;
116}
117
118static Boolint
119init_fontset(
120 XOC oc)
121{
122 XOCGenericPart *gen;
123 FontSet font_set;
124 OMData data;
125 int count;
126
127 count = XOM_GENERIC(oc->core.om)(&((XOMGeneric) oc->core.om)->gen)->data_num;
128 data = XOM_GENERIC(oc->core.om)(&((XOMGeneric) oc->core.om)->gen)->data;
129
130 font_set = Xcalloc(count, sizeof(FontSetRec))calloc(((count) == 0 ? 1 : (count)), (sizeof(FontSetRec)));
131 if (font_set == NULL((void*)0))
132 return False0;
133
134 gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
135 gen->font_set_num = count;
136 gen->font_set = font_set;
137
138 for ( ; count-- > 0; data++, font_set++) {
139 font_set->charset_count = data->charset_count;
140 font_set->charset_list = data->charset_list;
141
142 if((font_set->font_data = init_fontdata(data->font_data,
143 data->font_data_count)) == NULL((void*)0))
144 goto err;
145 font_set->font_data_count = data->font_data_count;
146 if((font_set->substitute = init_fontdata(data->substitute,
147 data->substitute_num)) == NULL((void*)0))
148 goto err;
149 font_set->substitute_num = data->substitute_num;
150 if((font_set->vmap = init_fontdata(data->vmap,
151 data->vmap_num)) == NULL((void*)0))
152 goto err;
153 font_set->vmap_num = data->vmap_num;
154
155 if(data->vrotate_type != VROTATE_NONE0) {
156 /* A vrotate member is specified primary font data */
157 /* as initial value. */
158 if((font_set->vrotate = init_vrotate(data->font_data,
159 data->font_data_count,
160 data->vrotate_type,
161 data->vrotate,
162 data->vrotate_num)) == NULL((void*)0))
163 goto err;
164 font_set->vrotate_num = data->font_data_count;
165 }
166 }
167 return True1;
168
169err:
170
171 Xfree(font_set->font_data)free((font_set->font_data));
172 Xfree(font_set->substitute)free((font_set->substitute));
173 Xfree(font_set->vmap)free((font_set->vmap));
174 Xfree(font_set->vrotate)free((font_set->vrotate));
175 Xfree(font_set)free((font_set));
176 gen->font_set = (FontSet) NULL((void*)0);
177 gen->font_set_num = 0;
178 return False0;
179}
180
181/* For VW/UDC end */
182
183static char *
184get_prop_name(
185 Display *dpy,
186 XFontStruct *fs)
187{
188 unsigned long fp;
189
190 if (XGetFontProperty(fs, XA_FONT((Atom) 18), &fp))
191 return XGetAtomName(dpy, fp);
192
193 return (char *) NULL((void*)0);
194}
195
196/* For VW/UDC start */
197
198static Boolint
199load_fontdata(
200 XOC oc,
201 FontData font_data,
202 int font_data_num)
203{
204 Display *dpy = oc->core.om->core.display;
205 FontData fd = font_data;
206
207 if(font_data == NULL((void*)0)) return(True1);
208 for( ; font_data_num-- ; fd++) {
209 if(fd->xlfd_name != (char *) NULL((void*)0) && fd->font == NULL((void*)0)) {
210 fd->font = XLoadQueryFont(dpy, fd->xlfd_name);
211 if (fd->font == NULL((void*)0)){
212 return False0;
213 }
214 }
215 }
216 return True1;
217}
218
219static Boolint
220load_fontset_data(
221 XOC oc,
222 FontSet font_set)
223{
224 Display *dpy = oc->core.om->core.display;
225
226 if(font_set->font_name == (char *)NULL((void*)0)) return False0 ;
227
228 /* If font_set->font is not NULL, it contains the *best*
229 * match font for this FontSet.
230 * -- jjw/pma (HP)
231 */
232 if(font_set->font == NULL((void*)0)) {
233 font_set->font = XLoadQueryFont(dpy, font_set->font_name);
234 if (font_set->font == NULL((void*)0)){
235 return False0;
236 }
237 }
238 return True1;
239}
240
241static Boolint
242load_font(
243 XOC oc)
244{
245 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
246 FontSet font_set = gen->font_set;
247 int num = gen->font_set_num;
248
249 for ( ; num-- > 0; font_set++) {
250 if (font_set->font_name == NULL((void*)0))
251 continue;
252
253 if (load_fontset_data (oc, font_set) != True1)
254 return False0;
255#ifndef TESTVERSION
256 if(load_fontdata(oc, font_set->font_data,
257 font_set->font_data_count) != True1)
258 return False0;
259
260 if(load_fontdata(oc, font_set->substitute,
261 font_set->substitute_num) != True1)
262 return False0;
263#endif
264
265/* Add 1996.05.20 */
266 if( oc->core.orientation == XOMOrientation_TTB_RTL ||
267 oc->core.orientation == XOMOrientation_TTB_LTR ){
268 if (font_set->vpart_initialize == 0) {
269 load_fontdata(oc, font_set->vmap, font_set->vmap_num);
270 load_fontdata(oc, (FontData) font_set->vrotate,
271 font_set->vrotate_num);
272 font_set->vpart_initialize = 1;
273 }
274 }
275
276 if (font_set->font->min_byte1 || font_set->font->max_byte1)
277 font_set->is_xchar2b = True1;
278 else
279 font_set->is_xchar2b = False0;
280 }
281
282 return True1;
283}
284
285/* For VW/UDC end */
286
287static Boolint
288load_font_info(
289 XOC oc)
290{
291 Display *dpy = oc->core.om->core.display;
292 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
293 FontSet font_set = gen->font_set;
294 char **fn_list;
295 int fn_num, num = gen->font_set_num;
296
297 for ( ; num-- > 0; font_set++) {
298 if (font_set->font_name == NULL((void*)0))
299 continue;
300
301 if (font_set->info == NULL((void*)0)) {
302 fn_list = XListFontsWithInfo(dpy, font_set->font_name, 1, &fn_num,
303 &font_set->info);
304 if (font_set->info == NULL((void*)0))
305 return False0;
306
307 XFreeFontNames(fn_list);
308 }
309 }
310
311 return True1;
312}
313
314/* For Vertical Writing start */
315
316static void
317check_fontset_extents(
318 XCharStruct *overall,
319 int *logical_ascent,
320 int *logical_descent,
321 XFontStruct *font)
322{
323 overall->lbearing = min(overall->lbearing, font->min_bounds.lbearing)(((overall->lbearing) < (font->min_bounds.lbearing))
? (overall->lbearing) : (font->min_bounds.lbearing))
;
324 overall->rbearing = max(overall->rbearing, font->max_bounds.rbearing)(((overall->rbearing) > (font->max_bounds.rbearing))
? (overall->rbearing) : (font->max_bounds.rbearing))
;
325 overall->ascent = max(overall->ascent, font->max_bounds.ascent)(((overall->ascent) > (font->max_bounds.ascent)) ? (
overall->ascent) : (font->max_bounds.ascent))
;
326 overall->descent = max(overall->descent, font->max_bounds.descent)(((overall->descent) > (font->max_bounds.descent)) ?
(overall->descent) : (font->max_bounds.descent))
;
327 overall->width = max(overall->width, font->max_bounds.width)(((overall->width) > (font->max_bounds.width)) ? (overall
->width) : (font->max_bounds.width))
;
328 *logical_ascent = max(*logical_ascent, font->ascent)(((*logical_ascent) > (font->ascent)) ? (*logical_ascent
) : (font->ascent))
;
329 *logical_descent = max(*logical_descent, font->descent)(((*logical_descent) > (font->descent)) ? (*logical_descent
) : (font->descent))
;
330}
331
332/* For Vertical Writing end */
333
334static void
335set_fontset_extents(
336 XOC oc)
337{
338 XRectangle *ink = &oc->core.font_set_extents.max_ink_extent;
339 XRectangle *logical = &oc->core.font_set_extents.max_logical_extent;
340 XFontStruct **font_list, *font;
341 XCharStruct overall;
342 int logical_ascent, logical_descent;
343 int num = oc->core.font_info.num_font;
344
345 font_list = oc->core.font_info.font_struct_list;
346 font = *font_list++;
347 overall = font->max_bounds;
348 overall.lbearing = font->min_bounds.lbearing;
349 logical_ascent = font->ascent;
350 logical_descent = font->descent;
351
352 /* For Vertical Writing start */
353
354 while (--num > 0) {
355 font = *font_list++;
356 check_fontset_extents(&overall, &logical_ascent, &logical_descent,
357 font);
358 }
359
360 {
361 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
362 FontSet font_set = gen->font_set;
363 FontData font_data;
364 int font_set_num = gen->font_set_num;
365 int font_data_count;
366
367 for( ; font_set_num-- ; font_set++) {
368 if(font_set->vmap_num > 0) {
369 font_data = font_set->vmap;
370 font_data_count = font_set->vmap_num;
371 for( ; font_data_count-- ; font_data++) {
372 if(font_data->font != NULL((void*)0)) {
373 check_fontset_extents(&overall, &logical_ascent,
374 &logical_descent,
375 font_data->font);
376 }
377 }
378 }
379
380 if(font_set->vrotate_num > 0 && font_set->vrotate != NULL((void*)0)) {
381 font_data = (FontData) font_set->vrotate;
382 font_data_count = font_set->vrotate_num;
383 for( ; font_data_count-- ; font_data++) {
384 if(font_data->font != NULL((void*)0)) {
385 check_fontset_extents(&overall, &logical_ascent,
386 &logical_descent,
387 font_data->font);
388 }
389 }
390 }
391 }
392 }
393
394 /* For Vertical Writing start */
395
396 ink->x = overall.lbearing;
397 ink->y = -(overall.ascent);
398 ink->width = overall.rbearing - overall.lbearing;
399 ink->height = overall.ascent + overall.descent;
400
401 logical->x = 0;
402 logical->y = -(logical_ascent);
403 logical->width = overall.width;
404 logical->height = logical_ascent + logical_descent;
405}
406
407static Boolint
408init_core_part(
409 XOC oc)
410{
411 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
412 FontSet font_set;
413 int font_set_num;
414 XFontStruct **font_struct_list;
415 char **font_name_list, *font_name_buf;
416 int count, length;
417
418 font_set = gen->font_set;
419 font_set_num = gen->font_set_num;
420 count = length = 0;
421
422 for ( ; font_set_num-- > 0; font_set++) {
423 if (font_set->font_name == NULL((void*)0))
424 continue;
425
426 length += strlen(font_set->font_name) + 1;
427
428 count++;
429 }
430 if (count == 0)
431 return False0;
432
433 font_struct_list = Xmalloc(sizeof(XFontStruct *) * count)malloc(((sizeof(XFontStruct *) * count) == 0 ? 1 : (sizeof(XFontStruct
*) * count)))
;
434 if (font_struct_list == NULL((void*)0))
435 return False0;
436
437 font_name_list = Xmalloc(sizeof(char *) * count)malloc(((sizeof(char *) * count) == 0 ? 1 : (sizeof(char *) *
count)))
;
438 if (font_name_list == NULL((void*)0))
439 goto err;
440
441 font_name_buf = Xmalloc(length)malloc(((length) == 0 ? 1 : (length)));
442 if (font_name_buf == NULL((void*)0))
443 goto err;
444
445 oc->core.font_info.num_font = count;
446 oc->core.font_info.font_name_list = font_name_list;
447 oc->core.font_info.font_struct_list = font_struct_list;
448
449 font_set = gen->font_set;
450 font_set_num = gen->font_set_num;
451
452 for (count = 0; font_set_num-- > 0; font_set++) {
453 if (font_set->font_name == NULL((void*)0))
454 continue;
455
456 font_set->id = count;
457 if (font_set->font)
458 *font_struct_list++ = font_set->font;
459 else
460 *font_struct_list++ = font_set->info;
461 strcpy(font_name_buf, font_set->font_name)__builtin___strcpy_chk (font_name_buf, font_set->font_name
, __builtin_object_size (font_name_buf, 2 > 1 ? 1 : 0))
;
462 Xfree(font_set->font_name)free((font_set->font_name));
463 *font_name_list++ = font_set->font_name = font_name_buf;
464 font_name_buf += strlen(font_name_buf) + 1;
465
466 count++;
467 }
468
469 set_fontset_extents(oc);
470
471 return True1;
472
473err:
474
475 Xfree(font_name_list)free((font_name_list));
476 Xfree(font_struct_list)free((font_struct_list));
477
478 return False0;
479}
480
481static char *
482get_font_name(
483 XOC oc,
484 char *pattern)
485{
486 char **list, *name;
487 int count = 0;
488
489 list = XListFonts(oc->core.om->core.display, pattern, 1, &count);
490 if (list == NULL((void*)0))
491 return NULL((void*)0);
492
493 name = strdup(*list);
494
495 XFreeFontNames(list);
496
497 return name;
498}
499
500/* For VW/UDC start*/
501
502static char *
503get_rotate_fontname(
504 char *font_name)
505{
506 char *pattern = NULL((void*)0), *ptr = NULL((void*)0);
507 char *fields[CHARSET_ENCODING_FIELD14];
508 char str_pixel[32], str_point[4];
509 char *rotate_font_ptr = NULL((void*)0);
510 int pixel_size = 0;
511 int field_num = 0, len = 0;
512
513 if(font_name == (char *) NULL((void*)0) || (len = strlen(font_name)) <= 0
514 || len > XLFD_MAX_LEN255)
515 return NULL((void*)0);
516
517 pattern = strdup(font_name);
518 if(!pattern)
519 return NULL((void*)0);
520
521 memset(fields, 0, sizeof(char *) * 14)__builtin___memset_chk (fields, 0, sizeof(char *) * 14, __builtin_object_size
(fields, 0))
;
522 ptr = pattern;
523 while(isspace(*ptr)) {
524 ptr++;
525 }
526 if(*ptr == '-')
527 ptr++;
528
529 for(field_num = 0 ; field_num < CHARSET_ENCODING_FIELD14 && ptr && *ptr ;
530 ptr++, field_num++) {
531 fields[field_num] = ptr;
532
533 if((ptr = strchr(ptr, '-'))) {
534 *ptr = '\0';
535 } else {
536 field_num++; /* Count last field */
537 break;
538 }
539 }
540
541 if(field_num < CHARSET_ENCODING_FIELD14)
542 goto free_pattern;
543
544 /* Pixel Size field : fields[6] */
545 for(ptr = fields[PIXEL_SIZE_FIELD7 - 1] ; ptr && *ptr; ptr++) {
546 if(!isdigit(*ptr)) {
547 if(*ptr == '['){ /* 960730 */
548 strcpy(pattern, font_name)__builtin___strcpy_chk (pattern, font_name, __builtin_object_size
(pattern, 2 > 1 ? 1 : 0))
;
549 return(pattern);
550 }
551 goto free_pattern;
552 }
553 }
554 pixel_size = atoi(fields[PIXEL_SIZE_FIELD7 - 1]);
555 snprintf(str_pixel, sizeof(str_pixel),__builtin___snprintf_chk (str_pixel, sizeof(str_pixel), 0, __builtin_object_size
(str_pixel, 2 > 1 ? 1 : 0), "[ 0 ~%d %d 0 ]", pixel_size,
pixel_size)
556 "[ 0 ~%d %d 0 ]", pixel_size, pixel_size)__builtin___snprintf_chk (str_pixel, sizeof(str_pixel), 0, __builtin_object_size
(str_pixel, 2 > 1 ? 1 : 0), "[ 0 ~%d %d 0 ]", pixel_size,
pixel_size)
;
557 fields[6] = str_pixel;
558
559 /* Point Size field : fields[7] */
560 strcpy(str_point, "*")__builtin___strcpy_chk (str_point, "*", __builtin_object_size
(str_point, 2 > 1 ? 1 : 0))
;
561 fields[POINT_SIZE_FIELD8 - 1] = str_point;
562
563 len = 0;
564 for (field_num = 0; field_num < CHARSET_ENCODING_FIELD14 &&
565 fields[field_num]; field_num++) {
566 len += 1 + strlen(fields[field_num]);
567 }
568
569 /* Max XLFD length is 255 */
570 if (len > XLFD_MAX_LEN255)
571 goto free_pattern;
572
573 rotate_font_ptr = Xmalloc(len + 1)malloc(((len + 1) == 0 ? 1 : (len + 1)));
574 if(!rotate_font_ptr)
575 goto free_pattern;
576
577 rotate_font_ptr[0] = '\0';
578
579 for(field_num = 0 ; field_num < CHARSET_ENCODING_FIELD14 &&
580 fields[field_num] ; field_num++) {
581 strcat(rotate_font_ptr, "-")__builtin___strcat_chk (rotate_font_ptr, "-", __builtin_object_size
(rotate_font_ptr, 2 > 1 ? 1 : 0))
;
582 strcat(rotate_font_ptr, fields[field_num])__builtin___strcat_chk (rotate_font_ptr, fields[field_num], __builtin_object_size
(rotate_font_ptr, 2 > 1 ? 1 : 0))
;
583 }
584
585free_pattern:
586 Xfree(pattern)free((pattern));
587
588 return rotate_font_ptr;
589}
590
591static Boolint
592is_match_charset(
593 FontData font_data,
594 char *font_name)
595{
596 char *last;
597 int length, name_len;
598
599 name_len = strlen(font_name);
600 last = font_name + name_len;
601
602 length = strlen(font_data->name);
603 if (length > name_len)
604 return False0;
605
606 if (_XlcCompareISOLatin1(last - length, font_data->name) == 0)
607 return True1;
608
609 return False0;
610}
611
612static int
613parse_all_name(
614 XOC oc,
615 FontData font_data,
616 char *pattern)
617{
618
619#ifdef OLDCODE
620 if(is_match_charset(font_data, pattern) != True1)
621 return False0;
622
623 font_data->xlfd_name = strdup(pattern);
624 if(font_data->xlfd_name == NULL((void*)0))
625 return (-1);
626
627 return True1;
628#else /* OLDCODE */
629 Display *dpy = oc->core.om->core.display;
630 char **fn_list = NULL((void*)0), *prop_fname = NULL((void*)0);
631 int list_num;
632 XFontStruct *fs_list;
633 if(is_match_charset(font_data, pattern) != True1) {
634 /*
635 * pattern should not contain any wildcard (execpt '?')
636 * this was probably added to make this case insensitive.
637 */
638 if ((fn_list = XListFontsWithInfo(dpy, pattern,
639 MAXFONTS100,
640 &list_num, &fs_list)) == NULL((void*)0)) {
641 return False0;
642 }
643 /* shouldn't we loop here ? */
644 else if ((prop_fname = get_prop_name(dpy, fs_list)) == NULL((void*)0)) {
645 XFreeFontInfo(fn_list, fs_list, list_num);
646 return False0;
647 }
648 else if ((is_match_charset(font_data, prop_fname) != True1)) {
649 XFree(prop_fname);
650 XFreeFontInfo(fn_list, fs_list, list_num);
651 return False0;
652 }
653 else {
654 font_data->xlfd_name = prop_fname;
655 XFreeFontInfo(fn_list, fs_list, list_num);
656 return True1;
657 }
658 }
659
660 font_data->xlfd_name = strdup(pattern);
661 if(font_data->xlfd_name == NULL((void*)0))
662 return (-1);
663
664 return True1;
665#endif /* OLDCODE */
666}
667
668static int
669parse_omit_name(
670 XOC oc,
671 FontData font_data,
672 char *pattern)
673{
674 char* last = (char *) NULL((void*)0);
675 char* base_name;
676 char buf[XLFD_MAX_LEN255 + 1];
677 int length = 0;
678 int num_fields;
679 /*
680 * If the font specified by "pattern" is expandable to be
681 * a member of "font_data"'s FontSet, we've found a match.
682 */
683 if(is_match_charset(font_data, pattern) == True1) {
684 if ((font_data->xlfd_name = get_font_name(oc, pattern)) != NULL((void*)0)) {
685 return True1;
686 }
687 }
688
689 length = strlen (pattern);
690
691 if (length > XLFD_MAX_LEN255)
692 return -1;
693
694 strcpy(buf, pattern)__builtin___strcpy_chk (buf, pattern, __builtin_object_size (
buf, 2 > 1 ? 1 : 0))
;
695 last = buf + length - 1;
696
697 /* Replace the original encoding with the encoding for this FontSet. */
698
699 /* Figure out how many fields have been specified in this xlfd. */
700 for (num_fields = 0, base_name = buf; *base_name != '\0'; base_name++)
701 if (*base_name == '-') num_fields++;
702
703 switch (num_fields) {
704 case 12:
705 /* This is the best way to have specifed the fontset. In this
706 * case, there is no original encoding. E.g.,
707 * -*-*-*-*-*-*-14-*-*-*-*-*
708 * To this, we'll append a dash:
709 * -*-*-*-*-*-*-14-*-*-*-*-*-
710 * then append the encoding to get:
711 * -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
712 */
713 /*
714 * Take care of:
715 * -*-*-*-*-*-*-14-*-*-*-*-
716 */
717 if (*(last) == '-')
718 *++last = '*';
719
720 *++last = '-';
721 break;
722 case 13:
723 /* Got the charset, not the encoding, zap the charset In this
724 * case, there is no original encoding, but there is a charset. E.g.,
725 * -*-*-*-*-*-*-14-*-*-*-*-*-jisx0212.1990
726 * To this, we remove the charset:
727 * -*-*-*-*-*-*-14-*-*-*-*-*-
728 * then append the new encoding to get:
729 * -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
730 */
731 last = strrchr (buf, '-');
732 num_fields = 12;
733 break;
734 case 14:
735 /* Both the charset and the encoding are specified. Get rid
736 * of them so that we can append the new charset encoding. E.g.,
737 * -*-*-*-*-*-*-14-*-*-*-*-*-jisx0212.1990-0
738 * To this, we'll remove the encoding and charset to get:
739 * -*-*-*-*-*-*-14-*-*-*-*-*-
740 * then append the new encoding to get:
741 * -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
742 */
743 last = strrchr (buf, '-');
744 *last = '\0';
745 last = strrchr (buf, '-');
746 num_fields = 12;
747 break;
748 default:
749 if (*last != '-')
750 *++last = '-';
751 break;
752 }
753
754 /* At this point, "last" is pointing to the last "-" in the
755 * xlfd, and all xlfd's at this point take a form similar to:
756 * -*-*-*-*-*-*-14-*-*-*-*-*-
757 * (i.e., no encoding).
758 * After the strcpy, we'll end up with something similar to:
759 * -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
760 *
761 * If the modified font is found in the current FontSet,
762 * we've found a match.
763 */
764
765 last++;
766
767 if ((last - buf) + strlen(font_data->name) > XLFD_MAX_LEN255)
768 return -1;
769
770 strcpy(last, font_data->name)__builtin___strcpy_chk (last, font_data->name, __builtin_object_size
(last, 2 > 1 ? 1 : 0))
;
771 if ((font_data->xlfd_name = get_font_name(oc, buf)) != NULL((void*)0))
772 return True1;
773
774 /* This may mot be needed anymore as XListFonts() takes care of this */
775 if (num_fields < 12) {
776 if ((last - buf) > (XLFD_MAX_LEN255 - 2))
777 return -1;
778 *last = '*';
779 *(last + 1) = '-';
780 strcpy(last + 2, font_data->name)__builtin___strcpy_chk (last + 2, font_data->name, __builtin_object_size
(last + 2, 2 > 1 ? 1 : 0))
;
781 num_fields++;
782 last+=2;
783 if ((font_data->xlfd_name = get_font_name(oc, buf)) != NULL((void*)0))
784 return True1;
785 }
786
787
788 return False0;
789}
790
791
792typedef enum{C_PRIMARY, C_SUBSTITUTE, C_VMAP, C_VROTATE } ClassType;
793
794static int
795parse_fontdata(
796 XOC oc,
797 FontSet font_set,
798 FontData font_data,
799 int font_data_count,
800 char **name_list,
801 int name_list_count,
802 ClassType class,
803 FontDataRec *font_data_return)
804{
805
806 char **cur_name_list = name_list;
807 char *font_name = (char *) NULL((void*)0);
808 char *pattern = (char *) NULL((void*)0);
809 int found_num = 0, ret = 0;
810 int count = name_list_count;
811
812 if(name_list == NULL((void*)0) || count <= 0) {
813 return False0;
814 }
815
816 if(font_data == NULL((void*)0) || font_data_count <= 0) {
817 return False0;
818 }
819
820 /* Loop through each font encoding defined in the "font_data" FontSet. */
821 for ( ; font_data_count-- > 0; font_data++) {
822 Boolint is_found = False0;
823 font_name = (char *) NULL((void*)0);
824 count = name_list_count;
825 cur_name_list = name_list;
826
827 /*
828 * Loop through each font specified by the user
829 * in the call to XCreateFontset().
830 */
831 while (count-- > 0) {
832 pattern = *cur_name_list++;
833 if (pattern == NULL((void*)0) || *pattern == '\0')
834 continue;
835#ifdef FONTDEBUG
836 fprintf(stderr__stderrp,"Font pattern: %s %s\n",
837 pattern,font_data->name);
838#endif
839
840 /*
841 * If the current font is fully specified (i.e., the
842 * xlfd contains no wildcards) and the font exists on
843 * the X Server, we have a match.
844 */
845 if (strchr(pattern, '*') == NULL((void*)0) &&
846 (font_name = get_font_name(oc, pattern))) {
847 /*
848 * Find the full xlfd name for this font. If the font is
849 * already in xlfd format, it is simply returned. If the
850 * font is an alias for another font, the xlfd of the
851 * aliased font is returned.
852 */
853 ret = parse_all_name(oc, font_data, font_name);
854 Xfree(font_name)free((font_name));
855
856 if (ret == -1) return -1;
857 if (ret == False0) continue;
858 /*
859 * Since there was an exact match of a fully-specified font
860 * or a font alias, we can return now since the desired font
861 * was found for the current font encoding for this FontSet.
862 *
863 * Previous implementations of this algorithm would
864 * not return here. Instead, they continued searching
865 * through the font encodings for this FontSet. The side-effect
866 * of that behavior is you may return a "substitute" match
867 * instead of an "exact" match. We believe there should be a
868 * preference on exact matches. Therefore, as soon as we
869 * find one, we bail.
870 *
871 * Also, previous implementations seemed to think it was
872 * important to find either a primary or substitute font
873 * for each Font encoding in the FontSet before returning an
874 * acceptable font. We don't believe this is necessary.
875 * All the client cares about is finding a reasonable font
876 * for what was passed in. If we find an exact match,
877 * there's no reason to look any further.
878 *
879 * -- jjw/pma (HP)
880 */
881 if (font_data_return) {
882 font_data_return->xlfd_name = strdup(font_data->xlfd_name);
883 if (!font_data_return->xlfd_name) return -1;
884
885 font_data_return->side = font_data->side;
886 }
887#ifdef FONTDEBUG
888 fprintf(stderr__stderrp,"XLFD name: %s\n",font_data->xlfd_name);
889#endif
890
891 return True1;
892 }
893 /*
894 * If the font name is not fully specified
895 * (i.e., it has wildcards), we have more work to do.
896 * See the comments in parse_omit_name()
897 * for the list of things to do.
898 */
899 ret = parse_omit_name(oc, font_data, pattern);
900
901 if (ret == -1) return -1;
902 if (ret == False0) continue;
903
904 /*
905 * A font which matched the wild-carded specification was found.
906 * Only update the return data if a font has not yet been found.
907 * This maintains the convention that FontSets listed higher in
908 * a CodeSet in the Locale Database have higher priority than
909 * those FontSets listed lower in the CodeSet. In the following
910 * example:
911 *
912 * fs1 {
913 * charset HP-JIS:GR
914 * font JISX0208.1990-0:GL;\
915 * JISX0208.1990-1:GR;\
916 * JISX0208.1983-0:GL;\
917 * JISX0208.1983-1:GR
918 * }
919 *
920 * a font found in the JISX0208.1990-0 FontSet will have a
921 * higher priority than a font found in the JISX0208.1983-0
922 * FontSet.
923 */
924 if (font_data_return && font_data_return->xlfd_name == NULL((void*)0)) {
925
926#ifdef FONTDEBUG
927 fprintf(stderr__stderrp,"XLFD name: %s\n",font_data->xlfd_name);
928#endif
929 font_data_return->xlfd_name = strdup(font_data->xlfd_name);
930 if (!font_data_return->xlfd_name) return -1;
931
932 font_data_return->side = font_data->side;
933 }
934
935 found_num++;
936 is_found = True1;
937
938 break;
939 }
940
941 switch(class) {
942 case C_PRIMARY:
943 if(is_found == False0) {
944 /*
945 * Did not find a font for the current FontSet. Check the
946 * FontSet's "substitute" font for a match. If we find a
947 * match, we'll keep searching in hopes of finding an exact
948 * match later down the FontSet list.
949 *
950 * when we return and we have found a font font_data_return
951 * contains the first (ie. best) match no matter if this
952 * is a C_PRIMARY or a C_SUBSTITUTE font
953 */
954 ret = parse_fontdata(oc, font_set, font_set->substitute,
955 font_set->substitute_num, name_list,
956 name_list_count, C_SUBSTITUTE,
957 font_data_return);
958 if (ret == -1) return -1;
959 if (ret == False0) continue;
960
961 found_num++;
962 is_found = True1;
963 }
964#ifdef TESTVERSION
965 else
966 return True1;
967#endif
968 break;
969
970 case C_SUBSTITUTE:
971 case C_VMAP:
972 if(is_found == True1)
973 return True1;
974 break;
975
976 case C_VROTATE:
977 if(is_found == True1) {
978 char *rotate_name;
979
980 if((rotate_name = get_rotate_fontname(font_data->xlfd_name))
981 != NULL((void*)0)) {
982 Xfree(font_data->xlfd_name)free((font_data->xlfd_name));
983 font_data->xlfd_name = rotate_name;
984
985 return True1;
986 }
987 Xfree(font_data->xlfd_name)free((font_data->xlfd_name));
988 font_data->xlfd_name = NULL((void*)0);
989 return False0;
990 }
991 break;
992 }
993 }
994
995 if(class == C_PRIMARY && found_num >= 1)
996 return True1;
997
998 return False0;
999}
1000
1001
1002static int
1003parse_vw(
1004 XOC oc,
1005 FontSet font_set,
1006 char **name_list,
1007 int count)
1008{
1009 FontData vmap = font_set->vmap;
1010 VRotate vrotate = font_set->vrotate;
1011 int vmap_num = font_set->vmap_num;
1012 int vrotate_num = font_set->vrotate_num;
1013 int ret = 0, i = 0;
1014
1015 if(vmap_num > 0) {
1016 if(parse_fontdata(oc, font_set, vmap, vmap_num, name_list,
1017 count, C_VMAP,NULL((void*)0)) == -1)
1018 return (-1);
1019 }
1020
1021 if(vrotate_num > 0) {
1022 ret = parse_fontdata(oc, font_set, (FontData) vrotate, vrotate_num,
1023 name_list, count, C_VROTATE, NULL((void*)0));
1024 if(ret == -1) {
1025 return (-1);
1026 } else if(ret == False0) {
1027 CodeRange code_range;
1028 int num_cr;
1029 int sub_num = font_set->substitute_num;
1030
1031 code_range = vrotate[0].code_range; /* ? */
1032 num_cr = vrotate[0].num_cr; /* ? */
1033 for(i = 0 ; i < vrotate_num ; i++) {
1034 if(vrotate[i].xlfd_name)
1035 Xfree(vrotate[i].xlfd_name)free((vrotate[i].xlfd_name));
1036 }
1037 Xfree(vrotate)free((vrotate));
1038
1039 if(sub_num > 0) {
1040 vrotate = font_set->vrotate = Xcalloc(sub_num,calloc(((sub_num) == 0 ? 1 : (sub_num)), (sizeof(VRotateRec))
)
1041 sizeof(VRotateRec))calloc(((sub_num) == 0 ? 1 : (sub_num)), (sizeof(VRotateRec))
)
;
1042 if(font_set->vrotate == (VRotate)NULL((void*)0))
1043 return (-1);
1044
1045 for(i = 0 ; i < sub_num ; i++) {
1046 vrotate[i].charset_name = font_set->substitute[i].name;
1047 vrotate[i].side = font_set->substitute[i].side;
1048 vrotate[i].code_range = code_range;
1049 vrotate[i].num_cr = num_cr;
1050 }
1051 vrotate_num = font_set->vrotate_num = sub_num;
1052 } else {
1053 vrotate = font_set->vrotate = (VRotate)NULL((void*)0);
1054 }
1055
1056 ret = parse_fontdata(oc, font_set, (FontData) vrotate, vrotate_num,
1057 name_list, count, C_VROTATE, NULL((void*)0));
1058 if(ret == -1)
1059 return (-1);
1060 }
1061 }
1062
1063 return True1;
1064}
1065
1066static int
1067parse_fontname(
1068 XOC oc)
1069{
1070 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
1071 FontSet font_set;
1072 FontDataRec font_data_return;
1073 char *base_name, **name_list;
1074 int font_set_num = 0;
1075 int found_num = 0;
1076 int count = 0;
1077 int ret;
1078 int i;
1079
1080 name_list = _XParseBaseFontNameList(oc->core.base_name_list, &count);
1081 if (name_list == NULL((void*)0))
1082 return -1;
1083
1084 font_set = gen->font_set;
1085 font_set_num = gen->font_set_num;
1086
1087 /* Loop through all of the CharSets defined in the Locale
1088 * database for the current Locale.
1089 */
1090 for( ; font_set_num-- > 0 ; font_set++) {
1091 if(font_set->font_name)
1092 continue;
1093
1094 if(font_set->font_data_count > 0) {
1095
1096 /*
1097 * If there are a non-zero number of FontSets defined
1098 * for this CharSet.
1099 * Try to find a font for this CharSet. If we find an
1100 * acceptable font, we save the information for return
1101 * to the client. If we do not find an acceptable font,
1102 * a "missing_charset" will be reported to the client
1103 * for this CharSet.
1104 */
1105 font_data_return.xlfd_name = NULL((void*)0);
1106 font_data_return.side = XlcUnknown;
1107
1108 ret = parse_fontdata(oc, font_set, font_set->font_data,
1109 font_set->font_data_count,
1110 name_list, count, C_PRIMARY,
1111 &font_data_return);
1112 if(ret == -1) {
1113 goto err;
1114 } else if(ret == True1) {
1115 /*
1116 * We can't just loop thru fontset->font_data to
1117 * find the first (ie. best) match: parse_fontdata
1118 * will try a substitute font if no primary one could
1119 * be matched. It returns the required information in
1120 * font_data_return.
1121 */
1122 font_set->font_name = strdup(font_data_return.xlfd_name);
1123 if(font_set->font_name == (char *) NULL((void*)0))
1124 goto err;
1125
1126 font_set->side = font_data_return.side;
1127
1128 Xfree (font_data_return.xlfd_name)free((font_data_return.xlfd_name));
1129 font_data_return.xlfd_name = NULL((void*)0);
1130
1131 if(parse_vw(oc, font_set, name_list, count) == -1)
1132 goto err;
1133 found_num++;
1134 }
1135
1136 } else if(font_set->substitute_num > 0) {
1137 /*
1138 * If there are no FontSets defined for this
1139 * CharSet. We can only find "substitute" fonts.
1140 */
1141 ret = parse_fontdata(oc, font_set, font_set->substitute,
1142 font_set->substitute_num,
1143 name_list, count, C_SUBSTITUTE, NULL((void*)0));
1144 if(ret == -1) {
1145 goto err;
1146 } else if(ret == True1) {
1147 for(i=0;i<font_set->substitute_num;i++){
1148 if(font_set->substitute[i].xlfd_name != NULL((void*)0)){
1149 break;
1150 }
1151 }
1152 font_set->font_name = strdup(font_set->substitute[i].xlfd_name);
1153 if(font_set->font_name == (char *) NULL((void*)0))
1154 goto err;
1155
1156 font_set->side = font_set->substitute[i].side;
1157 if(parse_vw(oc, font_set, name_list, count) == -1)
1158 goto err;
1159
1160 found_num++;
1161 }
1162 }
1163 }
1164
1165 base_name = strdup(oc->core.base_name_list);
1166 if (base_name == NULL((void*)0))
1167 goto err;
1168
1169 oc->core.base_name_list = base_name;
1170
1171 XFreeStringList(name_list);
1172
1173 return found_num;
1174
1175err:
1176 XFreeStringList(name_list);
1177 /* Prevent this from being freed twice */
1178 oc->core.base_name_list = NULL((void*)0);
1179
1180 return -1;
1181}
1182
1183/* For VW/UDC end*/
1184
1185static Boolint
1186set_missing_list(
1187 XOC oc)
1188{
1189 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
1190 FontSet font_set;
1191 char **charset_list, *charset_buf;
1192 int count, length, font_set_num;
1193 int result = 1;
1194
1195 font_set = gen->font_set;
1196 font_set_num = gen->font_set_num;
1197 count = length = 0;
1198
1199 for ( ; font_set_num-- > 0; font_set++) {
1200 if (font_set->info || font_set->font) {
1201 continue;
1202 }
1203
1204 /* Change 1996.01.23 start */
1205 if(font_set->font_data_count <= 0 ||
1206 font_set->font_data == (FontData)NULL((void*)0)) {
1207 if(font_set->substitute_num <= 0 ||
1208 font_set->substitute == (FontData)NULL((void*)0)) {
1209 if(font_set->charset_list != NULL((void*)0)){
1210 length +=
1211 strlen(font_set->charset_list[0]->encoding_name) + 1;
1212 } else {
1213 length += 1;
1214 }
1215 } else {
1216 length += strlen(font_set->substitute->name) + 1;
1217 }
1218 } else {
1219 length += strlen(font_set->font_data->name) + 1;
1220 }
1221 /* Change 1996.01.23 end */
1222 count++;
1223 }
1224
1225 if (count < 1) {
1226 return True1;
1227 }
1228
1229 charset_list = Xmalloc(sizeof(char *) * count)malloc(((sizeof(char *) * count) == 0 ? 1 : (sizeof(char *) *
count)))
;
1230 if (charset_list == NULL((void*)0)) {
1231 return False0;
1232 }
1233
1234 charset_buf = Xmalloc(length)malloc(((length) == 0 ? 1 : (length)));
1235 if (charset_buf == NULL((void*)0)) {
1236 Xfree(charset_list)free((charset_list));
1237 return False0;
1238 }
1239
1240 oc->core.missing_list.charset_list = charset_list;
1241 oc->core.missing_list.charset_count = count;
1242
1243 font_set = gen->font_set;
1244 font_set_num = gen->font_set_num;
1245
1246 for ( ; font_set_num-- > 0; font_set++) {
1247 if (font_set->info || font_set->font) {
1248 continue;
1249 }
1250
1251 /* Change 1996.01.23 start */
1252 if(font_set->font_data_count <= 0 ||
1253 font_set->font_data == (FontData)NULL((void*)0)) {
1254 if(font_set->substitute_num <= 0 ||
1255 font_set->substitute == (FontData)NULL((void*)0)) {
1256 if(font_set->charset_list != NULL((void*)0)){
1257 strcpy(charset_buf,__builtin___strcpy_chk (charset_buf, font_set->charset_list
[0]->encoding_name, __builtin_object_size (charset_buf, 2 >
1 ? 1 : 0))
1258 font_set->charset_list[0]->encoding_name)__builtin___strcpy_chk (charset_buf, font_set->charset_list
[0]->encoding_name, __builtin_object_size (charset_buf, 2 >
1 ? 1 : 0))
;
1259 } else {
1260 strcpy(charset_buf, "")__builtin___strcpy_chk (charset_buf, "", __builtin_object_size
(charset_buf, 2 > 1 ? 1 : 0))
;
1261 }
1262 result = 0;
1263 } else {
1264 strcpy(charset_buf, font_set->substitute->name)__builtin___strcpy_chk (charset_buf, font_set->substitute->
name, __builtin_object_size (charset_buf, 2 > 1 ? 1 : 0))
;
1265 }
1266 } else {
1267 strcpy(charset_buf, font_set->font_data->name)__builtin___strcpy_chk (charset_buf, font_set->font_data->
name, __builtin_object_size (charset_buf, 2 > 1 ? 1 : 0))
;
1268 }
1269 /* Change 1996.01.23 end */
1270 *charset_list++ = charset_buf;
1271 charset_buf += strlen(charset_buf) + 1;
1272 }
1273
1274 if(result == 0) {
1275 return(False0);
1276 }
1277
1278 return True1;
1279}
1280
1281static Boolint
1282create_fontset(
1283 XOC oc)
1284{
1285 XOMGenericPart *gen = XOM_GENERIC(oc->core.om)(&((XOMGeneric) oc->core.om)->gen);
1286 int found_num;
1287
1288 if (init_fontset(oc) == False0)
1289 return False0;
1290
1291 found_num = parse_fontname(oc);
1292 if (found_num <= 0) {
1293 if (found_num == 0)
1294 set_missing_list(oc);
1295 return False0;
1296 }
1297
1298 if (gen->on_demand_loading == True1) {
1299 if (load_font_info(oc) == False0)
1300 return False0;
1301 } else {
1302 if (load_font(oc) == False0)
1303 return False0;
1304 }
1305
1306 if (init_core_part(oc) == False0)
1307 return False0;
1308
1309 if (set_missing_list(oc) == False0)
1310 return False0;
1311
1312 return True1;
1313}
1314
1315/* For VW/UDC start */
1316static void
1317free_fontdataOC(
1318 Display *dpy,
1319 FontData font_data,
1320 int font_data_count)
1321{
1322 for( ; font_data_count-- ; font_data++) {
1323 if(font_data->xlfd_name){
1324 Xfree(font_data->xlfd_name)free((font_data->xlfd_name));
1325 font_data->xlfd_name = NULL((void*)0);
1326 }
1327 if(font_data->font){ /* ADD 1996.01.7 */
1328 if(font_data->font->fid) /* Add 1996.01.23 */
1329 XFreeFont(dpy,font_data->font); /* ADD 1996.01.7 */
1330 else /* Add 1996.01.23 */
1331 XFreeFontInfo(NULL((void*)0), font_data->font, 1);/* Add 1996.01.23 */
1332 font_data->font = NULL((void*)0);
1333 }
1334/*
1335 * font_data->name and font_data->scopes belong to the OM not OC.
1336 * To save space this data is shared between OM and OC. We are
1337 * not allowed to free it here.
1338 * It has been moved to free_fontdataOM()
1339 */
1340/*
1341 if(font_data->scopes){
1342 Xfree(font_data->scopes);
1343 font_data->scopes = NULL;
1344 }
1345 if(font_data->name){
1346 Xfree(font_data->name);
1347 font_data->name = NULL;
1348 }
1349*/
1350 }
1351}
1352
1353static void destroy_fontdata(
1354 XOCGenericPart *gen,
1355 Display *dpy)
1356{
1357 FontSet font_set = (FontSet) NULL((void*)0);
1358 int font_set_num = 0;
1359
1360 if (gen->font_set) {
1361 font_set = gen->font_set;
1362 font_set_num = gen->font_set_num;
1363 for( ; font_set_num-- ; font_set++) {
1364 if (font_set->font) {
1365 if(font_set->font->fid)
1366 XFreeFont(dpy,font_set->font);
1367 else
1368 XFreeFontInfo(NULL((void*)0), font_set->font, 1);
1369 font_set->font = NULL((void*)0);
1370 }
1371 if(font_set->font_data) {
1372 if (font_set->info)
1373 XFreeFontInfo(NULL((void*)0), font_set->info, 1);
1374 free_fontdataOC(dpy,
1375 font_set->font_data, font_set->font_data_count);
1376 Xfree(font_set->font_data)free((font_set->font_data));
1377 font_set->font_data = NULL((void*)0);
1378 }
1379 if(font_set->substitute) {
1380 free_fontdataOC(dpy,
1381 font_set->substitute, font_set->substitute_num);
1382 Xfree(font_set->substitute)free((font_set->substitute));
1383 font_set->substitute = NULL((void*)0);
1384 }
1385 if(font_set->vmap) {
1386 free_fontdataOC(dpy,
1387 font_set->vmap, font_set->vmap_num);
1388 Xfree(font_set->vmap)free((font_set->vmap));
1389 font_set->vmap = NULL((void*)0);
1390 }
1391 if(font_set->vrotate) {
1392 free_fontdataOC(dpy,
1393 (FontData)font_set->vrotate,
1394 font_set->vrotate_num);
1395 Xfree(font_set->vrotate)free((font_set->vrotate));
1396 font_set->vrotate = NULL((void*)0);
1397 }
1398 }
1399 Xfree(gen->font_set)free((gen->font_set));
1400 gen->font_set = NULL((void*)0);
1401 }
1402}
1403/* For VW/UDC end */
1404
1405static void
1406destroy_oc(
1407 XOC oc)
1408{
1409 Display *dpy = oc->core.om->core.display;
1410 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
1411
1412 if (gen->mbs_to_cs)
1413 _XlcCloseConverter(gen->mbs_to_cs);
1414
1415 if (gen->wcs_to_cs)
1416 _XlcCloseConverter(gen->wcs_to_cs);
1417
1418 if (gen->utf8_to_cs)
1419 _XlcCloseConverter(gen->utf8_to_cs);
1420
1421/* For VW/UDC start */ /* Change 1996.01.8 */
1422 destroy_fontdata(gen,dpy);
1423/*
1424*/
1425/* For VW/UDC end */
1426
1427 Xfree(oc->core.base_name_list)free((oc->core.base_name_list));
1428 XFreeStringList(oc->core.font_info.font_name_list);
1429 Xfree(oc->core.font_info.font_struct_list)free((oc->core.font_info.font_struct_list));
1430 XFreeStringList(oc->core.missing_list.charset_list);
1431
1432#ifdef notdef
1433
1434 Xfree(oc->core.res_name)free((oc->core.res_name));
1435 Xfree(oc->core.res_class)free((oc->core.res_class));
1436#endif
1437
1438 Xfree(oc)free((oc));
1439}
1440
1441static char *
1442set_oc_values(
1443 XOC oc,
1444 XlcArgList args,
1445 int num_args)
1446{
1447 XOCGenericPart *gen = XOC_GENERIC(oc)(&((XOCGeneric) oc)->gen);
1448 FontSet font_set = gen->font_set;
1449 char *ret;
1450 int num = gen->font_set_num;
1451
1452 if (oc->core.resources == NULL((void*)0))
1453 return NULL((void*)0);
1454
1455 ret = _XlcSetValues((XPointer) oc, oc->core.resources,
1456 oc->core.num_resources, args, num_args, XlcSetMask(1L<<3));
1457 if(ret != NULL((void*)0)){
1458 return(ret);
1459 } else {
1460 for ( ; num-- > 0; font_set++) {
1461 if (font_set->font_name == NULL((void*)0))
1462 continue;
1463 if (font_set->vpart_initialize != 0)
1464 continue;
1465 if( oc->core.orientation == XOMOrientation_TTB_RTL ||
1466 oc->core.orientation == XOMOrientation_TTB_LTR ){
1467 load_fontdata(oc, font_set->vmap, font_set->vmap_num);
1468 load_fontdata(oc, (FontData) font_set->vrotate,
1469 font_set->vrotate_num);
1470 font_set->vpart_initialize = 1;
1471 }
1472 }
1473 return(NULL((void*)0));
1474 }
1475}
1476
1477static char *
1478get_oc_values(
1479 XOC oc,
1480 XlcArgList args,
1481 int num_args)
1482{
1483 if (oc->core.resources == NULL((void*)0))
1484 return NULL((void*)0);
1485
1486 return _XlcGetValues((XPointer) oc, oc->core.resources,
1487 oc->core.num_resources, args, num_args, XlcGetMask(1L<<2));
1488}
1489
1490static XOCMethodsRec oc_default_methods = {
1491 destroy_oc,
1492 set_oc_values,
1493 get_oc_values,
1494 _XmbDefaultTextEscapement,
1495 _XmbDefaultTextExtents,
1496 _XmbDefaultTextPerCharExtents,
1497 _XmbDefaultDrawString,
1498 _XmbDefaultDrawImageString,
1499 _XwcDefaultTextEscapement,
1500 _XwcDefaultTextExtents,
1501 _XwcDefaultTextPerCharExtents,
1502 _XwcDefaultDrawString,
1503 _XwcDefaultDrawImageString,
1504 _Xutf8DefaultTextEscapement,
1505 _Xutf8DefaultTextExtents,
1506 _Xutf8DefaultTextPerCharExtents,
1507 _Xutf8DefaultDrawString,
1508 _Xutf8DefaultDrawImageString
1509};
1510
1511static XOCMethodsRec oc_generic_methods = {
1512 destroy_oc,
1513 set_oc_values,
1514 get_oc_values,
1515 _XmbGenericTextEscapement,
1516 _XmbGenericTextExtents,
1517 _XmbGenericTextPerCharExtents,
1518 _XmbGenericDrawString,
1519 _XmbGenericDrawImageString,
1520 _XwcGenericTextEscapement,
1521 _XwcGenericTextExtents,
1522 _XwcGenericTextPerCharExtents,
1523 _XwcGenericDrawString,
1524 _XwcGenericDrawImageString,
1525 _Xutf8GenericTextEscapement,
1526 _Xutf8GenericTextExtents,
1527 _Xutf8GenericTextPerCharExtents,
1528 _Xutf8GenericDrawString,
1529 _Xutf8GenericDrawImageString
1530};
1531
1532typedef struct _XOCMethodsListRec {
1533 const char *name;
1534 XOCMethods methods;
1535} XOCMethodsListRec, *XOCMethodsList;
1536
1537static XOCMethodsListRec oc_methods_list[] = {
1538 { "default", &oc_default_methods },
1539 { "generic", &oc_generic_methods }
1540};
1541
1542static XlcResource oc_resources[] = {
1543 { XNBaseFontName"baseFontName", NULLQUARK((XrmQuark) 0), sizeof(char *),
1544 XOffsetOf(XOCRec, core.base_name_list)__builtin_offsetof(XOCRec, core.base_name_list), XlcCreateMask(1L<<0) | XlcGetMask(1L<<2) },
1545 { XNOMAutomatic"omAutomatic", NULLQUARK((XrmQuark) 0), sizeof(Boolint),
1546 XOffsetOf(XOCRec, core.om_automatic)__builtin_offsetof(XOCRec, core.om_automatic), XlcGetMask(1L<<2) },
1547 { XNMissingCharSet"missingCharSet", NULLQUARK((XrmQuark) 0), sizeof(XOMCharSetList),
1548 XOffsetOf(XOCRec, core.missing_list)__builtin_offsetof(XOCRec, core.missing_list), XlcGetMask(1L<<2) },
1549 { XNDefaultString"defaultString", NULLQUARK((XrmQuark) 0), sizeof(char *),
1550 XOffsetOf(XOCRec, core.default_string)__builtin_offsetof(XOCRec, core.default_string), XlcGetMask(1L<<2) },
1551 { XNOrientation"orientation", NULLQUARK((XrmQuark) 0), sizeof(XOrientation),
1552 XOffsetOf(XOCRec, core.orientation)__builtin_offsetof(XOCRec, core.orientation), XlcDefaultMask(1L<<1) | XlcSetMask(1L<<3) | XlcGetMask(1L<<2) },
1553 { XNResourceName"resourceName", NULLQUARK((XrmQuark) 0), sizeof(char *),
1554 XOffsetOf(XOCRec, core.res_name)__builtin_offsetof(XOCRec, core.res_name), XlcSetMask(1L<<3) | XlcGetMask(1L<<2) },
1555 { XNResourceClass"resourceClass", NULLQUARK((XrmQuark) 0), sizeof(char *),
1556 XOffsetOf(XOCRec, core.res_class)__builtin_offsetof(XOCRec, core.res_class), XlcSetMask(1L<<3) | XlcGetMask(1L<<2) },
1557 { XNFontInfo"fontInfo", NULLQUARK((XrmQuark) 0), sizeof(XOMFontInfo),
1558 XOffsetOf(XOCRec, core.font_info)__builtin_offsetof(XOCRec, core.font_info), XlcGetMask(1L<<2) }
1559};
1560
1561static XOC
1562create_oc(
1563 XOM om,
1564 XlcArgList args,
1565 int num_args)
1566{
1567 XOC oc;
1568 XOMGenericPart *gen = XOM_GENERIC(om)(&((XOMGeneric) om)->gen);
1569 XOCMethodsList methods_list = oc_methods_list;
1570 int count;
1571
1572 oc = Xcalloc(1, sizeof(XOCGenericRec))calloc(((1) == 0 ? 1 : (1)), (sizeof(XOCGenericRec)));
1573 if (oc == NULL((void*)0))
1574 return (XOC) NULL((void*)0);
1575
1576 oc->core.om = om;
1577
1578 if (oc_resources[0].xrm_name == NULLQUARK((XrmQuark) 0))
1579 _XlcCompileResourceList(oc_resources, XlcNumber(oc_resources)(sizeof(oc_resources) / sizeof(oc_resources[0])));
1580
1581 if (_XlcSetValues((XPointer) oc, oc_resources, XlcNumber(oc_resources)(sizeof(oc_resources) / sizeof(oc_resources[0])),
1582 args, num_args, XlcCreateMask(1L<<0) | XlcDefaultMask(1L<<1)))
1583 goto err;
1584
1585 if (oc->core.base_name_list == NULL((void*)0))
1586 goto err;
1587
1588 oc->core.resources = oc_resources;
1589 oc->core.num_resources = XlcNumber(oc_resources)(sizeof(oc_resources) / sizeof(oc_resources[0]));
1590
1591 if (create_fontset(oc) == False0)
1592 goto err;
1593
1594 oc->methods = &oc_generic_methods;
1595
1596 if (gen->object_name) {
1597 count = XlcNumber(oc_methods_list)(sizeof(oc_methods_list) / sizeof(oc_methods_list[0]));
1598
1599 for ( ; count-- > 0; methods_list++) {
1600 if (!_XlcCompareISOLatin1(gen->object_name, methods_list->name)) {
1601 oc->methods = methods_list->methods;
1602 break;
1603 }
1604 }
1605 }
1606
1607 return oc;
1608
1609err:
1610 destroy_oc(oc);
1611
1612 return (XOC) NULL((void*)0);
1613}
1614
1615static void
1616free_fontdataOM(
1617 FontData font_data,
1618 int font_data_count)
1619{
1620 for( ; font_data_count-- ; font_data++) {
1621 if(font_data->name){
1622 Xfree(font_data->name)free((font_data->name));
1623 font_data->name = NULL((void*)0);
1624 }
1625 if(font_data->scopes){
1626 Xfree(font_data->scopes)free((font_data->scopes));
1627 font_data->scopes = NULL((void*)0);
1628 }
1629 }
1630}
1631
1632static Statusint
1633close_om(
1634 XOM om)
1635{
1636 XOMGenericPart *gen = XOM_GENERIC(om)(&((XOMGeneric) om)->gen);
1637 OMData data;
1638 int count;
1639
1640 if ((data = gen->data)) {
1641 for (count = gen->data_num; count-- > 0; data++) {
1642 if (data->charset_list){
1643 Xfree(data->charset_list)free((data->charset_list));
1644 data->charset_list = NULL((void*)0);
1645 }
1646 /* free font_data for om */
1647 if (data->font_data) {
1648 free_fontdataOM(data->font_data,data->font_data_count);
1649 Xfree(data->font_data)free((data->font_data));
1650 data->font_data = NULL((void*)0);
1651 }
1652 /* free substitute for om */
1653 if (data->substitute) {
1654 free_fontdataOM(data->substitute,data->substitute_num);
1655 Xfree(data->substitute)free((data->substitute));
1656 data->substitute = NULL((void*)0);
1657 }
1658 /* free vmap for om */
1659 if (data->vmap) {
1660 free_fontdataOM(data->vmap,data->vmap_num);
1661 Xfree(data->vmap)free((data->vmap));
1662 data->vmap = NULL((void*)0);
1663 }
1664 /* free vrotate for om */
1665 if (data->vrotate) {
1666 Xfree(data->vrotate)free((data->vrotate));
1667 data->vrotate = NULL((void*)0);
1668 }
1669 }
1670 Xfree(gen->data)free((gen->data));
1671 gen->data = NULL((void*)0);
1672 }
1673
1674 if (gen->object_name){
1675 Xfree(gen->object_name)free((gen->object_name));
1676 gen->object_name = NULL((void*)0);
1677 }
1678
1679 if (om->core.res_name){
1680 Xfree(om->core.res_name)free((om->core.res_name));
1681 om->core.res_name = NULL((void*)0);
1682 }
1683 if (om->core.res_class){
1684 Xfree(om->core.res_class)free((om->core.res_class));
1685 om->core.res_class = NULL((void*)0);
1686 }
1687 if (om->core.required_charset.charset_list &&
1688 om->core.required_charset.charset_count > 0){
1689 XFreeStringList(om->core.required_charset.charset_list);
1690 om->core.required_charset.charset_list = NULL((void*)0);
1691 } else {
1692 Xfree((char*)om->core.required_charset.charset_list)free(((char*)om->core.required_charset.charset_list));
1693 om->core.required_charset.charset_list = NULL((void*)0);
1694 }
1695 if (om->core.orientation_list.orientation){
1696 Xfree(om->core.orientation_list.orientation)free((om->core.orientation_list.orientation));
1697 om->core.orientation_list.orientation = NULL((void*)0);
1698 }
1699
1700 Xfree(om)free((om));
1701
1702 return 1;
1703}
1704
1705static char *
1706set_om_values(
1707 XOM om,
1708 XlcArgList args,
1709 int num_args)
1710{
1711 if (om->core.resources == NULL((void*)0))
1712 return NULL((void*)0);
1713
1714 return _XlcSetValues((XPointer) om, om->core.resources,
1715 om->core.num_resources, args, num_args, XlcSetMask(1L<<3));
1716}
1717
1718static char *
1719get_om_values(
1720 XOM om,
1721 XlcArgList args,
1722 int num_args)
1723{
1724 if (om->core.resources == NULL((void*)0))
1725 return NULL((void*)0);
1726
1727 return _XlcGetValues((XPointer) om, om->core.resources,
1728 om->core.num_resources, args, num_args, XlcGetMask(1L<<2));
1729}
1730
1731static XOMMethodsRec methods = {
1732 close_om,
1733 set_om_values,
1734 get_om_values,
1735 create_oc
1736};
1737
1738static XlcResource om_resources[] = {
1739 { XNRequiredCharSet"requiredCharSet", NULLQUARK((XrmQuark) 0), sizeof(XOMCharSetList),
1740 XOffsetOf(XOMRec, core.required_charset)__builtin_offsetof(XOMRec, core.required_charset), XlcGetMask(1L<<2) },
1741 { XNQueryOrientation"queryOrientation", NULLQUARK((XrmQuark) 0), sizeof(XOMOrientation),
1742 XOffsetOf(XOMRec, core.orientation_list)__builtin_offsetof(XOMRec, core.orientation_list), XlcGetMask(1L<<2) },
1743 { XNDirectionalDependentDrawing"directionalDependentDrawing", NULLQUARK((XrmQuark) 0), sizeof(Boolint),
1744 XOffsetOf(XOMRec, core.directional_dependent)__builtin_offsetof(XOMRec, core.directional_dependent), XlcGetMask(1L<<2) },
1745 { XNContextualDrawing"contextualDrawing", NULLQUARK((XrmQuark) 0), sizeof(Boolint),
1746 XOffsetOf(XOMRec, core.contextual_drawing)__builtin_offsetof(XOMRec, core.contextual_drawing), XlcGetMask(1L<<2) }
1747};
1748
1749static XOM
1750create_om(
1751 XLCd lcd,
1752 Display *dpy,
1753 XrmDatabase rdb,
1754 _Xconstconst char *res_name,
1755 _Xconstconst char *res_class)
1756{
1757 XOM om;
1758
1759 om = Xcalloc(1, sizeof(XOMGenericRec))calloc(((1) == 0 ? 1 : (1)), (sizeof(XOMGenericRec)));
1760 if (om == NULL((void*)0))
1761 return (XOM) NULL((void*)0);
1762
1763 om->methods = &methods;
1764 om->core.lcd = lcd;
1765 om->core.display = dpy;
1766 om->core.rdb = rdb;
1767 if (res_name) {
1768 om->core.res_name = strdup(res_name);
1769 if (om->core.res_name == NULL((void*)0))
1770 goto err;
1771 }
1772 if (res_class) {
1773 om->core.res_class = strdup(res_class);
1774 if (om->core.res_class == NULL((void*)0))
1775 goto err;
1776 }
1777
1778 if (om_resources[0].xrm_name == NULLQUARK((XrmQuark) 0))
1779 _XlcCompileResourceList(om_resources, XlcNumber(om_resources)(sizeof(om_resources) / sizeof(om_resources[0])));
1780
1781 om->core.resources = om_resources;
1782 om->core.num_resources = XlcNumber(om_resources)(sizeof(om_resources) / sizeof(om_resources[0]));
1783
1784 return om;
1785
1786err:
1787 close_om(om);
1788
1789 return (XOM) NULL((void*)0);
1790}
1791
1792static OMData
1793add_data(
1794 XOM om)
1795{
1796 XOMGenericPart *gen = XOM_GENERIC(om)(&((XOMGeneric) om)->gen);
1797 OMData new;
1798 int num;
1799
1800 if ((num = gen->data_num))
1801 new = Xrealloc(gen->data, (num + 1) * sizeof(OMDataRec))realloc((gen->data), (((num + 1) * sizeof(OMDataRec)) == 0
? 1 : ((num + 1) * sizeof(OMDataRec))))
;
1802 else
1803 new = Xmalloc(sizeof(OMDataRec))malloc(((sizeof(OMDataRec)) == 0 ? 1 : (sizeof(OMDataRec))));
1804
1805 if (new == NULL((void*)0))
1806 return NULL((void*)0);
1807
1808 gen->data_num = num + 1;
1809 gen->data = new;
1810
1811 new += num;
1812 bzero((char *) new, sizeof(OMDataRec))__builtin___memset_chk ((char *) new, 0, sizeof(OMDataRec), __builtin_object_size
((char *) new, 0))
;
1813
1814 return new;
1815}
1816
1817/* For VW/UDC */
1818
1819FontData
1820read_EncodingInfo(
1821 int count,
1822 char **value)
1823{
1824 FontData font_data,ret;
1825 char *buf, *bufptr,*scp;
1826 int len, i;
1827 font_data = Xcalloc(count, sizeof(FontDataRec))calloc(((count) == 0 ? 1 : (count)), (sizeof(FontDataRec)));
1828 if (font_data == NULL((void*)0))
42
Assuming 'font_data' is not equal to null
43
Taking false branch
1829 return NULL((void*)0);
1830
1831 ret = font_data;
1832 for (i = 0; i < count; i++, font_data++) {
44
Loop condition is true. Entering loop body
48
Assuming 'i' is < 'count'
49
Loop condition is true. Entering loop body
1833/*
1834 strcpy(buf, *value++);
1835*/
1836 buf = *value; value++;
1837 if ((bufptr = strchr(buf, ':'))) {
45
Assuming 'bufptr' is null
46
Taking false branch
50
Assuming 'bufptr' is not null
51
Taking true branch
1838 len = (int)(bufptr - buf);
1839 bufptr++ ;
1840 } else
1841 len = strlen(buf);
1842 font_data->name = Xmalloc(len + 1)malloc(((len + 1) == 0 ? 1 : (len + 1)));
1843 if (font_data->name == NULL((void*)0)) {
47
Taking false branch
52
Taking false branch
1844 free_fontdataOM(ret, i + 1);
1845 Xfree(ret)free((ret));
1846 return NULL((void*)0);
1847 }
1848 strncpy(font_data->name, buf,len)__builtin___strncpy_chk (font_data->name, buf, len, __builtin_object_size
(font_data->name, 2 > 1 ? 1 : 0))
;
53
Within the expansion of the macro 'strncpy':
a
Size argument is greater than the length of the destination buffer
1849 font_data->name[len] = 0;
1850 if (bufptr && _XlcCompareISOLatin1(bufptr, "GL") == 0)
1851 font_data->side = XlcGL;
1852 else if (bufptr && _XlcCompareISOLatin1(bufptr, "GR") == 0)
1853 font_data->side = XlcGR;
1854 else
1855 font_data->side = XlcGLGR;
1856
1857 if (bufptr && (scp = strchr(bufptr, '['))){
1858 font_data->scopes = _XlcParse_scopemaps(scp,&(font_data->scopes_num));
1859 }
1860 }
1861 return(ret);
1862}
1863
1864static CodeRange read_vrotate(
1865 int count,
1866 char **value,
1867 int *type,
1868 int *vrotate_num)
1869{
1870 CodeRange range;
1871 if(!strcmp(value[0],"all")){
1872 *type = VROTATE_ALL2 ;
1873 *vrotate_num = 0 ;
1874 return (NULL((void*)0));
1875 } else if(*(value[0]) == '['){
1876 *type = VROTATE_PART1 ;
1877 range = (CodeRange) _XlcParse_scopemaps(value[0],vrotate_num);
1878 return (range);
1879 } else {
1880 *type = VROTATE_NONE0 ;
1881 *vrotate_num = 0 ;
1882 return (NULL((void*)0));
1883 }
1884}
1885
1886static void read_vw(
1887 XLCd lcd,
1888 OMData font_set,
1889 int num)
1890{
1891 char **value, buf[BUFSIZ1024];
1892 int count;
1893
1894 snprintf(buf, sizeof(buf), "fs%d.font.vertical_map", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.font.vertical_map", num)
;
1895 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1896 if (count > 0){
39
Assuming 'count' is > 0
40
Taking true branch
1897 _XlcDbg_printValue(buf,value,count);
1898 font_set->vmap_num = count;
1899 font_set->vmap = read_EncodingInfo(count,value);
41
Calling 'read_EncodingInfo'
1900 }
1901
1902 snprintf(buf, sizeof(buf), "fs%d.font.vertical_rotate", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.font.vertical_rotate", num)
;
1903 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1904 if (count > 0){
1905 _XlcDbg_printValue(buf,value,count);
1906 font_set->vrotate = read_vrotate(count,value,&(font_set->vrotate_type),
1907 &(font_set->vrotate_num));
1908 }
1909}
1910/* VW/UDC end */
1911static Boolint
1912init_om(
1913 XOM om)
1914{
1915 XLCd lcd = om->core.lcd;
1916 XOMGenericPart *gen = XOM_GENERIC(om)(&((XOMGeneric) om)->gen);
1917 OMData data;
1918 XlcCharSet *charset_list;
1919 FontData font_data;
1920 char **required_list;
1921 XOrientation *orientation;
1922 char **value, buf[BUFSIZ1024], *bufptr;
1923 int count = 0, num = 0, length = 0;
1924
1925 _XlcGetResource(lcd, "XLC_FONTSET", "on_demand_loading", &value, &count);
1926 if (count > 0 && _XlcCompareISOLatin1(*value, "True") == 0)
1
Assuming 'count' is <= 0
1927 gen->on_demand_loading = True1;
1928
1929 _XlcGetResource(lcd, "XLC_FONTSET", "object_name", &value, &count);
1930 if (count > 0) {
2
Assuming 'count' is <= 0
3
Taking false branch
1931 gen->object_name = strdup(*value);
1932 if (gen->object_name == NULL((void*)0))
1933 return False0;
1934 }
1935
1936 for (num = 0; ; num++) {
4
Loop condition is true. Entering loop body
21
Loop condition is true. Entering loop body
1937
1938 snprintf(buf, sizeof(buf), "fs%d.charset.name", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.charset.name", num)
;
1939 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1940
1941 if( count < 1){
5
Assuming 'count' is >= 1
6
Taking false branch
22
Assuming 'count' is >= 1
23
Taking false branch
1942 snprintf(buf, sizeof(buf), "fs%d.charset", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.charset", num)
;
1943 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1944 if (count < 1)
1945 break;
1946 }
1947
1948 data = add_data(om);
1949 if (data == NULL((void*)0))
7
Taking false branch
24
Taking false branch
1950 return False0;
1951
1952 charset_list = Xmalloc(sizeof(XlcCharSet) * count)malloc(((sizeof(XlcCharSet) * count) == 0 ? 1 : (sizeof(XlcCharSet
) * count)))
;
1953 if (charset_list == NULL((void*)0))
8
Assuming 'charset_list' is not equal to null
9
Taking false branch
25
Assuming 'charset_list' is not equal to null
26
Taking false branch
1954 return False0;
1955 data->charset_list = charset_list;
1956 data->charset_count = count;
1957
1958 while (count-- > 0){
10
Loop condition is true. Entering loop body
11
Loop condition is false. Execution continues on line 1961
27
Loop condition is true. Entering loop body
28
Loop condition is false. Execution continues on line 1961
1959 *charset_list++ = _XlcGetCharSet(*value++);
1960 }
1961 snprintf(buf, sizeof(buf), "fs%d.charset.udc_area", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.charset.udc_area", num)
;
1962 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1963 if( count > 0){
12
Assuming 'count' is <= 0
13
Taking false branch
29
Assuming 'count' is <= 0
30
Taking false branch
1964 UDCArea udc;
1965 int i,flag = 0;
1966 udc = Xmalloc(count * sizeof(UDCAreaRec))malloc(((count * sizeof(UDCAreaRec)) == 0 ? 1 : (count * sizeof
(UDCAreaRec))))
;
1967 if (udc == NULL((void*)0))
1968 return False0;
1969 for(i=0;i<count;i++){
1970 sscanf(value[i],"\\x%lx,\\x%lx", &(udc[i].start),
1971 &(udc[i].end));
1972 }
1973 for(i=0;i<data->charset_count;i++){
1974 if(data->charset_list[i]->udc_area == NULL((void*)0)){
1975 data->charset_list[i]->udc_area = udc;
1976 data->charset_list[i]->udc_area_num = count;
1977 flag = 1;
1978 }
1979 }
1980 if(flag == 0){
1981 Xfree(udc)free((udc));
1982 }
1983 }
1984
1985 snprintf(buf, sizeof(buf), "fs%d.font.primary", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.font.primary", num)
;
1986 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1987 if (count < 1){
14
Assuming 'count' is >= 1
15
Taking false branch
31
Assuming 'count' is >= 1
32
Taking false branch
1988 snprintf(buf, sizeof(buf), "fs%d.font", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.font", num)
;
1989 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1990 if (count < 1)
1991 return False0;
1992 }
1993
1994 font_data = read_EncodingInfo(count,value);
1995 if (font_data == NULL((void*)0))
16
Taking false branch
33
Taking false branch
1996 return False0;
1997
1998 data->font_data = font_data;
1999 data->font_data_count = count;
2000
2001 snprintf(buf, sizeof(buf), "fs%d.font.substitute", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.font.substitute", num)
;
2002 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
2003 if (count > 0){
17
Assuming 'count' is <= 0
18
Taking false branch
34
Assuming 'count' is <= 0
35
Taking false branch
2004 font_data = read_EncodingInfo(count,value);
2005 if (font_data == NULL((void*)0))
2006 return False0;
2007 data->substitute = font_data;
2008 data->substitute_num = count;
2009 } else {
2010 snprintf(buf, sizeof(buf), "fs%d.font", num)__builtin___snprintf_chk (buf, sizeof(buf), 0, __builtin_object_size
(buf, 2 > 1 ? 1 : 0), "fs%d.font", num)
;
2011 _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
2012 if (count < 1) {
19
Assuming 'count' is >= 1
20
Taking false branch
36
Assuming 'count' is >= 1
37
Taking false branch
2013 data->substitute = NULL((void*)0);
2014 data->substitute_num = 0;
2015 } else {
2016 font_data = read_EncodingInfo(count,value);
2017 data->substitute = font_data;
2018 data->substitute_num = count;
2019 }
2020 }
2021 read_vw(lcd,data,num);
38
Calling 'read_vw'
2022 length += strlen(data->font_data->name) + 1;
2023 }
2024
2025 /* required charset list */
2026 required_list = Xmalloc(sizeof(char *) * gen->data_num)malloc(((sizeof(char *) * gen->data_num) == 0 ? 1 : (sizeof
(char *) * gen->data_num)))
;
2027 if (required_list == NULL((void*)0))
2028 return False0;
2029
2030 om->core.required_charset.charset_list = required_list;
2031 om->core.required_charset.charset_count = gen->data_num;
2032
2033 count = gen->data_num;
2034 data = gen->data;
2035
2036 if (count > 0) {
2037 bufptr = Xmalloc(length)malloc(((length) == 0 ? 1 : (length)));
2038 if (bufptr == NULL((void*)0)) {
2039 Xfree(required_list)free((required_list));
2040 return False0;
2041 }
2042
2043 for ( ; count-- > 0; data++) {
2044 strcpy(bufptr, data->font_data->name)__builtin___strcpy_chk (bufptr, data->font_data->name, __builtin_object_size
(bufptr, 2 > 1 ? 1 : 0))
;
2045 *required_list++ = bufptr;
2046 bufptr += strlen(bufptr) + 1;
2047 }
2048 }
2049
2050 /* orientation list */
2051 orientation = Xmalloc(sizeof(XOrientation) * 2)malloc(((sizeof(XOrientation) * 2) == 0 ? 1 : (sizeof(XOrientation
) * 2)))
;
2052 if (orientation == NULL((void*)0))
2053 return False0;
2054
2055 orientation[0] = XOMOrientation_LTR_TTB;
2056 orientation[1] = XOMOrientation_TTB_RTL;
2057 om->core.orientation_list.orientation = orientation;
2058 om->core.orientation_list.num_orientation = 2;
2059
2060 /* directional dependent drawing */
2061 om->core.directional_dependent = False0;
2062
2063 /* contexual drawing */
2064 om->core.contextual_drawing = False0;
2065
2066 /* context dependent */
2067 om->core.context_dependent = False0;
2068
2069 return True1;
2070}
2071
2072XOM
2073_XomGenericOpenOM(XLCd lcd, Display *dpy, XrmDatabase rdb,
2074 _Xconstconst char *res_name, _Xconstconst char *res_class)
2075{
2076 XOM om;
2077
2078 om = create_om(lcd, dpy, rdb, res_name, res_class);
2079 if (om == NULL((void*)0))
2080 return (XOM) NULL((void*)0);
2081
2082 if (init_om(om) == False0)
2083 goto err;
2084
2085 return om;
2086
2087err:
2088 close_om(om);
2089
2090 return (XOM) NULL((void*)0);
2091}
2092
2093Boolint
2094_XInitOM(
2095 XLCd lcd)
2096{
2097 lcd->methods->open_om = _XomGenericOpenOM;
2098
2099 return True1;
2100}