X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Fmacro.c;h=584ee7f2fd3ed29e3d4880761c7176814e55c62c;hb=69bf3f901b0a949cfa957950f55df78d0c86a765;hp=32185fb9cf03016bc3c8cf1bab602e0e536d2149;hpb=db57300f720b0916461aad06cec4d268481f06e0;p=pspp diff --git a/src/language/lexer/macro.c b/src/language/lexer/macro.c index 32185fb9cf..584ee7f2fd 100644 --- a/src/language/lexer/macro.c +++ b/src/language/lexer/macro.c @@ -429,7 +429,9 @@ me_next_arg (struct macro_expander *me) return me_finished (me); else { - me->state = me->param->positional ? ME_ARG : ME_KEYWORD; + me->state = (!me->param->positional ? ME_KEYWORD + : me->param->arg_type == ARG_ENCLOSE ? ME_ENCLOSE + : ME_ARG); return 0; } } @@ -455,8 +457,11 @@ me_error (struct macro_expander *me) static int me_add_arg (struct macro_expander *me, const struct macro_token *mt) { + const struct macro_param *p = me->param; + const struct token *token = &mt->token; - if (token->type == T_ENDCMD || token->type == T_STOP) + if ((token->type == T_ENDCMD || token->type == T_STOP) + && p->arg_type != ARG_CMDEND) { msg (SE, _("Unexpected end of command reading argument %s " "to macro %s."), me->param->name, me->macro->name); @@ -466,7 +471,6 @@ me_add_arg (struct macro_expander *me, const struct macro_token *mt) me->n_tokens++; - const struct macro_param *p = me->param; struct macro_tokens **argp = &me->args[p - me->macro->params]; if (!*argp) *argp = xzalloc (sizeof **argp); @@ -531,10 +535,13 @@ me_enclose (struct macro_expander *me, const struct macro_token *mt) static const struct macro_param * macro_find_parameter_by_name (const struct macro *m, struct substring name) { + if (ss_first (name) == '!') + ss_advance (&name, 1); + for (size_t i = 0; i < m->n_params; i++) { const struct macro_param *p = &m->params[i]; - struct substring p_name = ss_cstr (p->name); + struct substring p_name = ss_cstr (p->name + 1); if (!utf8_strncasecmp (p_name.string, p_name.length, name.string, name.length)) return p; @@ -613,7 +620,9 @@ macro_expander_create (const struct macro_set *macros, return 1; else { - me->state = macro->params[0].positional ? ME_ARG : ME_KEYWORD; + me->state = (!macro->params[0].positional ? ME_KEYWORD + : macro->params[0].arg_type == ARG_ENCLOSE ? ME_ENCLOSE + : ME_ARG); me->args = xcalloc (macro->n_params, sizeof *me->args); me->param = macro->params; return 0; @@ -931,6 +940,13 @@ macro_expand (const struct macro_tokens *mts, const struct macro_expander *me, bool *expand, struct macro_tokens *exp) { + /* Macro expansion: + + - Macro names in macro bodies are not expanded by default. !EVAL() + expands them. + + - Macro names in arguments to macro invocations (outside of macro bodies) + are expanded by default, unless !NOEXPAND. */ if (nesting_countdown <= 0) { printf ("maximum nesting level exceeded\n");