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

📄 cc.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
## include <stdio.h># include <ctype.h># include <signal.h>/* cc command */# define MAXINC 10# define MAXFIL 100# define MAXLIB 100# define MAXOPT 100char	*tmp0;char	*tmp1;char	*tmp2;char	*tmp3;char	*tmp4;char	*tmp5;char	*outfile;# define CHSPACE 1000char	ts[CHSPACE+50];char	*tsa = ts;char	*tsp = ts;char	*av[50];char	*clist[MAXFIL];char	*llist[MAXLIB];int	pflag;int	sflag;int	cflag;int	eflag;int	exflag;int	oflag;int	proflag;int	noflflag;char	*chpass ;char	*npassname ;char	pass0[20] = "/lib/c0";char	pass1[20] = "/lib/c1";char	pass2[20] = "/lib/c2";char	passp[20] = "/lib/cpp";char	*pref = "/lib/crt0.o";char	*copy();char	*setsuf();char	*strcat();char	*strcpy();main(argc, argv)char *argv[]; {	char *t;	char *savetsp;	char *assource;	char **pv, *ptemp[MAXOPT], **pvt;	int nc, nl, i, j, c, f20, nxo, na;	int idexit();	i = nc = nl = f20 = nxo = 0;	setbuf(stdout, (char *)NULL);	pv = ptemp;	while(++i < argc) {		if(*argv[i] == '-') switch (argv[i][1]) {		default:			goto passa;		case 'S':			sflag++;			cflag++;			break;		case 'o':			if (++i < argc) {				outfile = argv[i];				if ((c=getsuf(outfile))=='c'||c=='o') {					error("Would overwrite %s", outfile);					exit(8);				}			}			break;		case 'O':			oflag++;			break;		case 'p':			proflag++;			break;		case 'E':			exflag++;		case 'P':			pflag++;			*pv++ = argv[i];		case 'c':			cflag++;			break;		case 'f':			noflflag++;			if (npassname || chpass)				error("-f overwrites earlier option", (char *)NULL);			npassname = "/lib/f";			chpass = "1";			break;		case '2':			if(argv[i][2] == '\0')				pref = "/lib/crt2.o";			else {				pref = "/lib/crt20.o";				f20 = 1;			}			break;		case 'D':		case 'I':		case 'U':		case 'C':			*pv++ = argv[i];			if (pv >= ptemp+MAXOPT) {				error("Too many DIUC options", (char *)NULL);				--pv;			}			break;		case 't':			if (chpass)				error("-t overwrites earlier option", (char *)NULL);			chpass = argv[i]+2;			if (chpass[0]==0)				chpass = "012p";			break;		case 'B':			if (npassname)				error("-B overwrites earlier option", (char *)NULL);			npassname = argv[i]+2;			if (npassname[0]==0)				npassname = "/usr/src/cmd/c/o";			break;		} 		else {passa:			t = argv[i];			if((c=getsuf(t))=='c' || c=='s'|| exflag) {				clist[nc++] = t;				if (nc>=MAXFIL) {					error("Too many source files", (char *)NULL);					exit(1);				}				t = setsuf(t, 'o');			}			if (nodup(llist, t)) {				llist[nl++] = t;				if (nl >= MAXLIB) {					error("Too many object/library files", (char *)NULL);					exit(1);				}				if (getsuf(t)=='o')					nxo++;			}		}	}	if (npassname && chpass ==0)		chpass = "012p";	if (chpass && npassname==0)		npassname = "/usr/src/cmd/c/";	if (chpass)		for (t=chpass; *t; t++) {			switch (*t) {			case '0':				strcpy (pass0, npassname);				strcat (pass0, "c0");				continue;			case '1':				strcpy (pass1, npassname);				strcat (pass1, "c1");				continue;			case '2':				strcpy (pass2, npassname);				strcat (pass2, "c2");				continue;			case 'p':				strcpy (passp, npassname);				strcat (passp, "cpp");				continue;			}		}	if (noflflag)		pref = proflag ? "/lib/fmcrt0.o" : "/lib/fcrt0.o";	else if (proflag)		pref = "/lib/mcrt0.o";	if(nc==0)		goto nocom;	if (pflag==0) {		tmp0 = copy("/tmp/ctm0a");		while (access(tmp0, 0)==0)			tmp0[9]++;		while((creat(tmp0, 0400))<0) {			if (tmp0[9]=='z') {				error("cc: cannot create temp", NULL);				exit(1);			}			tmp0[9]++;		}	}	if (signal(SIGINT, SIG_IGN) != SIG_IGN)		signal(SIGINT, idexit);	if (signal(SIGTERM, SIG_IGN) != SIG_IGN)		signal(SIGTERM, idexit);	(tmp1 = copy(tmp0))[8] = '1';	(tmp2 = copy(tmp0))[8] = '2';	(tmp3 = copy(tmp0))[8] = '3';	if (oflag)		(tmp5 = copy(tmp0))[8] = '5';	if (pflag==0)		(tmp4 = copy(tmp0))[8] = '4';	pvt = pv;	for (i=0; i<nc; i++) {		if (nc>1)			printf("%s:\n", clist[i]);		if (getsuf(clist[i])=='s') {			assource = clist[i];			goto assemble;		} 		else			assource = tmp3;		if (pflag)			tmp4 = setsuf(clist[i], 'i');		savetsp = tsp;		av[0] = "cpp";		av[1] = clist[i];		av[2] = exflag ? "-" : tmp4;		na = 3;		for(pv=ptemp; pv <pvt; pv++)			av[na++] = *pv;		av[na++]=0;		if (callsys(passp, av)) {			cflag++;			eflag++;			continue;		}		av[1] = tmp4;		tsp = savetsp;		av[0]= "c0";		if (pflag) {			cflag++;			continue;		}		av[2] = tmp1;		av[3] = tmp2;		if (proflag) {			av[4] = "-P";			av[5] = 0;		} 		else			av[4] = 0;		if (callsys(pass0, av)) {			cflag++;			eflag++;			continue;		}		av[0] = "c1";		av[1] = tmp1;		av[2] = tmp2;		if (sflag)			assource = tmp3 = setsuf(clist[i], 's');		av[3] = tmp3;		if (oflag)			av[3] = tmp5;		av[4] = 0;		if(callsys(pass1, av)) {			cflag++;			eflag++;			continue;		}		if (oflag) {			av[0] = "c2";			av[1] = tmp5;			av[2] = tmp3;			av[3] = 0;			if (callsys(pass2, av)) {				unlink(tmp3);				tmp3 = assource = tmp5;			} 			else				unlink(tmp5);		}		if (sflag)			continue;assemble:		av[0] = "as";		av[1] = "-u";		av[2] = "-o";		av[3] = setsuf(clist[i], 'o');		av[4] = assource;		av[5] = 0;		cunlink(tmp1);		cunlink(tmp2);		cunlink(tmp4);		if (callsys("/bin/as", av) > 1) {			cflag++;			eflag++;			continue;		}	}nocom:	if (cflag==0 && nl!=0) {		i = 0;		av[0] = "ld";		av[1] = "-X";		av[2] = pref;		j = 3;		if (noflflag) {			j = 4;			av[3] = "-lfpsim";		}		if (outfile) {			av[j++] = "-o";			av[j++] = outfile;		}		while(i<nl)			av[j++] = llist[i++];		if(f20)			av[j++] = "-l2";		else {			av[j++] = "-lc";		}		av[j++] = 0;		eflag |= callsys("/bin/ld", av);		if (nc==1 && nxo==1 && eflag==0)			cunlink(setsuf(clist[0], 'o'));	}	dexit();}idexit(){	eflag = 100;	dexit();}dexit(){	if (!pflag) {		cunlink(tmp1);		cunlink(tmp2);		if (sflag==0)			cunlink(tmp3);		cunlink(tmp4);		cunlink(tmp5);		cunlink(tmp0);	}	exit(eflag);}error(s, x)char *s, *x;{	fprintf(exflag?stderr:stdout, s, x);	putc('\n', exflag? stderr : stdout);	cflag++;	eflag++;}getsuf(as)char as[];{	register int c;	register char *s;	register int t;	s = as;	c = 0;	while(t = *s++)		if (t=='/')			c = 0;		else			c++;	s -= 3;	if (c<=14 && c>2 && *s++=='.')		return(*s);	return(0);}char *setsuf(as, ch)char *as;{	register char *s, *s1;	s = s1 = copy(as);	while(*s)		if (*s++ == '/')			s1 = s;	s[-1] = ch;	return(s1);}callsys(f, v)char f[], *v[]; {	int t, status;	if ((t=fork())==0) {		execv(f, v);		printf("Can't find %s\n", f);		exit(100);	} else		if (t == -1) {			printf("Try again\n");			return(100);		}	while(t!=wait(&status))		;	if (t = status&0377) {		if (t!=SIGINT) {			printf("Fatal error in %s\n", f);			eflag = 8;		}		dexit();	}	return((status>>8) & 0377);}char *copy(as)char *as;{	char *malloc();	register char *otsp, *s;	otsp = tsp;	s = as;	while (*tsp++ = *s++)		;	if (tsp > tsa+CHSPACE) {		tsp = tsa = malloc(CHSPACE+50);		if (tsp==NULL) {			error("no space for file names", (char *)NULL);			dexit();		}	}	return(otsp);}nodup(l, os)char **l, *os;{	register char *t, *s;	register int c;	s = os;	if (getsuf(s) != 'o')		return(1);	while(t = *l++) {		while(c = *s++)			if (c != *t++)				break;		if (*t=='\0' && c=='\0')			return(0);		s = os;	}	return(1);}cunlink(f)char *f;{	if (f==NULL)		return;	unlink(f);}

⌨️ 快捷键说明

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