Bug Summary

File:_psmodule.c
Warning:line 375, column 28
Assigned value is garbage or undefined

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple amd64-unknown-openbsd6.8 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name _psmodule.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mthread-model posix -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/local/lib/clang/10.0.1 -I /usr/X11R6/include -I /usr/local/include -fdebug-compilation-dir /home/ben/Projects/ClassiCube/src -ferror-limit 19 -fmessage-length 0 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -fobjc-runtime=gnustep -fdiagnostics-show-option -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -o /home/ben/Projects/ClassiCube/src/scan/2020-12-10-180422-33404-1 -x c _psmodule.c
1/***************************************************************************/
2/* */
3/* psmodule.c */
4/* */
5/* PSNames module implementation (body). */
6/* */
7/* Copyright 1996-2018 by */
8/* David Turner, Robert Wilhelm, and Werner Lemberg. */
9/* */
10/* This file is part of the FreeType project, and may only be used, */
11/* modified, and distributed under the terms of the FreeType project */
12/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13/* this file you indicate that you have read the license and */
14/* understand and accept it fully. */
15/* */
16/***************************************************************************/
17
18
19#include "freetype/ft2build.h"
20#include FT_INTERNAL_DEBUG_H_FT"freetype/ftdebug.h"
21#include FT_INTERNAL_OBJECTS_H_FT"freetype/ftobjs.h"
22#include FT_SERVICE_POSTSCRIPT_CMAPS_H_FT"freetype/svpscmap.h"
23
24#include "freetype/psmodule.h"
25
26 /*
27 * The file `pstables.h' with its arrays and its function
28 * `ft_get_adobe_glyph_index' is useful for other projects also (for
29 * example, `pdfium' is using it). However, if used as a C++ header,
30 * including it in two different source files makes it necessary to use
31 * `extern const' for the declaration of its arrays, otherwise the data
32 * would be duplicated as mandated by the C++ standard.
33 *
34 * For this reason, we use `DEFINE_PS_TABLES' to guard the function
35 * definitions, and `DEFINE_PS_TABLES_DATA' to provide both proper array
36 * declarations and definitions.
37 */
38#include "freetype/pstables.h"
39#define DEFINE_PS_TABLES
40#define DEFINE_PS_TABLES_DATA
41#include "freetype/pstables.h"
42
43#include "freetype/psnamerr.h"
44
45
46#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
47
48
49#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
50
51
52#define VARIANT_BIT0x80000000UL 0x80000000UL
53#define BASE_GLYPH( code )( (FT_UInt32)( (code) & ~0x80000000UL ) ) ( (FT_UInt32)( (code) & ~VARIANT_BIT0x80000000UL ) )
54
55
56 /* Return the Unicode value corresponding to a given glyph. Note that */
57 /* we do deal with glyph variants by detecting a non-initial dot in */
58 /* the name, as in `A.swash' or `e.final'; in this case, the */
59 /* VARIANT_BIT is set in the return value. */
60 /* */
61 static FT_UInt32
62 ps_unicode_value( const char* glyph_name )
63 {
64 /* If the name begins with `uni', then the glyph name may be a */
65 /* hard-coded unicode character code. */
66 if ( glyph_name[0] == 'u' &&
67 glyph_name[1] == 'n' &&
68 glyph_name[2] == 'i' )
69 {
70 /* determine whether the next four characters following are */
71 /* hexadecimal. */
72
73 /* XXX: Add code to deal with ligatures, i.e. glyph names like */
74 /* `uniXXXXYYYYZZZZ'... */
75
76 FT_Int count;
77 FT_UInt32 value = 0;
78 const char* p = glyph_name + 3;
79
80
81 for ( count = 4; count > 0; count--, p++ )
82 {
83 char c = *p;
84 unsigned int d;
85
86
87 d = (unsigned char)c - '0';
88 if ( d >= 10 )
89 {
90 d = (unsigned char)c - 'A';
91 if ( d >= 6 )
92 d = 16;
93 else
94 d += 10;
95 }
96
97 /* Exit if a non-uppercase hexadecimal character was found */
98 /* -- this also catches character codes below `0' since such */
99 /* negative numbers cast to `unsigned int' are far too big. */
100 if ( d >= 16 )
101 break;
102
103 value = ( value << 4 ) + d;
104 }
105
106 /* there must be exactly four hex digits */
107 if ( count == 0 )
108 {
109 if ( *p == '\0' )
110 return value;
111 if ( *p == '.' )
112 return (FT_UInt32)( value | VARIANT_BIT0x80000000UL );
113 }
114 }
115
116 /* If the name begins with `u', followed by four to six uppercase */
117 /* hexadecimal digits, it is a hard-coded unicode character code. */
118 if ( glyph_name[0] == 'u' )
119 {
120 FT_Int count;
121 FT_UInt32 value = 0;
122 const char* p = glyph_name + 1;
123
124
125 for ( count = 6; count > 0; count--, p++ )
126 {
127 char c = *p;
128 unsigned int d;
129
130
131 d = (unsigned char)c - '0';
132 if ( d >= 10 )
133 {
134 d = (unsigned char)c - 'A';
135 if ( d >= 6 )
136 d = 16;
137 else
138 d += 10;
139 }
140
141 if ( d >= 16 )
142 break;
143
144 value = ( value << 4 ) + d;
145 }
146
147 if ( count <= 2 )
148 {
149 if ( *p == '\0' )
150 return value;
151 if ( *p == '.' )
152 return (FT_UInt32)( value | VARIANT_BIT0x80000000UL );
153 }
154 }
155
156 /* Look for a non-initial dot in the glyph name in order to */
157 /* find variants like `A.swash', `e.final', etc. */
158 {
159 const char* p = glyph_name;
160 const char* dot = NULL((void*)0);
161
162
163 for ( ; *p; p++ )
164 {
165 if ( *p == '.' && p > glyph_name )
166 {
167 dot = p;
168 break;
169 }
170 }
171
172 /* now look up the glyph in the Adobe Glyph List */
173 if ( !dot )
174 return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );
175 else
176 return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |
177 VARIANT_BIT0x80000000UL );
178 }
179 }
180
181
182 /* ft_qsort callback to sort the unicode map */
183 FT_CALLBACK_DEF( int )static int
184 compare_uni_maps( const void* a,
185 const void* b )
186 {
187 PS_UniMap* map1 = (PS_UniMap*)a;
188 PS_UniMap* map2 = (PS_UniMap*)b;
189 FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode )( (FT_UInt32)( (map1->unicode) & ~0x80000000UL ) );
190 FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode )( (FT_UInt32)( (map2->unicode) & ~0x80000000UL ) );
191
192
193 /* sort base glyphs before glyph variants */
194 if ( unicode1 == unicode2 )
195 {
196 if ( map1->unicode > map2->unicode )
197 return 1;
198 else if ( map1->unicode < map2->unicode )
199 return -1;
200 else
201 return 0;
202 }
203 else
204 {
205 if ( unicode1 > unicode2 )
206 return 1;
207 else if ( unicode1 < unicode2 )
208 return -1;
209 else
210 return 0;
211 }
212 }
213
214
215 /* support for extra glyphs not handled (well) in AGL; */
216 /* we add extra mappings for them if necessary */
217
218#define EXTRA_GLYPH_LIST_SIZE10 10
219
220 static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE10] =
221 {
222 /* WGL 4 */
223 0x0394,
224 0x03A9,
225 0x2215,
226 0x00AD,
227 0x02C9,
228 0x03BC,
229 0x2219,
230 0x00A0,
231 /* Romanian */
232 0x021A,
233 0x021B
234 };
235
236 static const char ft_extra_glyph_names[] =
237 {
238 'D','e','l','t','a',0,
239 'O','m','e','g','a',0,
240 'f','r','a','c','t','i','o','n',0,
241 'h','y','p','h','e','n',0,
242 'm','a','c','r','o','n',0,
243 'm','u',0,
244 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
245 's','p','a','c','e',0,
246 'T','c','o','m','m','a','a','c','c','e','n','t',0,
247 't','c','o','m','m','a','a','c','c','e','n','t',0
248 };
249
250 static const FT_Int
251 ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE10] =
252 {
253 0,
254 6,
255 12,
256 21,
257 28,
258 35,
259 38,
260 53,
261 59,
262 72
263 };
264
265
266 static void
267 ps_check_extra_glyph_name( const char* gname,
268 FT_UInt glyph,
269 FT_UInt* extra_glyphs,
270 FT_UInt *states )
271 {
272 FT_UInt n;
273
274
275 for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE10; n++ )
8
Loop condition is true. Entering loop body
276 {
277 if ( ft_strcmpstrcmp( ft_extra_glyph_names +
9
Taking true branch
278 ft_extra_glyph_name_offsets[n], gname ) == 0 )
279 {
280 if ( states[n] == 0 )
10
Taking true branch
281 {
282 /* mark this extra glyph as a candidate for the cmap */
283 states[n] = 1;
284 extra_glyphs[n] = glyph;
285 }
286
287 return;
288 }
289 }
290 }
291
292
293 static void
294 ps_check_extra_glyph_unicode( FT_UInt32 uni_char,
295 FT_UInt *states )
296 {
297 FT_UInt n;
298
299
300 for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE10; n++ )
301 {
302 if ( uni_char == ft_extra_glyph_unicodes[n] )
303 {
304 /* disable this extra glyph from being added to the cmap */
305 states[n] = 2;
306
307 return;
308 }
309 }
310 }
311
312
313 /* Build a table that maps Unicode values to glyph indices. */
314 static FT_Error
315 ps_unicodes_init( FT_Memory memory,
316 PS_Unicodes table,
317 FT_UInt num_glyphs,
318 PS_GetGlyphNameFunc get_glyph_name,
319 PS_FreeGlyphNameFunc free_glyph_name,
320 FT_Pointer glyph_data )
321 {
322 FT_Error error;
323
324 FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
325 FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE10];
326
327
328 /* we first allocate the table */
329 table->num_maps = 0;
330 table->maps = NULL((void*)0);
331
332 if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE )( ((table->maps) = (ft_mem_realloc( memory, sizeof ( *(table
->maps) ), 0, (FT_Long)(num_glyphs + 10), ((void*)0), &
error ))), error != 0 )
)
1
Assuming 'error' is equal to 0
2
Taking true branch
333 {
334 FT_UInt n;
335 FT_UInt count;
336 PS_UniMap* map;
337 FT_UInt32 uni_char;
338
339
340 map = table->maps;
341
342 for ( n = 0; n < num_glyphs; n++ )
3
Assuming 'n' is < 'num_glyphs'
4
Loop condition is true. Entering loop body
15
Assuming 'n' is >= 'num_glyphs'
16
Loop condition is false. Execution continues on line 367
343 {
344 const char* gname = get_glyph_name( glyph_data, n );
345
346
347 if ( gname )
5
Assuming 'gname' is non-null
6
Taking true branch
348 {
349 ps_check_extra_glyph_name( gname, n,
7
Calling 'ps_check_extra_glyph_name'
11
Returning from 'ps_check_extra_glyph_name'
350 extra_glyphs, extra_glyph_list_states );
351 uni_char = ps_unicode_value( gname );
352
353 if ( BASE_GLYPH( uni_char )( (FT_UInt32)( (uni_char) & ~0x80000000UL ) ) != 0 )
12
Taking true branch
354 {
355 ps_check_extra_glyph_unicode( uni_char,
356 extra_glyph_list_states );
357 map->unicode = uni_char;
358 map->glyph_index = n;
359 map++;
360 }
361
362 if ( free_glyph_name )
13
Assuming 'free_glyph_name' is null
14
Taking false branch
363 free_glyph_name( glyph_data, gname );
364 }
365 }
366
367 for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE10; n++ )
17
Loop condition is true. Entering loop body
20
The value 1 is assigned to 'n'
21
Loop condition is true. Entering loop body
368 {
369 if ( extra_glyph_list_states[n] == 1 )
18
Assuming the condition is false
19
Taking false branch
22
Assuming the condition is true
23
Taking true branch
370 {
371 /* This glyph name has an additional representation. */
372 /* Add it to the cmap. */
373
374 map->unicode = ft_extra_glyph_unicodes[n];
375 map->glyph_index = extra_glyphs[n];
24
Assigned value is garbage or undefined
376 map++;
377 }
378 }
379
380 /* now compress the table a bit */
381 count = (FT_UInt)( map - table->maps );
382
383 if ( count == 0 )
384 {
385 /* No unicode chars here! */
386 FT_FREE( table->maps )do { ft_mem_free( memory, (table->maps) ); (table->maps
) = ((void*)0); } while ( 0 )
;
387 if ( !error )
388 error = FT_THROW( No_Unicode_Glyph_Name )PSnames_Err_No_Unicode_Glyph_Name;
389 }
390 else
391 {
392 /* Reallocate if the number of used entries is much smaller. */
393 if ( count < num_glyphs / 2 )
394 {
395 (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count )( ((table->maps) = (ft_mem_realloc( memory, sizeof ( *(table
->maps) ), (FT_Long)(num_glyphs), (FT_Long)(count), (table
->maps), &error ))), error != 0 )
;
396 error = FT_Err_Ok;
397 }
398
399 /* Sort the table in increasing order of unicode values, */
400 /* taking care of glyph variants. */
401 ft_qsortqsort( table->maps, count, sizeof ( PS_UniMap ),
402 compare_uni_maps );
403 }
404
405 table->num_maps = count;
406 }
407
408 return error;
409 }
410
411
412 static FT_UInt
413 ps_unicodes_char_index( PS_Unicodes table,
414 FT_UInt32 unicode )
415 {
416 PS_UniMap *min, *max, *mid, *result = NULL((void*)0);
417
418
419 /* Perform a binary search on the table. */
420
421 min = table->maps;
422 max = min + table->num_maps - 1;
423
424 while ( min <= max )
425 {
426 FT_UInt32 base_glyph;
427
428
429 mid = min + ( ( max - min ) >> 1 );
430
431 if ( mid->unicode == unicode )
432 {
433 result = mid;
434 break;
435 }
436
437 base_glyph = BASE_GLYPH( mid->unicode )( (FT_UInt32)( (mid->unicode) & ~0x80000000UL ) );
438
439 if ( base_glyph == unicode )
440 result = mid; /* remember match but continue search for base glyph */
441
442 if ( min == max )
443 break;
444
445 if ( base_glyph < unicode )
446 min = mid + 1;
447 else
448 max = mid - 1;
449 }
450
451 if ( result )
452 return result->glyph_index;
453 else
454 return 0;
455 }
456
457
458 static FT_UInt32
459 ps_unicodes_char_next( PS_Unicodes table,
460 FT_UInt32 *unicode )
461 {
462 FT_UInt result = 0;
463 FT_UInt32 char_code = *unicode + 1;
464
465
466 {
467 FT_UInt min = 0;
468 FT_UInt max = table->num_maps;
469 FT_UInt mid;
470 PS_UniMap* map;
471 FT_UInt32 base_glyph;
472
473
474 while ( min < max )
475 {
476 mid = min + ( ( max - min ) >> 1 );
477 map = table->maps + mid;
478
479 if ( map->unicode == char_code )
480 {
481 result = map->glyph_index;
482 goto Exit;
483 }
484
485 base_glyph = BASE_GLYPH( map->unicode )( (FT_UInt32)( (map->unicode) & ~0x80000000UL ) );
486
487 if ( base_glyph == char_code )
488 result = map->glyph_index;
489
490 if ( base_glyph < char_code )
491 min = mid + 1;
492 else
493 max = mid;
494 }
495
496 if ( result )
497 goto Exit; /* we have a variant glyph */
498
499 /* we didn't find it; check whether we have a map just above it */
500 char_code = 0;
501
502 if ( min < table->num_maps )
503 {
504 map = table->maps + min;
505 result = map->glyph_index;
506 char_code = BASE_GLYPH( map->unicode )( (FT_UInt32)( (map->unicode) & ~0x80000000UL ) );
507 }
508 }
509
510 Exit:
511 *unicode = char_code;
512 return result;
513 }
514
515
516#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
517
518
519 static const char*
520 ps_get_macintosh_name( FT_UInt name_index )
521 {
522 if ( name_index >= FT_NUM_MAC_NAMES258 )
523 name_index = 0;
524
525 return ft_standard_glyph_names + ft_mac_names[name_index];
526 }
527
528
529 static const char*
530 ps_get_standard_strings( FT_UInt sid )
531 {
532 if ( sid >= FT_NUM_SID_NAMES391 )
533 return 0;
534
535 return ft_standard_glyph_names + ft_sid_names[sid];
536 }
537
538
539#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
540
541 FT_DEFINE_SERVICE_PSCMAPSREC(static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
542 pscmaps_interface,static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
543
544 (PS_Unicode_ValueFunc) ps_unicode_value, /* unicode_value */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
545 (PS_Unicodes_InitFunc) ps_unicodes_init, /* unicodes_init */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
546 (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, /* unicodes_char_index */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
547 (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, /* unicodes_char_next */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
548
549 (PS_Macintosh_NameFunc) ps_get_macintosh_name, /* macintosh_name */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
550 (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
551
552 t1_standard_encoding, /* adobe_std_encoding */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
553 t1_expert_encoding /* adobe_expert_encoding */static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
554 )static const FT_Service_PsCMapsRec pscmaps_interface = { (PS_Unicode_ValueFunc
) ps_unicode_value, (PS_Unicodes_InitFunc) ps_unicodes_init, (
PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, (PS_Unicodes_CharNextFunc
) ps_unicodes_char_next, (PS_Macintosh_NameFunc) ps_get_macintosh_name
, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, t1_standard_encoding
, t1_expert_encoding };
555
556#else
557
558 FT_DEFINE_SERVICE_PSCMAPSREC(static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
559 pscmaps_interface,static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
560
561 NULL, /* unicode_value */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
562 NULL, /* unicodes_init */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
563 NULL, /* unicodes_char_index */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
564 NULL, /* unicodes_char_next */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
565
566 (PS_Macintosh_NameFunc) ps_get_macintosh_name, /* macintosh_name */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
567 (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
568
569 t1_standard_encoding, /* adobe_std_encoding */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
570 t1_expert_encoding /* adobe_expert_encoding */static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
571 )static const FT_Service_PsCMapsRec pscmaps_interface = { ((void
*)0), ((void*)0), ((void*)0), ((void*)0), (PS_Macintosh_NameFunc
) ps_get_macintosh_name, (PS_Adobe_Std_StringsFunc) ps_get_standard_strings
, t1_standard_encoding, t1_expert_encoding };
572
573#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
574
575
576 FT_DEFINE_SERVICEDESCREC1(static const FT_ServiceDescRec pscmaps_services[] = { { "postscript-cmaps"
, &pscmaps_interface }, { ((void*)0), ((void*)0) } };
577 pscmaps_services,static const FT_ServiceDescRec pscmaps_services[] = { { "postscript-cmaps"
, &pscmaps_interface }, { ((void*)0), ((void*)0) } };
578
579 FT_SERVICE_ID_POSTSCRIPT_CMAPS, &pscmaps_interface )static const FT_ServiceDescRec pscmaps_services[] = { { "postscript-cmaps"
, &pscmaps_interface }, { ((void*)0), ((void*)0) } };
580
581
582 static FT_Pointer
583 psnames_get_service( FT_Module module,
584 const char* service_id )
585 {
586 FT_UNUSED( module )( (module) = (module) );
587 return ft_service_list_lookup( pscmaps_services, service_id );
588 }
589
590#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
591
592
593#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
594#define PUT_PS_NAMES_SERVICE( a )a NULL((void*)0)
595#else
596#define PUT_PS_NAMES_SERVICE( a )a a
597#endif
598
599 FT_DEFINE_MODULE(const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
600 psnames_module_class,const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
601
602 0, /* this is not a font driver, nor a renderer */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
603 sizeof ( FT_ModuleRec ),const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
604
605 "psnames", /* driver name */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
606 0x10000L, /* driver version */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
607 0x20000L, /* driver requires FreeType 2 or above */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
608
609 PUT_PS_NAMES_SERVICE(const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
610 (void*)&pscmaps_interface ), /* module specific interface */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
611
612 (FT_Module_Constructor)NULL, /* module_init */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
613 (FT_Module_Destructor) NULL, /* module_done */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
614 (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) /* get_interface */const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
615 )const FT_Module_Class psnames_module_class = { 0, sizeof ( FT_ModuleRec
), "psnames", 0x10000L, 0x20000L, (void*)&pscmaps_interface
, (FT_Module_Constructor)((void*)0), (FT_Module_Destructor) (
(void*)0), (FT_Module_Requester) psnames_get_service, };
616
617
618/* END */