Newer
Older
/*
* DATA DECLARATION BUILDER
* ==== =========== =======
*
******* Author:
*
* Duncan White, Imperial College, London, England.
*
******* Description:
*
* This program builds C data declarations, construction functions
* and print functions from a series of HOPE/Miranda style recursive
* data declarations. (with optional hints on printing)
* The output produced is placed in pair of files (eg. x.c and x.h )
* which together form a module provided the relevent data types.
*/
#include <dcw.h>
#include "struct.h"
#include "lexer.h"
#include "parser.h"
#define MUSTBE(b) ASSERT(b,("Usage: datadec [-vpo] outfile [infile]\n"))
#define NEED_ANOTHER_ARG MUSTBE( IS_ANOTHER_ARG )
#define REQUIRE_NO_MORE_ARGS MUSTBE( argc == arg )
#define IS_ANOTHER_ARG (argc > arg)
verbose = FALSE; print = FALSE; opt = FALSE;
for( s++; *s; s++ )
{
switch( *s )
{
case 'v':
verbose = TRUE;
break;
case 'p':
print = TRUE;
break;
case 'o':
opt = TRUE;
break;
default:
ABORT( ("datadec: illegal option -%c\n",*s) );
}
}
basename[len-2] = '\0';
}
sprintf( tempname, "%s.c", basename );
cfile = fopen( tempname, "w" );
ASSERT( cfile != NULL, ("datadec: can't create '%s'\n",tempname) );
sprintf( tempname, "%s.h", basename );
hfile = fopen( tempname, "w" );
ASSERT( hfile != NULL, ("datadec: can't create '%s'\n",tempname) );
if( IS_ANOTHER_ARG ) {
lexfile = fopen( argv[arg], "r" );
("datadec: can't open '%s'\n",argv[arg]) );
arg++;
REQUIRE_NO_MORE_ARGS;
if( parse_declns( &declns ) )
{
if( verbose )
{
print_declnlist( declns );
}
make_declns( declns, cfile, hfile, basename );
} else
{
fprintf( stderr, "datadec: can't parse input properly\n" );
}