* src/tools/apinames.c: Formatting, minor edits.

cmakelists-updates
Werner Lemberg 6 years ago
parent 47ca5cb69d
commit 983a87c6ec
  1. 4
      ChangeLog
  2. 441
      src/tools/apinames.c

@ -1,3 +1,7 @@
2019-06-16 Werner Lemberg <wl@gnu.org>
* src/tools/apinames.c: Formatting, minor edits.
2019-06-16 Werner Lemberg <wl@gnu.org>
[autofit] Disable hinting if no blue zones are available (#56450).

@ -10,7 +10,7 @@
* accepted if you are using GCC for compilation (and probably by
* other compilers too).
*
* Author: David Turner, 2005, 2006, 2008-2013, 2015
* Author: FreeType team, 2005-2019
*
* This code is explicitly placed into the public domain.
*
@ -26,6 +26,7 @@
#define LINEBUFF_SIZE 1024
typedef enum OutputFormat_
{
OUTPUT_LIST = 0, /* output the list of names, one per line */
@ -53,10 +54,12 @@ typedef struct NameRec_
} NameRec, *Name;
static Name the_names;
static int num_names;
static int max_names;
static void
names_add( const char* name,
const char* end )
@ -65,14 +68,16 @@ names_add( const char* name,
int nn, len;
Name nm;
if ( end <= name )
return;
/* compute hash value */
len = (int)(end - name);
len = (int)( end - name );
h = 0;
for ( nn = 0; nn < len; nn++ )
h = h*33 + name[nn];
h = h * 33 + name[nn];
/* check for an pre-existing name */
for ( nn = 0; nn < num_names; nn++ )
@ -88,7 +93,7 @@ names_add( const char* name,
/* add new name */
if ( num_names >= max_names )
{
max_names += (max_names >> 1) + 4;
max_names += ( max_names >> 1 ) + 4;
the_names = (NameRec*)realloc( the_names,
sizeof ( the_names[0] ) * max_names );
if ( !the_names )
@ -97,7 +102,7 @@ names_add( const char* name,
nm = &the_names[num_names++];
nm->hash = h;
nm->name = (char*)malloc( len+1 );
nm->name = (char*)malloc( len + 1 );
if ( !nm->name )
panic( "not enough memory" );
@ -116,6 +121,7 @@ name_compare( const void* name1,
return strcmp( n1->name, n2->name );
}
static void
names_sort( void )
{
@ -134,87 +140,93 @@ names_dump( FILE* out,
switch ( format )
{
case OUTPUT_WINDOWS_DEF:
if ( dll_name )
fprintf( out, "LIBRARY %s\n", dll_name );
fprintf( out, "DESCRIPTION FreeType 2 DLL\n" );
fprintf( out, "EXPORTS\n" );
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, " %s\n", the_names[nn].name );
break;
case OUTPUT_WINDOWS_DEF:
if ( dll_name )
fprintf( out, "LIBRARY %s\n", dll_name );
case OUTPUT_BORLAND_DEF:
if ( dll_name )
fprintf( out, "LIBRARY %s\n", dll_name );
fprintf( out, "DESCRIPTION FreeType 2 DLL\n" );
fprintf( out, "EXPORTS\n" );
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, " _%s\n", the_names[nn].name );
break;
case OUTPUT_WATCOM_LBC:
{
const char* dot;
char temp[512];
fprintf( out, "DESCRIPTION FreeType 2 DLL\n" );
fprintf( out, "EXPORTS\n" );
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, " %s\n", the_names[nn].name );
if ( !dll_name )
{
fprintf( stderr,
"you must provide a DLL name with the -d option!\n" );
exit( 4 );
}
break;
/* we must omit the .dll suffix from the library name */
dot = strchr( dll_name, '.' );
if ( dot )
{
int len = dot - dll_name;
case OUTPUT_BORLAND_DEF:
if ( dll_name )
fprintf( out, "LIBRARY %s\n", dll_name );
fprintf( out, "DESCRIPTION FreeType 2 DLL\n" );
fprintf( out, "EXPORTS\n" );
if ( len > (int)( sizeof ( temp ) - 1 ) )
len = sizeof ( temp ) - 1;
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, " _%s\n", the_names[nn].name );
memcpy( temp, dll_name, len );
temp[len] = 0;
break;
dll_name = (const char*)temp;
}
case OUTPUT_WATCOM_LBC:
{
const char* dot;
char temp[512];
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, "++_%s.%s.%s\n", the_names[nn].name, dll_name,
the_names[nn].name );
}
break;
case OUTPUT_NETWARE_IMP:
if ( !dll_name )
{
if ( dll_name )
fprintf( out, " (%s)\n", dll_name );
for ( nn = 0; nn < num_names - 1; nn++ )
fprintf( out, " %s,\n", the_names[nn].name );
fprintf( out, " %s\n", the_names[num_names - 1].name );
fprintf( stderr,
"you must provide a DLL name with the -d option!\n" );
exit( 4 );
}
break;
case OUTPUT_GNU_VERMAP:
/* we must omit the `.dll' suffix from the library name */
dot = strchr( dll_name, '.' );
if ( dot )
{
fprintf( out, "{\n\tglobal:\n" );
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, "\t\t%s;\n", the_names[nn].name );
fprintf( out, "\tlocal:\n\t\t*;\n};\n" );
int len = dot - dll_name;
if ( len > (int)( sizeof ( temp ) - 1 ) )
len = sizeof ( temp ) - 1;
memcpy( temp, dll_name, len );
temp[len] = 0;
dll_name = (const char*)temp;
}
break;
default: /* LIST */
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, "%s\n", the_names[nn].name );
}
}
fprintf( out, "++_%s.%s.%s\n",
the_names[nn].name, dll_name, the_names[nn].name );
}
break;
case OUTPUT_NETWARE_IMP:
if ( dll_name )
fprintf( out, " (%s)\n", dll_name );
for ( nn = 0; nn < num_names - 1; nn++ )
fprintf( out, " %s,\n", the_names[nn].name );
fprintf( out, " %s\n", the_names[num_names - 1].name );
break;
case OUTPUT_GNU_VERMAP:
fprintf( out, "{\n\tglobal:\n" );
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, "\t\t%s;\n", the_names[nn].name );
fprintf( out, "\tlocal:\n\t\t*;\n};\n" );
break;
default: /* LIST */
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, "%s\n", the_names[nn].name );
break;
}
}
/* states of the line parser */
@ -226,89 +238,96 @@ typedef enum State_
} State;
static int
read_header_file( FILE* file, int verbose )
read_header_file( FILE* file,
int verbose )
{
static char buff[LINEBUFF_SIZE + 1];
State state = STATE_START;
while ( !feof( file ) )
{
char* p;
if ( !fgets( buff, LINEBUFF_SIZE, file ) )
break;
p = buff;
while ( *p && (*p == ' ' || *p == '\\') ) /* skip leading whitespace */
/* skip leading whitespace */
while ( *p && ( *p == ' ' || *p == '\\' ) )
p++;
if ( *p == '\n' || *p == '\r' ) /* skip empty lines */
/* skip empty lines */
if ( *p == '\n' || *p == '\r' )
continue;
switch ( state )
{
case STATE_START:
case STATE_START:
if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 )
break;
p += 10;
for (;;)
{
if ( *p == 0 || *p == '\n' || *p == '\r' )
goto NextLine;
if ( *p == ')' )
{
if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 )
break;
p += 10;
for (;;)
{
if ( *p == 0 || *p == '\n' || *p == '\r' )
goto NextLine;
if ( *p == ')' )
{
p++;
break;
}
p++;
}
state = STATE_TYPE;
/* sometimes, the name is just after the FT_EXPORT(...), so
* skip whitespace, and fall-through if we find an alphanumeric
* character
*/
while ( *p == ' ' || *p == '\t' )
p++;
if ( !isalpha(*p) )
break;
p++;
break;
}
/* fall-through */
case STATE_TYPE:
{
char* name = p;
p++;
}
while ( isalnum(*p) || *p == '_' )
p++;
state = STATE_TYPE;
/*
* Sometimes, the name is just after `FT_EXPORT(...)', so skip
* whitespace and fall-through if we find an alphanumeric character.
*/
while ( *p == ' ' || *p == '\t' )
p++;
if ( !isalpha( *p ) )
break;
/* fall-through */
case STATE_TYPE:
{
char* name = p;
if ( p > name )
{
if ( verbose )
fprintf( stderr, ">>> %.*s\n", (int)(p - name), name );
names_add( name, p );
}
while ( isalnum( *p ) || *p == '_' )
p++;
state = STATE_START;
if ( p > name )
{
if ( verbose )
fprintf( stderr, ">>> %.*s\n", (int)( p - name ), name );
names_add( name, p );
}
break;
default:
;
state = STATE_START;
}
break;
default:
;
}
NextLine:
NextLine:
;
}
} /* end of while loop */
return 0;
}
@ -318,143 +337,154 @@ static void
usage( void )
{
static const char* const format =
"%s %s: extract FreeType API names from header files\n\n"
"this program is used to extract the list of public FreeType API\n"
"functions. It receives the list of header files as argument and\n"
"generates a sorted list of unique identifiers\n\n"
"usage: %s header1 [options] [header2 ...]\n\n"
"options: - : parse the content of stdin, ignore arguments\n"
" -v : verbose mode, output sent to standard error\n"
" -oFILE : write output to FILE instead of standard output\n"
" -dNAME : indicate DLL file name, 'freetype.dll' by default\n"
" -w : output .DEF file for Visual C++ and Mingw\n"
" -wB : output .DEF file for Borland C++\n"
" -wW : output Watcom Linker Response File\n"
" -wN : output NetWare Import File\n"
" -wL : output version map for GNU or Solaris linker\n"
"\n";
"%s %s: extract FreeType API names from header files\n"
"\n"
"This program extracts the list of public FreeType API functions.\n"
"It receives a list of header files as an argument and\n"
"generates a sorted list of unique identifiers in various formats.\n"
"\n"
"usage: %s header1 [options] [header2 ...]\n"
"\n"
"options: - parse the contents of stdin, ignore arguments\n"
" -v verbose mode, output sent to standard error\n"
" -oFILE write output to FILE instead of standard output\n"
" -dNAME indicate DLL file name, 'freetype.dll' by default\n"
" -w output .DEF file for Visual C++ and Mingw\n"
" -wB output .DEF file for Borland C++\n"
" -wW output Watcom Linker Response File\n"
" -wN output NetWare Import File\n"
" -wL output version map for GNU or Solaris linker\n"
"\n";
fprintf( stderr,
format,
PROGRAM_NAME,
PROGRAM_VERSION,
PROGRAM_NAME
);
exit(1);
PROGRAM_NAME );
exit( 1 );
}
int main( int argc, const char* const* argv )
int
main( int argc,
const char* const* argv )
{
int from_stdin = 0;
int verbose = 0;
OutputFormat format = OUTPUT_LIST; /* the default */
FILE* out = stdout;
int from_stdin = 0;
int verbose = 0;
OutputFormat format = OUTPUT_LIST; /* the default */
FILE* out = stdout;
const char* library_name = NULL;
if ( argc < 2 )
usage();
/* '-' used as a single argument means read source file from stdin */
/* `-' used as a single argument means read source file from stdin */
while ( argc > 1 && argv[1][0] == '-' )
{
const char* arg = argv[1];
switch ( arg[1] )
{
case 'v':
verbose = 1;
break;
case 'v':
verbose = 1;
case 'o':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
break;
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
case 'o':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
out = fopen( arg, "wt" );
if ( !out )
{
fprintf( stderr, "could not open '%s' for writing\n", arg );
exit(3);
}
break;
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
case 'd':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
out = fopen( arg, "wt" );
if ( !out )
{
fprintf( stderr, "could not open '%s' for writing\n", arg );
exit( 3 );
}
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
break;
library_name = arg;
break;
case 'd':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
case 'w':
format = OUTPUT_WINDOWS_DEF;
switch ( arg[2] )
{
case 'B':
format = OUTPUT_BORLAND_DEF;
break;
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
library_name = arg;
break;
case 'W':
format = OUTPUT_WATCOM_LBC;
break;
case 'w':
format = OUTPUT_WINDOWS_DEF;
case 'N':
format = OUTPUT_NETWARE_IMP;
break;
switch ( arg[2] )
{
case 'B':
format = OUTPUT_BORLAND_DEF;
break;
case 'L':
format = OUTPUT_GNU_VERMAP;
break;
case 'W':
format = OUTPUT_WATCOM_LBC;
break;
case 0:
break;
case 'N':
format = OUTPUT_NETWARE_IMP;
break;
default:
usage();
}
case 'L':
format = OUTPUT_GNU_VERMAP;
break;
case 0:
from_stdin = 1;
break;
default:
usage();
}
break;
case 0:
from_stdin = 1;
break;
default:
usage();
}
argc--;
argv++;
}
} /* end of while loop */
if ( from_stdin )
{
read_header_file( stdin, verbose );
}
else
{
for ( --argc, argv++; argc > 0; argc--, argv++ )
{
FILE* file = fopen( argv[0], "rb" );
if ( !file )
fprintf( stderr, "unable to open '%s'\n", argv[0] );
else
@ -469,7 +499,7 @@ int main( int argc, const char* const* argv )
}
if ( num_names == 0 )
panic( "could not find exported functions !!\n" );
panic( "could not find exported functions\n" );
names_sort();
names_dump( out, format, library_name );
@ -479,3 +509,6 @@ int main( int argc, const char* const* argv )
return 0;
}
/* END */

Loading…
Cancel
Save