Exemple #1
0
/** 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);
}
Exemple #2
0
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;
}