Bell 32V development
[unix-history] / usr / src / cmd / f77 / main.c
char *xxxvers[] = "\nFORTRAN 77 PASS 1, VERSION 1.16, 3 NOVEMBER 1978\n";
#include "defs"
main(argc, argv)
int argc;
char **argv;
{
char *s;
int k, retcode;
FILEP opf();
#define DONE(c) { retcode = c; goto finis; }
--argc;
++argv;
while(argc>0 && argv[0][0]=='-')
{
for(s = argv[0]+1 ; *s ; ++s) switch(*s)
{
case 'w':
if(s[1]=='6' && s[2]=='6')
{
ftn66flag = YES;
s += 2;
}
else
nowarnflag = YES;
break;
case 'U':
shiftcase = NO;
break;
case 'u':
undeftype = YES;
break;
case 'O':
optimflag = YES;
if( isdigit(s[1]) )
{
k = *++s - '0';
if(k > MAXREGVAR)
{
warn1("-O%d: too many register variables", k);
maxregvar = MAXREGVAR;
}
else
maxregvar = k;
}
break;
case 'd':
debugflag = YES;
break;
case 'p':
profileflag = YES;
break;
case 'C':
checksubs = YES;
break;
case '1':
onetripflag = YES;
break;
case 'I':
if(*++s == '2')
tyint = TYSHORT;
else if(*s == '4')
{
shortsubs = NO;
tyint = TYLONG;
}
else if(*s == 's')
shortsubs = YES;
else
fatal1("invalid flag -I%c\n", *s);
tylogical = tyint;
break;
default:
fatal1("invalid flag %c\n", *s);
}
--argc;
++argv;
}
if(argc != 4)
fatal1("arg count %d", argc);
asmfile = opf(argv[1]);
initfile = opf(argv[2]);
textfile = opf(argv[3]);
initkey();
if(inilex( copys(argv[0]) ))
DONE(1);
fprintf(diagfile, "%s:\n", argv[0]);
fileinit();
procinit();
if(k = yyparse())
{
fprintf(diagfile, "Bad parse, return code %d\n", k);
DONE(1);
}
if(nerr > 0)
DONE(1);
if(parstate != OUTSIDE)
{
warn("missing END statement");
endproc();
}
doext();
preven(ALIDOUBLE);
prtail();
#if FAMILY==SCJ
puteof();
#endif
DONE(0);
finis:
done(retcode);
return(retcode);
}
done(k)
int k;
{
static int recurs = NO;
if(recurs == NO)
{
recurs = YES;
clfiles();
}
exit(k);
}
LOCAL FILEP opf(fn)
char *fn;
{
FILEP fp;
if( fp = fopen(fn, "w") )
return(fp);
fatal1("cannot open intermediate file %s", fn);
/* NOTREACHED */
}
LOCAL clfiles()
{
clf(&textfile);
clf(&asmfile);
clf(&initfile);
}
clf(p)
FILEP *p;
{
if(p!=NULL && *p!=NULL && *p!=stdout)
{
if(ferror(*p))
fatal("writing error");
fclose(*p);
}
*p = NULL;
}