31bacec52d7ea29b4cc036ebb492ac24dfd55435
[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     const struct macro_set *macros;
870     const struct macro *macro;
871     struct macro_tokens **args;
872     enum segmenter_mode segmenter_mode;
873     struct stringi_map *vars;
874     bool *expand;
875     bool *break_;
876     int nesting_countdown;
877   };
878
879 /* Each argument to a macro function is one of:
880
881        - A quoted string or other single literal token.
882
883        - An argument to the macro being expanded, e.g. !1 or a named argument.
884
885        - !*.
886
887        - A function invocation.
888
889    Each function invocation yields a character sequence to be turned into a
890    sequence of tokens.  The case where that character sequence is a single
891    quoted string is an important special case.
892 */
893 struct parse_macro_function_ctx
894   {
895     const struct macro_token *input;
896     size_t n_input;
897     const struct macro_expander *me;
898     const struct macro_expansion_stack *stack;
899     bool *expand;
900   };
901
902 static void
903 macro_expand (const struct macro_tokens *, const struct macro_expander *,
904               const struct macro_expansion_stack *,
905               struct macro_tokens *);
906
907 static bool
908 expand_macro_function (struct parse_macro_function_ctx *ctx,
909                        struct string *output, size_t *input_consumed);
910
911 /* Returns true if the pair of tokens starting at offset OFS within MTS are !*,
912    false otherwise. */
913 static bool
914 is_bang_star (const struct macro_token *mts, size_t n, size_t ofs)
915 {
916   return (ofs + 1 < n
917           && mts[ofs].token.type == T_MACRO_ID
918           && ss_equals (mts[ofs].token.string, ss_cstr ("!"))
919           && mts[ofs + 1].token.type == T_ASTERISK);
920 }
921
922 static size_t
923 parse_function_arg (struct parse_macro_function_ctx *ctx,
924                     size_t i, struct string *farg)
925 {
926   const struct macro_token *tokens = ctx->input;
927   const struct token *token = &tokens[i].token;
928   if (token->type == T_MACRO_ID && ctx->me->macro)
929     {
930       const struct macro_param *param = macro_find_parameter_by_name (
931         ctx->me->macro, token->string);
932       if (param)
933         {
934           size_t param_idx = param - ctx->me->macro->params;
935           const struct macro_tokens *marg = ctx->me->args[param_idx];
936           for (size_t i = 0; i < marg->n; i++)
937             {
938               if (i)
939                 ds_put_byte (farg, ' ');
940               ds_put_substring (farg, marg->mts[i].representation);
941             }
942           return 1;
943         }
944
945       if (is_bang_star (ctx->input, ctx->n_input, i))
946         {
947           for (size_t i = 0; i < ctx->me->macro->n_params; i++)
948             {
949               if (!ctx->me->macro->params[i].positional)
950                 break;
951
952               const struct macro_tokens *marg = ctx->me->args[i];
953               for (size_t j = 0; j < marg->n; j++)
954                 {
955                   if (i || j)
956                     ds_put_byte (farg, ' ');
957                   ds_put_substring (farg, marg->mts[j].representation);
958                 }
959             }
960           return 2;
961         }
962
963       const char *value = stringi_map_find__ (ctx->me->vars,
964                                               token->string.string,
965                                               token->string.length);
966       if (value)
967         {
968           ds_put_cstr (farg, value);
969           return 1;
970         }
971
972       struct parse_macro_function_ctx subctx = {
973         .input = &ctx->input[i],
974         .n_input = ctx->n_input - i,
975         .me = ctx->me,
976         .stack = ctx->stack,
977       };
978       size_t subinput_consumed;
979       if (expand_macro_function (&subctx, farg, &subinput_consumed))
980         return subinput_consumed;
981     }
982
983   ds_put_substring (farg, tokens[i].representation);
984   return 1;
985 }
986
987 static bool
988 parse_macro_function (struct parse_macro_function_ctx *ctx,
989                       struct string_array *args,
990                       struct substring function,
991                       int min_args, int max_args,
992                       size_t *input_consumed)
993 {
994   const struct macro_token *tokens = ctx->input;
995   size_t n_tokens = ctx->n_input;
996
997   if (!n_tokens
998       || tokens[0].token.type != T_MACRO_ID
999       || !ss_equals_case (tokens[0].token.string, function)) /* XXX abbrevs allowed */
1000     return false;
1001
1002   if (n_tokens < 2 || tokens[1].token.type != T_LPAREN)
1003     {
1004       macro_error (ctx->stack, n_tokens > 1 ? &tokens[1] : NULL,
1005                    _("`(' expected following %s."), function.string);
1006       return false;
1007     }
1008
1009   string_array_init (args);
1010
1011   for (size_t i = 2;; )
1012     {
1013       if (i >= n_tokens)
1014         goto unexpected_end;
1015       if (tokens[i].token.type == T_RPAREN)
1016         {
1017           *input_consumed = i + 1;
1018           if (args->n < min_args || args->n > max_args)
1019             {
1020               macro_error (ctx->stack, &tokens[i],
1021                            _("Wrong number of arguments to macro function %s."),
1022                            function.string);
1023               goto error;
1024             }
1025           return true;
1026         }
1027
1028       struct string s = DS_EMPTY_INITIALIZER;
1029       i += parse_function_arg (ctx, i, &s);
1030       if (i >= n_tokens)
1031         {
1032           ds_destroy (&s);
1033           goto unexpected_end;
1034         }
1035       string_array_append_nocopy (args, ds_steal_cstr (&s));
1036
1037       if (tokens[i].token.type == T_COMMA)
1038         i++;
1039       else if (tokens[i].token.type != T_RPAREN)
1040         {
1041           macro_error (ctx->stack, &tokens[i],
1042                        _("`,' or `)' expected in call to macro function %s."),
1043                        function.string);
1044           goto error;
1045         }
1046     }
1047
1048 unexpected_end:
1049   macro_error (ctx->stack, NULL, _("Missing `)' in call to macro function %s."),
1050                function.string);
1051   /* Fall through. */
1052 error:
1053   string_array_destroy (args);
1054   return false;
1055 }
1056
1057 static bool
1058 unquote_string (const char *s, enum segmenter_mode segmenter_mode,
1059                 struct string *content)
1060 {
1061   struct string_lexer slex;
1062   string_lexer_init (&slex, s, strlen (s), segmenter_mode, true);
1063
1064   struct token token1;
1065   if (!string_lexer_next (&slex, &token1))
1066     return false;
1067
1068   if (token1.type != T_STRING)
1069     {
1070       token_uninit (&token1);
1071       return false;
1072     }
1073
1074   struct token token2;
1075   if (string_lexer_next (&slex, &token2))
1076     {
1077       token_uninit (&token1);
1078       token_uninit (&token2);
1079       return false;
1080     }
1081
1082   ds_put_substring (content, token1.string);
1083   token_uninit (&token1);
1084   return true;
1085 }
1086
1087 static const char *
1088 unquote_string_in_place (const char *s, enum segmenter_mode segmenter_mode,
1089                          struct string *tmp)
1090 {
1091   ds_init_empty (tmp);
1092   return unquote_string (s, segmenter_mode, tmp) ? ds_cstr (tmp) : s;
1093 }
1094
1095 static bool
1096 parse_integer (const char *s, int *np)
1097 {
1098   errno = 0;
1099
1100   char *tail;
1101   long int n = strtol (s, &tail, 10);
1102   *np = n < INT_MIN ? INT_MIN : n > INT_MAX ? INT_MAX : n;
1103   tail += strspn (tail, CC_SPACES);
1104   return *tail == '\0' && errno != ERANGE && n == *np;
1105 }
1106
1107 static bool
1108 expand_macro_function (struct parse_macro_function_ctx *ctx,
1109                        struct string *output,
1110                        size_t *input_consumed)
1111 {
1112   struct string_array args;
1113
1114   if (parse_macro_function (ctx, &args, ss_cstr ("!LENGTH"), 1, 1,
1115                             input_consumed))
1116     ds_put_format (output, "%zu", strlen (args.strings[0]));
1117   else if (parse_macro_function (ctx, &args, ss_cstr ("!BLANKS"), 1, 1,
1118                                  input_consumed))
1119     {
1120       int n;
1121       if (!parse_integer (args.strings[0], &n))
1122         {
1123           macro_error (ctx->stack, NULL,
1124                        _("Argument to !BLANKS must be non-negative integer "
1125                          "(not \"%s\")."), args.strings[0]);
1126           string_array_destroy (&args);
1127           return false;
1128         }
1129
1130       ds_put_byte_multiple (output, ' ', n);
1131     }
1132   else if (parse_macro_function (ctx, &args, ss_cstr ("!CONCAT"), 1, INT_MAX,
1133                                  input_consumed))
1134     {
1135       for (size_t i = 0; i < args.n; i++)
1136         if (!unquote_string (args.strings[i], ctx->me->segmenter_mode, output))
1137           ds_put_cstr (output, args.strings[i]);
1138     }
1139   else if (parse_macro_function (ctx, &args, ss_cstr ("!HEAD"), 1, 1,
1140                                  input_consumed))
1141     {
1142       struct string tmp;
1143       const char *s = unquote_string_in_place (args.strings[0],
1144                                                ctx->me->segmenter_mode, &tmp);
1145
1146       struct macro_tokens mts = { .n = 0 };
1147       macro_tokens_from_string__ (&mts, ss_cstr (s), ctx->me->segmenter_mode,
1148                                   ctx->stack);
1149       if (mts.n > 0)
1150         ds_put_substring (output, mts.mts[0].representation);
1151       macro_tokens_uninit (&mts);
1152       ds_destroy (&tmp);
1153     }
1154   else if (parse_macro_function (ctx, &args, ss_cstr ("!INDEX"), 2, 2,
1155                                  input_consumed))
1156     {
1157       const char *haystack = args.strings[0];
1158       const char *needle = strstr (haystack, args.strings[1]);
1159       ds_put_format (output, "%zu", needle ? needle - haystack + 1 : 0);
1160     }
1161   else if (parse_macro_function (ctx, &args, ss_cstr ("!QUOTE"), 1, 1,
1162                                  input_consumed))
1163     {
1164       if (unquote_string (args.strings[0], ctx->me->segmenter_mode, NULL))
1165         ds_put_cstr (output, args.strings[0]);
1166       else
1167         {
1168           ds_extend (output, strlen (args.strings[0]) + 2);
1169           ds_put_byte (output, '\'');
1170           for (const char *p = args.strings[0]; *p; p++)
1171             {
1172               if (*p == '\'')
1173                 ds_put_byte (output, '\'');
1174               ds_put_byte (output, *p);
1175             }
1176           ds_put_byte (output, '\'');
1177         }
1178     }
1179   else if (parse_macro_function (ctx, &args, ss_cstr ("!SUBSTR"), 2, 3,
1180                                  input_consumed))
1181     {
1182       int start;
1183       if (!parse_integer (args.strings[1], &start) || start < 1)
1184         {
1185           macro_error (ctx->stack, NULL,
1186                        _("Second argument of !SUBSTR must be "
1187                          "positive integer (not \"%s\")."),
1188                        args.strings[1]);
1189           string_array_destroy (&args);
1190           return false;
1191         }
1192
1193       int count = INT_MAX;
1194       if (args.n > 2 && (!parse_integer (args.strings[2], &count) || count < 0))
1195         {
1196           macro_error (ctx->stack, NULL,
1197                        _("Third argument of !SUBSTR must be "
1198                          "non-negative integer (not \"%s\")."),
1199                        args.strings[2]);
1200           string_array_destroy (&args);
1201           return false;
1202         }
1203
1204       struct substring s = ss_cstr (args.strings[0]);
1205       ds_put_substring (output, ss_substr (s, start - 1, count));
1206     }
1207   else if (parse_macro_function (ctx, &args, ss_cstr ("!TAIL"), 1, 1,
1208                                  input_consumed))
1209     {
1210       struct string tmp;
1211       const char *s = unquote_string_in_place (args.strings[0],
1212                                                ctx->me->segmenter_mode, &tmp);
1213
1214       struct macro_tokens mts = { .n = 0 };
1215       macro_tokens_from_string__ (&mts, ss_cstr (s), ctx->me->segmenter_mode,
1216                                   ctx->stack);
1217       if (mts.n > 1)
1218         {
1219           struct macro_tokens tail = { .mts = mts.mts + 1, .n = mts.n - 1 };
1220           macro_tokens_to_representation (&tail, output, NULL, NULL);
1221         }
1222       macro_tokens_uninit (&mts);
1223       ds_destroy (&tmp);
1224     }
1225   else if (parse_macro_function (ctx, &args, ss_cstr ("!UNQUOTE"), 1, 1,
1226                                  input_consumed))
1227     {
1228       if (!unquote_string (args.strings[0], ctx->me->segmenter_mode, output))
1229         ds_put_cstr (output, args.strings[0]);
1230     }
1231   else if (parse_macro_function (ctx, &args, ss_cstr ("!UPCASE"), 1, 1,
1232                                  input_consumed))
1233     {
1234       struct string tmp;
1235       const char *s = unquote_string_in_place (args.strings[0],
1236                                                ctx->me->segmenter_mode, &tmp);
1237       char *upper = utf8_to_upper (s);
1238       ds_put_cstr (output, upper);
1239       free (upper);
1240       ds_destroy (&tmp);
1241     }
1242   else if (parse_macro_function (ctx, &args, ss_cstr ("!EVAL"), 1, 1,
1243                                  input_consumed))
1244     {
1245       struct macro_tokens mts = { .n = 0 };
1246       macro_tokens_from_string__ (&mts, ss_cstr (args.strings[0]),
1247                                   ctx->me->segmenter_mode, ctx->stack);
1248       struct macro_tokens exp = { .n = 0 };
1249       struct macro_expander subme = *ctx->me;
1250       subme.break_ = NULL;
1251       macro_expand (&mts, &subme,
1252                     &(struct macro_expansion_stack) {
1253                       .name = "!EVAL",
1254                       .next = ctx->stack,
1255                     }, &exp);
1256       macro_tokens_to_representation (&exp, output, NULL, NULL);
1257       macro_tokens_uninit (&exp);
1258       macro_tokens_uninit (&mts);
1259     }
1260   else if (ctx->n_input > 0
1261            && ctx->input[0].token.type == T_MACRO_ID
1262            && ss_equals_case (ctx->input[0].token.string, ss_cstr ("!NULL")))
1263     {
1264       *input_consumed = 1;
1265       return true;
1266     }
1267   else
1268     return false;
1269
1270   string_array_destroy (&args);
1271   return true;
1272 }
1273
1274 struct expr_context
1275   {
1276     const struct macro_expander *me;
1277     const struct macro_expansion_stack *stack;
1278   };
1279
1280 static char *macro_evaluate_or (const struct expr_context *ctx,
1281                                 const struct macro_token **tokens,
1282                                 const struct macro_token *end);
1283
1284 static char *
1285 macro_evaluate_literal (const struct expr_context *ctx,
1286                         const struct macro_token **tokens,
1287                         const struct macro_token *end)
1288 {
1289   const struct macro_token *p = *tokens;
1290   if (p >= end)
1291     return NULL;
1292   if (p->token.type == T_LPAREN)
1293     {
1294       p++;
1295       char *value = macro_evaluate_or (ctx, &p, end);
1296       if (!value)
1297         return NULL;
1298       if (p >= end || p->token.type != T_RPAREN)
1299         {
1300           free (value);
1301           macro_error (ctx->stack, p < end ? p : NULL,
1302                        _("Expecting ')' in macro expression."));
1303           return NULL;
1304         }
1305       p++;
1306       *tokens = p;
1307       return value;
1308     }
1309   else if (p->token.type == T_RPAREN)
1310     {
1311       macro_error (ctx->stack, p, _("Expecting literal or function invocation "
1312                                     "in macro expression."));
1313       return NULL;
1314     }
1315
1316   struct parse_macro_function_ctx fctx = {
1317     .input = p,
1318     .n_input = end - p,
1319     .me = ctx->me,
1320     .stack = ctx->stack,
1321   };
1322   struct string function_output = DS_EMPTY_INITIALIZER;
1323   size_t function_consumed = parse_function_arg (&fctx, 0, &function_output);
1324   struct string unquoted = DS_EMPTY_INITIALIZER;
1325   if (unquote_string (ds_cstr (&function_output), ctx->me->segmenter_mode,
1326                       &unquoted))
1327     {
1328       ds_swap (&function_output, &unquoted);
1329       ds_destroy (&unquoted);
1330     }
1331   *tokens = p + function_consumed;
1332   return ds_steal_cstr (&function_output);
1333 }
1334
1335 /* Returns true if MT is valid as a macro operator.  Only operators written as
1336    symbols (e.g. <>) are usable in macro expressions, not operator written as
1337    letters (e.g. EQ). */
1338 static bool
1339 is_macro_operator (const struct macro_token *mt)
1340 {
1341   return (mt->representation.length > 0
1342           && !c_isalpha (mt->representation.string[0]));
1343 }
1344
1345 static enum token_type
1346 parse_relational_op (const struct macro_token *mt)
1347 {
1348   switch (mt->token.type)
1349     {
1350     case T_EQUALS:
1351       return T_EQ;
1352
1353     case T_NE:
1354     case T_LT:
1355     case T_GT:
1356     case T_LE:
1357     case T_GE:
1358       return is_macro_operator (mt) ? mt->token.type : T_STOP;
1359
1360     case T_MACRO_ID:
1361       return (ss_equals_case (mt->token.string, ss_cstr ("!EQ")) ? T_EQ
1362               : ss_equals_case (mt->token.string, ss_cstr ("!NE")) ? T_NE
1363               : ss_equals_case (mt->token.string, ss_cstr ("!LT")) ? T_LT
1364               : ss_equals_case (mt->token.string, ss_cstr ("!GT")) ? T_GT
1365               : ss_equals_case (mt->token.string, ss_cstr ("!LE")) ? T_LE
1366               : ss_equals_case (mt->token.string, ss_cstr ("!GE")) ? T_GE
1367               : T_STOP);
1368
1369     default:
1370       return T_STOP;
1371     }
1372 }
1373
1374 static char *
1375 macro_evaluate_relational (const struct expr_context *ctx,
1376                            const struct macro_token **tokens,
1377                            const struct macro_token *end)
1378 {
1379   const struct macro_token *p = *tokens;
1380   char *lhs = macro_evaluate_literal (ctx, &p, end);
1381   if (!lhs)
1382     return NULL;
1383
1384   enum token_type op = p >= end ? T_STOP : parse_relational_op (p);
1385   if (op == T_STOP)
1386     {
1387       *tokens = p;
1388       return lhs;
1389     }
1390   p++;
1391
1392   char *rhs = macro_evaluate_literal (ctx, &p, end);
1393   if (!rhs)
1394     {
1395       free (lhs);
1396       return NULL;
1397     }
1398
1399   struct string lhs_tmp, rhs_tmp;
1400   int cmp = strcmp (unquote_string_in_place (lhs, ctx->me->segmenter_mode,
1401                                              &lhs_tmp),
1402                     unquote_string_in_place (rhs, ctx->me->segmenter_mode,
1403                                              &rhs_tmp));
1404   ds_destroy (&lhs_tmp);
1405   ds_destroy (&rhs_tmp);
1406
1407   free (lhs);
1408   free (rhs);
1409
1410   bool b = (op == T_EQUALS || op == T_EQ ? !cmp
1411             : op == T_NE ? cmp
1412             : op == T_LT ? cmp < 0
1413             : op == T_GT ? cmp > 0
1414             : op == T_LE ? cmp <= 0
1415             : /* T_GE */ cmp >= 0);
1416
1417   *tokens = p;
1418   return xstrdup (b ? "1" : "0");
1419 }
1420
1421 static char *
1422 macro_evaluate_not (const struct expr_context *ctx,
1423                     const struct macro_token **tokens,
1424                     const struct macro_token *end)
1425 {
1426   const struct macro_token *p = *tokens;
1427
1428   unsigned int negations = 0;
1429   while (p < end
1430          && (ss_equals_case (p->representation, ss_cstr ("!NOT"))
1431              || ss_equals (p->representation, ss_cstr ("~"))))
1432     {
1433       p++;
1434       negations++;
1435     }
1436
1437   char *operand = macro_evaluate_relational (ctx, &p, end);
1438   if (!operand || !negations)
1439     {
1440       *tokens = p;
1441       return operand;
1442     }
1443
1444   bool b = strcmp (operand, "0") ^ (negations & 1);
1445   free (operand);
1446   *tokens = p;
1447   return xstrdup (b ? "1" : "0");
1448 }
1449
1450 static char *
1451 macro_evaluate_and (const struct expr_context *ctx,
1452                     const struct macro_token **tokens,
1453                     const struct macro_token *end)
1454 {
1455   const struct macro_token *p = *tokens;
1456   char *lhs = macro_evaluate_not (ctx, &p, end);
1457   if (!lhs)
1458     return NULL;
1459
1460   while (p < end
1461          && (ss_equals_case (p->representation, ss_cstr ("!AND"))
1462              || ss_equals (p->representation, ss_cstr ("&"))))
1463     {
1464       p++;
1465       char *rhs = macro_evaluate_not (ctx, &p, end);
1466       if (!rhs)
1467         {
1468           free (lhs);
1469           return NULL;
1470         }
1471
1472       bool b = strcmp (lhs, "0") && strcmp (rhs, "0");
1473       free (lhs);
1474       free (rhs);
1475       lhs = xstrdup (b ? "1" : "0");
1476     }
1477   *tokens = p;
1478   return lhs;
1479 }
1480
1481 static char *
1482 macro_evaluate_or (const struct expr_context *ctx,
1483                    const struct macro_token **tokens,
1484                    const struct macro_token *end)
1485 {
1486   const struct macro_token *p = *tokens;
1487   char *lhs = macro_evaluate_and (ctx, &p, end);
1488   if (!lhs)
1489     return NULL;
1490
1491   while (p < end
1492          && (ss_equals_case (p->representation, ss_cstr ("!OR"))
1493              || ss_equals (p->representation, ss_cstr ("|"))))
1494     {
1495       p++;
1496       char *rhs = macro_evaluate_and (ctx, &p, end);
1497       if (!rhs)
1498         {
1499           free (lhs);
1500           return NULL;
1501         }
1502
1503       bool b = strcmp (lhs, "0") || strcmp (rhs, "0");
1504       free (lhs);
1505       free (rhs);
1506       lhs = xstrdup (b ? "1" : "0");
1507     }
1508   *tokens = p;
1509   return lhs;
1510 }
1511
1512 static char *
1513 macro_evaluate_expression (const struct macro_token **tokens, size_t n_tokens,
1514                            const struct macro_expander *me,
1515                            const struct macro_expansion_stack *stack)
1516 {
1517   const struct expr_context ctx = {
1518     .me = me,
1519     .stack = stack,
1520   };
1521   return macro_evaluate_or (&ctx, tokens, *tokens + n_tokens);
1522 }
1523
1524 static bool
1525 macro_evaluate_number (const struct macro_token **tokens, size_t n_tokens,
1526                        const struct macro_expander *me,
1527                        const struct macro_expansion_stack *stack,
1528                        double *number)
1529 {
1530   char *s = macro_evaluate_expression (tokens, n_tokens, me, stack);
1531   if (!s)
1532     return false;
1533
1534   struct macro_tokens mts = { .n = 0 };
1535   macro_tokens_from_string__ (&mts, ss_cstr (s), me->segmenter_mode, stack);
1536   if (mts.n != 1 || !token_is_number (&mts.mts[0].token))
1537     {
1538       macro_error (stack, mts.n > 0 ? &mts.mts[0] : NULL,
1539                    _("Macro expression must evaluate to "
1540                      "a number (not \"%s\")."), s);
1541       free (s);
1542       macro_tokens_uninit (&mts);
1543       return false;
1544     }
1545
1546   *number = token_number (&mts.mts[0].token);
1547   free (s);
1548   macro_tokens_uninit (&mts);
1549   return true;
1550 }
1551
1552 static const struct macro_token *
1553 find_ifend_clause (const struct macro_token *p, const struct macro_token *end)
1554 {
1555   size_t nesting = 0;
1556   for (; p < end; p++)
1557     {
1558       if (p->token.type != T_MACRO_ID)
1559         continue;
1560
1561       if (ss_equals_case (p->token.string, ss_cstr ("!IF")))
1562         nesting++;
1563       else if (ss_equals_case (p->token.string, ss_cstr ("!IFEND")))
1564         {
1565           if (!nesting)
1566             return p;
1567           nesting--;
1568         }
1569       else if (ss_equals_case (p->token.string, ss_cstr ("!ELSE")) && !nesting)
1570         return p;
1571     }
1572   return NULL;
1573 }
1574
1575 static size_t
1576 macro_expand_if (const struct macro_token *tokens, size_t n_tokens,
1577                  const struct macro_expander *me,
1578                  const struct macro_expansion_stack *stack,
1579                  struct macro_tokens *exp)
1580 {
1581   const struct macro_token *p = tokens;
1582   const struct macro_token *end = tokens + n_tokens;
1583
1584   if (p >= end || !ss_equals_case (p->token.string, ss_cstr ("!IF")))
1585     return 0;
1586
1587   p++;
1588   char *result = macro_evaluate_expression (&p, end - p, me, stack);
1589   if (!result)
1590     return 0;
1591   bool b = strcmp (result, "0");
1592   free (result);
1593
1594   if (p >= end
1595       || p->token.type != T_MACRO_ID
1596       || !ss_equals_case (p->token.string, ss_cstr ("!THEN")))
1597     {
1598       macro_error (stack, p < end ? p : NULL,
1599                    _("!THEN expected in macro !IF construct."));
1600       return 0;
1601     }
1602
1603   const struct macro_token *start_then = p + 1;
1604   const struct macro_token *end_then = find_ifend_clause (start_then, end);
1605   if (!end_then)
1606     {
1607       macro_error (stack, NULL,
1608                    _("!ELSE or !IFEND expected in macro !IF construct."));
1609       return 0;
1610     }
1611
1612   const struct macro_token *start_else, *end_if;
1613   if (ss_equals_case (end_then->token.string, ss_cstr ("!ELSE")))
1614     {
1615       start_else = end_then + 1;
1616       end_if = find_ifend_clause (start_else, end);
1617       if (!end_if
1618           || !ss_equals_case (end_if->token.string, ss_cstr ("!IFEND")))
1619         {
1620           macro_error (stack, end_if ? end_if : NULL,
1621                        _("!IFEND expected in macro !IF construct."));
1622           return 0;
1623         }
1624     }
1625   else
1626     {
1627       start_else = NULL;
1628       end_if = end_then;
1629     }
1630
1631   const struct macro_token *start;
1632   size_t n;
1633   if (b)
1634     {
1635       start = start_then;
1636       n = end_then - start_then;
1637     }
1638   else if (start_else)
1639     {
1640       start = start_else;
1641       n = end_if - start_else;
1642     }
1643   else
1644     {
1645       start = NULL;
1646       n = 0;
1647     }
1648
1649   if (n)
1650     {
1651       struct macro_tokens mts = {
1652         .mts = CONST_CAST (struct macro_token *, start),
1653         .n = n,
1654       };
1655       macro_expand (&mts, me, &(struct macro_expansion_stack) {
1656                       .name = "!IF",
1657                       .next = stack,
1658                     },
1659                     exp);
1660     }
1661   return (end_if + 1) - tokens;
1662 }
1663
1664 static size_t
1665 macro_parse_let (const struct macro_token *tokens, size_t n_tokens,
1666                  const struct macro_expander *me,
1667                  const struct macro_expansion_stack *stack)
1668 {
1669   const struct macro_token *p = tokens;
1670   const struct macro_token *end = tokens + n_tokens;
1671
1672   if (p >= end || !ss_equals_case (p->token.string, ss_cstr ("!LET")))
1673     return 0;
1674   p++;
1675
1676   if (p >= end || p->token.type != T_MACRO_ID)
1677     {
1678       macro_error (stack, p < end ? p : NULL,
1679                    _("Expected macro variable name following !LET."));
1680       return 0;
1681     }
1682   const struct substring var_name = p->token.string;
1683   if (is_macro_keyword (var_name)
1684       || (me->macro && macro_find_parameter_by_name (me->macro, var_name)))
1685     {
1686       macro_error (stack, p < end ? p : NULL,
1687                    _("Cannot use argument name or macro keyword "
1688                      "\"%.*s\" as !LET variable."),
1689                    (int) var_name.length, var_name.string);
1690       return 0;
1691     }
1692   p++;
1693
1694   if (p >= end || p->token.type != T_EQUALS)
1695     {
1696       macro_error (stack, p < end ? p : NULL,
1697                    _("Expected `=' following !LET."));
1698       return 0;
1699     }
1700   p++;
1701
1702   char *value = macro_evaluate_expression (&p, end - p, me, stack);
1703   if (!value)
1704     return 0;
1705
1706   stringi_map_replace_nocopy (me->vars, ss_xstrdup (var_name), value);
1707   return p - tokens;
1708 }
1709
1710 static const struct macro_token *
1711 find_doend (const struct macro_expansion_stack *stack,
1712             const struct macro_token *p, const struct macro_token *end)
1713 {
1714   size_t nesting = 0;
1715   for (; p < end; p++)
1716     {
1717       if (p->token.type != T_MACRO_ID)
1718         continue;
1719
1720       if (ss_equals_case (p->token.string, ss_cstr ("!DO")))
1721         nesting++;
1722       else if (ss_equals_case (p->token.string, ss_cstr ("!DOEND")))
1723         {
1724           if (!nesting)
1725             return p;
1726           nesting--;
1727         }
1728     }
1729   macro_error (stack, NULL, _("Missing !DOEND."));
1730   return NULL;
1731 }
1732
1733 static size_t
1734 macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
1735                  const struct macro_expander *me,
1736                  const struct macro_expansion_stack *stack,
1737                  struct macro_tokens *exp)
1738 {
1739   const struct macro_token *p = tokens;
1740   const struct macro_token *end = tokens + n_tokens;
1741
1742   if (p >= end || !ss_equals_case (p->token.string, ss_cstr ("!DO")))
1743     return 0;
1744   p++;
1745
1746   if (p >= end || p->token.type != T_MACRO_ID)
1747     {
1748       macro_error (stack, p < end ? p : NULL,
1749                    _("Expected macro variable name following !DO."));
1750       return 0;
1751     }
1752   const struct substring var_name = p->token.string;
1753   if (is_macro_keyword (var_name)
1754       || (me->macro && macro_find_parameter_by_name (me->macro, var_name)))
1755     {
1756       macro_error (stack, p, _("Cannot use argument name or macro "
1757                                "keyword as !DO variable."));
1758       return 0;
1759     }
1760   p++;
1761
1762   struct macro_expansion_stack next_stack = {
1763     .name = "!DO", .next = stack,
1764   };
1765   int miterate = settings_get_miterate ();
1766   if (p < end && p->token.type == T_MACRO_ID
1767       && ss_equals_case (p->token.string, ss_cstr ("!IN")))
1768     {
1769       p++;
1770       char *list = macro_evaluate_expression (&p, end - p, me, &next_stack);
1771       if (!list)
1772         return 0;
1773
1774       struct macro_tokens items = { .n = 0 };
1775       macro_tokens_from_string__ (&items, ss_cstr (list), me->segmenter_mode,
1776                                   stack);
1777       free (list);
1778
1779       const struct macro_token *do_end = find_doend (stack, p, end);
1780       if (!do_end)
1781         {
1782           macro_tokens_uninit (&items);
1783           return 0;
1784         }
1785
1786       const struct macro_tokens inner = {
1787         .mts = CONST_CAST (struct macro_token *, p),
1788         .n = do_end - p
1789       };
1790
1791       bool break_ = false;
1792       struct macro_expander subme = *me;
1793       subme.break_ = &break_;
1794
1795       for (size_t i = 0; i < items.n && !break_; i++)
1796         {
1797           if (i >= miterate)
1798             {
1799               macro_error (stack, NULL,
1800                            _("!DO loop over list exceeded "
1801                              "maximum number of iterations %d.  "
1802                              "(Use SET MITERATE to change the limit.)"),
1803                            miterate);
1804               break;
1805             }
1806           stringi_map_replace_nocopy (me->vars, ss_xstrdup (var_name),
1807                                       ss_xstrdup (items.mts[i].representation));
1808
1809           macro_expand (&inner, &subme, &next_stack, exp);
1810         }
1811       return do_end - tokens + 1;
1812     }
1813   else if (p < end && p->token.type == T_EQUALS)
1814     {
1815       p++;
1816       double first;
1817       if (!macro_evaluate_number (&p, end - p, me, &next_stack, &first))
1818         return 0;
1819
1820       if (p >= end || p->token.type != T_MACRO_ID
1821           || !ss_equals_case (p->token.string, ss_cstr ("!TO")))
1822         {
1823           macro_error (stack, p < end ? p : NULL,
1824                        _("Expected !TO in numerical !DO loop."));
1825           return 0;
1826         }
1827       p++;
1828
1829       double last;
1830       if (!macro_evaluate_number (&p, end - p, me, &next_stack, &last))
1831         return 0;
1832
1833       double by = 1.0;
1834       if (p < end && p->token.type == T_MACRO_ID
1835           && ss_equals_case (p->token.string, ss_cstr ("!BY")))
1836         {
1837           p++;
1838           if (!macro_evaluate_number (&p, end - p, me, &next_stack, &by))
1839             return 0;
1840
1841           if (by == 0.0)
1842             {
1843               macro_error (stack, NULL, _("!BY value cannot be zero."));
1844               return 0;
1845             }
1846         }
1847
1848       const struct macro_token *do_end = find_doend (stack, p, end);
1849       if (!do_end)
1850         return 0;
1851       const struct macro_tokens inner = {
1852         .mts = CONST_CAST (struct macro_token *, p),
1853         .n = do_end - p
1854       };
1855
1856       bool break_ = false;
1857       struct macro_expander subme = *me;
1858       subme.break_ = &break_;
1859
1860       if ((by > 0 && first <= last) || (by < 0 && first >= last))
1861         {
1862           int i = 0;
1863           for (double index = first;
1864                by > 0 ? (index <= last) : (index >= last) && !break_;
1865                index += by)
1866             {
1867               if (i++ > miterate)
1868                 {
1869                   macro_error (stack, NULL,
1870                                _("Numerical !DO loop exceeded "
1871                                  "maximum number of iterations %d.  "
1872                                  "(Use SET MITERATE to change the limit.)"),
1873                                miterate);
1874                   break;
1875                 }
1876
1877               char index_s[DBL_BUFSIZE_BOUND];
1878               c_dtoastr (index_s, sizeof index_s, 0, 0, index);
1879               stringi_map_replace_nocopy (me->vars, ss_xstrdup (var_name),
1880                                           xstrdup (index_s));
1881
1882               macro_expand (&inner, &subme, &next_stack, exp);
1883             }
1884         }
1885
1886       return do_end - tokens + 1;
1887     }
1888   else
1889     {
1890       macro_error (stack, p < end ? p : NULL,
1891                    _("Expected `=' or !IN in !DO loop."));
1892       return 0;
1893     }
1894 }
1895
1896 static void
1897 macro_expand (const struct macro_tokens *mts,
1898               const struct macro_expander *me,
1899               const struct macro_expansion_stack *stack,
1900               struct macro_tokens *exp)
1901 {
1902   if (me->nesting_countdown <= 0)
1903     {
1904       macro_error (stack, NULL, _("Maximum nesting level %d exceeded.  "
1905                                   "(Use SET MNEST to change the limit.)"),
1906                    settings_get_mnest ());
1907       for (size_t i = 0; i < mts->n; i++)
1908         macro_tokens_add (exp, &mts->mts[i]);
1909       return;
1910     }
1911
1912   for (size_t i = 0; i < mts->n && (!me->break_ || !*me->break_); i++)
1913     {
1914       const struct macro_token *mt = &mts->mts[i];
1915       const struct token *token = &mt->token;
1916       if (token->type == T_MACRO_ID && me->macro)
1917         {
1918           const struct macro_param *param = macro_find_parameter_by_name (
1919             me->macro, token->string);
1920           if (param)
1921             {
1922               const struct macro_tokens *arg
1923                 = me->args[param - me->macro->params];
1924               if (*me->expand && param->expand_arg)
1925                 {
1926                   struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
1927                   struct macro_expander subme = {
1928                     .macros = me->macros,
1929                     .macro = NULL,
1930                     .args = NULL,
1931                     .segmenter_mode = me->segmenter_mode,
1932                     .expand = me->expand,
1933                     .break_ = NULL,
1934                     .vars = &vars,
1935                     .nesting_countdown = me->nesting_countdown,
1936                   };
1937                   macro_expand (arg, &subme, &(struct macro_expansion_stack) {
1938                                   .name = param->name,
1939                                   .next = stack,
1940                                 }, exp);
1941                   stringi_map_destroy (&vars);
1942                 }
1943               else
1944                 for (size_t i = 0; i < arg->n; i++)
1945                   macro_tokens_add (exp, &arg->mts[i]);
1946               continue;
1947             }
1948
1949           if (is_bang_star (mts->mts, mts->n, i))
1950             {
1951               for (size_t j = 0; j < me->macro->n_params; j++)
1952                 {
1953                   const struct macro_param *param = &me->macro->params[j];
1954                   if (!param->positional)
1955                     break;
1956
1957                   const struct macro_tokens *arg = me->args[j];
1958                   if (*me->expand && param->expand_arg)
1959                     {
1960                       struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
1961                       struct macro_expander subme = {
1962                         .macros = me->macros,
1963                         .macro = NULL,
1964                         .args = NULL,
1965                         .segmenter_mode = me->segmenter_mode,
1966                         .expand = me->expand,
1967                         .break_ = NULL,
1968                         .vars = &vars,
1969                         .nesting_countdown = me->nesting_countdown,
1970                       };
1971                       macro_expand (arg, &subme,
1972                                     &(struct macro_expansion_stack) {
1973                                       .name = "!*",
1974                                       .next = stack,
1975                                     }, exp);
1976                       stringi_map_destroy (&vars);
1977                     }
1978                   else
1979                     for (size_t k = 0; k < arg->n; k++)
1980                       macro_tokens_add (exp, &arg->mts[k]);
1981                 }
1982               i++;
1983               continue;
1984             }
1985
1986           size_t n = macro_expand_if (&mts->mts[i], mts->n - i, me, stack,
1987                                       exp);
1988           if (n > 0)
1989             {
1990               i += n - 1;
1991               continue;
1992             }
1993         }
1994
1995       if (token->type == T_MACRO_ID)
1996         {
1997           const char *value = stringi_map_find__ (me->vars,
1998                                                   token->string.string,
1999                                                   token->string.length);
2000           if (value)
2001             {
2002               macro_tokens_from_string__ (exp, ss_cstr (value),
2003                                           me->segmenter_mode, stack);
2004               continue;
2005             }
2006         }
2007
2008       if (*me->expand)
2009         {
2010           struct macro_call *submc;
2011           int retval = macro_call_create (me->macros, token, &submc);
2012           for (size_t j = 1; !retval; j++)
2013             {
2014               const struct macro_token endcmd
2015                 = { .token = { .type = T_ENDCMD } };
2016               retval = macro_call_add (
2017                 submc, i + j < mts->n ? &mts->mts[i + j] : &endcmd);
2018             }
2019           if (retval > 0)
2020             {
2021               i += retval - 1;
2022               struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
2023               struct macro_expander subme = {
2024                 .macros = submc->macros,
2025                 .macro = submc->macro,
2026                 .args = submc->args,
2027                 .segmenter_mode = me->segmenter_mode,
2028                 .expand = me->expand,
2029                 .break_ = NULL,
2030                 .vars = &vars,
2031                 .nesting_countdown = me->nesting_countdown - 1,
2032               };
2033               macro_expand (&submc->macro->body, &subme,
2034                             &(struct macro_expansion_stack) {
2035                               .name = submc->macro->name,
2036                               .file_name = submc->macro->file_name,
2037                               .first_line = submc->macro->first_line,
2038                               .last_line = submc->macro->last_line,
2039                               .next = stack,
2040                             }, exp);
2041               macro_call_destroy (submc);
2042               stringi_map_destroy (&vars);
2043               continue;
2044             }
2045
2046           macro_call_destroy (submc);
2047         }
2048
2049       if (token->type != T_MACRO_ID)
2050         {
2051           macro_tokens_add (exp, mt);
2052           continue;
2053         }
2054
2055       if (ss_equals_case (token->string, ss_cstr ("!break")))
2056         {
2057           if (!me->break_)
2058             macro_error (stack, mt, _("!BREAK outside !DO."));
2059           else
2060             {
2061               *me->break_ = true;
2062               break;
2063             }
2064         }
2065
2066       struct parse_macro_function_ctx ctx = {
2067         .input = &mts->mts[i],
2068         .n_input = mts->n - i,
2069         .me = me,
2070         .stack = stack,
2071       };
2072       struct string function_output = DS_EMPTY_INITIALIZER;
2073       size_t function_consumed;
2074       if (expand_macro_function (&ctx, &function_output, &function_consumed))
2075         {
2076           i += function_consumed - 1;
2077
2078           macro_tokens_from_string__ (exp, function_output.ss,
2079                                       me->segmenter_mode, stack);
2080           ds_destroy (&function_output);
2081
2082           continue;
2083         }
2084
2085       size_t n = macro_parse_let (&mts->mts[i], mts->n - i, me, stack);
2086       if (n > 0)
2087         {
2088           i += n - 1;
2089           continue;
2090         }
2091
2092       n = macro_expand_do (&mts->mts[i], mts->n - i, me, stack, exp);
2093       if (n > 0)
2094         {
2095           i += n - 1;
2096           continue;
2097         }
2098
2099       if (ss_equals_case (token->string, ss_cstr ("!onexpand")))
2100         *me->expand = true;
2101       else if (ss_equals_case (token->string, ss_cstr ("!offexpand")))
2102         *me->expand = false;
2103       else
2104         macro_tokens_add (exp, mt);
2105     }
2106 }
2107
2108 void
2109 macro_call_expand (struct macro_call *mc, enum segmenter_mode segmenter_mode,
2110                    struct macro_tokens *exp)
2111 {
2112   assert (mc->state == MC_FINISHED);
2113
2114   bool expand = true;
2115   struct stringi_map vars = STRINGI_MAP_INITIALIZER (vars);
2116   struct macro_expander me = {
2117     .macros = mc->macros,
2118     .macro = mc->macro,
2119     .args = mc->args,
2120     .segmenter_mode = segmenter_mode,
2121     .expand = &expand,
2122     .break_ = NULL,
2123     .vars = &vars,
2124     .nesting_countdown = settings_get_mnest (),
2125   };
2126
2127   struct macro_expansion_stack stack = {
2128     .name = mc->macro->name,
2129     .file_name = mc->macro->file_name,
2130     .first_line = mc->macro->first_line,
2131     .last_line = mc->macro->last_line,
2132   };
2133   macro_expand (&mc->macro->body, &me, &stack, exp);
2134
2135   stringi_map_destroy (&vars);
2136 }
2137