/* * handles the "directive" state after the "ignore" state */ static int direce(lex_t *t) { int i = NELEM(dtab), ign; assert(cond_ignore()); ign = cond_list->f.ignore; NEXTSP(t); /* consumes # */ if (t->id == LEX_ID) { const char *n = LEX_SPELL(t); for (i = 0; i < NELEM(dtab); i++) if (strcmp(n, dtab[i].name) == 0) break; switch(i) { case DINCLUDE: case DDEFINE: case DUNDEF: case DLINE: case DERROR: case DPRAGMA: default: i = NELEM(dtab); break; case DIF: t = dif(t->pos, COND_KIF, 1); break; case DIFDEF: t = dif(t->pos, COND_KIFDEF, 1); break; case DIFNDEF: t = dif(t->pos, COND_KIFNDEF, 1); break; case DELIF: t = delif(t->pos); break; case DELSE: t = delse(t->pos); break; case DENDIF: t = dendif(t->pos); break; } } if (warnxtra[i] && ign != 2) { SKIPSP(t); if (t->id != LEX_NEWLINE) t = xtratok(t); } SKIPNL(t); lst_discard(1); lex_direc = 0; return 0; }
/* xdelifnot - built-in function 'delete-if-not' */ LVAL xdelifnot(void) { LVAL delif(); return (delif(FALSE)); }
/* xdelif - built-in function 'delete-if' */ LVAL xdelif(void) { LVAL delif(); return (delif(TRUE)); }
/* * handles the "directive" state after the "normal" state */ static int direci(lex_t *t) { int i = NELEM(dtab); assert(!cond_ignore()); NEXTSP(t); /* consumes # */ if (t->id == LEX_ID) { const char *n = LEX_SPELL(t); for (i = 0; i < NELEM(dtab); i++) if (strcmp(n, dtab[i].name) == 0) break; switch(i) { case DINCLUDE: t = dinclude(t->pos); break; case DDEFINE: /* ddefine() moved into mcr.c for macros from -D */ t = mcr_define(t->pos, 0); break; case DUNDEF: t = dundef(t->pos); break; case DIF: t = dif(t->pos, COND_KIF, 0); break; case DIFDEF: t = dif(t->pos, COND_KIFDEF, 0); break; case DIFNDEF: t = dif(t->pos, COND_KIFNDEF, 0); break; case DELIF: t = delif(t->pos); break; case DELSE: t = delse(t->pos); break; case DENDIF: t = dendif(t->pos); break; case DLINE: t = dline(t->pos); break; case DERROR: t = derror(t->pos, 0); break; case DPRAGMA: t = dpragma(t->pos); break; case DWARNING: t = derror(t->pos, 1); break; default: err_dpos(t->pos, ERR_PP_UNKNOWNDIR); break; } } else i = DUNDEF; if (warnxtra[i]) { SKIPSP(t); if (t->id != LEX_NEWLINE) t = xtratok(t); } SKIPNL(t); lst_discard(1); lex_direc = 0; return 0; }