⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -