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

📄 dr.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
## include "../mcons.h"# include "../ccmn.h"/*int	mbuf[1024];	/*INSTR*//*int	tbuf[36];	/*INSTR*/int	(*acts[])()	{0,			&coll,			&save,			&out,			&asym,			&asw,			&csym,			&csw,			&incl,			&decl,			&sk2,			&sk,			&tabs,			&semi			};char	*tmp[5]	{"/tmp/crt0a",		"/tmp/crt1a",		"/tmp/crt2a",		"/tmp/crt3a",		"/tmp/crt4a"		};char	*ignonl	"/usr/lib/aign";char	*gtab	"/usr/lib/atab";main(argc,argv)	char	*argv[];{	auto	i,j,tm1,tm2,tm3;	char	*fn,*av[8];/*	extern	etext;	/*INSTR*//*	monitor(&main,&etext,&mbuf,1024);	/*INSTR*/	if(argc < 2) {		printf("Usage: cref [-aceilosux] file1 ...\n");		exit();	}	lbuf[4] = '\t';	if(*argv[1] == '-') {		j = flags(argv);		argv =+ j;		argc =- j;	}	init();	i = 0;	while(++i < argc) {		curs[0] = '_';		curs[1] = '\t';		curs[4] = '\t';		cursl = 2;		if(fopen(argv[i],ibuf1) < 0) {			printf("Can't open %s\n",argv[i]);			dexit();		}		ibuf = ibuf1;		curf[0] = '\t';		curfl = 1;		while((curf[curfl] = *argv[i]++) != 0 && curfl <= 8)			if(curf[curfl++] == '/')	curfl = 1;		curf[curfl++] = '\t';		if(curfl == 10)	curf[9] = -1;/*		printf("%s %d\n",curf,curfl);/*DEBUG*/		lno = 1;		driver();		close(file);	}	for(j = 0; j < 4;) {		flsh(j,0);		close(tp[j++]);	}/*	monitor(0);	/*INSTR*//*	dexit();	/*INSTR*//*	times(tbuf);	/*INSTR*//*	tm1 = tbuf[15]/6;	/*INSTR*//*	tm2 = tbuf[19]/6;	/*INSTR*//*	tm3 = tbuf[23]/6;	/*INSTR*//*	printf("Prep: %d  %d  %d\n",tm1,tm2,tm3);	/*INSTR*/	if(utmp)	exit();	fn = "/bin/sort";	av[0] = "sort";	av[1] = "-a";	av[3] = "-o";	av[5] = 0;	for(i = 0; i < 4; i++) {		av[4] = av[2] = tmp[i];		callsys(fn,av);		if(utmp)	break;	}/*	times(tbuf);	/*INSTR*//*	tm1 = tbuf[27]/6;	/*INSTR*//*	tm2 = tbuf[31]/6;	/*INSTR*//*	tm3 = tbuf[35]/6;	/*INSTR*//*	printf("Sort: %d  %d  %d\n",tm1,tm2,tm3);	/*INSTR*/	if(usw) {		fn = "/usr/bin/upost";		av[0] = "upost";		i = 0;	} else {		fn = "/usr/bin/crpost";		av[0] = "crpost";		av[1] = cross? "-4x": "-3";		i = 1;	}	j = -1;	while(++j < 4) {		av[++i] = tmp[j];		if(utmp)	break;	}	av[++i] = 0;	callsys(fn,av);/*	times(tbuf);	/*INSTR*//*	tm1 = tbuf[27]/6 - tm1;	/*INSTR*//*	tm2 = tbuf[31]/6 - tm2;	/*INSTR*//*	tm3 = tbuf[35]/6 - tm3;	/*INSTR*//*	printf("Post: %d  %d  %d\n",tm1,tm2,tm3);	/*INSTR*/	dexit();}driver(){	auto	p;top:	l = -1;	while((c = line[++l] = getc(ibuf)) != -1) {		if(l >= 131) {			printf("Line too long: %d %s\n",lno,curf);			dexit();		}		if(c & 0200) {			printf("Illegal character: %o line %d\n",c,lno);			dexit();		}		if(fl) {			if((*flag[fl])())				continue;		}/*printf("cs = %d cc = %c ca = %d\n",cs,c,tab[cs].cl[c]);	/*DEBUG*/		if(p = tab[cs].cl[c])			(*acts[p])();		continue;	}	if(ibuf == ibuf1)	return;	ibuf = ibuf1;	goto top;}init(){	int	b[3];	auto	fi,i;	extern	coll(),save(),out(),asym(),asw(),csym(),csw();	extern	incl(),decl(),sk(),sk2();	extern	dexit();	ibuf1 = &ib1;	ibuf2 = &ib2;	xtab.hptr = &xpsp;	xtab.symt = &xssp;	xtab.hsiz = PTRX;	xtab.ssiz = CHARX;	xtab.nsym = 0;	xtab.curb = 1;	itab.hptr = &ipsp;	itab.symt = &issp;	itab.hsiz = PTRI;	itab.ssiz = CHARI;	itab.nsym = 0;	itab.curb = 1;	if((fi = open(gtab,0)) < 0) {		printf("Cannot open grammar table; see lem\n");		dexit();	}	i = -1;	while(++i < NUMS)		if(read(fi,tab[i].cl,256) < 256) {			printf("Bad grammar table.\n");			dexit();		}	close(fi);	if((fi = open(ignonl,0)) < 0) {		printf("Cannot open ignore/only file: %s\n",ignonl);		dexit();	}	if((read(fi,b,6) == 6) && (b[0] == 0100200)) {		if(read(fi,itab.hptr,b[1]) < b[1]) {			printf("Cannot read ignore/only file: %s\n",ignonl);			dexit();		}		if(read(fi,itab.symt,b[2]) < b[2]) {			printf("Cannot read ignore/only file: %s\n",ignonl);			dexit();		}		close(fi);	} else {		close(fi);		compile();	}	if((signal(1,1) & 1) == 0)	signal(1,&dexit);	if((signal(2,1) & 1) == 0)	signal(2,&dexit);	if((signal(3,1) & 1) == 0)	signal(3,&dexit);/*	signal(4,&dexit);	signal(5,&dexit);	signal(6,&dexit);	signal(7,&dexit);	signal(8,&dexit);	signal(10,&dexit);	signal(11,&dexit);	signal(12,&dexit);*/	if(utmp == 0) {		while((tp[4] = creat(tmp[4],0)) < 0)			tmp[4][9]++;		close(tp[4]);		tmp[0][9] = tmp[4][9];		tmp[1][9] = tmp[4][9];		tmp[2][9] = tmp[4][9];		tmp[3][9] = tmp[4][9];		tp[0] = creat(tmp[0],CREATC);		tp[1] = creat(tmp[1],CREATC);		tp[2] = creat(tmp[2],CREATC);		tp[3] = creat(tmp[3],CREATC);	} else {		if((tp[0] = creat(utmp,CREATC)) < 0) {		printf("Can't create user's temp file.\n");			exit();		}	}	return;}error(a){	printf("Error %d\n",a);	dexit();}dexit(){	extern	nflush;/*	printf("nflush = %d\n",nflush);	/*DEBUG*/	if(tp[0] > 0 && utmp == 0) {		unlink(tmp[0]);		unlink(tmp[1]);		unlink(tmp[2]);		unlink(tmp[3]);		unlink(tmp[4]);	}	exit();}callsys(f,v)	char	f[],*v[];{	int	t,status,i;	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));/*	printf("Status = %o, %s\n",status,f);	/*DEBUG*/	if((t = (status & 0377)) != 0) {		if(t != 2) {			printf("Fatal error in %s\n",f);			printf("t = %d\n",t);		}		dexit();	}	return((status>>8) & 0377);}flags(argv)	char	*argv[];{	int	j,xx;	char	*ap;	j = 1;	ap = argv[1];	while(*++ap != '\0') {		switch(*ap) {			default:				printf("Unrecognized flag: %c\n",*ap);				dexit();			case '1':	/* Symbol first */				order = 1;				continue;			case '2':	/* Current file first */				order = 2;				continue;			case '3':	/* Current symbol first */				order = 3;				continue;			case 'a':	/* Assembler */				cflag = 0;				continue;			case 'c':	/* C */				gtab = "/usr/lib/ctab";				if(!xx)					ignonl = "/usr/lib/cign";				cflag = 1;				continue;			case 'e':	/* English */				gtab = "/usr/lib/etab";				if(!xx)					ignonl = "/usr/lib/eign";				continue;			case 'i':	/* Ignore file */				if(!xx) {					xx = 1;					only = 0;					ignonl = argv[++j];				}				continue;			case 'l':	/* Line numbers in col. 3 */				cross = 0;				continue;			case 'o':	/* Only file */				if(!xx) {					xx = 1;					only = 1;					ignonl = argv[++j];				}				continue;			case 's':	/* Symbols in col. 3 */				cross = 1;				continue;			case 't':				utmp = argv[++j];				tmp[0] = argv[j];				continue;			case 'u':	/* Unique symbols only */				usw = 1;				continue;			case 'x':	/* C externals */				xsw = 1;				gtab = "/usr/lib/ctab";				if(!xx)					ignonl = "/usr/lib/cign";				cflag = 1;				continue;		}	}	return(j);}compile(){	char	buf[40],*b;	int	i,v;	fopen(ignonl,ibuf1);	b = buf - 1;	while((*++b = getc(ibuf1)) != -1) {		if(*b == '\n') {			*b = '\0';			search(buf,b - buf,&itab,1);			b = buf - 1;		} else {			if(*b == '\t') {				v = 0;				while((i = getc(ibuf1)) != -1) {					if(i == '\n')	break;					v = v*10 + (i - '0');				}				search(buf,b - buf,&itab,v);				b = buf - 1;			} else {				if((b - buf) > 39) {					printf("Ignore/only symbol too long");					dexit();				}			}		}	}	close(ibuf1);	return;}

⌨️ 快捷键说明

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