File: | modules/om/generic/omGeneric.c |
Location: | line 1257, column 4 |
Description: | String copy function overflows destination buffer |
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 | ||||||
70 | static FontData | |||||
71 | init_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 | ||||||
88 | static VRotate | |||||
89 | init_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 | ||||||
118 | static Boolint | |||||
119 | init_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 | ||||||
169 | err: | |||||
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 | ||||||
183 | static char * | |||||
184 | get_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 | ||||||
198 | static Boolint | |||||
199 | load_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 | ||||||
219 | static Boolint | |||||
220 | load_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 | ||||||
241 | static Boolint | |||||
242 | load_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 | ||||||
287 | static Boolint | |||||
288 | load_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 | ||||||
316 | static void | |||||
317 | check_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 | ||||||
334 | static void | |||||
335 | set_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 | ||||||
407 | static Boolint | |||||
408 | init_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 | ||||||
473 | err: | |||||
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 | ||||||
481 | static char * | |||||
482 | get_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 | ||||||
502 | static char * | |||||
503 | get_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 | ||||||
585 | free_pattern: | |||||
586 | Xfree(pattern)free((pattern)); | |||||
587 | ||||||
588 | return rotate_font_ptr; | |||||
589 | } | |||||
590 | ||||||
591 | static Boolint | |||||
592 | is_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 | ||||||
612 | static int | |||||
613 | parse_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 | ||||||
668 | static int | |||||
669 | parse_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 | ||||||
792 | typedef enum{C_PRIMARY, C_SUBSTITUTE, C_VMAP, C_VROTATE } ClassType; | |||||
793 | ||||||
794 | static int | |||||
795 | parse_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 | ||||||
1002 | static int | |||||
1003 | parse_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 | ||||||
1066 | static int | |||||
1067 | parse_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 | ||||||
1175 | err: | |||||
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 | ||||||
1185 | static Boolint | |||||
1186 | set_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 | ||||||
1281 | static Boolint | |||||
1282 | create_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 */ | |||||
1316 | static void | |||||
1317 | free_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 | ||||||
1353 | static 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 | ||||||
1405 | static void | |||||
1406 | destroy_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 | ||||||
1441 | static char * | |||||
1442 | set_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 | ||||||
1477 | static char * | |||||
1478 | get_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 | ||||||
1490 | static 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 | ||||||
1511 | static 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 | ||||||
1532 | typedef struct _XOCMethodsListRec { | |||||
1533 | const char *name; | |||||
1534 | XOCMethods methods; | |||||
1535 | } XOCMethodsListRec, *XOCMethodsList; | |||||
1536 | ||||||
1537 | static XOCMethodsListRec oc_methods_list[] = { | |||||
1538 | { "default", &oc_default_methods }, | |||||
1539 | { "generic", &oc_generic_methods } | |||||
1540 | }; | |||||
1541 | ||||||
1542 | static 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 | ||||||
1561 | static XOC | |||||
1562 | create_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 | ||||||
1609 | err: | |||||
1610 | destroy_oc(oc); | |||||
1611 | ||||||
1612 | return (XOC) NULL((void*)0); | |||||
1613 | } | |||||
1614 | ||||||
1615 | static void | |||||
1616 | free_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 | ||||||
1632 | static Statusint | |||||
1633 | close_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 | ||||||
1705 | static char * | |||||
1706 | set_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 | ||||||
1718 | static char * | |||||
1719 | get_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 | ||||||
1731 | static XOMMethodsRec methods = { | |||||
1732 | close_om, | |||||
1733 | set_om_values, | |||||
1734 | get_om_values, | |||||
1735 | create_oc | |||||
1736 | }; | |||||
1737 | ||||||
1738 | static 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 | ||||||
1749 | static XOM | |||||
1750 | create_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 | ||||||
1786 | err: | |||||
1787 | close_om(om); | |||||
1788 | ||||||
1789 | return (XOM) NULL((void*)0); | |||||
1790 | } | |||||
1791 | ||||||
1792 | static OMData | |||||
1793 | add_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 | ||||||
1819 | FontData | |||||
1820 | read_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)) | |||||
1829 | return NULL((void*)0); | |||||
1830 | ||||||
1831 | ret = font_data; | |||||
1832 | for (i = 0; i < count; i++, font_data++) { | |||||
1833 | /* | |||||
1834 | strcpy(buf, *value++); | |||||
1835 | */ | |||||
1836 | buf = *value; value++; | |||||
1837 | if ((bufptr = strchr(buf, ':'))) { | |||||
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)) { | |||||
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)); | |||||
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 | ||||||
1864 | static 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 | ||||||
1886 | static 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){ | |||||
1897 | _XlcDbg_printValue(buf,value,count); | |||||
1898 | font_set->vmap_num = count; | |||||
1899 | font_set->vmap = read_EncodingInfo(count,value); | |||||
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 */ | |||||
1911 | static Boolint | |||||
1912 | init_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) | |||||
1927 | gen->on_demand_loading = True1; | |||||
1928 | ||||||
1929 | _XlcGetResource(lcd, "XLC_FONTSET", "object_name", &value, &count); | |||||
1930 | if (count > 0) { | |||||
1931 | gen->object_name = strdup(*value); | |||||
1932 | if (gen->object_name == NULL((void*)0)) | |||||
1933 | return False0; | |||||
1934 | } | |||||
1935 | ||||||
1936 | for (num = 0; ; num++) { | |||||
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){ | |||||
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)) | |||||
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)) | |||||
1954 | return False0; | |||||
1955 | data->charset_list = charset_list; | |||||
1956 | data->charset_count = count; | |||||
1957 | ||||||
1958 | while (count-- > 0){ | |||||
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){ | |||||
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){ | |||||
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)) | |||||
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){ | |||||
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) { | |||||
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); | |||||
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 | ||||||
2072 | XOM | |||||
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 | ||||||
2087 | err: | |||||
2088 | close_om(om); | |||||
2089 | ||||||
2090 | return (XOM) NULL((void*)0); | |||||
2091 | } | |||||
2092 | ||||||
2093 | Boolint | |||||
2094 | _XInitOM( | |||||
2095 | XLCd lcd) | |||||
2096 | { | |||||
2097 | lcd->methods->open_om = _XomGenericOpenOM; | |||||
2098 | ||||||
2099 | return True1; | |||||
2100 | } |