mosesdecoder/jam-files/engine/mkjambase.c

124 lines
2.8 KiB
C

/*
* Copyright 1993, 1995 Christopher Seiwald.
*
* This file is part of Jam - see jam.c for Copyright information.
*/
/* This file is ALSO:
* Copyright 2001-2004 David Abrahams.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
*/
/*
* mkjambase.c - turn Jambase into a big C structure
*
* Usage: mkjambase jambase.c Jambase ...
*
* Results look like this:
*
* char *jambase[] = {
* "...\n",
* ...
* 0 };
*
* Handles \'s and "'s specially; knows to delete blank and comment lines.
*
*/
#include <stdio.h>
#include <string.h>
int main( int argc, char * * argv, char * * envp )
{
char buf[ 1024 ];
FILE * fin;
FILE * fout;
char * p;
int doDotC = 0;
if ( argc < 3 )
{
fprintf( stderr, "usage: %s jambase.c Jambase ...\n", argv[ 0 ] );
return -1;
}
if ( !( fout = fopen( argv[1], "w" ) ) )
{
perror( argv[ 1 ] );
return -1;
}
/* If the file ends in .c generate a C source file. */
if ( ( p = strrchr( argv[1], '.' ) ) && !strcmp( p, ".c" ) )
doDotC++;
/* Now process the files. */
argc -= 2;
argv += 2;
if ( doDotC )
{
fprintf( fout, "/* Generated by mkjambase from Jambase */\n" );
fprintf( fout, "char *jambase[] = {\n" );
}
for ( ; argc--; ++argv )
{
if ( !( fin = fopen( *argv, "r" ) ) )
{
perror( *argv );
return -1;
}
if ( doDotC )
fprintf( fout, "/* %s */\n", *argv );
else
fprintf( fout, "### %s ###\n", *argv );
while ( fgets( buf, sizeof( buf ), fin ) )
{
if ( doDotC )
{
char * p = buf;
/* Strip leading whitespace. */
while ( ( *p == ' ' ) || ( *p == '\t' ) || ( *p == '\n' ) )
++p;
/* Drop comments and empty lines. */
if ( ( *p == '#' ) || !*p )
continue;
/* Copy. */
putc( '"', fout );
for ( ; *p && ( *p != '\n' ); ++p )
switch ( *p )
{
case '\\': putc( '\\', fout ); putc( '\\', fout ); break;
case '"' : putc( '\\', fout ); putc( '"' , fout ); break;
case '\r': break;
default: putc( *p, fout ); break;
}
fprintf( fout, "\\n\",\n" );
}
else
{
fprintf( fout, "%s", buf );
}
}
fclose( fin );
}
if ( doDotC )
fprintf( fout, "0 };\n" );
fclose( fout );
return 0;
}