/* * Handle a preprocessor directive. */ void ppdir(void) { char bp[20]; int ch, i; redo: while ((ch = inch()) == ' ' || ch == '\t') ; if (ch == '/') { if ((ch = inch()) == '/') { skpln(); return; } if (ch == '*') { while ((ch = inch()) != -1) { if (ch == '*') { if ((ch = inch()) == '/') goto redo; unch(ch); } else if (ch == '\n') { putch('\n'); ifiles->lineno++; } } } } if (ch == '\n') { /* empty directive */ unch(ch); return; } if (ch < 'a' || ch > 'z') goto out; /* something else, ignore */ i = 0; do { bp[i++] = (usch)ch; if (i == sizeof(bp)-1) goto out; /* too long */ ch = inch(); } while ((ch >= 'a' && ch <= 'z') || (ch == '_')); unch(ch); bp[i++] = 0; /* got keyword */ for (i = 0; i < NPPD; i++) { if (bp[0] == ppd[i].name[0] && strcmp(bp, ppd[i].name) == 0) { (*ppd[i].fun)(); return; } } out: if (flslvl == 0 && Aflag == 0) error("invalid preprocessor directive"); unch(ch); skpln(); }
/* * Handle a preprocessor directive. * # is already found. */ void ppdir(void) { int ch, i, oldC; usch *bp; oldC = Cflag; redo: Cflag = 0; if ((ch = fastspc()) == '\n') { /* empty directive */ unch(ch); Cflag = oldC; return; } Cflag = oldC; if ((spechr[ch] & C_ID0) == 0) goto out; bp = readid(ch); /* got some keyword */ for (i = 0; i < NPPD; i++) { if (bp[0] == ppd[i].name[0] && strcmp((char *)bp, ppd[i].name) == 0) { if (flslvl == 0) { (*ppd[i].fun)(); if (flslvl == 0) return; } else { if (ppd[i].flags & DIR_FLSLVL) { (*ppd[i].fun)(); if (flslvl == 0) return; } else if (ppd[i].flags & DIR_FLSINC) flslvl++; } flscan(); goto redo; } } if (flslvl == 0) { if (Aflag) skpln(); return; } flscan(); goto redo; out: if (flslvl == 0 && Aflag == 0) error("invalid preprocessor directive"); unch(ch); skpln(); }
static void ifndefstmt(void) { int t; if (flslvl) { flslvl++; skpln(); return; } do t = sloscan(); while (t == WSPACE); if (t != IDENT) error("bad #ifndef"); if (lookup(yytext, FIND) != NULL) flslvl++; else trulvl++; chknl(0); }
static void ifndefstmt(void) { int t; if (flslvl) { skpln(); return; } do t = sloscan(); while (t == WSPACE); if (t != IDENT) error("bad ifndef"); if (lookup((usch *)yytext, FIND) != 0) { putch('\n'); flslvl++; } else trulvl++; chknl(0); }