work on macro function parsing
[pspp] / src / language / lexer / macro.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2021 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "language/lexer/macro.h"
20
21 #include <errno.h>
22 #include <limits.h>
23 #include <stdlib.h>
24
25 #include "data/settings.h"
26 #include "language/lexer/lexer.h"
27 #include "language/lexer/segment.h"
28 #include "language/lexer/scan.h"
29 #include "libpspp/assertion.h"
30 #include "libpspp/cast.h"
31 #include "libpspp/i18n.h"
32 #include "libpspp/message.h"
33 #include "libpspp/str.h"
34 #include "libpspp/string-array.h"
35 #include "libpspp/stringi-map.h"
36 #include "libpspp/stringi-set.h"
37
38 #include "gl/c-ctype.h"
39 #include "gl/ftoastr.h"
40
41 #include "gettext.h"
42 #define _(msgid) gettext (msgid)
43
44 /* An entry in the stack of macros and macro directives being expanded.  The
45    stack is maintained as a linked list.  Entries are not dynamically allocated
46    but on the program stack. */
47 struct macro_expansion_stack
48   {
49     /* Points to an outer stack entry, or NULL if this is the outermost. */
50     const struct macro_expansion_stack *next;
51
52     /* A macro name or !IF, !DO, etc. */
53     const char *name;
54
55     /* Location of the macro definition, if available. */
56     const char *file_name;
57     int first_line;
58     int last_line;
59   };
60
61 /* Reports an error during macro expansion.  STACK is the stack for reporting
62    the location of the error, MT is the optional token at which the error was
63    detected, and FORMAT along with the varargs is the message to report. */
64 static void PRINTF_FORMAT (3, 4)
65 macro_error (const struct macro_expansion_stack *stack,
66              const struct macro_token *mt,
67              const char *format, ...)
68 {
69   struct msg_stack **ms = NULL;
70   size_t allocated_ms = 0;
71   size_t n_ms = 0;
72
73   for (const struct macro_expansion_stack *p = stack; p; p = p->next)
74     {
75       if (n_ms >= allocated_ms)
76         ms = x2nrealloc (ms, &allocated_ms, sizeof *ms);
77
78       /* TRANSLATORS: These strings are used for explaining the context of an
79          error.  The "While expanding" message appears first, followed by zero
80          or more of the "inside expansion" messages.  `innermost',
81          `next_inner`, etc., are names of macros, and `foobar' is a piece of
82          PSPP syntax:
83
84          foo.sps:12: At `foobar' in the expansion of 'innermost',
85          foo.sps:23: inside the expansion of 'next_inner',
86          foo.sps:34: inside the expansion of 'next_inner2',
87          foo.sps:45: inside the expansion of 'outermost',
88          foo.sps:76: This is the actual error message. */
89       char *description;
90       if (p == stack)
91         {
92           if (mt && mt->representation.length)
93             {
94               char syntax[64];
95               str_ellipsize (mt->representation, syntax, sizeof syntax);
96               description = xasprintf (_("At `%s' in the expansion of `%s',"),
97                                        syntax, p->name);
98             }
99           else
100             description = xasprintf (_("In the expansion of `%s',"), p->name);
101         }
102       else
103         description = xasprintf (_("inside the expansion of `%s',"), p->name);
104
105       ms[n_ms] = xmalloc (sizeof *ms[n_ms]);
106       *ms[n_ms] = (struct msg_stack) {
107         .location = {
108           .file_name = xstrdup_if_nonnull (p->file_name),
109           .first_line = p->first_line,
110           .last_line = p->last_line,
111         },
112         .description = description,
113       };
114       n_ms++;
115     }
116
117   va_list args;
118   va_start (args, format);
119   char *s = xvasprintf (format, args);
120   va_end (args);
121
122   struct msg *m = xmalloc (sizeof *m);
123   *m = (struct msg) {
124     .category = MSG_C_SYNTAX,
125     .severity = MSG_S_ERROR,
126     .stack = ms,
127     .n_stack = n_ms,
128     .text = s,
129   };
130   msg_emit (m);
131 }
132
133 void
134 macro_token_copy (struct macro_token *dst, const struct macro_token *src)
135 {
136   token_copy (&dst->token, &src->token);
137   ss_alloc_substring (&dst->representation, src->representation);
138 }
139
140 void
141 macro_token_uninit (struct macro_token *mt)
142 {
143   token_uninit (&mt->token);
144   ss_dealloc (&mt->representation);
145 }
146
147 void
148 macro_token_to_representation (struct macro_token *mt, struct string *s)
149 {
150   ds_put_substring (s, mt->representation);
151 }
152 bool
153 is_macro_keyword (struct substring s)
154 {
155   static struct stringi_set keywords = STRINGI_SET_INITIALIZER (keywords);
156   if (stringi_set_is_empty (&keywords))
157     {
158       static const char *kws[] = {
159         "BREAK",
160         "CHAREND",
161         "CMDEND",
162         "DEFAULT",
163         "DO",
164         "DOEND",
165         "ELSE",
166         "ENCLOSE",
167         "ENDDEFINE",
168         "IF",
169         "IFEND",
170         "IN",
171         "LET",
172         "NOEXPAND",
173         "OFFEXPAND",
174         "ONEXPAND",
175         "POSITIONAL",
176         "THEN",
177         "TOKENS",
178       };
179       for (size_t i = 0; i < sizeof kws / sizeof *kws; i++)
180         stringi_set_insert (&keywords, kws[i]);
181     }
182
183   ss_ltrim (&s, ss_cstr ("!"));
184   return stringi_set_contains_len (&keywords, s.string, s.length);
185 }
186 \f
187 void
188 macro_tokens_copy (struct macro_tokens *dst, const struct macro_tokens *src)
189 {
190   *dst = (struct macro_tokens) {
191     .mts = xmalloc (src->n * sizeof *dst->mts),
192     .n = src->n,
193     .allocated = src->n,
194   };
195   for (size_t i = 0; i < src->n; i++)
196     macro_token_copy (&dst->mts[i], &src->mts[i]);
197 }
198
199 void
200 macro_tokens_uninit (struct macro_tokens *mts)
201 {
202   for (size_t i = 0; i < mts->n; i++)
203     macro_token_uninit (&mts->mts[i]);
204   free (mts->mts);
205 }
206
207 struct macro_token *
208 macro_tokens_add_uninit (struct macro_tokens *mts)
209 {
210   if (mts->n >= mts->allocated)
211     mts->mts = x2nrealloc (mts->mts, &mts->allocated, sizeof *mts->mts);
212   return &mts->mts[mts->n++];
213 }
214
215 void
216 macro_tokens_add (struct macro_tokens *mts, const struct macro_token *mt)
217 {
218   macro_token_copy (macro_tokens_add_uninit (mts), mt);
219 }
220
221 /* Tokenizes SRC according to MODE and appends the tokens to MTS.  Uses STACK,
222    if nonull, for error reporting. */
223 static void
224 macro_tokens_from_string__ (struct macro_tokens *mts, const struct substring src,
225                             enum segmenter_mode mode,
226                             const struct macro_expansion_stack *stack)
227 {
228   struct state
229     {
230       struct segmenter segmenter;
231       struct substring body;
232     };
233
234   struct state state = {
235     .segmenter = segmenter_init (mode, true),
236     .body = src,
237   };
238   struct state saved = state;
239
240   while (state.body.length > 0)
241     {
242       struct macro_token mt = {
243         .token = { .type = T_STOP },
244         .representation = { .string = state.body.string },
245       };
246       struct token *token = &mt.token;
247
248       struct scanner scanner;
249       scanner_init (&scanner, token);
250
251       for (;;)
252         {
253           enum segment_type type;
254           int seg_len = segmenter_push (&state.segmenter, state.body.string,
255                                         state.body.length, true, &type);
256           assert (seg_len >= 0);
257
258           struct substring segment = ss_head (state.body, seg_len);
259           ss_advance (&state.body, seg_len);
260
261           enum scan_result result = scanner_push (&scanner, type, segment, token);
262           if (result == SCAN_SAVE)
263             saved = state;
264           else if (result == SCAN_BACK)
265             {
266               state = saved;
267               break;
268             }
269           else if (result == SCAN_DONE)
270             break;
271         }
272
273       /* We have a token in 'token'. */
274       mt.representation.length = state.body.string - mt.representation.string;
275       if (is_scan_type (token->type))
276         {
277           if (token->type != SCAN_SKIP)
278             {
279               char *s = scan_token_to_error (token);
280               if (stack)
281                 {
282                   mt.token.type = T_STRING;
283                   macro_error (stack, &mt, "%s", s);
284                 }
285               else
286                 msg (SE, "%s", s);
287               free (s);
288             }
289         }
290       else
291         macro_tokens_add (mts, &mt);
292       token_uninit (token);
293     }
294 }
295
296 /* Tokenizes SRC according to MODE and appends the tokens to MTS. */
297 void
298 macro_tokens_from_string (struct macro_tokens *mts, const struct substring src,
299                           enum segmenter_mode mode)
300 {
301   macro_tokens_from_string__ (mts, src, mode, NULL);
302 }
303
304 void
305 macro_tokens_print (const struct macro_tokens *mts, FILE *stream)
306 {
307   for (size_t i = 0; i < mts->n; i++)
308     token_print (&mts->mts[i].token, stream);
309 }
310
311 enum token_class
312   {
313     TC_ENDCMD,                  /* No space before or after (new-line after). */
314     TC_BINOP,                   /* Space on both sides. */
315     TC_COMMA,                   /* Space afterward. */
316     TC_ID,                      /* Don't need spaces except sequentially. */
317     TC_PUNCT,                   /* Don't need spaces except sequentially. */
318   };
319
320 static bool
321 needs_space (enum token_class prev, enum token_class next)
322 {
323   /* Don't need a space before or after the end of a command.
324      (A new-line is needed afterward as a special case.) */
325   if (prev == TC_ENDCMD || next == TC_ENDCMD)
326     return false;
327
328   /* Binary operators always have a space on both sides. */
329   if (prev == TC_BINOP || next == TC_BINOP)
330     return true;
331
332   /* A comma always has a space afterward. */
333   if (prev == TC_COMMA)
334     return true;
335
336   /* Otherwise, PREV is TC_ID or TC_PUNCT, which only need a space if there are
337      two or them in a row. */
338   return prev == next;
339 }
340
341 static enum token_class
342 classify_token (enum token_type type)
343 {
344   switch (type)
345     {
346     case T_ID:
347     case T_MACRO_ID:
348     case T_POS_NUM:
349     case T_NEG_NUM:
350     case T_STRING:
351       return TC_ID;
352
353     case T_STOP:
354       return TC_PUNCT;
355
356     case T_ENDCMD:
357       return TC_ENDCMD;
358
359     case T_LPAREN:
360     case T_RPAREN:
361     case T_LBRACK:
362     case T_RBRACK:
363       return TC_PUNCT;
364
365     case T_PLUS:
366     case T_DASH:
367     case T_ASTERISK:
368     case T_SLASH:
369     case T_EQUALS:
370     case T_AND:
371     case T_OR:
372     case T_NOT:
373     case T_EQ:
374     case T_GE:
375     case T_GT:
376     case T_LE:
377     case T_LT:
378     case T_NE:
379     case T_ALL:
380     case T_BY:
381     case T_TO:
382     case T_WITH:
383     case T_EXP:
384     case T_MACRO_PUNCT:
385       return TC_BINOP;
386
387     case T_COMMA:
388       return TC_COMMA;
389     }
390
391   NOT_REACHED ();
392 }
393
394 /* Appends a syntax representation of the tokens in MTS to S.  If OFS and LEN
395    are nonnull, sets OFS[i] to the offset within S of the start of token 'i' in
396    MTS and LEN[i] to its length.  OFS[i] + LEN[i] is not necessarily OFS[i + 1]
397    because some tokens are separated by white space.  */
398 void
399 macro_tokens_to_representation (struct macro_tokens *mts, struct string *s,
400                                 size_t *ofs, size_t *len)
401 {
402   assert ((ofs != NULL) == (len != NULL));
403
404   if (!mts->n)
405     return;
406
407   for (size_t i = 0; i < mts->n; i++)
408     {
409       if (i > 0)
410         {
411           enum token_type prev = mts->mts[i - 1].token.type;
412           enum token_type next = mts->mts[i].token.type;
413
414           if (prev == T_ENDCMD)
415             ds_put_byte (s, '\n');
416           else
417             {
418               enum token_class pc = classify_token (prev);
419               enum token_class nc = classify_token (next);
420               if (needs_space (pc, nc))
421                 ds_put_byte (s, ' ');
422             }
423         }
424
425       if (ofs)
426         ofs[i] = s->ss.length;
427       macro_token_to_representation (&mts->mts[i], s);
428       if (len)
429         len[i] = s->ss.length - ofs[i];
430     }
431 }
432
433 void
434 macro_destroy (struct macro *m)
435 {
436   if (!m)
437     return;
438
439   free (m->name);
440   free (m->file_name);
441   for (size_t i = 0; i < m->n_params; i++)
442     {
443       struct macro_param *p = &m->params[i];
444       free (p->name);
445
446       macro_tokens_uninit (&p->def);
447
448       switch (p->arg_type)
449         {
450         case ARG_N_TOKENS:
451           break;
452
453         case ARG_CHAREND:
454           token_uninit (&p->charend);
455           break;
456
457         case ARG_ENCLOSE:
458           token_uninit (&p->enclose[0]);
459           token_uninit (&p->enclose[1]);
460           break;
461
462         case ARG_CMDEND:
463           break;
464         }
465     }
466   free (m->params);
467   macro_tokens_uninit (&m->body);
468   free (m);
469 }
470 \f
471 struct macro_set *
472 macro_set_create (void)
473 {
474   struct macro_set *set = xmalloc (sizeof *set);
475   *set = (struct macro_set) {
476     .macros = HMAP_INITIALIZER (set->macros),
477   };
478   return set;
479 }
480
481 void
482 macro_set_destroy (struct macro_set *set)
483 {
484   if (!set)
485     return;
486
487   struct macro *macro, *next;
488   HMAP_FOR_EACH_SAFE (macro, next, struct macro, hmap_node, &set->macros)
489     {
490       hmap_delete (&set->macros, &macro->hmap_node);
491       macro_destroy (macro);
492     }
493   hmap_destroy (&set->macros);
494   free (set);
495 }
496
497 static unsigned int
498 hash_macro_name (const char *name)
499 {
500   return utf8_hash_case_string (name, 0);
501 }
502
503 static struct macro *
504 macro_set_find__ (struct macro_set *set, const char *name)
505 {
506   if (macro_set_is_empty (set))
507     return NULL;
508
509   struct macro *macro;
510   HMAP_FOR_EACH_WITH_HASH (macro, struct macro, hmap_node,
511                            hash_macro_name (name), &set->macros)
512     if (!utf8_strcasecmp (macro->name, name))
513       return macro;
514
515   return NULL;
516 }
517
518 const struct macro *
519 macro_set_find (const struct macro_set *set, const char *name)
520 {
521   return macro_set_find__ (CONST_CAST (struct macro_set *, set), name);
522 }
523
524 /* Adds M to SET.  M replaces any existing macro with the same name.  Takes
525    ownership of M. */
526 void
527 macro_set_add (struct macro_set *set, struct macro *m)
528 {
529   struct macro *victim = macro_set_find__ (set, m->name);
530   if (victim)
531     {
532       hmap_delete (&set->macros, &victim->hmap_node);
533       macro_destroy (victim);
534     }
535
536   hmap_insert (&set->macros, &m->hmap_node, hash_macro_name (m->name));
537 }
538 \f
539 /* Macro call parsing.. */
540
541 enum mc_state
542   {
543     /* Error state. */
544     MC_ERROR,
545
546     /* Accumulating tokens in mc->params toward the end of any type of
547        argument. */
548     MC_ARG,
549
550     /* Expecting the opening delimiter of an ARG_ENCLOSE argument. */
551     MC_ENCLOSE,
552
553     /* Expecting a keyword for a keyword argument. */
554     MC_KEYWORD,
555
556     /* Expecting an equal sign for a keyword argument. */
557     MC_EQUALS,
558
559     /* Macro fully parsed and ready for expansion. */
560     MC_FINISHED,
561   };
562
563 /* Parsing macro calls.  This is a FSM driven by macro_call_create() and
564    macro_call_add() to identify the macro being called and obtain its
565    arguments.  'state' identifies the FSM state. */
566 struct macro_call
567   {
568     const struct macro_set *macros;
569     const struct macro *macro;
570     struct macro_tokens **args;
571
572     enum mc_state state;
573     size_t n_tokens;
574     const struct macro_param *param; /* Parameter currently being parsed. */
575   };
576
577 /* Completes macro expansion by initializing arguments that weren't supplied to
578    their defaults. */
579 static int
580 mc_finished (struct macro_call *mc)
581 {
582   mc->state = MC_FINISHED;
583   for (size_t i = 0; i < mc->macro->n_params; i++)
584     if (!mc->args[i])
585       mc->args[i] = &mc->macro->params[i].def;
586   return mc->n_tokens;
587 }
588
589 static int
590 mc_next_arg (struct macro_call *mc)
591 {
592   if (!mc->param)
593     {
594       assert (!mc->macro->n_params);
595       return mc_finished (mc);
596     }
597   else if (mc->param->positional)
598     {
599       mc->param++;
600       if (mc->param >= &mc->macro->params[mc->macro->n_params])
601         return mc_finished (mc);
602       else
603         {
604           mc->state = (!mc->param->positional ? MC_KEYWORD
605                        : mc->param->arg_type == ARG_ENCLOSE ? MC_ENCLOSE
606                        : MC_ARG);
607           return 0;
608         }
609     }
610   else
611     {
612       for (size_t i = 0; i < mc->macro->n_params; i++)
613         if (!mc->args[i])
614           {
615             mc->state = MC_KEYWORD;
616             return 0;
617           }
618       return mc_finished (mc);
619     }
620 }
621
622 static int
623 mc_error (struct macro_call *mc)
624 {
625   mc->state = MC_ERROR;
626   return -1;
627 }
628
629 static int
630 mc_add_arg (struct macro_call *mc, const struct macro_token *mt)
631 {
632   const struct macro_param *p = mc->param;
633
634   const struct token *token = &mt->token;
635   if ((token->type == T_ENDCMD || token->type == T_STOP)
636       && p->arg_type != ARG_CMDEND)
637     {
638       msg (SE, _("Unexpected end of command reading argument %s "
639                  "to macro %s."), mc->param->name, mc->macro->name);
640
641       return mc_error (mc);
642     }
643
644   mc->n_tokens++;
645
646   struct macro_tokens **argp = &mc->args[p - mc->macro->params];
647   if (!*argp)
648     *argp = xzalloc (sizeof **argp);
649   struct macro_tokens *arg = *argp;
650   if (p->arg_type == ARG_N_TOKENS)
651     {
652       macro_tokens_add (arg, mt);
653       if (arg->n >= p->n_tokens)
654         return mc_next_arg (mc);
655       return 0;
656     }
657   else if (p->arg_type == ARG_CMDEND)
658     {
659       if (token->type == T_ENDCMD || token->type == T_STOP)
660         return mc_next_arg (mc);
661       macro_tokens_add (arg, mt);
662       return 0;
663     }
664   else
665     {
666       const struct token *end
667         = p->arg_type == ARG_CHAREND ? &p->charend : &p->enclose[1];
668       if (token_equal (token, end))
669         return mc_next_arg (mc);
670       macro_tokens_add (arg, mt);
671       return 0;
672     }
673 }
674
675 static int
676 mc_expected (struct macro_call *mc, const struct macro_token *actual,
677              const struct token *expected)
678 {
679   const struct substring actual_s
680     = (actual->representation.length ? actual->representation
681        : ss_cstr (_("<end of input>")));
682   char *expected_s = token_to_string (expected);
683   msg (SE, _("Found `%.*s' while expecting `%s' reading argument %s "
684              "to macro %s."),
685        (int) actual_s.length, actual_s.string, expected_s,
686        mc->param->name, mc->macro->name);
687   free (expected_s);
688
689   return mc_error (mc);
690 }
691
692 static int
693 mc_enclose (struct macro_call *mc, const struct macro_token *mt)
694 {
695   const struct token *token = &mt->token;
696   mc->n_tokens++;
697
698   if (token_equal (&mc->param->enclose[0], token))
699     {
700       mc->state = MC_ARG;
701       return 0;
702     }
703
704   return mc_expected (mc, mt, &mc->param->enclose[0]);
705 }
706
707 static const struct macro_param *
708 macro_find_parameter_by_name (const struct macro *m, struct substring name)
709 {
710   ss_ltrim (&name, ss_cstr ("!"));
711
712   for (size_t i = 0; i < m->n_params; i++)
713     {
714       const struct macro_param *p = &m->params[i];
715       struct substring p_name = ss_cstr (p->name + 1);
716       if (!utf8_strncasecmp (p_name.string, p_name.length,
717                              name.string, name.length))
718         return p;
719     }
720   return NULL;
721 }
722
723 static int
724 mc_keyword (struct macro_call *mc, const struct macro_token *mt)
725 {
726   const struct token *token = &mt->token;
727   if (token->type != T_ID)
728     return mc_finished (mc);
729
730   const struct macro_param *p = macro_find_parameter_by_name (mc->macro,
731                                                               token->string);
732   if (p)
733     {
734       size_t arg_index = p - mc->macro->params;
735       mc->param = p;
736       if (mc->args[arg_index])
737         {
738           msg (SE,
739                _("Argument %s multiply specified in call to macro %s."),
740                p->name, mc->macro->name);
741           return mc_error (mc);
742         }
743
744       mc->n_tokens++;
745       mc->state = MC_EQUALS;
746       return 0;
747     }
748
749   return mc_finished (mc);
750 }
751
752 static int
753 mc_equals (struct macro_call *mc, const struct macro_token *mt)
754 {
755   const struct token *token = &mt->token;
756   mc->n_tokens++;
757
758   if (token->type == T_EQUALS)
759     {
760       mc->state = MC_ARG;
761       return 0;
762     }
763
764   return mc_expected (mc, mt, &(struct token) { .type = T_EQUALS });
765 }
766
767 /* If TOKEN is the first token of a call to a macro in MACROS, create a new
768    macro expander, initializes *MCP to it.  Returns 0 if more tokens are needed
769    and should be added via macro_call_add() or 1 if the caller should next call
770    macro_call_get_expansion().
771
772    If TOKEN is not the first token of a macro call, returns -1 and sets *MCP to
773    NULL. */
774 int
775 macro_call_create (const struct macro_set *macros,
776                    const struct token *token,
777                    struct macro_call **mcp)
778 {
779   const struct macro *macro = (token->type == T_ID || token->type == T_MACRO_ID
780                                ? macro_set_find (macros, token->string.string)
781                                : NULL);
782   if (!macro)
783     {
784       *mcp = NULL;
785       return -1;
786     }
787
788   struct macro_call *mc = xmalloc (sizeof *mc);
789   *mc = (struct macro_call) {
790     .macros = macros,
791     .macro = macro,
792     .n_tokens = 1,
793     .state = (!macro->n_params ? MC_FINISHED
794               : !macro->params[0].positional ? MC_KEYWORD
795               : macro->params[0].arg_type == ARG_ENCLOSE ? MC_ENCLOSE
796               : MC_ARG),
797     .args = macro->n_params ? xcalloc (macro->n_params, sizeof *mc->args) : NULL,
798     .param = macro->params,
799   };
800   *mcp = mc;
801
802   return mc->state == MC_FINISHED ? 1 : 0;
803 }
804
805 void
806 macro_call_destroy (struct macro_call *mc)
807 {
808   if (!mc)
809     return;
810
811   for (size_t i = 0; i < mc->macro->n_params; i++)
812     {
813       struct macro_tokens *a = mc->args[i];
814       if (a && a != &mc->macro->params[i].def)
815         {
816           macro_tokens_uninit (a);
817           free (a);
818         }
819     }
820   free (mc->args);
821   free (mc);
822 }
823
824 /* Adds TOKEN to the collection of tokens in MC that potentially need to be
825    macro expanded.
826
827    Returns -1 if the tokens added do not actually invoke a macro.  The caller
828    should consume the first token without expanding it.  (Later tokens might
829    invoke a macro so it's best to feed the second token into a new expander.)
830
831    Returns 0 if the macro expander needs more tokens, for macro arguments or to
832    decide whether this is actually a macro invocation.  The caller should call
833    macro_call_add() again with the next token.
834
835    Returns a positive number to indicate that the returned number of tokens
836    invoke a macro.  The number returned might be less than the number of tokens
837    added because it can take a few tokens of lookahead to determine whether the
838    macro invocation is finished.  The caller should call
839    macro_call_get_expansion() to obtain the expansion. */
840 int
841 macro_call_add (struct macro_call *mc, const struct macro_token *mt)
842 {
843   switch (mc->state)
844     {
845     case MC_ERROR:
846       return -1;
847
848     case MC_ARG:
849       return mc_add_arg (mc, mt);
850
851     case MC_ENCLOSE:
852       return mc_enclose (mc, mt);
853
854     case MC_KEYWORD:
855       return mc_keyword (mc, mt);
856
857     case MC_EQUALS:
858       return mc_equals (mc, mt);
859
860     default:
861       NOT_REACHED ();
862     }
863 }
864 \f
865 /* Macro expansion. */
866
867 struct macro_expander
868   {
869     /* Always available. */
870     const struct macro_set *macros;     /* Macros to expand recursively. */
871     enum segmenter_mode segmenter_mode; /* Mode for tokenization. */
872     int nesting_countdown;              /* Remaining nesting levels. */
873     const struct macro_expansion_stack *stack; /* Stack for error reporting. */
874     bool *expand;                       /* May macro calls be expanded? */
875     struct stringi_map *vars;           /* Variables from !DO and !LET. */
876
877     /* Only nonnull if inside a !DO loop. */
878     bool *break_;                       /* Set to true to break out of loop. */
879
880     /* Only nonnull if expanding a macro (and not, say, a macro argument). */
881     const struct macro *macro;
882     struct macro_tokens **args;
883   };
884
885 static void
886 macro_expand (const struct macro_tokens *, const struct macro_expander *,
887               struct macro_tokens *);
888
889 static bool
890 expand_macro_function (const struct macro_expander *me,
891                        const struct macro_token *input, size_t n_input,
892                        struct string *output, size_t *input_consumed);
893
894 /* Returns true if the N tokens within MTS start with !*, false otherwise. */
895 static bool
896 is_bang_star (const struct macro_token *mts, size_t n)
897 {
898   return (n > 1
899           && mts[0].token.type == T_MACRO_ID
900           && ss_equals (mts[0].token.string, ss_cstr ("!"))
901           && mts[1].token.type == T_ASTERISK);
902 }
903
904 /* Parses one function argument from the N_INPUT tokens in INPUT
905    Each argument to a macro function is one of:
906
907        - A quoted string or other single literal token.
908
909        - An argument to the macro being expanded, e.g. !1 or a named argument.
910
911        - !*.
912
913        - A function invocation.
914
915    Each function invocation yields a character sequence to be turned into a
916    sequence of tokens.  The case where that character sequence is a single
917    quoted string is an important special case.
918 */
919 static size_t
920 parse_function_arg (const struct macro_expander *me,
921                     const struct macro_token *input, size_t n_input,
922                     struct string *farg)
923 {
924   assert (n_input > 0);
925
926   const struct token *token = &input[0].token;
927   if (token->type == T_MACRO_ID && me->macro)
928     {
929       const struct macro_param *param = macro_find_parameter_by_name (
930         me->macro, token->string);
931       if (param)
932         {
933           size_t param_idx = param - me->macro->params;
934           const struct macro_tokens *marg = me->args[param_idx];
935           for (size_t i = 0; i < marg->n; i++)
936             {
937               if (i)
938                 ds_put_byte (farg, ' ');
939               ds_put_substring (farg, marg->mts[i].representation);
940             }
941           return 1;
942         }
943
944       if (is_bang_star (input, n_input))
945         {
946           for (size_t i = 0; i < me->macro->n_params; i++)
947             {
948               if (!me->macro->params[i].positional)
949                 break;
950
951               const struct macro_tokens *marg = me->args[i];
952               for (size_t j = 0; j < marg->n; j++)
953                 {
954                   if (i || j)
955                     ds_put_byte (farg, ' ');
956                   ds_put_substring (farg, marg->mts[j].representation);
957                 }
958             }
959           return 2;
960         }
961
962       const char *value = stringi_map_find__ (me->vars,
963                                               token->string.string,
964                                               token->string.length);
965       if (value)
966         {
967           ds_put_cstr (farg, value);
968           return 1;
969         }
970
971       size_t subinput_consumed;
972       if (expand_macro_function (me, input, n_input,
973                                  farg, &subinput_consumed))
974         return subinput_consumed;
975     }
976
977   ds_put_substring (farg, input[0].representation);
978   return 1;
979 }
980
981 static bool
982 parse_macro_function (const struct macro_expander *me,
983                       const struct macro_token *tokens, size_t n_tokens,
984                       struct string_array *args,
985                       struct substring function,
986                       int min_args, int max_args,
987                       size_t *input_consumed)
988 {
989   if (!n_tokens
990       || tokens[0].token.type != T_MACRO_ID
991       || !ss_equals_case (tokens[0].token.string, function)) /* XXX abbrevs allowed */
992     return false;
993
994   if (n_tokens < 2 || tokens[1].token.type != T_LPAREN)
995     {
996       macro_error (me->stack, n_tokens > 1 ? &tokens[1] : NULL,
997                    _("`(' expected following %s."), function.string);
998       return false;
999     }
1000
1001   string_array_init (args);
1002
1003   for (size_t i = 2;; )
1004     {
1005       if (i >= n_tokens)
1006         goto unexpected_end;
1007       if (tokens[i].token.type == T_RPAREN)
1008         {
1009           *input_consumed = i + 1;
1010           if (args->n < min_args || args->n > max_args)
1011             {
1012               macro_error (me->stack, &tokens[i],
1013                            _("Wrong number of arguments to macro function %s."),
1014                            function.string);
1015               goto error;
1016             }
1017           return true;
1018         }
1019
1020       struct string s = DS_EMPTY_INITIALIZER;
1021       i += parse_function_arg (me, tokens + i, n_tokens - i, &s);
1022       if (i >= n_tokens)
1023         {
1024           ds_destroy (&s);
1025           goto unexpected_end;
1026         }
1027       string_array_append_nocopy (args, ds_steal_cstr (&s));
1028
1029       if (tokens[i].token.type == T_COMMA)
1030         i++;
1031       else if (tokens[i].token.type != T_RPAREN)
1032         {
1033           macro_error (me->stack, &tokens[i],
1034                        _("`,' or `)' expected in call to macro function %s."),
1035                        function.string);
1036           goto error;
1037         }
1038     }
1039
1040 unexpected_end:
1041   macro_error (me->stack, NULL, _("Missing `)' in call to macro function %s."),
1042                function.string);
1043   /* Fall through. */
1044 error:
1045   string_array_destroy (args);
1046   return false;
1047 }
1048
1049 static bool
1050 unquote_string (const char *s, enum segmenter_mode segmenter_mode,
1051                 struct string *content)
1052 {
1053   struct string_lexer slex;
1054   string_lexer_init (&slex, s, strlen (s), segmenter_mode, true);
1055
1056   struct token token1;
1057   if (!string_lexer_next (&slex, &token1))
1058     return false;
1059
1060   if (token1.type != T_STRING)
1061     {
1062       token_uninit (&token1);
1063       return false;
1064     }
1065
1066   struct token token2;
1067   if (string_lexer_next (&slex, &token2))
1068     {
1069       token_uninit (&token1);
1070       token_uninit (&token2);
1071       return false;
1072     }
1073
1074   ds_put_substring (content, token1.string);
1075   token_uninit (&token1);
1076   return true;
1077 }
1078
1079 static const char *
1080 unquote_string_in_place (const char *s, enum segmenter_mode segmenter_mode,
1081                          struct string *tmp)
1082 {
1083   ds_init_empty (tmp);
1084   return unquote_string (s, segmenter_mode, tmp) ? ds_cstr (tmp) : s;
1085 }
1086
1087 static bool
1088 parse_integer (const char *s, int *np)
1089 {
1090   errno = 0;
1091
1092   char *tail;
1093   long int n = strtol (s, &tail, 10);
1094   *np = n < INT_MIN ? INT_MIN : n > INT_MAX ? INT_MAX : n;
1095   tail += strspn (tail, CC_SPACES);
1096   return *tail == '\0' && errno != ERANGE && n == *np;
1097 }
1098
1099 static bool
1100 expand_macro_function (const struct macro_expander *me,
1101                        const struct macro_token *input, size_t n_input,
1102                        struct string *output, size_t *input_consumed)
1103 {
1104   struct string_array args;
1105   if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!LENGTH"), 1, 1,
1106                             input_consumed))
1107     ds_put_format (output, "%zu", strlen (args.strings[0]));
1108   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!BLANKS"), 1, 1,
1109                                  input_consumed))
1110     {
1111       int n;
1112       if (!parse_integer (args.strings[0], &n))
1113         {
1114           macro_error (me->stack, NULL,
1115                        _("Argument to !BLANKS must be non-negative integer "
1116                          "(not \"%s\")."), args.strings[0]);
1117           string_array_destroy (&args);
1118           return false;
1119         }
1120
1121       ds_put_byte_multiple (output, ' ', n);
1122     }
1123   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!CONCAT"), 1, INT_MAX,
1124                                  input_consumed))
1125     {
1126       for (size_t i = 0; i < args.n; i++)
1127         if (!unquote_string (args.strings[i], me->segmenter_mode, output))
1128           ds_put_cstr (output, args.strings[i]);
1129     }
1130   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!HEAD"), 1, 1,
1131                                  input_consumed))
1132     {
1133       struct string tmp;
1134       const char *s = unquote_string_in_place (args.strings[0],
1135                                                me->segmenter_mode, &tmp);
1136
1137       struct macro_tokens mts = { .n = 0 };
1138       macro_tokens_from_string__ (&mts, ss_cstr (s), me->segmenter_mode,
1139                                   me->stack);
1140       if (mts.n > 0)
1141         ds_put_substring (output, mts.mts[0].representation);
1142       macro_tokens_uninit (&mts);
1143       ds_destroy (&tmp);
1144     }
1145   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!INDEX"), 2, 2,
1146                                  input_consumed))
1147     {
1148       const char *haystack = args.strings[0];
1149       const char *needle = strstr (haystack, args.strings[1]);
1150       ds_put_format (output, "%zu", needle ? needle - haystack + 1 : 0);
1151     }
1152   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!QUOTE"), 1, 1,
1153                                  input_consumed))
1154     {
1155       if (unquote_string (args.strings[0], me->segmenter_mode, NULL))
1156         ds_put_cstr (output, args.strings[0]);
1157       else
1158         {
1159           ds_extend (output, strlen (args.strings[0]) + 2);
1160           ds_put_byte (output, '\'');
1161           for (const char *p = args.strings[0]; *p; p++)
1162             {
1163               if (*p == '\'')
1164                 ds_put_byte (output, '\'');
1165               ds_put_byte (output, *p);
1166             }
1167           ds_put_byte (output, '\'');
1168         }
1169     }
1170   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!SUBSTR"), 2, 3,
1171                                  input_consumed))
1172     {
1173       int start;
1174       if (!parse_integer (args.strings[1], &start) || start < 1)
1175         {
1176           macro_error (me->stack, NULL,
1177                        _("Second argument of !SUBSTR must be "
1178                          "positive integer (not \"%s\")."),
1179                        args.strings[1]);
1180           string_array_destroy (&args);
1181           return false;
1182         }
1183
1184       int count = INT_MAX;
1185       if (args.n > 2 && (!parse_integer (args.strings[2], &count) || count < 0))
1186         {
1187           macro_error (me->stack, NULL,
1188                        _("Third argument of !SUBSTR must be "
1189                          "non-negative integer (not \"%s\")."),
1190                        args.strings[2]);
1191           string_array_destroy (&args);
1192           return false;
1193         }
1194
1195       struct substring s = ss_cstr (args.strings[0]);
1196       ds_put_substring (output, ss_substr (s, start - 1, count));
1197     }
1198   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!TAIL"), 1, 1,
1199                                  input_consumed))
1200     {
1201       struct string tmp;
1202       const char *s = unquote_string_in_place (args.strings[0],
1203                                                me->segmenter_mode, &tmp);
1204
1205       struct macro_tokens mts = { .n = 0 };
1206       macro_tokens_from_string__ (&mts, ss_cstr (s), me->segmenter_mode,
1207                                   me->stack);
1208       if (mts.n > 1)
1209         {
1210           struct macro_tokens tail = { .mts = mts.mts + 1, .n = mts.n - 1 };
1211           macro_tokens_to_representation (&tail, output, NULL, NULL);
1212         }
1213       macro_tokens_uninit (&mts);
1214       ds_destroy (&tmp);
1215     }
1216   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!UNQUOTE"), 1, 1,
1217                                  input_consumed))
1218     {
1219       if (!unquote_string (args.strings[0], me->segmenter_mode, output))
1220         ds_put_cstr (output, args.strings[0]);
1221     }
1222   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!UPCASE"), 1, 1,
1223                                  input_consumed))
1224     {
1225       struct string tmp;
1226       const char *s = unquote_string_in_place (args.strings[0],
1227                                                me->segmenter_mode, &tmp);
1228       char *upper = utf8_to_upper (s);
1229       ds_put_cstr (output, upper);
1230       free (upper);
1231       ds_destroy (&tmp);
1232     }
1233   else if (parse_macro_function (me, input, n_input, &args, ss_cstr ("!EVAL"), 1, 1,
1234                                  input_consumed))
1235     {
1236       struct macro_tokens mts = { .n = 0 };
1237       macro_tokens_from_string__ (&mts, ss_cstr (args.strings[0]),
1238                                   me->segmenter_mode, me->stack);
1239       struct macro_tokens exp = { .n = 0 };
1240       struct macro_expansion_stack stack = {
1241         .name = "!EVAL",
1242         .next = me->stack
1243       };
1244       struct macro_expander subme = *me;
1245       subme.break_ = NULL;
1246       subme.stack = &stack;
1247       
1248       macro_expand (&mts, &subme, &exp);
1249       macro_tokens_to_representation (&exp, output, NULL, NULL);
1250       macro_tokens_uninit (&exp);
1251       macro_tokens_uninit (&mts);
1252     }
1253   else if (n_input > 0
1254            && input[0].token.type == T_MACRO_ID
1255            && ss_equals_case (input[0].token.string, ss_cstr ("!NULL")))
1256     {
1257       *input_consumed = 1;
1258       return true;
1259     }
1260   else
1261     return false;
1262
1263   string_array_destroy (&args);
1264   return true;
1265 }
1266
1267 static char *macro_evaluate_or (const struct macro_expander *me,
1268                                 const struct macro_token **tokens,
1269                                 const struct macro_token *end);
1270
1271 static char *
1272 macro_evaluate_literal (const struct macro_expander *me,
1273                         const struct macro_token **tokens,
1274                         const struct macro_token *end)
1275 {
1276   const struct macro_token *p = *tokens;
1277   if (p >= end)
1278     return NULL;
1279   if (p->token.type == T_LPAREN)
1280     {
1281       p++;
1282       char *value = macro_evaluate_or (me, &p, end);
1283       if (!value)
1284         return NULL;
1285       if (p >= end || p->token.type != T_RPAREN)
1286         {
1287           free (value);
1288           macro_error (me->stack, p < end ? p : NULL,
1289                        _("Expecting ')' in macro expression."));
1290           return NULL;
1291         }
1292       p++;
1293       *tokens = p;
1294       return value;
1295     }
1296   else if (p->token.type == T_RPAREN)
1297     {
1298       macro_error (me->stack, p, _("Expecting literal or function invocation "
1299                                    "in macro expression."));
1300       return NULL;
1301     }
1302
1303   struct string function_output = DS_EMPTY_INITIALIZER;
1304   size_t function_consumed = parse_function_arg (me, p, end - p,
1305                                                  &function_output);
1306   struct string unquoted = DS_EMPTY_INITIALIZER;
1307   if (unquote_string (ds_cstr (&function_output), me->segmenter_mode,
1308                       &unquoted))
1309     {
1310       ds_swap (&function_output, &unquoted);
1311       ds_destroy (&unquoted);
1312     }
1313   *tokens = p + function_consumed;
1314   return ds_steal_cstr (&function_output);
1315 }
1316
1317 /* Returns true if MT is valid as a macro operator.  Only operators written as
1318    symbols (e.g. <>) are usable in macro expressions, not operator written as
1319    letters (e.g. EQ). */
1320 static bool
1321 is_macro_operator (const struct macro_token *mt)
1322 {
1323   return (mt->representation.length > 0
1324           && !c_isalpha (mt->representation.string[0]));
1325 }
1326
1327 static enum token_type
1328 parse_relational_op (const struct macro_token *mt)
1329 {
1330   switch (mt->token.type)
1331     {
1332     case T_EQUALS:
1333       return T_EQ;
1334
1335     case T_NE:
1336     case T_LT:
1337     case T_GT:
1338     case T_LE:
1339     case T_GE:
1340       return is_macro_operator (mt) ? mt->token.type : T_STOP;
1341
1342     case T_MACRO_ID:
1343       return (ss_equals_case (mt->token.string, ss_cstr ("!EQ")) ? T_EQ
1344               : ss_equals_case (mt->token.string, ss_cstr ("!NE")) ? T_NE
1345               : ss_equals_case (mt->token.string, ss_cstr ("!LT")) ? T_LT
1346               : ss_equals_case (mt->token.string, ss_cstr ("!GT")) ? T_GT
1347               : ss_equals_case (mt->token.string, ss_cstr ("!LE")) ? T_LE
1348               : ss_equals_case (mt->token.string, ss_cstr ("!GE")) ? T_GE
1349               : T_STOP);
1350
1351     default:
1352       return T_STOP;
1353     }
1354 }
1355
1356 static char *
1357 macro_evaluate_relational (const struct macro_expander *me,
1358                            const struct macro_token **tokens,
1359                            const struct macro_token *end)
1360 {
1361   const struct macro_token *p = *tokens;
1362   char *lhs = macro_evaluate_literal (me, &p, end);
1363   if (!lhs)
1364     return NULL;
1365
1366   enum token_type op = p >= end ? T_STOP : parse_relational_op (p);
1367   if (op == T_STOP)
1368     {
1369       *tokens = p;
1370       return lhs;
1371     }
1372   p++;
1373
1374   char *rhs = macro_evaluate_literal (me, &p, end);
1375   if (!rhs)
1376     {
1377       free (lhs);
1378       return NULL;
1379     }
1380
1381   struct string lhs_tmp, rhs_tmp;
1382   int cmp = strcmp (unquote_string_in_place (lhs, me->segmenter_mode,
1383                                              &lhs_tmp),
1384                     unquote_string_in_place (rhs, me->segmenter_mode,
1385                                              &rhs_tmp));
1386   ds_destroy (&lhs_tmp);
1387   ds_destroy (&rhs_tmp);
1388
1389   free (lhs);
1390   free (rhs);
1391
1392   bool b = (op == T_EQUALS || op == T_EQ ? !cmp
1393             : op == T_NE ? cmp
1394             : op == T_LT ? cmp < 0
1395             : op == T_GT ? cmp > 0
1396             : op == T_LE ? cmp <= 0
1397             : /* T_GE */ cmp >= 0);
1398
1399   *tokens = p;
1400   return xstrdup (b ? "1" : "0");
1401 }
1402
1403 static char *
1404 macro_evaluate_not (const struct macro_expander *me,
1405                     const struct macro_token **tokens,
1406                     const struct macro_token *end)
1407 {
1408   const struct macro_token *p = *tokens;
1409
1410   unsigned int negations = 0;
1411   while (p < end
1412          && (ss_equals_case (p->representation, ss_cstr ("!NOT"))
1413              || ss_equals (p->representation, ss_cstr ("~"))))
1414     {
1415       p++;
1416       negations++;
1417     }
1418
1419   char *operand = macro_evaluate_relational (me, &p, end);
1420   if (!operand || !negations)
1421     {
1422       *tokens = p;
1423       return operand;
1424     }
1425
1426   bool b = strcmp (operand, "0") ^ (negations & 1);
1427   free (operand);
1428   *tokens = p;
1429   return xstrdup (b ? "1" : "0");
1430 }
1431
1432 static char *
1433 macro_evaluate_and (const struct macro_expander *me,
1434                     const struct macro_token **tokens,
1435                     const struct macro_token *end)
1436 {
1437   const struct macro_token *p = *tokens;
1438   char *lhs = macro_evaluate_not (me, &p, end);
1439   if (!lhs)
1440     return NULL;
1441
1442   while (p < end
1443          && (ss_equals_case (p->representation, ss_cstr ("!AND"))
1444              || ss_equals (p->representation, ss_cstr ("&"))))
1445     {
1446       p++;
1447       char *rhs = macro_evaluate_not (me, &p, end);
1448       if (!rhs)
1449         {
1450           free (lhs);
1451           return NULL;
1452         }
1453
1454       bool b = strcmp (lhs, "0") && strcmp (rhs, "0");
1455       free (lhs);
1456       free (rhs);
1457       lhs = xstrdup (b ? "1" : "0");
1458     }
1459   *tokens = p;
1460   return lhs;
1461 }
1462
1463 static char *
1464 macro_evaluate_or (const struct macro_expander *me,
1465                    const struct macro_token **tokens,
1466                    const struct macro_token *end)
1467 {
1468   const struct macro_token *p = *tokens;
1469   char *lhs = macro_evaluate_and (me, &p, end);
1470   if (!lhs)
1471     return NULL;
1472
1473   while (p < end
1474          && (ss_equals_case (p->representation, ss_cstr ("!OR"))
1475              || ss_equals (p->representation, ss_cstr ("|"))))
1476     {
1477       p++;
1478       char *rhs = macro_evaluate_and (me, &p, end);
1479       if (!rhs)
1480         {
1481           free (lhs);
1482           return NULL;
1483         }
1484
1485       bool b = strcmp (lhs, "0") || strcmp (rhs, "0");
1486       free (lhs);
1487       free (rhs);
1488       lhs = xstrdup (b ? "1" : "0");
1489     }
1490   *tokens = p;
1491   return lhs;
1492 }
1493
1494 static char *
1495 macro_evaluate_expression (const struct macro_token **tokens, size_t n_tokens,
1496                            const struct macro_expander *me)
1497 {
1498   return macro_evaluate_or (me, tokens, *tokens + n_tokens);
1499 }
1500
1501 static bool
1502 macro_evaluate_number (const struct macro_token **tokens, size_t n_tokens,
1503                        const struct macro_expander *me,
1504                        double *number)
1505 {
1506   char *s = macro_evaluate_expression (tokens, n_tokens, me);
1507   if (!s)
1508     return false;
1509
1510   struct macro_tokens mts = { .n = 0 };
1511   macro_tokens_from_string__ (&mts, ss_cstr (s), me->segmenter_mode, me->stack);
1512   if (mts.n != 1 || !token_is_number (&mts.mts[0].token))
1513     {
1514       macro_error (me->stack, mts.n > 0 ? &mts.mts[0] : NULL,
1515                    _("Macro expression must evaluate to "
1516                      "a number (not \"%s\")."), s);
1517       free (s);
1518       macro_tokens_uninit (&mts);
1519       return false;
1520     }
1521
1522   *number = token_number (&mts.mts[0].token);
1523   free (s);
1524   macro_tokens_uninit (&mts);
1525   return true;
1526 }
1527
1528 static const struct macro_token *
1529 find_ifend_clause (const struct macro_token *p, const struct macro_token *end)
1530 {
1531   size_t nesting = 0;
1532   for (; p < end; p++)
1533     {
1534       if (p->token.type != T_MACRO_ID)
1535         continue;
1536
1537       if (ss_equals_case (p->token.string, ss_cstr ("!IF")))
1538         nesting++;
1539       else if (ss_equals_case (p->token.string, ss_cstr ("!IFEND")))
1540         {
1541           if (!nesting)
1542             return p;
1543           nesting--;
1544         }
1545       else if (ss_equals_case (p->token.string, ss_cstr ("!ELSE")) && !nesting)
1546         return p;
1547     }
1548   return NULL;
1549 }
1550
1551 static size_t
1552 macro_expand_if (const struct macro_token *tokens, size_t n_tokens,
1553                  const struct macro_expander *me,
1554                  struct macro_tokens *exp)
1555 {
1556   const struct macro_token *p = tokens;
1557   const struct macro_token *end = tokens + n_tokens;
1558
1559   if (p >= end || !ss_equals_case (p->token.string, ss_cstr ("!IF")))
1560     return 0;
1561
1562   p++;
1563   char *result = macro_evaluate_expression (&p, end - p, me);
1564   if (!result)
1565     return 0;
1566   bool b = strcmp (result, "0");
1567   free (result);
1568
1569   if (p >= end
1570       || p->token.type != T_MACRO_ID
1571       || !ss_equals_case (p->token.string, ss_cstr ("!THEN")))
1572     {
1573       macro_error (me->stack, p < end ? p : NULL,
1574                    _("!THEN expected in macro !IF construct."));
1575       return 0;
1576     }
1577
1578   const struct macro_token *start_then = p + 1;
1579   const struct macro_token *end_then = find_ifend_clause (start_then, end);
1580   if (!end_then)
1581     {
1582       macro_error (me->stack, NULL,
1583                    _("!ELSE or !IFEND expected in macro !IF construct."));
1584       return 0;
1585     }
1586
1587   const struct macro_token *start_else, *end_if;
1588   if (ss_equals_case (end_then->token.string, ss_cstr ("!ELSE")))
1589     {
1590       start_else = end_then + 1;
1591       end_if = find_ifend_clause (start_else, end);
1592       if (!end_if
1593           || !ss_equals_case (end_if->token.string, ss_cstr ("!IFEND")))
1594         {
1595           macro_error (me->stack, end_if ? end_if : NULL,
1596                        _("!IFEND expected in macro !IF construct."));
1597           return 0;
1598         }
1599     }
1600   else
1601     {
1602       start_else = NULL;
1603       end_if = end_then;
1604     }
1605
1606   const struct macro_token *start;
1607   size_t n;
1608   if (b)
1609     {
1610       start = start_then;
1611       n = end_then - start_then;
1612     }
1613   else if (start_else)
1614     {
1615       start = start_else;
1616       n = end_if - start_else;
1617     }
1618   else
1619     {
1620       start = NULL;
1621       n = 0;
1622     }
1623
1624   if (n)
1625     {
1626       struct macro_tokens mts = {
1627         .mts = CONST_CAST (struct macro_token *, start),
1628         .n = n,
1629       };
1630       struct macro_expansion_stack stack = {
1631         .name = "!IF",
1632         .next = me->stack,
1633       };
1634       struct macro_expander subme = *me;
1635       subme.stack = &stack;
1636       macro_expand (&mts, &subme, exp);
1637     }
1638   return (end_if + 1) - tokens;
1639 }
1640
1641 static size_t
1642 macro_parse_let (const struct macro_token *tokens, size_t n_tokens,
1643                  const struct macro_expander *me)
1644 {
1645   const struct macro_token *p = tokens;
1646   const struct macro_token *end = tokens + n_tokens;
1647
1648   if (p >= end || !ss_equals_case (p->token.string, ss_cstr ("!LET")))
1649     return 0;
1650   p++;
1651
1652   if (p >= end || p->token.type != T_MACRO_ID)
1653     {
1654       macro_error (me->stack, p < end ? p : NULL,
1655                    _("Expected macro variable name following !LET."));
1656       return 0;
1657     }
1658   const struct substring var_name = p->token.string;
1659   if (is_macro_keyword (var_name)
1660       || (me->macro && macro_find_parameter_by_name (me->macro, var_name)))
1661     {
1662       macro_error (me->stack, p < end ? p : NULL,
1663                    _("Cannot use argument name or macro keyword "
1664                      "\"%.*s\" as !LET variable."),
1665                    (int) var_name.length, var_name.string);
1666       return 0;
1667     }
1668   p++;
1669
1670   if (p >= end || p->token.type != T_EQUALS)
1671     {
1672       macro_error (me->stack, p < end ? p : NULL,
1673                    _("Expected `=' following !LET."));
1674       return 0;
1675     }
1676   p++;
1677
1678   char *value = macro_evaluate_expression (&p, end - p, me);
1679   if (!value)
1680     return 0;
1681
1682   stringi_map_replace_nocopy (me->vars, ss_xstrdup (var_name), value);
1683   return p - tokens;
1684 }
1685
1686 static const struct macro_token *
1687 find_doend (const struct macro_expansion_stack *stack,
1688             const struct macro_token *p, const struct macro_token *end)
1689 {
1690   size_t nesting = 0;
1691   for (; p < end; p++)
1692     {
1693       if (p->token.type != T_MACRO_ID)
1694         continue;
1695
1696       if (ss_equals_case (p->token.string, ss_cstr ("!DO")))
1697         nesting++;
1698       else if (ss_equals_case (p->token.string, ss_cstr ("!DOEND")))
1699         {
1700           if (!nesting)
1701             return p;
1702           nesting--;
1703         }
1704     }
1705   macro_error (stack, NULL, _("Missing !DOEND."));
1706   return NULL;
1707 }
1708
1709 static size_t
1710 macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
1711                  const struct macro_expander *me,
1712                  struct macro_tokens *exp)
1713 {
1714   const struct macro_token *p = tokens;
1715   const struct macro_token *end = tokens + n_tokens;
1716
1717   if (p >= end || !ss_equals_case (p->token.string, ss_cstr ("!DO")))
1718     return 0;
1719   p++;
1720
1721   if (p >= end || p->token.type != T_MACRO_ID)
1722     {
1723       macro_error (me->stack, p < end ? p : NULL,
1724                    _("Expected macro variable name following !DO."));
1725       return 0;
1726     }
1727   const struct substring var_name = p->token.string;
1728   if (is_macro_keyword (var_name)
1729       || (me->macro && macro_find_parameter_by_name (me->macro, var_name)))
1730     {
1731       macro_error (me->stack, p, _("Cannot use argument name or macro "
1732                                "keyword as !DO variable."));
1733       return 0;
1734     }
1735   p++;
1736
1737   struct macro_expansion_stack substack = {
1738     .name = "!DO",
1739     .next = me->stack,
1740   };
1741   bool break_ = false;
1742   struct macro_expander subme = *me;
1743   subme.break_ = &break_;
1744   subme.stack = &substack;
1745
1746   int miterate = settings_get_miterate ();
1747   if (p < end && p->token.type == T_MACRO_ID
1748       && ss_equals_case (p->token.string, ss_cstr ("!IN")))
1749     {
1750       p++;
1751       char *list = macro_evaluate_expression (&p, end - p, &subme);
1752       if (!list)
1753         return 0;
1754
1755       struct macro_tokens items = { .n = 0 };
1756       macro_tokens_from_string__ (&items, ss_cstr (list), me->segmenter_mode,
1757                                   me->stack);
1758       free (list);
1759
1760       const struct macro_token *do_end = find_doend (subme.stack, p, end);
1761       if (!do_end)
1762         {
1763           macro_tokens_uninit (&items);
1764           return 0;
1765         }
1766
1767       const struct macro_tokens inner = {
1768         .mts = CONST_CAST (struct macro_token *, p),
1769         .n = do_end - p
1770       };
1771
1772       for (size_t i = 0; i < items.n && !break_; i++)
1773         {
1774           if (i >= miterate)
1775             {
1776               macro_error (&substack, NULL,
1777                            _("!DO loop over list exceeded "
1778                              "maximum number of iterations %d.  "
1779                              "(Use SET MITERATE to change the limit.)"),
1780                            miterate);
1781               break;
1782             }
1783           stringi_map_replace_nocopy (me->vars, ss_xstrdup (var_name),
1784                                       ss_xstrdup (items.mts[i].representation));
1785
1786           macro_expand (&inner, &subme, exp);
1787         }
1788       return do_end - tokens + 1;
1789     }
1790   else if (p < end && p->token.type == T_EQUALS)
1791     {
1792       p++;
1793       double first;
1794       if (!macro_evaluate_number (&p, end - p, &subme, &first))
1795         return 0;
1796
1797       if (p >= end || p->token.type != T_MACRO_ID
1798           || !ss_equals_case (p->token.string, ss_cstr ("!TO")))
1799         {
1800           macro_error (subme.stack, p < end ? p : NULL,
1801                        _("Expected !TO in numerical !DO loop."));
1802           return 0;
1803         }
1804       p++;
1805
1806       double last;
1807       if (!macro_evaluate_number (&p, end - p, &subme, &last))
1808         return 0;
1809
1810       double by = 1.0;
1811       if (p < end && p->token.type == T_MACRO_ID
1812           && ss_equals_case (p->token.string, ss_cstr ("!BY")))
1813         {
1814           p++;
1815           if (!macro_evaluate_number (&p, end - p, &subme, &by))
1816             return 0;
1817
1818           if (by == 0.0)
1819             {
1820               macro_error (subme.stack, NULL, _("!BY value cannot be zero."));
1821               return 0;
1822             }
1823         }
1824
1825       const struct macro_token *do_end = find_doend (subme.stack, p, end);
1826       if (!do_end)
1827         return 0;
1828       const struct macro_tokens inner = {
1829         .mts = CONST_CAST (struct macro_token *, p),
1830         .n = do_end - p
1831       };
1832
1833       if ((by > 0 && first <= last) || (by < 0 && first >= last))
1834         {
1835           int i = 0;
1836           for (double index = first;
1837                by > 0 ? (index <= last) : (index >= last) && !break_;
1838                index += by)
1839             {
1840               if (i++ > miterate)
1841                 {
1842                   macro_error (subme.stack, NULL,
1843                                _("Numerical !DO loop exceeded "
1844                                  "maximum number of iterations %d.  "
1845                                  "(Use SET MITERATE to change the limit.)"),
1846                                miterate);
1847                   break;
1848                 }
1849
1850               char index_s[DBL_BUFSIZE_BOUND];
1851               c_dtoastr (index_s, sizeof index_s, 0, 0, index);
1852               stringi_map_replace_nocopy (me->vars, ss_xstrdup (var_name),
1853                                           xstrdup (index_s));
1854
1855               macro_expand (&inner, &subme, exp);
1856             }
1857         }
1858
1859       return do_end - tokens + 1;
1860     }
1861   else
1862     {
1863       macro_error (me->stack, p < end ? p : NULL,
1864                    _("Expected `=' or !IN in !DO loop."));
1865       return 0;
1866     }
1867 }
1868
1869 static void
1870 macro_expand (const struct macro_tokens *mts,
1871               const struct macro_expander *me,
1872               struct macro_tokens *exp)
1873 {
1874   if (me->nesting_countdown <= 0)
1875     {
1876       macro_error (me->stack, NULL, _("Maximum nesting level %d exceeded.  "
1877                                       "(Use SET MNEST to change the limit.)"),
1878                    settings_get_mnest ());
1879       for (size_t i = 0; i < mts->n; i++)
1880         macro_tokens_add (exp, &mts->mts[i]);
1881       return;
1882     }
1883
1884   for (size_t i = 0; i < mts->n && (!me->break_ || !*me->break_); i++)
1885     {
1886       const struct macro_token *mt = &mts->mts[i];
1887       const struct token *token = &mt->token;
1888       if (token->type == T_MACRO_ID && me->macro)
1889         {
1890           const struct macro_param *param = macro_find_parameter_by_name (
1891             me->macro, token->string);
1892           if (param)
1893             {
1894               const struct macro_tokens *arg
1895                 = me->args[param - me->macro->params];
1896               if (*me->expand && param->expand_arg)
1897                 {
1898                   struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
1899                   struct macro_expansion_stack stack = {
1900                     .name = param->name,
1901                     .next = me->stack,
1902                   };
1903                   struct macro_expander subme = {
1904                     .macros = me->macros,
1905                     .macro = NULL,
1906                     .args = NULL,
1907                     .segmenter_mode = me->segmenter_mode,
1908                     .expand = me->expand,
1909                     .break_ = NULL,
1910                     .vars = &vars,
1911                     .nesting_countdown = me->nesting_countdown,
1912                     .stack = &stack,
1913                   };
1914                   macro_expand (arg, &subme, exp);
1915                   stringi_map_destroy (&vars);
1916                 }
1917               else
1918                 for (size_t i = 0; i < arg->n; i++)
1919                   macro_tokens_add (exp, &arg->mts[i]);
1920               continue;
1921             }
1922
1923           if (is_bang_star (mts->mts + i, mts->n - i))
1924             {
1925               for (size_t j = 0; j < me->macro->n_params; j++)
1926                 {
1927                   const struct macro_param *param = &me->macro->params[j];
1928                   if (!param->positional)
1929                     break;
1930
1931                   const struct macro_tokens *arg = me->args[j];
1932                   if (*me->expand && param->expand_arg)
1933                     {
1934                       struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
1935                       struct macro_expansion_stack stack = {
1936                         .name = "!*",
1937                         .next = me->stack,
1938                       };
1939                       struct macro_expander subme = {
1940                         .macros = me->macros,
1941                         .macro = NULL,
1942                         .args = NULL,
1943                         .segmenter_mode = me->segmenter_mode,
1944                         .expand = me->expand,
1945                         .break_ = NULL,
1946                         .vars = &vars,
1947                         .nesting_countdown = me->nesting_countdown,
1948                         .stack = &stack,
1949                       };
1950                       macro_expand (arg, &subme, exp);
1951                       stringi_map_destroy (&vars);
1952                     }
1953                   else
1954                     for (size_t k = 0; k < arg->n; k++)
1955                       macro_tokens_add (exp, &arg->mts[k]);
1956                 }
1957               i++;
1958               continue;
1959             }
1960
1961           size_t n = macro_expand_if (&mts->mts[i], mts->n - i, me, exp);
1962           if (n > 0)
1963             {
1964               i += n - 1;
1965               continue;
1966             }
1967         }
1968
1969       if (token->type == T_MACRO_ID)
1970         {
1971           const char *value = stringi_map_find__ (me->vars,
1972                                                   token->string.string,
1973                                                   token->string.length);
1974           if (value)
1975             {
1976               macro_tokens_from_string__ (exp, ss_cstr (value),
1977                                           me->segmenter_mode, me->stack);
1978               continue;
1979             }
1980         }
1981
1982       if (*me->expand)
1983         {
1984           struct macro_call *submc;
1985           int retval = macro_call_create (me->macros, token, &submc);
1986           for (size_t j = 1; !retval; j++)
1987             {
1988               const struct macro_token endcmd
1989                 = { .token = { .type = T_ENDCMD } };
1990               retval = macro_call_add (
1991                 submc, i + j < mts->n ? &mts->mts[i + j] : &endcmd);
1992             }
1993           if (retval > 0)
1994             {
1995               i += retval - 1;
1996               struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
1997               struct macro_expansion_stack stack = {
1998                 .name = submc->macro->name,
1999                 .file_name = submc->macro->file_name,
2000                 .first_line = submc->macro->first_line,
2001                 .last_line = submc->macro->last_line,
2002                 .next = me->stack,
2003               };
2004               struct macro_expander subme = {
2005                 .macros = submc->macros,
2006                 .macro = submc->macro,
2007                 .args = submc->args,
2008                 .segmenter_mode = me->segmenter_mode,
2009                 .expand = me->expand,
2010                 .break_ = NULL,
2011                 .vars = &vars,
2012                 .nesting_countdown = me->nesting_countdown - 1,
2013                 .stack = &stack,
2014               };
2015               macro_expand (&submc->macro->body, &subme, exp);
2016               macro_call_destroy (submc);
2017               stringi_map_destroy (&vars);
2018               continue;
2019             }
2020
2021           macro_call_destroy (submc);
2022         }
2023
2024       if (token->type != T_MACRO_ID)
2025         {
2026           macro_tokens_add (exp, mt);
2027           continue;
2028         }
2029
2030       if (ss_equals_case (token->string, ss_cstr ("!break")))
2031         {
2032           if (!me->break_)
2033             macro_error (me->stack, mt, _("!BREAK outside !DO."));
2034           else
2035             {
2036               *me->break_ = true;
2037               break;
2038             }
2039         }
2040
2041       struct string function_output = DS_EMPTY_INITIALIZER;
2042       size_t function_consumed;
2043       if (expand_macro_function (me, &mts->mts[i], mts->n - i,
2044                                  &function_output, &function_consumed))
2045         {
2046           i += function_consumed - 1;
2047
2048           macro_tokens_from_string__ (exp, function_output.ss,
2049                                       me->segmenter_mode, me->stack);
2050           ds_destroy (&function_output);
2051
2052           continue;
2053         }
2054
2055       size_t n = macro_parse_let (&mts->mts[i], mts->n - i, me);
2056       if (n > 0)
2057         {
2058           i += n - 1;
2059           continue;
2060         }
2061
2062       n = macro_expand_do (&mts->mts[i], mts->n - i, me, exp);
2063       if (n > 0)
2064         {
2065           i += n - 1;
2066           continue;
2067         }
2068
2069       if (ss_equals_case (token->string, ss_cstr ("!onexpand")))
2070         *me->expand = true;
2071       else if (ss_equals_case (token->string, ss_cstr ("!offexpand")))
2072         *me->expand = false;
2073       else
2074         macro_tokens_add (exp, mt);
2075     }
2076 }
2077
2078 void
2079 macro_call_expand (struct macro_call *mc, enum segmenter_mode segmenter_mode,
2080                    struct macro_tokens *exp)
2081 {
2082   assert (mc->state == MC_FINISHED);
2083
2084   bool expand = true;
2085   struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
2086   struct macro_expansion_stack stack = {
2087     .name = mc->macro->name,
2088     .file_name = mc->macro->file_name,
2089     .first_line = mc->macro->first_line,
2090     .last_line = mc->macro->last_line,
2091   };
2092   struct macro_expander me = {
2093     .macros = mc->macros,
2094     .macro = mc->macro,
2095     .args = mc->args,
2096     .segmenter_mode = segmenter_mode,
2097     .expand = &expand,
2098     .break_ = NULL,
2099     .vars = &vars,
2100     .nesting_countdown = settings_get_mnest (),
2101     .stack = &stack,
2102   };
2103
2104   macro_expand (&mc->macro->body, &me, exp);
2105
2106   stringi_map_destroy (&vars);
2107 }
2108