-
- switch (cpp->exp->type) {
- case PSI_T_ERROR:
- if (!cpp->skip) {
- D->error(D, cpp->exp->token, PSI_ERROR, "%s",
- cpp->exp->data.tok->text);
- }
- break;
- case PSI_T_WARNING:
- if (!cpp->skip) {
- D->error(D, cpp->exp->token, PSI_WARNING, "%s",
- cpp->exp->data.tok->text);
- }
- break;
- case PSI_T_UNDEF:
- if (!cpp->skip) {
- psi_cpp_undef(cpp, cpp->exp->data.tok);
- }
- break;
- case PSI_T_DEFINE:
- if (!cpp->skip) {
- psi_cpp_define(cpp, cpp->exp->data.decl);
- /* FIXME: copy */
- cpp->exp->data.decl = NULL;
- }
- break;
- case PSI_T_IFDEF:
- ++cpp->level;
- if (!cpp->skip) {
- if (psi_cpp_defined(cpp, cpp->exp->data.tok)) {
- psi_cpp_level_mask(cpp);
- } else {
- psi_cpp_level_skip(cpp);
- }
- }
- break;
- case PSI_T_IFNDEF:
- ++cpp->level;
- if (!cpp->skip) {
- if (psi_cpp_defined(cpp, cpp->exp->data.tok)) {
- psi_cpp_level_skip(cpp);
- } else {
- psi_cpp_level_mask(cpp);
- }
- }
- break;
- case PSI_T_IF:
- ++cpp->level;
- if (!cpp->skip) {
- if (psi_cpp_if(cpp->exp, &cpp->defs, D)) {
- psi_cpp_level_mask(cpp);
- } else {
- psi_cpp_level_skip(cpp);
- }
- }
- break;
- case PSI_T_ENDIF:
- if (!cpp->level) {
- D->error(D, cpp->exp->token, PSI_WARNING, "Ingoring lone #endif");
- } else {
- psi_cpp_level_unskip(cpp);
- psi_cpp_level_unmask(cpp);
- --cpp->level;
- }
- break;
- case PSI_T_ELSE:
- /* FIXME: catch "else" after "else" */
- if (!cpp->level) {
- D->error(D, cpp->exp->token, PSI_WARNING, "Ingoring lone #else");
- } else if (psi_cpp_level_skipped(cpp) && !psi_cpp_level_masked(cpp)) {
- /*
- * if skip is set on this level and the level has
- * not been masked yet, then unskip and mask this level
- */
- psi_cpp_level_unskip(cpp);
- psi_cpp_level_mask(cpp);
- } else if (!cpp->skip && psi_cpp_level_masked(cpp)) {
- /*
- * previous block masked this level
- */
- psi_cpp_level_skip(cpp);
- } else {
- assert(cpp->skip < cpp->level);
- }
- break;
- case PSI_T_ELIF:
- if (!cpp->level) {
- D->error(D, cpp->exp->token, PSI_WARNING, "Ingoring lone #elif");
- } else if (psi_cpp_level_skipped(cpp) && !psi_cpp_level_masked(cpp)) {
- /*
- * if skip is set on this level and the level has
- * not been masked yet, then unskip and mask this
- * level, if the condition evals truthy
- */
- if (psi_cpp_if(cpp->exp, &cpp->defs, D)) {
- psi_cpp_level_unskip(cpp);
- psi_cpp_level_mask(cpp);
- }
- } else if (!cpp->skip && psi_cpp_level_masked(cpp)) {
- /*
- * previous block masked this level
- */
- psi_cpp_level_skip(cpp);
- } else {
- assert(cpp->skip < cpp->level);
- }
- break;
- default:
- assert(0);
- break;