📄 cpp.c
字号:
{ 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 + -