/** If the \a variable name is obsolete, return the name to use, * otherwise \a variable. If the \a value is obsolete, update it too. * * Allocates the returned value. */ static char * muscle_percent_variable_update (char const *variable, location variable_loc, char const **value) { typedef struct { const char *obsolete; const char *updated; } conversion_type; const conversion_type conversion[] = { { "api.push_pull", "api.push-pull", }, { "api.tokens.prefix", "api.token.prefix", }, { "lex_symbol", "api.token.constructor", }, { "location_type", "api.location.type", }, { "lr.default-reductions", "lr.default-reduction", }, { "lr.keep-unreachable-states", "lr.keep-unreachable-state", }, { "lr.keep_unreachable_states", "lr.keep-unreachable-state", }, { "namespace", "api.namespace", }, { "stype", "api.value.type", }, { "variant=", "api.value.type=variant", }, { "variant=true", "api.value.type=variant", }, { NULL, NULL, } }; conversion_type const *c; for (c = conversion; c->obsolete; ++c) { char const *eq = strchr (c->obsolete, '='); if (eq ? (!strncmp (c->obsolete, variable, eq - c->obsolete) && STREQ (eq + 1, *value)) : STREQ (c->obsolete, variable)) { char *old = define_directive (c->obsolete, *value); char *upd = define_directive (c->updated, *value); deprecated_directive (&variable_loc, old, upd); free (old); free (upd); char *res = xstrdup (c->updated); { char *eq2 = strchr (res, '='); if (eq2) { *eq2 = '\0'; *value = eq2 + 1; } } return res; } } return xstrdup (variable); }
bool PreProcessor::pp() { bool success = true; while (!tokenit.eof()) { const Token &t = tokenit.get(0); switch (t.id) { case _IDENT: identifier(); break; case _PP_DEFINE: success = define_directive(); break; case _PP_UNDEF: success = undef_directive(); break; case _PP_INCLUDE: success = include_directive(); break; case _PP_INCLUDE_NEXT: success = include_directive(); break; case _PP_IF: success = if_directive(); break; case _PP_ELIF: success = elif_directive(); break; case _PP_IFDEF: success = ifdef_directive(); break; case _PP_IFNDEF: success = ifndef_directive(); break; case _PP_ELSE: success = else_directive(); break; case _PP_ENDIF: success = endif_directive(); break; case _PP_ERROR: success = error_directive(); break; case _PP_WARNING: success = warning_directive(); break; case _PP_LINE: success = line_directive(); break; case _PP_PRAGMA: success = pragma_directive(); break; default: tokenit.next(); break; } if (!success) { break; } } if (!ifBlockEnables.empty()) { ERROR("expected 'endif'"); success = false; } return success; }