25#include "vms_shorten_symbol.c"
27#define PROGRAM_NAME "apinames"
28#define PROGRAM_VERSION "0.5"
30#define LINEBUFF_SIZE 1024
33typedef enum OutputFormat_
45#define SUFFIX_VMS_64ADDR "64__"
48panic(
const char* fmt,
54 fprintf( stderr,
"PANIC: " );
57 vfprintf( stderr, fmt, ap );
60 fprintf( stderr,
"\n" );
80names_add(
const char* name,
85 int nn, len, len_suffix;
93 len = (int)( end - name );
96 for ( nn = 0; nn < len; nn++ )
97 h = h * 33 + name[nn];
100 for ( nn = 0; nn < num_names; nn++ )
104 if ( (
int)nm->hash == h &&
105 memcmp( name, nm->name, len ) == 0 &&
111 if ( num_names >= max_names )
113 max_names += ( max_names >> 1 ) + 4;
114 the_names = (NameRec*)realloc( the_names,
115 sizeof ( the_names[0] ) * max_names );
117 panic(
"not enough memory" );
119 nm = &the_names[num_names++];
125 len_suffix =
sizeof ( SUFFIX_VMS_64ADDR );
132 nm->name = (
char*)malloc( len + len_suffix + 1 );
134 panic(
"not enough memory" );
136 memcpy( nm->name, name, len );
142name_compare(
const void* name1,
145 Name n1 = (Name)name1;
146 Name n2 = (Name)name2;
148 return strcmp( n1->name, n2->name );
155 qsort( the_names, (
size_t)num_names,
156 sizeof ( the_names[0] ), name_compare );
161names_dump( FILE* out,
163 const char* dll_name )
170 case OUTPUT_WINDOWS_DEF:
172 fprintf( out,
"LIBRARY %s\n", dll_name );
174 fprintf( out,
"DESCRIPTION FreeType 2 DLL\n" );
175 fprintf( out,
"EXPORTS\n" );
177 for ( nn = 0; nn < num_names; nn++ )
178 fprintf( out,
" %s\n", the_names[nn].name );
182 case OUTPUT_BORLAND_DEF:
184 fprintf( out,
"LIBRARY %s\n", dll_name );
186 fprintf( out,
"DESCRIPTION FreeType 2 DLL\n" );
187 fprintf( out,
"EXPORTS\n" );
189 for ( nn = 0; nn < num_names; nn++ )
190 fprintf( out,
" _%s\n", the_names[nn].name );
194 case OUTPUT_WATCOM_LBC:
203 "you must provide a DLL name with the -d option!\n" );
208 dot = strchr( dll_name,
'.' );
211 int len = dot - dll_name;
214 if ( len > (
int)(
sizeof ( temp ) - 1 ) )
215 len =
sizeof ( temp ) - 1;
217 memcpy( temp, dll_name, len );
220 dll_name = (
const char*)temp;
223 for ( nn = 0; nn < num_names; nn++ )
224 fprintf( out,
"++_%s.%s.%s\n",
225 the_names[nn].name, dll_name, the_names[nn].name );
231 fprintf( out,
"case_sensitive=YES\n" );
233 for ( nn = 0; nn < num_names; nn++ )
235 char short_symbol[32];
238 if ( vms_shorten_symbol( the_names[nn].name, short_symbol, 1 ) == -1 )
239 panic(
"could not shorten name '%s'", the_names[nn].name );
240 fprintf( out,
"symbol_vector = ( %s = PROCEDURE)\n", short_symbol );
244 strcat( the_names[nn].name , SUFFIX_VMS_64ADDR );
245 if ( vms_shorten_symbol( the_names[nn].name, short_symbol, 1 ) == -1 )
246 panic(
"could not shorten name '%s'", the_names[nn].name );
247 fprintf( out,
"symbol_vector = ( %s = PROCEDURE)\n", short_symbol );
252 case OUTPUT_NETWARE_IMP:
254 fprintf( out,
" (%s)\n", dll_name );
256 for ( nn = 0; nn < num_names - 1; nn++ )
257 fprintf( out,
" %s,\n", the_names[nn].name );
258 fprintf( out,
" %s\n", the_names[num_names - 1].name );
262 case OUTPUT_GNU_VERMAP:
263 fprintf( out,
"{\n\tglobal:\n" );
265 for ( nn = 0; nn < num_names; nn++ )
266 fprintf( out,
"\t\t%s;\n", the_names[nn].name );
268 fprintf( out,
"\tlocal:\n\t\t*;\n};\n" );
273 for ( nn = 0; nn < num_names; nn++ )
274 fprintf( out,
"%s\n", the_names[nn].name );
292read_header_file( FILE* file,
294 OutputFormat format )
296 static char buff[LINEBUFF_SIZE + 1];
297 State state = STATE_START;
300 while ( !feof( file ) )
305 if ( !fgets( buff, LINEBUFF_SIZE, file ) )
311 while ( *p ==
' ' || *p ==
'\t' )
315 if ( *p ==
'\n' || *p ==
'\r' )
321 if ( memcmp( p,
"FT_EXPORT(", 10 ) != 0 )
327 if ( *p == 0 || *p ==
'\n' || *p ==
'\r' )
345 while ( *p ==
' ' || *p ==
'\t' )
348 if ( !isalpha( *p ) )
358 while ( isalnum( *p ) || *p ==
'_' )
364 fprintf( stderr,
">>> %.*s\n", (
int)( p - name ), name );
366 names_add( name, p, format );
389 static const char*
const format =
390 "%s %s: extract FreeType API names from header files\n"
392 "This program extracts the list of public FreeType API functions.\n"
393 "It receives a list of header files as an argument and\n"
394 "generates a sorted list of unique identifiers in various formats.\n"
396 "usage: %s [options] header1 [header2 ...]\n"
398 "options: - parse the contents of stdin, ignore arguments\n"
399 " -v verbose mode, output sent to standard error\n"
400 " -oFILE write output to FILE instead of standard output\n"
401 " -dNAME indicate DLL file name, 'freetype.dll' by default\n"
402 " -w output .DEF file for Visual C++ and Mingw\n"
403 " -wB output .DEF file for Borland C++\n"
404 " -wW output Watcom Linker Response File\n"
405 " -wV output OpenVMS Linker Options File\n"
406 " -wN output NetWare Import File\n"
407 " -wL output version map for GNU or Solaris linker\n"
422 const char*
const* argv )
426 OutputFormat format = OUTPUT_LIST;
428 const char* library_name = NULL;
435 while ( argc > 1 && argv[1][0] ==
'-' )
437 const char* arg = argv[1];
460 out = fopen( arg,
"wt" );
463 fprintf( stderr,
"could not open '%s' for writing\n", arg );
487 format = OUTPUT_WINDOWS_DEF;
492 format = OUTPUT_BORLAND_DEF;
496 format = OUTPUT_WATCOM_LBC;
500 format = OUTPUT_VMS_OPT;
504 format = OUTPUT_NETWARE_IMP;
508 format = OUTPUT_GNU_VERMAP;
535 read_header_file( stdin, verbose, format );
538 for ( --argc, argv++; argc > 0; argc--, argv++ )
540 FILE* file = fopen( argv[0],
"rb" );
544 fprintf( stderr,
"unable to open '%s'\n", argv[0] );
548 fprintf( stderr,
"opening '%s'\n", argv[0] );
550 read_header_file( file, verbose, format );
556 if ( num_names == 0 )
557 panic(
"could not find exported functions\n" );
560 names_dump( out, format, library_name );