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