📄 driver.c
字号:
char *xxxvers[] = "\n FORTRAN 77 DRIVER, VERSION 1.13, 20 APRIL 1979\n";#include <stdio.h>#include <ctype.h>#include "defines"#include "locdefs"#include "drivedefs"#include "ftypes"#include <signal.h>static FILEP diagfile = {stderr} ;static int pid;static int sigivalue = 0;static int sigqvalue = 0;static int sighvalue = 0;static int sigtvalue = 0;static char *pass1name = PASS1NAME ;static char *pass2name = PASS2NAME ;static char *asmname = ASMNAME ;static char *ldname = LDNAME ;static char *footname = FOOTNAME;static char *proffoot = PROFFOOT;static char *macroname = "m4";static char *shellname = "/bin/sh";static char *aoutname = "a.out" ;static char *infname;static char textfname[15];static char asmfname[15];static char asmpass2[15];static char initfname[15];static char sortfname[15];static char prepfname[15];static char objfdefault[15];static char optzfname[15];static char setfname[15];static char fflags[30] = "-";static char cflags[20] = "-c";static char eflags[30] = "";static char rflags[30] = "";static char lflag[3] = "-x";static char *fflagp = fflags+1;static char *cflagp = cflags+2;static char *eflagp = eflags;static char *rflagp = rflags;static char **loadargs;static char **loadp;static flag erred = NO;static flag loadflag = YES;static flag saveasmflag = NO;static flag profileflag = NO;static flag optimflag = NO;static flag debugflag = NO;static flag verbose = NO;static flag nofloating = NO;static flag fortonly = NO;static flag macroflag = NO;main(argc, argv)int argc;char **argv;{int i, c, status;char *setdoto(), *lastchar(), *lastfield();ptr ckalloc();register char *s;char fortfile[20], *t;char buff[100];int intrupt();sigivalue = (int) signal(SIGINT, 1) & 01;sigqvalue = (int) signal(SIGQUIT,1) & 01;sighvalue = (int) signal(SIGHUP, 1) & 01;sigtvalue = (int) signal(SIGTERM,1) & 01;enbint(intrupt);pid = getpid();crfnames();loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) );loadargs[1] = "-X";loadargs[2] = "-u";#if HERE==PDP11 || HERE==VAX loadargs[3] = "_MAIN__";#endif#if HERE == INTERDATA loadargs[3] = "main";#endifloadp = loadargs + 4;--argc;++argv;while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0') { for(s = argv[0]+1 ; *s ; ++s) switch(*s) { case 'T': /* use special passes */ switch(*++s) { case '1': pass1name = s+1; goto endfor; case '2': pass2name = s+1; goto endfor; case 'a': asmname = s+1; goto endfor; case 'l': ldname = s+1; goto endfor; case 'F': footname = s+1; goto endfor; case 'm': macroname = s+1; goto endfor; default: fatal1("bad option -T%c", *s); } break; case 'w': if(s[1]=='6' && s[2]=='6') { *fflagp++ = *s++; *fflagp++ = *s++; } copyfflag: case 'u': case 'U': case 'M': case '1': case 'C': *fflagp++ = *s; break; case 'O': optimflag = YES;#if TARGET == INTERDATA *loadp++ = "-r"; *loadp++ = "-d";#endif *fflagp++ = 'O'; if( isdigit(s[1]) ) *fflagp++ = *++s; break; case 'm': if(s[1] == '4') ++s; macroflag = YES; break; case 'S': saveasmflag = YES; case 'c': loadflag = NO; break; case 'v': verbose = YES; break; case 'd': debugflag = YES; goto copyfflag; case 'p': profileflag = YES; *cflagp++ = 'p'; goto copyfflag; case 'o': if( ! strcmp(s, "onetrip") ) { *fflagp++ = '1'; goto endfor; } aoutname = *++argv; --argc; break;#if TARGET == PDP11 case 'f': nofloating = YES; pass2name = NOFLPASS2; break;#endif case 'F': fortonly = YES; loadflag = NO; break; case 'I': if(s[1]=='2' || s[1]=='4' || s[1]=='s') { *fflagp++ = *s++; goto copyfflag; } fprintf(diagfile, "invalid flag -I%c\n", s[1]); done(1); case 'l': /* letter ell--library */ s[-1] = '-'; *loadp++ = s-1; goto endfor; case 'E': /* EFL flag argument */ while( *eflagp++ = *++s) ; *eflagp++ = ' '; goto endfor; case 'R': while( *rflagp++ = *++s ) ; *rflagp++ = ' '; goto endfor; default: lflag[1] = *s; *loadp++ = copys(lflag); break; }endfor: --argc; ++argv; }loadargs[0] = ldname;#if TARGET == PDP11 if(nofloating) *loadp++ = (profileflag ? NOFLPROF : NOFLFOOT); else#endif*loadp++ = (profileflag ? proffoot : footname);for(i = 0 ; i<argc ; ++i) switch(c = dotchar(infname = argv[i]) ) { case 'r': /* Ratfor file */ case 'e': /* EFL file */ if( unreadable(argv[i]) ) { erred = YES; break; } s = fortfile; t = lastfield(argv[i]); while( *s++ = *t++) ; s[-2] = 'f'; if(macroflag) { if(sys(sprintf(buff, "%s %s >%s", macroname, infname, prepfname) )) { rmf(prepfname); erred = YES; break; } infname = prepfname; } if(c == 'e') sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile); else sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile); status = sys(buff); if(macroflag) rmf(infname); if(status) { erred = YES; rmf(fortfile); break; } if( ! fortonly ) { infname = argv[i] = lastfield(argv[i]); *lastchar(infname) = 'f'; if( dofort(argv[i]) ) erred = YES; else { if( nodup(t = setdoto(argv[i])) ) *loadp++ = t; rmf(fortfile); } } break; case 'f': /* Fortran file */ case 'F': if( unreadable(argv[i]) ) erred = YES; else if( dofort(argv[i]) ) erred = YES; else if( nodup(t=setdoto(argv[i])) ) *loadp++ = t; break; case 'c': /* C file */ case 's': /* Assembler file */ if( unreadable(argv[i]) ) { erred = YES; break; }#if HERE==PDP11 || HERE==VAX fprintf(diagfile, "%s:\n", argv[i]);#endif sprintf(buff, "cc -c %s", argv[i] ); if( sys(buff) ) erred = YES; else if( nodup(t = setdoto(argv[i])) ) *loadp++ = t; break; case 'o': if( nodup(argv[i]) ) *loadp++ = argv[i]; break; default: if( ! strcmp(argv[i], "-o") ) aoutname = argv[++i]; else *loadp++ = argv[i]; break; }if(loadflag && !erred) doload(loadargs, loadp);done(erred);}dofort(s)char *s;{int retcode;char buff[200];infname = s;sprintf(buff, "%s %s %s %s %s %s", pass1name, fflags, s, asmfname, initfname, textfname);switch( sys(buff) ) { case 1: goto error; case 0: break; default: goto comperror; }if(content(initfname) > 0) if( dodata() ) goto error;if( dopass2() ) goto comperror;doasm(s);retcode = 0;ret: rmf(asmfname); rmf(initfname); rmf(textfname); return(retcode);error: fprintf(diagfile, "\nError. No assembly.\n"); retcode = 1; goto ret;comperror: fprintf(diagfile, "\ncompiler error.\n"); retcode = 2; goto ret;}dopass2(){char buff[100];if(verbose) fprintf(diagfile, "PASS2.");#if FAMILY==DMR sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2); return( sys(buff) );#endif#if FAMILY == SCJ# if TARGET==INTERDATA sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);# else sprintf(buff, "%s <%s >%s", pass2name, textfname, asmpass2);# endif return( sys(buff) );#endif}doasm(s)char *s;{register char *lastc;char *obj;char buff[200];if(*s == '\0') s = objfdefault;lastc = lastchar(s);obj = setdoto(s);#if TARGET==PDP11 || TARGET==VAX#ifdef PASS2OPTif(optimflag) { if( sys(sprintf(buff, "%s %s %s", PASS2OPT, asmpass2, optzfname)) ) rmf(optzfname); else sys(sprintf(buff,"mv %s %s", optzfname, asmpass2)); }#endif#endifif(saveasmflag) { *lastc = 's';#if TARGET == INTERDATA sys( sprintf(buff, "cat %s %s %s >%s", asmfname, setfname, asmpass2, obj) );#else sys( sprintf(buff, "cat %s %s >%s", asmfname, asmpass2, obj) );#endif *lastc = 'o'; }else { if(verbose) fprintf(diagfile, " ASM.");#if TARGET == INTERDATA sprintf(buff, "%s -o %s %s %s %s", asmname, obj, asmfname, setfname, asmpass2);#endif#if TARGET == VAX /* vax assembler currently accepts only one input file */ sys(sprintf(buff, "cat %s >>%s", asmpass2, asmfname)); sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);#endif#if TARGET == PDP11 sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2);#endif#if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2);#endif if( sys(buff) ) fatal("assembler error"); if(verbose) fprintf(diagfile, "\n");#if HERE==PDP11 && TARGET!=PDP11 rmf(obj);#endif }rmf(asmpass2);}doload(v0, v)register char *v0[], *v[];{char **p;int waitpid;for(p = liblist ; *p ; *v++ = *p++) ;*v++ = "-o";*v++ = aoutname;*v = NULL;if(verbose) fprintf(diagfile, "LOAD.");if(debugflag) { for(p = v0 ; p<v ; ++p) fprintf(diagfile, "%s ", *p); fprintf(diagfile, "\n"); }#if HERE==PDP11 || HERE==INTERDATA || HERE==VAX if( (waitpid = fork()) == 0) { enbint(SIG_DFL); execv(ldname, v0); fatal1("couldn't load %s", ldname); } await(waitpid);#endif#if HERE==INTERDATA if(optimflag) { char buff[100]; if( sys(sprintf(buff, "nopt %s -o junk.%d", aoutname, pid)) || sys(sprintf(buff, "mv junk.%d %s", pid, aoutname)) ) err("bad optimization"); }#endifif(verbose) fprintf(diagfile, "\n");}/* Process control and Shell-simulating routines */sys(str)char *str;{register char *s, *t;char *argv[100], path[100];char *inname, *outname;int append;int waitpid;int argc;if(debugflag) fprintf(diagfile, "%s\n", str);inname = NULL;outname = NULL;argv[0] = shellname;argc = 1;t = str;while( isspace(*t) ) ++t;while(*t) { if(*t == '<') inname = t+1; else if(*t == '>') { if(t[1] == '>') { append = YES; outname = t+2; } else { append = NO; outname = t+1; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -