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 + -
显示快捷键?