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

📄 driver.c

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