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