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

📄 cpp.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 4 页
字号:
{  char *pin;   char *psav,*space;   pin=inp;   space=psav=malloc(WORK_AREA);   for(;;) { /* accumulate pragma until linefeed */      outp=inp=p;      p=cotoken(p);      pin=inp;      if (*pin=='\n') break;      while ( pin <p) *psav++= *pin++;   }   *psav = '\0';   fprintf(fout,"# %d $pragma %s \n", lineno[ifno], space );   return(p);}char *dodef(p) register char *p; {/* process '#define' */	register char *pin,*psav,*cf;	char **pf,**qf; register int b;int c,params;	register struct symtab *np;	char *oldval;	char *space, *newspace;	char *formal[MAXFRM]; /* formal[n] is name of nth formal */	char formtxt[BUFSIZ]; /* space for formal names */	int opt_passcom=passcom;	passcom=0;	/* don't put comments in macro expansions */	++flslvl; /* prevent macro expansion during 'define' */	p=skipbl(p); pin=inp;	if ((toktyp+COFF)[*pin]!=IDENT) {		ppwarn("illegal macro name"); while (*inp!='\n') p=skipbl(p);		passcom=opt_passcom; return(p);	}	np=slookup(pin,p,1);	if (oldval=np->value) free(lastcopy);	/* was previously defined */	b=1; cf=pin;	while (cf<p) {/* update macbit */		c= *cf++; xmac1(c,b,|=); b=(b+b)&0xFF;		if (cf!=p) xmac2(c,*cf,-1+(cf-pin),|=);		else xmac2(c,0,-1+(cf-pin),|=);	}	params=0; outp=inp=p; p=cotoken(p); pin=inp;	if (*pin=='(') {/* with parameters; identify the formals */		cf=formtxt; pf=formal;		for (;;) {			p=skipbl(p); pin=inp;			if (*pin=='\n') {				--lineno[ifno]; --p; pperror("%s: missing )",np->name); break;			}			if (*pin==')') break;			if (*pin==',') continue;			if ((*pin=='\\') && (*++pin=='\n')) /* 3-9-88 LFL */			    continue;			if ((toktyp+COFF)[*pin]!=IDENT) {				c= *p; *p='\0'; pperror("bad formal: %s",pin); *p=c;			} else if (pf>= &formal[MAXFRM]) {				c= *p; *p='\0'; pperror("too many formals: %s",pin); *p=c;			} else {				*pf++=cf; while (pin<p) *cf++= *pin++; *cf++='\0'; ++params;			}		}		if (params==0) --params; /* #define foo() ... */	} else if (*pin=='\n') {--lineno[ifno]; --p;}	/* remember beginning of macro body, so that we can	/* warn if a redefinition is different from old value.	*/	space=psav=malloc(WORK_AREA);	if (space==NULL) {		pperror("too much defining");		passcom=opt_passcom;		return(p);	}	*psav++ = '\0';	for (;;) {/* accumulate definition until linefeed */		outp=inp=p; p=cotoken(p); pin=inp;		if (*pin=='\\' && pin[1]=='\n') {putc('\n',fout); continue;}	/* ignore escaped lf */		if (*pin=='\n') break;		if (params) {/* mark the appearance of formals in the definiton */			if ((toktyp+COFF)[*pin]==IDENT) {				for (qf=pf; --qf>=formal; ) {					if (equfrm(*qf,pin,p)) {						*psav++=qf-formal+1; *psav++=WARN; pin=p; break;					}				}			} else if (*pin=='"' || *pin=='\''# if gcos					|| *pin=='`'# endif						) {/* inside quotation marks, too */				char quoc= *pin;				for (*psav++= *pin++; pin<p && *pin!=quoc; ) {					while (pin<p && !isid(*pin)) *psav++= *pin++;					cf=pin; while (cf<p && isid(*cf)) ++cf;					for (qf=pf; --qf>=formal; ) {						if (equfrm(*qf,pin,cf)) {							*psav++=qf-formal+1; *psav++=WARN; pin=cf; break;						}					}					while (pin<cf) *psav++= *pin++;				}			}		}		while (pin<p) *psav++= *pin++;	}	*psav++=params; *psav++='\0';	if ((cf=oldval)!=NULL) {/* redefinition */		--cf;	/* skip no. of params, which may be zero */		while (*--cf);	/* go back to the beginning */		if (0!=strcmp(++cf,space+1)) {/* redefinition different from old */			--lineno[ifno]; ppwarn("%s redefined",np->name); ++lineno[ifno];			np->value=psav-1;		} else free(space); /* identical redef.; reclaim space */	} else np->value=psav-1;	--flslvl; inp=pin;	if (np->value == psav-1) {                if ((psav-space)<= WORK_AREA) {          		newspace = realloc(space, psav-space);		        if (newspace==NULL) {pperror("no space");exit(exfail);}			/*			 * Adjust pointer in case this moved.			 */			np->value += newspace-space;		      }                else {pperror("macro definition too long");exit(exfail);}                    	}	passcom=opt_passcom;	return(p);}#define fasscan() ptrtab=fastab+COFF#define sloscan() ptrtab=slotab+COFFvoid	/* DAG -- bug fix (was (char *)) */control(p) register char *p; {/* find and handle preprocessor control lines */	register struct symtab *np;for (;;) {	fasscan(); p=cotoken(p); if (*inp=='\n') ++inp; dump();	sloscan(); p=skipbl(p);	*--inp=SALT; outp=inp; ++flslvl; np=slookup(inp,p,0); --flslvl;	if (np==defloc) {/* define */		if (flslvl==0) {p=dodef(p); continue;}        } else if (np== pragmaloc) { /* pragma */             if ( flslvl==0) {p=dopragma(p);continue;}	} else if (np==incloc) {/* include */		if (flslvl==0) {p=doincl(p); continue;}	} else if (np==ifnloc) {/* ifndef */		++flslvl; p=skipbl(p); np=slookup(inp,p,0); --flslvl;		if (flslvl==0)			if(ifdone[trulvl] = np->value==0)				++trulvl;			else				++flslvl;		else ++flslvl;	} else if (np==ifdloc) {/* ifdef */		++flslvl; p=skipbl(p); np=slookup(inp,p,0); --flslvl;		if (flslvl==0)			if (ifdone[trulvl] = np->value!=0)				++trulvl;			else				++flslvl;		else ++flslvl;	} else if (np==eifloc) {/* endif */		if (flslvl) {if (--flslvl==0) sayline(CONT);}		else if (trulvl) ifdone[--trulvl] = 0;	/* DAG */		else pperror("If-less endif",0);	} else if (np==elsloc) {/* else */		if (flslvl) {			if (--flslvl!=0 || ifdone[trulvl]) ++flslvl;			else {++trulvl; sayline(CONT);}		}		else if (trulvl) {++flslvl; --trulvl;}		else pperror("If-less else",0);	} else if (np==udfloc) {/* undefine */		if (flslvl==0) {			++flslvl; p=skipbl(p); slookup(inp,p,DROP); --flslvl;		}	} else if (np==ifloc) {/* if */#if tgp		pperror(" IF not implemented, true assumed", 0);		if (flslvl==0) ifdone[trulvl++] = 1; else ++flslvl;#else		newp=p;		if (flslvl==0)		{			if (ifdone[trulvl] = yyparse())	/* DAG */				++trulvl;			else				++flslvl;		}		else ++flslvl;		p=newp;#endif	} else if (np==eliloc) {/* elif */	/* DAG -- added */#if tgp		pperror (" ELIF not implemented, true assumed", (char *) 0, (char *) 0);		if (flslvl)		{			if (--flslvl == 0 && !ifdone[trulvl])			{				ifdone[trulvl++] = 1;				--lineno[ifno];				sayline (CONT);				++lineno[ifno];			}			else				++flslvl;		}		else if (trulvl)		{			++flslvl;			--trulvl;		}		else			pperror ( "If-less elif", (char *) 0, (char *) 0);#else		newp = p;		if (flslvl)		{			if (--flslvl == 0 && !ifdone[trulvl] && yyparse ())			{				ifdone[trulvl++] = 1;/*	Yyparse() finished this line.  Back up.  jlr009 */				--lineno[ifno];				sayline (CONT);				++lineno[ifno];			}			else				++flslvl;		}		else if (trulvl)		{			++flslvl;			--trulvl;		}		else			pperror ( "If-less elif", (char *) 0, (char *) 0);		p = newp;#endif	} else if (np==lneloc) {/* line */		if (flslvl==0 && pflag==0) {			char *savestring();			char filename[BUFSIZ], *cp = filename;			outp=inp=p; *--outp='#';			/* Find the line number.. */			do {				p = cotoken(p);			} while (!isnum(*inp) && *inp != '\n');			if (isnum(*inp))				lineno[ifno] = atoi(inp)-1;			/* Skip over the blank token */			inp = p;			if (*inp != '\n') {				p = cotoken(p); inp = p;			}			/* Add a quote if missing..  */			if (*inp != '\n') {				p = cotoken(p);				/* Add a quote if missing..  */				if (*inp == '"')					inp++;				else {					dump();					*--outp = '"';				}				while (*inp != '\n') {					while (inp < p && *inp != '"' &&						cp < filename+sizeof(filename))						*cp++ = *inp++;					if (*inp == '"')						break;					inp = p; p = cotoken(p);				}				fnames[ifno] = savestring(filename, cp);				/* Add a quote if missing..  */				if (*inp != '"') {					dump();					*--outp = '"';				}			}			while (*inp != '\n')				p = cotoken(p);			continue;		}	} else if (np==identloc) {/* ident (for Sys 5r3 compat) */		/* remove this cause we don't want to want to pass it		 * -- if we ever do remove this comment around the following		 * 	code		 *	while(*inp!='\n') p=cotoken(p);		 */	} else if (*++inp=='\n') outp=inp;	/* allows blank line after # */	else pperror("undefined control",0);	/* flush to lf */	++flslvl; while (*inp!='\n') {outp=inp=p; p=cotoken(p);} --flslvl;}}char *savestring(start, finish)	register char *start, *finish;{	register char *retbuf;	register char *cp;	retbuf = (char *) calloc(finish - start + 1, sizeof (char));	cp = retbuf;	while (start < finish)		*cp++ = *start++;	*cp = 0;	return(retbuf);}struct symtab *stsym(s) register char *s; {	char buf[BUFSIZ]; register char *p;	/* make definition look exactly like end of #define line */	/* copy to avoid running off end of world when param list is at end */	p=buf; while (*p++= *s++);	p=buf; while (isid(*p++)); /* skip first identifier */	if (*--p=='=') {*p++=' '; while (*p++);}	else {s=" 1"; while (*p++= *s++);}	pend=p; *--p='\n';	sloscan(); dodef(buf); return(lastsym);}struct symtab *ppsym(s) register char *s; {/* kluge */	register struct symtab *sp;	register char *name;	cinit=SALT; sp=stsym(s); name = malloc(strlen(sp->name)+1+1);	name[0] = '#'; strcpy(name+1, sp->name); sp->name = name;	cinit=0; return(sp);}#ifdef notdef/* VARARGS1 */pperror(s,x,y) char *s; {	if (fnames[ifno][0]) fprintf(stderr,# if gcos			"*%c*   \"%s\", line ", exfail >= 0 ? 'F' : 'W',# else			"%s: ",# endif				 fnames[ifno]);	fprintf(stderr, "%d: ",lineno[ifno]);	fprintf(stderr, s, x, y);	fprintf(stderr,"\n");	++exfail;}#endif/* VARARGS1 */pperror(s,x,y) char *s; {	fprintf(stderr, "cpp: error ");	if (fnames[ifno][0])		fprintf(stderr, "%s:", fnames[ifno]);	fprintf(stderr, "%d: ", lineno[ifno]);	fprintf(stderr, s, x, y);	fprintf(stderr,"\n");	++exfail;}/* VARARGS1 */ppwarn(s,x,y) char *s; {	fprintf(stderr, "cpp: warning ");	if (fnames[ifno][0])		fprintf(stderr, "%s:", fnames[ifno]);	fprintf(stderr, "%d: ", lineno[ifno]);	fprintf(stderr, s, x, y);	fprintf(stderr,"\n");}yyerror(s,a,b) char *s; {	pperror(s,a,b);}struct symtab *lookup(namep, enterf)register char *namep;{	register char *np, *snp;	register int c, i; int around;	register struct symtab *sp;	/* namep had better not be too long (currently, <=NCPS chars) */	np=namep; around=0; i=cinit;	while (c= *np++) i += i+c; c=i;	/* c=i for register usage on pdp11 */	c %= symsiz; if (c<0) c += symsiz;	sp = &stab[c];	while (snp=sp->name) {		np = namep;		while (*snp++ == *np) if (*np++ == '\0') {				if (enterf==DROP) {sp->name[0]= DROP; sp->value=0;}				return(lastsym=sp);			}		if (--sp < &stab[0])			if (around) {pperror("too many defines", 0); exit(exfail);}			else {++around; sp = &stab[symsiz-1];}	}	if (enterf==1) sp->name=namep;	return(lastsym=sp);}struct symtab *slookup(p1,p2,enterf) register char *p1,*p2; register int enterf;{	register char *p3; char c2,c3; register struct symtab *np;	         c2= *p2; *p2='\0';	/* mark end of token */	if ((p2-p1)>NCPS) p3=p1+NCPS; else p3=p2;			 c3= *p3; *p3='\0';	/* truncate to NCPS chars or less */

⌨️ 快捷键说明

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