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

📄 fc.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
/* Fortran command */char	*tmp;char ts[1000];char *tsp ts;char *av[50];char *clist[50];char *llist[50];int instring;int pflag;int cflag;char	*complr;int *ibuf;int *ibuf1;int *ibuf2;int *obuf;char *lp;char *line;int lineno;int exfail;struct symtab {	char name[8];	char *value;} *symtab;int symsiz 200;struct symtab *defloc;struct symtab *incloc;char *stringbuf;main(argc, argv)char *argv[]; {	char *t;	int nc, nl, i, j, c, nxo;	int dexit();	complr = "/usr/fort/fc1";	i = nc = nl = nxo = 0;	while(++i < argc) {		if(*argv[i] == '-')			switch (argv[i][1]) {				default:					goto passa;				case 'p':					pflag++;				case 'c':					cflag++;					break;				case '2':					complr = "/usr/fort/fc2";					break;			}		else {		passa:			t = argv[i];			if(getsuf(t)=='f') {				clist[nc++] = t;				t = setsuf(copy(t), 'o');			}			if (nodup(llist, t)) {				llist[nl++] = t;				if (getsuf(t)=='o')					nxo++;			}		}	}	if(nc==0)		goto nocom;	if ((signal(2, 1) & 01) == 0)		signal(2, &dexit);	for (i=0; i<nc; i++) {		if (nc>1)			printf("%s:\n", clist[i]);		tmp = 0;		av[0] = complr;		av[1] = expand(clist[i]);		if (pflag || exfail)			continue;		if (av[1] == 0) {			cflag++;			continue;		}		av[2] = 0;		t = callsys(complr, av);		if(tmp)			cunlink(tmp);		if(t) {			cflag++;			continue;		}		av[0] = "as";		av[1] = "-";		av[2] = "f.tmp1";		av[3] = 0;		callsys("/bin/as", av);		t = setsuf(clist[i], 'o');		cunlink(t);		if(link("a.out", t) || cunlink("a.out")) {			printf("move failed: %s\n", t);			cflag++;		}	}nocom:	if (cflag==0 && nl!=0) {		i = 0;		av[0] = "ld";		av[1] = "-x";		av[2] = "/lib/fr0.o";		j = 3;		while(i<nl)			av[j++] = llist[i++];		av[j++] = "-lf";		av[j++] = "/lib/filib.a";		av[j++] = "-l";		av[j++] = 0;		callsys("/bin/ld", av);		if (nc==1 && nxo==1)			cunlink(setsuf(clist[0], 'o'));	}	dexit();}dexit(){	unlink("f.tmp1");	exit();}expand(file)char *file;{	int ib1[259], ib2[259], ob[259];	struct symtab stab[200];	char ln[196], sbf[1024];	int c;	exfail = 0;	ibuf = ibuf1 = ib1;	ibuf2 = ib2;	if (fopen(file, ibuf1)<0)		return(file);	if (getc(ibuf1) != '#') {		close(ibuf1[0]);		return(file);	}	ibuf1[1]++;	ibuf1[2]--;	obuf = ob;	symtab = stab;	for (c=0; c<200; c++) {		stab[c].name[0] = '\0';		stab[c].value = 0;	}	defloc = lookup("define", 1);	defloc->value = defloc->name;	incloc = lookup("include", 1);	incloc->value = incloc->name;	stringbuf = sbf;	line  = ln;	lineno = 0;	tmp = setsuf(copy(file), 'i');	if (fcreat(tmp, obuf) < 0) {		printf("Can't creat %s\n", tmp);		dexit();	}	while(getline()) {/*		if (ibuf==ibuf2)			putc(001, obuf);	/*SOH: insert */		if (ln[0] != '#')			for (lp=line; *lp!='\0'; lp++)				putc(*lp, obuf);		putc('\n', obuf);	}	fflush(obuf);	close(obuf[0]);	close(ibuf1[0]);	return(tmp);}getline(){	int c, sc, state;	struct symtab *np;	char *namep, *filname;	if (ibuf==ibuf1)		lineno++;	lp = line;	*lp = '\0';	state = 0;	if ((c=getch()) == '#')		state = 1;	while (c!='\n' && c!='\0') {		if ('a'<=c && c<='z' || 'A'<=c && c<='Z' || c=='_') {			namep = lp;			sch(c);			while ('a'<=(c=getch()) && c<='z'			      ||'A'<=c && c<='Z'			      ||'0'<=c && c<='9' 			      ||c=='_')				sch(c);			sch('\0');			lp--;			np = lookup(namep, state);			if (state==1) {				if (np==defloc)					state = 2;				else if (np==incloc)					state = 3;				else {					error("Undefined control");					while (c!='\n' && c!='\0')						c = getch();					return(c);				}			} else if (state==2) {				np->value = stringbuf;				while ((c=getch())!='\n' && c!='\0')					savch(c);				savch('\0');				return(1);			}			continue;		} else if ((sc=c)=='\'' || sc=='"') {			sch(sc);			filname = lp;			instring++;			while ((c=getch())!=sc && c!='\n' && c!='\0') {				sch(c);				if (c=='\\')					sch(getch());			}			instring = 0;			if (state==3) {				*lp = '\0';				while ((c=getch())!='\n' && c!='\0');				if (ibuf==ibuf2)					error("Nested 'include'");				if (fopen(filname, ibuf2)<0)					error("Missing file %s", filname);				else					ibuf = ibuf2;				return(c);			}		}		sch(c);		c = getch();	}	sch('\0');	if (state>1)		error("Control syntax");	return(c);}error(s, x){	printf("%d: ", lineno);	printf(s, x);	putchar('\n');	exfail++;	cflag++;}sch(c){	if (lp==line+194)		error("Line overflow");	*lp++ = c;	if (lp>line+195)		lp = line+195;}savch(c){	*stringbuf++ = c;}getch(){	static peekc;	int c;	if (peekc) {		c = peekc;		peekc = 0;		return(c);	}loop:	if ((c=getc1())=='/' && !instring) {		if ((peekc=getc1())!='*')			return('/');		peekc = 0;		for(;;) {			c = getc1();		cloop:			switch (c) {			case '\0':				return('\0');			case '*':				if ((c=getc1())=='/')					goto loop;				goto cloop;			case '\n':				if (ibuf==ibuf1) {					putc('\n', obuf);					lineno++;				}				continue;			}		}	}	return(c);}getc1(){	int c;	if ((c = getc(ibuf)) < 0 && ibuf==ibuf2) {		close(ibuf2[0]);		ibuf = ibuf1;		putc('\n', obuf);		c = getc1();	}	if (c<0)		return(0);	return(c);}lookup(namep, enterf)char *namep;{	char *np, *snp;	struct symtab *sp;	int i, c;	np = namep;	i = 0;	while (c = *np++)		i =+ c;	i =% symsiz;	sp = &symtab[i];	while (sp->name[0]) {		snp = sp;		np = namep;		while (*snp++ == *np)			if (*np++ == '\0' || np==namep+8) {				if (!enterf)					subst(namep, sp);				return(sp);			}		if (sp++ > &symtab[symsiz])			sp = symtab;	}	if (enterf) {		for (i=0; i<8; i++)			if (sp->name[i] = *namep)				namep++;		while (*namep)			namep++;	}	return(sp);}subst(np, sp)char *np;struct symtab *sp;{	char *vp;	lp = np;	if ((vp = sp->value) == 0)		return;	sch(' ');	while (*vp)		sch(*vp++);	sch(' ');}getsuf(s)char s[];{	int c;	char t, *os;	c = 0;	os = s;	while(t = *s++)		if (t=='/')			c = 0;		else			c++;	s =- 3;	if (c<=14 && c>2 && *s++=='.')		return(*s);	return(0);}setsuf(s, ch)char s[];{	char *os;	os = s;	while(*s++);	s[-2] = ch;	return(os);}callsys(f, v)char f[], *v[]; {	int t, status;	if ((t=fork())==0) {		execv(f, v);		printf("Can't find %s\n", f);		exit(1);	} else		if (t == -1) {			printf("Try again\n");			return(1);		}	while(t!=wait(&status));	if ((t=(status&0377)) != 0 && t!=14) {		if (t!=2)		/* interrupt */			printf("Fatal error in %s\n", f);		dexit();	}	return((status>>8) & 0377);}copy(s)char s[]; {	char *otsp;	otsp = tsp;	while(*tsp++ = *s++);	return(otsp);}nodup(l, s)char **l, s[]; {	char *t, *os, c;	if (getsuf(s) != 'o')		return(1);	os = s;	while(t = *l++) {		s = os;		while(c = *s++)			if (c != *t++)				break;		if (*t++ == '\0')			return(0);	}	return(1);}cunlink(f)char *f;{	if (f==0)		return(0);	return(unlink(f));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -