#include <stdlib.h>
#include <stdio.h>
#include "error.h"
#include "lexxer.h"
#include "global.h"
#include "write.h"
#ifdef __LP64__
#error "migcom is not yet x86_64 compatible."
#endif
extern int yyparse();
static FILE *myfopen();
static void
parseArgs(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':
warn("Mach RPC traps not fully supported");
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 = FALSE;
break;
case 'x':
ShortCircuit = TRUE;
default:
fatal("unknown/unsupported flag: '%s'", argv[0]);
}
}
else
fatal("bad argument: '%s'", *argv);
}
FILE *uheader, *server, *user;
int
main(int argc, char *argv[])
{
FILE *iheader = 0;
FILE *sheader = 0;
FILE *dheader = 0;
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 (mig_errors > 0)
fatal("%d errors found. Abort.\n", mig_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(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;
}