#include <stdio.h>
#include "error.h"
#include "lexxer.h"
#include "global.h"
#include "write.h"
extern int yyparse();
static FILE *myfopen();
static void
parseArgs(argc, argv)
int argc;
char *argv[];
{
while (--argc > 0)
if ((++argv)[0][0] == '-')
{
switch (argv[0][1])
{
case 'q':
BeQuiet = TRUE;
break;
case 'Q':
BeQuiet = FALSE;
break;
case 'v':
BeVerbose = TRUE;
break;
case 'V':
BeVerbose = FALSE;
break;
case 'r':
UseMsgRPC = TRUE;
break;
case 'R':
UseMsgRPC = FALSE;
break;
case 'l':
UseEventLogger = FALSE;
break;
case 'L':
UseEventLogger = TRUE;
break;
case 'k':
BeAnsiC = TRUE;
break;
case 'K':
BeAnsiC = FALSE;
break;
case 's':
if (streql(argv[0], "-server"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -server option");
ServerFileName = strmake(argv[0]);
}
else if (streql(argv[0], "-sheader"))
{
--argc; ++argv;
if (argc == 0)
fatal ("missing name for -sheader option");
ServerHeaderFileName = strmake(argv[0]);
}
else if (streql(argv[0], "-split"))
UseSplitHeaders = TRUE;
else
GenSymTab = TRUE;
break;
case 'S':
GenSymTab = FALSE;
break;
case 't':
TestRPCTrap = TRUE;
UseRPCTrap = TRUE;
break;
case 'T':
UseRPCTrap = FALSE;
break;
case 'i':
if (streql(argv[0], "-iheader"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -iheader option");
InternalHeaderFileName = strmake(argv[0]);
}
else
{
--argc; ++argv;
if (argc == 0)
fatal("missing prefix for -i option");
UserFilePrefix = strmake(argv[0]);
}
break;
case 'u':
if (streql(argv[0], "-user"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -user option");
UserFileName = strmake(argv[0]);
}
else
fatal("unknown flag: '%s'", argv[0]);
break;
case 'h':
if (streql(argv[0], "-header"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -header option");
UserHeaderFileName = strmake(argv[0]);
}
else
fatal("unknown flag: '%s'", argv[0]);
break;
case 'd':
if (streql(argv[0], "-dheader"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing name for -dheader option");
DefinesHeaderFileName = strmake(argv[0]);
}
else
fatal("unknown flag: '%s'", argv[0]);
break;
case 'm':
if (streql(argv[0], "-maxonstack"))
{
--argc; ++argv;
if (argc == 0)
fatal("missing size for -maxonstack option");
MaxMessSizeOnStack = atoi(argv[0]);
}
else
fatal("unknown flag: '%s'", argv[0]);
break;
case 'x':
ShortCircuit = TRUE;
break;
case 'X':
ShortCircuit = FALSE;
break;
default:
fatal("unknown flag: '%s'", argv[0]);
}
}
else
fatal("bad argument: '%s'", *argv);
}
FILE *uheader, *server, *user;
void
main(argc, argv)
int argc;
char *argv[];
{
FILE *iheader, *sheader, *dheader;
time_t loc;
extern time_t time();
extern string_t ctime();
extern string_t GenerationDate;
set_program_name("mig");
parseArgs(argc, argv);
init_global();
init_type();
loc = time((time_t *)0);
GenerationDate = ctime(&loc);
LookNormal();
(void) yyparse();
if (errors > 0)
fatal("%d errors found. Abort.\n", errors);
more_global();
uheader = myfopen(UserHeaderFileName, "w");
if (!UserFilePrefix)
user = myfopen(UserFileName, "w");
server = myfopen(ServerFileName, "w");
if (ServerHeaderFileName)
sheader = myfopen(ServerHeaderFileName, "w");
if (IsKernelServer)
{
iheader = myfopen(InternalHeaderFileName, "w");
}
if (DefinesHeaderFileName)
dheader = myfopen(DefinesHeaderFileName, "w");
if (BeVerbose)
{
printf("Writing %s ... ", UserHeaderFileName);
fflush(stdout);
}
WriteUserHeader(uheader, stats);
fclose(uheader);
if (ServerHeaderFileName)
{
if (BeVerbose)
{
printf ("done.\nWriting %s ...", ServerHeaderFileName);
fflush (stdout);
}
WriteServerHeader(sheader, stats);
fclose(sheader);
}
if (IsKernelServer)
{
if (BeVerbose)
{
printf("done.\nWriting %s ... ", InternalHeaderFileName);
fflush(stdout);
}
WriteInternalHeader(iheader, stats);
fclose(iheader);
}
if (DefinesHeaderFileName)
{
if (BeVerbose)
{
printf ("done.\nWriting %s ...", DefinesHeaderFileName);
fflush (stdout);
}
WriteDefinesHeader(dheader, stats);
fclose(dheader);
}
if (UserFilePrefix)
{
if (BeVerbose)
{
printf("done.\nWriting individual user files ... ");
fflush(stdout);
}
WriteUserIndividual(stats);
}
else
{
if (BeVerbose)
{
printf("done.\nWriting %s ... ", UserFileName);
fflush(stdout);
}
WriteUser(user, stats);
fclose(user);
}
if (BeVerbose)
{
printf("done.\nWriting %s ... ", ServerFileName);
fflush(stdout);
}
WriteServer(server, stats);
fclose(server);
if (BeVerbose)
printf("done.\n");
exit(0);
}
static FILE *
myfopen(name, mode)
char *name;
char *mode;
{
char *realname;
FILE *file;
if (name == strNULL)
realname = "/dev/null";
else
realname = name;
file = fopen(realname, mode);
if (file == NULL)
fatal("fopen(%s): %s", realname, strerror(errno));
return file;
}