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

This commit is contained in:
Werner Lemberg 2019-06-16 15:58:21 +02:00
parent 47ca5cb69d
commit 983a87c6ec
2 changed files with 260 additions and 223 deletions

View File

@ -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).

View File

@ -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,89 +140,95 @@ names_dump( FILE* out,
switch ( format )
{
case OUTPUT_WINDOWS_DEF:
if ( dll_name )
fprintf( out, "LIBRARY %s\n", dll_name );
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;
fprintf( out, "DESCRIPTION FreeType 2 DLL\n" );
fprintf( out, "EXPORTS\n" );
case OUTPUT_BORLAND_DEF:
if ( dll_name )
fprintf( out, "LIBRARY %s\n", dll_name );
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, " %s\n", the_names[nn].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;
break;
case OUTPUT_WATCOM_LBC:
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];
if ( !dll_name )
{
const char* dot;
char temp[512];
if ( !dll_name )
{
fprintf( stderr,
"you must provide a DLL name with the -d option!\n" );
exit( 4 );
}
/* we must omit the .dll suffix from the library name */
dot = strchr( dll_name, '.' );
if ( dot )
{
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;
}
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, "++_%s.%s.%s\n", the_names[nn].name, dll_name,
the_names[nn].name );
fprintf( stderr,
"you must provide a DLL name with the -d option!\n" );
exit( 4 );
}
break;
case OUTPUT_NETWARE_IMP:
/* we must omit the `.dll' suffix from the library name */
dot = strchr( dll_name, '.' );
if ( dot )
{
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;
int len = dot - dll_name;
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 */
if ( len > (int)( sizeof ( temp ) - 1 ) )
len = sizeof ( temp ) - 1;
memcpy( temp, dll_name, len );
temp[len] = 0;
dll_name = (const char*)temp;
}
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 */
typedef enum State_
@ -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:
{
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;
}
/* fall-through */
case STATE_TYPE:
{
char* name = p;
while ( isalnum(*p) || *p == '_' )
p++;
if ( p > name )
{
if ( verbose )
fprintf( stderr, ">>> %.*s\n", (int)(p - name), name );
names_add( name, p );
}
state = STATE_START;
}
case STATE_START:
if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 )
break;
default:
;
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 `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;
while ( isalnum( *p ) || *p == '_' )
p++;
if ( p > name )
{
if ( verbose )
fprintf( stderr, ">>> %.*s\n", (int)( p - name ), name );
names_add( name, p );
}
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;
case 'v':
verbose = 1;
break;
case 'o':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
out = fopen( arg, "wt" );
if ( !out )
{
fprintf( stderr, "could not open '%s' for writing\n", arg );
exit( 3 );
}
break;
case 'd':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
library_name = arg;
break;
case 'w':
format = OUTPUT_WINDOWS_DEF;
switch ( arg[2] )
{
case 'B':
format = OUTPUT_BORLAND_DEF;
break;
case 'o':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
out = fopen( arg, "wt" );
if ( !out )
{
fprintf( stderr, "could not open '%s' for writing\n", arg );
exit(3);
}
case 'W':
format = OUTPUT_WATCOM_LBC;
break;
case 'd':
if ( arg[2] == 0 )
{
if ( argc < 2 )
usage();
arg = argv[2];
argv++;
argc--;
}
else
arg += 2;
library_name = arg;
case 'N':
format = OUTPUT_NETWARE_IMP;
break;
case 'w':
format = OUTPUT_WINDOWS_DEF;
switch ( arg[2] )
{
case 'B':
format = OUTPUT_BORLAND_DEF;
break;
case 'W':
format = OUTPUT_WATCOM_LBC;
break;
case 'N':
format = OUTPUT_NETWARE_IMP;
break;
case 'L':
format = OUTPUT_GNU_VERMAP;
break;
case 0:
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 */