Keyword arguments work.
[pspp] / src / language / lexer / macro.c
index 32185fb9cf03016bc3c8cf1bab602e0e536d2149..d67278c51cd4066aa3c99f973e4a0de98db4063e 100644 (file)
@@ -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;