f77.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 1,404 行 · 第 1/2 页
C
1,404 行
case 0: break; default: goto comperror; }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 == PCC# if TARGET==INTERDATA sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);# else sprintf(buff, "%s %s %s >%s", pass2name, f2flags, textfname, asmpass2);# endif return( sys(buff) );#endif}doasm(s)char *s;{register char *lastc;char *obj;char buff[200];char *lastchar(), *setdoto();if(*s == '\0') s = objfdefault;lastc = lastchar(s);obj = setdoto(s);#if TARGET==PDP11 || TARGET==VAX# ifdef PASS2OPT if(optimflag) { sprintf(buff, "%s -f %s %s", pass2opt, asmpass2, optzfname); if( sys(buff) ) rmf(optzfname); else { sprintf(buff,"mv %s %s", optzfname, asmpass2); sys(buff); } }# endif#endifif(saveasmflag) { *lastc = 's';#if TARGET == INTERDATA sprintf(buff, "%s %s %s %s %s >%s", CATNAME, asmfname, initfname, setfname, asmpass2, obj);#else#if TARGET == VAX if (sdbflag) sprintf(buff, "%s %s %s %s >%s", CATNAME, asmfname, asmpass2, initfname, obj); else sprintf(buff, "%s %s %s %s >%s", CATNAME, asmfname, initfname, asmpass2, obj);#else sprintf(buff, "%s %s %s %s >%s", CATNAME, asmfname, initfname, asmpass2, obj);#endif#endif sys(buff); *lastc = 'o'; }else { if(verbose) fprintf(diagfile, " ASM.");#if TARGET == INTERDATA sprintf(buff, "%s -o %s %s %s %s %s", asmname, obj, asmfname, initfname, setfname, asmpass2);#endif#if TARGET == VAX /* vax assembler currently accepts only one input file */ if (sdbflag) sprintf(buff, "%s %s %s >>%s", CATNAME, asmpass2, initfname, asmfname); else sprintf(buff, "%s %s %s >>%s", CATNAME, initfname, asmpass2, asmfname); sys(buff);#ifdef UCBVAXASM sprintf(buff, "%s -J -o %s %s", asmname, obj, asmfname);#else sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);#endif#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;if(sdbflag) *v++ = "-lg";if (profileflag) { for(p = p_liblist ; *p ; *v++ = *p++) ; }else { 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); fatalstr("couldn't load %s", ldname); } await(waitpid);#endif#if HERE==INTERDATA if(optimflag) { char buff1[100], buff2[100]; sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid); sprintf(buff2, "mv junk.%d %s", pid, aoutname); if( sys(buff1) || sys(buff2) ) 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; } } 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 */ fatalstr("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) fatalstr("%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);}#ifdef PSIGNAL/* * Fancy 4.2 BSD signal printing stuff. */char harmless[NSIG] = { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 };#endifawait(waitpid)int waitpid;{#ifdef PSIGNALextern char *sys_siglist[];union wait status;#else PSIGNALint status;#endif PSIGNALint w;enbint(SIG_IGN);while ( (w = wait(&status)) != waitpid) if(w == -1) fatal("bad wait code");enbint(intrupt);#ifdef PSIGNALif(status.w_termsig) { debugflag = 0; /* Prevent us from dumping core ourselves */ if(status.w_termsig != SIGINT && status.w_termsig < NSIG) fprintf(diagfile, "%s%s\n", sys_siglist[status.w_termsig], status.w_coredump ? " -- core dumped" : ""); if(status.w_termsig < NSIG && ! harmless[status.w_termsig]) fatal("see a system manager"); else done(3); }return(status.w_retcode);#else PSIGNALif(status & 0377) { if(status != SIGINT) fprintf(diagfile, "Termination code %d\n", status); done(3); }return(status>>8);#endif PSIGNAL}/* 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); }}stupid(s)char *s;{char c;if( (c = dotchar(s)) && index("focsreF", c) && access(s, 0) == 0 ) { fprintf(diagfile, "Loading on %s would destroy it\n", s); return(YES); }return(NO);}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 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') */if(fn!=NULL && *fn!='\0') unlink(fn);}LOCAL fname(name, suff)char *name, *suff;{sprintf(name, "/tmp/%s%d.%s", temppref, 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;{fatalstr("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 */}char *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);}char *copys(s)char *s;{return( copyn( strlen(s)+1 , s) );}oneof(c,s)register c;register char *s;{while( *s ) if(*s++ == c) return(YES);return(NO);}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 fatali(t,d)char *t;int d;{char buff[100];sprintf(buff, t, d);fatal(buff);}static fatalstr(t, s)char *t, *s;{char buff[100];sprintf(buff, t, s);fatal(buff);}err(s)char *s;{fprintf(diagfile, "Error in file %s: %s\n", infname, s);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?