📄 driver.c
字号:
else argv[argc++] = t; while( !isspace(*t) && *t!='\0' ) ++t; if(*t) { *t++ = '\0'; while( isspace(*t) ) ++t; } }if(argc == 1) /* no command */ return(-1);argv[argc] = 0;s = path;t = "/usr/bin/";while(*t) *s++ = *t++;for(t = argv[1] ; *s++ = *t++ ; ) ;if((waitpid = fork()) == 0) { if(inname) freopen(inname, "r", stdin); if(outname) freopen(outname, (append ? "a" : "w"), stdout); enbint(SIG_DFL); texec(path+9, argv); /* command */ texec(path+4, argv); /* /bin/command */ texec(path , argv); /* /usr/bin/command */ fatal1("Cannot load %s",path+9); }return( await(waitpid) );}#include "errno.h"/* modified version from the Shell */texec(f, av)char *f;char **av;{extern int errno;execv(f, av+1);if (errno==ENOEXEC) { av[1] = f; execv(shellname, av); fatal("No shell!"); }if (errno==ENOMEM) fatal1("%s: too large", f);}done(k)int k;{static int recurs = NO;if(recurs == NO) { recurs = YES; rmfiles(); }exit(k);}enbint(k)int (*k)();{if(sigivalue == 0) signal(SIGINT,k);if(sigqvalue == 0) signal(SIGQUIT,k);if(sighvalue == 0) signal(SIGHUP,k);if(sigtvalue == 0) signal(SIGTERM,k);}intrupt(){done(2);}await(waitpid)int waitpid;{int w, status;enbint(SIG_IGN);while ( (w = wait(&status)) != waitpid) if(w == -1) fatal("bad wait code");enbint(intrupt);if(status & 0377) { if(status != SIGINT) fprintf(diagfile, "Termination code %d", status); done(3); }return(status>>8);}/* File Name and File Manipulation Routines */unreadable(s)register char *s;{register FILE *fp;if(fp = fopen(s, "r")) { fclose(fp); return(NO); }else { fprintf(diagfile, "Error: Cannot read file %s\n", s); return(YES); }}clf(p)FILEP *p;{if(p!=NULL && *p!=NULL && *p!=stdout) { if(ferror(*p)) fatal("writing error"); fclose(*p); }*p = NULL;}rmfiles(){rmf(textfname);rmf(asmfname);rmf(initfname);rmf(asmpass2);#if TARGET == INTERDATA rmf(setfname);#endif}/* return -1 if file does not exist, 0 if it is of zero length and 1 if of positive length*/content(filename)char *filename;{#ifdef VERSION6 struct stat { char cjunk[9]; char size0; int size1; int ijunk[12]; } buf;#else# include <sys/types.h># include <sys/stat.h> struct stat buf;#endifif(stat(filename,&buf) < 0) return(-1);#ifdef VERSION6 return(buf.size0 || buf.size1);#else return( buf.st_size > 0 );#endif}crfnames(){fname(textfname, "x");fname(asmfname, "s");fname(asmpass2, "a");fname(initfname, "d");fname(sortfname, "S");fname(objfdefault, "o");fname(prepfname, "p");fname(optzfname, "z");fname(setfname, "A");}rmf(fn)register char *fn;{if(!debugflag && fn!=NULL && *fn!='\0') unlink(fn);}LOCAL fname(name, suff)char *name, *suff;{sprintf(name, "fort%d.%s", pid, suff);}dotchar(s)register char *s;{for( ; *s ; ++s) if(s[0]=='.' && s[1]!='\0' && s[2]=='\0') return( s[1] );return(NO);}char *lastfield(s)register char *s;{register char *t;for(t = s; *s ; ++s) if(*s == '/') t = s+1;return(t);}char *lastchar(s)register char *s;{while(*s) ++s;return(s-1);}char *setdoto(s)register char *s;{*lastchar(s) = 'o';return( lastfield(s) );}badfile(s)char *s;{fatal1("cannot open intermediate file %s", s);}ptr ckalloc(n)int n;{ptr p, calloc();if( p = calloc(1, (unsigned) n) ) return(p);fatal("out of memory");/* NOTREACHED */}copyn(n, s)register int n;register char *s;{register char *p, *q;p = q = (char *) ckalloc(n);while(n-- > 0) *q++ = *s++;return(p);}copys(s)char *s;{return( copyn( strlen(s)+1 , s) );}nodup(s)char *s;{register char **p;for(p = loadargs ; p < loadp ; ++p) if( !strcmp(*p, s) ) return(NO);return(YES);}static fatal(t)char *t;{fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t);if(debugflag) abort();done(1);exit(1);}static fatal1(t,d)char *t, *d;{char buff[100];fatal( sprintf(buff, t, d) );}err(s)char *s;{fprintf(diagfile, "Error in file %s: %s\n", infname, s);}LOCAL int nch = 0;LOCAL FILEP asmfile;LOCAL FILEP sortfile;#include "ftypes"static ftnint typesize[NTYPES] = { 1, SZADDR, SZSHORT, SZLONG, SZLONG, 2*SZLONG, 2*SZLONG, 4*SZLONG, SZLONG, 1, 1, 1};static int typealign[NTYPES] = { 1, ALIADDR, ALISHORT, ALILONG, ALILONG, ALIDOUBLE, ALILONG, ALIDOUBLE, ALILONG, 1, 1, 1};dodata(){char buff[50];char varname[XL+1], ovarname[XL+1];int status;flag erred;ftnint offset, vlen, type;register ftnint ooffset, ovlen;ftnint vchar;int size, align;int vargroup;ftnint totlen, doeven();erred = NO;ovarname[0] = '\0';ooffset = 0;ovlen = 0;totlen = 0;nch = 0;if(status = sys( sprintf(buff, "sort %s >%s", initfname, sortfname) ) ) fatal1("call sort status = %d", status);if( (sortfile = fopen(sortfname, "r")) == NULL) badfile(sortfname);if( (asmfile = fopen(asmfname, "a")) == NULL) badfile(asmfname);pruse(asmfile, USEINIT);while( rdname(&vargroup, varname) && rdlong(&offset) && rdlong(&vlen) && rdlong(&type) ) { size = typesize[type]; if( strcmp(varname, ovarname) ) { prspace(ovlen-ooffset); strcpy(ovarname, varname); ooffset = 0; totlen += ovlen; ovlen = vlen; if(vargroup == 0) align = (type==TYCHAR ? SZLONG : typealign[type]); else align = ALIDOUBLE; totlen = doeven(totlen, align); if(vargroup == 2) prcomblock(asmfile, varname); else fprintf(asmfile, LABELFMT, varname); } if(offset < ooffset) { erred = YES; err("overlapping initializations"); } if(offset > ooffset) { prspace(offset-ooffset); ooffset = offset; } if(type == TYCHAR) { if( ! rdlong(&vchar) ) fatal("bad intermediate file format"); prch( (int) vchar ); } else { putc('\t', asmfile); while ( putc( getc(sortfile), asmfile) != '\n') ; } if( (ooffset += size) > ovlen) { erred = YES; err("initialization out of bounds"); } }prspace(ovlen-ooffset);totlen = doeven(totlen+ovlen, (ALIDOUBLE>SZLONG ? ALIDOUBLE : SZLONG) );clf(&sortfile);clf(&asmfile);clf(&sortfile);rmf(sortfname);return(erred);}prspace(n)register ftnint n;{register ftnint m;while(nch>0 && n>0) { --n; prch(0); }m = SZSHORT * (n/SZSHORT);if(m > 0) prskip(asmfile, m);for(n -= m ; n>0 ; --n) prch(0);}ftnint doeven(tot, align)register ftnint tot;int align;{ftnint new;new = roundup(tot, align);prspace(new - tot);return(new);}rdname(vargroupp, name)int *vargroupp;register char *name;{register int i, c;if( (c = getc(sortfile)) == EOF) return(NO);*vargroupp = c - '0';for(i = 0 ; i<XL ; ++i) { if( (c = getc(sortfile)) == EOF) return(NO); if(c != ' ') *name++ = c; }*name = '\0';return(YES);}rdlong(n)register ftnint *n;{register int c;for(c = getc(sortfile) ; c!=EOF && isspace(c) ; c = getc(sortfile) ); ;if(c == EOF) return(NO);for(*n = 0 ; isdigit(c) ; c = getc(sortfile) ) *n = 10* (*n) + c - '0';return(YES);}prch(c)register int c;{static int buff[SZSHORT];buff[nch++] = c;if(nch == SZSHORT) { prchars(asmfile, buff); nch = 0; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -