Coverage Report

Created: 2026-09-14 08:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/gas/macro.c
Line
Count
Source
1
/* macro.c - macro support for gas
2
   Copyright (C) 1994-2026 Free Software Foundation, Inc.
3
4
   Written by Steve and Judy Chamberlain of Cygnus Support,
5
      sac@cygnus.com
6
7
   This file is part of GAS, the GNU Assembler.
8
9
   GAS is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3, or (at your option)
12
   any later version.
13
14
   GAS is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
19
   You should have received a copy of the GNU General Public License
20
   along with GAS; see the file COPYING.  If not, write to the Free
21
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22
   02110-1301, USA.  */
23
24
#include "as.h"
25
#include "safe-ctype.h"
26
#include "sb.h"
27
#include "macro.h"
28
29
/* The routines in this file handle macro definition and expansion.
30
   They are called by gas.  */
31
32
/* The macro hash table.  */
33
34
htab_t macro_hash;
35
36
/* Whether any macros have been defined.  */
37
38
int macro_defined;
39
40
/* Whether we should strip '@' characters.  */
41
42
8.54M
#define macro_strip_at false
43
44
/* Number of macro expansions that have been done.  */
45
46
static unsigned int macro_number;
47
48
static void free_macro (macro_entry *);
49
50
static void
51
macro_del_f (void *ent)
52
24
{
53
24
  string_tuple_t *tuple = ent;
54
24
  free_macro ((macro_entry *) tuple->value);
55
24
}
56
57
/* Initialize macro processing.  */
58
59
void
60
macro_init (void)
61
339
{
62
339
  macro_hash = htab_create_alloc (16, hash_string_tuple, eq_string_tuple,
63
339
          macro_del_f, notes_calloc, NULL);
64
339
  macro_defined = 0;
65
339
}
66
67
void
68
macro_end (void)
69
339
{
70
339
  if (ENABLE_LEAK_CHECK)
71
339
    htab_delete (macro_hash);
72
339
}
73
74
/* Read input lines till we get to a TO string.
75
   Increase nesting depth if we get a FROM string.
76
   Put the results into sb at PTR.
77
   FROM may be NULL (or will be ignored) if TO is "ENDR".
78
   Add a new input line to an sb using GET_LINE.
79
   Return 1 on success, 0 on unexpected EOF.  */
80
81
int
82
buffer_and_nest (const char *from, const char *to, sb *ptr,
83
     size_t (*get_line) (sb *))
84
6.30k
{
85
6.30k
  size_t from_len;
86
6.30k
  size_t to_len = strlen (to);
87
6.30k
  int depth = 1;
88
6.30k
  size_t line_start, more;
89
90
6.30k
  if (to_len == 4 && strcasecmp (to, "ENDR") == 0)
91
6.24k
    {
92
6.24k
      from = NULL;
93
6.24k
      from_len = 0;
94
6.24k
    }
95
60
  else
96
60
    from_len = strlen (from);
97
98
  /* Record the present source position, such that diagnostics and debug info
99
     can be properly associated with the respective original lines, rather
100
     than with the line of the ending directive (TO).  */
101
6.30k
  {
102
6.30k
    unsigned int line;
103
6.30k
    char *linefile;
104
105
6.30k
    const char *prefix = flag_m68k_mri ? "" : ".";
106
6.30k
    const char *file = as_where_top (&line);
107
108
6.30k
    if (*input_line_pointer == '\n')
109
4.94k
      line++;
110
6.30k
    if (file)
111
6.30k
      linefile = xasprintf ("\t%slinefile %u \"%s\"", prefix, line, file);
112
0
    else
113
0
      linefile = xasprintf ("\t%slinefile %u .", prefix, line);
114
6.30k
    sb_add_string (ptr, linefile);
115
6.30k
    xfree (linefile);
116
6.30k
  }
117
118
6.30k
  line_start = ptr->len;
119
6.30k
  more = get_line (ptr);
120
90.6k
  while (more)
121
90.5k
    {
122
      /* Try to find the first pseudo op on the line.  */
123
90.5k
      size_t i = line_start;
124
90.5k
      bool had_colon = false;
125
126
      /* With normal syntax we can suck what we want till we get
127
   to the dot.  With the alternate, labels have to start in
128
   the first column, since we can't tell what's a label and
129
   what's a pseudoop.  */
130
131
90.5k
      if (! LABELS_WITHOUT_COLONS)
132
90.5k
  {
133
    /* Skip leading whitespace.  */
134
90.5k
    i = sb_skip_white (i, ptr);
135
90.5k
  }
136
137
90.5k
      for (;;)
138
91.0k
  {
139
    /* Skip over a label, if any.  */
140
91.0k
    if (i >= ptr->len || ! is_name_beginner (ptr->ptr[i]))
141
31.7k
      break;
142
59.2k
    i++;
143
262k
    while (i < ptr->len && is_part_of_name (ptr->ptr[i]))
144
202k
      i++;
145
59.2k
    if (i < ptr->len && is_name_ender (ptr->ptr[i]))
146
0
      i++;
147
    /* Skip whitespace.  */
148
59.2k
    i = sb_skip_white (i, ptr);
149
    /* Check for the colon.  */
150
59.2k
    if (i >= ptr->len || ptr->ptr[i] != ':')
151
58.7k
      {
152
        /* LABELS_WITHOUT_COLONS doesn't mean we cannot have a
153
     colon after a label.  If we do have a colon on the
154
     first label then handle more than one label on the
155
     line, assuming that each label has a colon.  */
156
58.7k
        if (LABELS_WITHOUT_COLONS && !had_colon)
157
0
    break;
158
58.7k
        i = line_start;
159
58.7k
        break;
160
58.7k
      }
161
518
    i++;
162
518
    line_start = i;
163
518
    had_colon = true;
164
518
  }
165
166
      /* Skip trailing whitespace.  */
167
90.5k
      i = sb_skip_white (i, ptr);
168
169
90.5k
      if (i < ptr->len && (ptr->ptr[i] == '.'
170
30.5k
         || NO_PSEUDO_DOT
171
30.5k
         || flag_mri))
172
59.2k
  {
173
59.2k
    if (! flag_m68k_mri && ptr->ptr[i] == '.')
174
30.5k
      i++;
175
59.2k
    size_t len = ptr->len - i;
176
59.2k
    if (from == NULL)
177
55.6k
      {
178
55.6k
        if (len >= 5 && strncasecmp (ptr->ptr + i, "IREPC", 5) == 0)
179
0
    from_len = 5;
180
55.6k
        else if (len >= 4 && strncasecmp (ptr->ptr + i, "IREP", 4) == 0)
181
0
    from_len = 4;
182
55.6k
        else if (len >= 4 && strncasecmp (ptr->ptr + i, "IRPC", 4) == 0)
183
76
    from_len = 4;
184
55.5k
        else if (len >= 4 && strncasecmp (ptr->ptr + i, "REPT", 4) == 0)
185
0
    from_len = 4;
186
55.5k
        else if (len >= 3 && strncasecmp (ptr->ptr + i, "IRP", 3) == 0)
187
1.27k
    from_len = 3;
188
54.2k
        else if (len >= 3 && strncasecmp (ptr->ptr + i, "REP", 3) == 0)
189
91
    from_len = 3;
190
54.1k
        else
191
54.1k
    from_len = 0;
192
55.6k
      }
193
59.2k
    if ((from != NULL
194
59.2k
         ? (len >= from_len
195
2.98k
      && strncasecmp (ptr->ptr + i, from, from_len) == 0)
196
59.2k
         : from_len > 0)
197
1.81k
        && (len == from_len
198
1.81k
      || ! (is_part_of_name (ptr->ptr[i + from_len])
199
1.80k
      || is_name_ender (ptr->ptr[i + from_len]))))
200
1.80k
      depth++;
201
59.2k
    if (len >= to_len
202
42.4k
        && strncasecmp (ptr->ptr + i, to, to_len) == 0
203
8.35k
        && (len == to_len
204
4.17k
      || ! (is_part_of_name (ptr->ptr[i + to_len])
205
3.58k
      || is_name_ender (ptr->ptr[i + to_len]))))
206
7.75k
      {
207
7.75k
        depth--;
208
7.75k
        if (depth == 0)
209
6.14k
    {
210
      /* Reset the string to not include the ending rune.  */
211
6.14k
      ptr->len = line_start;
212
213
      /* With the ending directive consumed here, announce the
214
         line for macro-expanded listings. */
215
6.14k
      if (listing & LISTING_MACEXP)
216
0
        listing_newline (NULL);
217
6.14k
      break;
218
6.14k
    }
219
7.75k
      }
220
221
    /* PR gas/16908
222
       Apply .linefile directives that appear within the macro, alongside
223
       keeping them for later expansion of the macro.  */
224
53.1k
    if (from != NULL && strcasecmp (from, "MACRO") == 0
225
3.65k
        && len >= 8 && strncasecmp (ptr->ptr + i, "linefile", 8) == 0)
226
192
      {
227
192
        sb_add_char (ptr, more);
228
192
        temp_ilp (sb_terminate (ptr) + i + 8);
229
192
        s_linefile (0);
230
192
        restore_ilp ();
231
192
        line_start = ptr->len;
232
192
        more = get_line (ptr);
233
192
        continue;
234
192
      }
235
53.1k
  }
236
237
      /* Add the original end-of-line char to the end and keep running.  */
238
84.1k
      sb_add_char (ptr, more);
239
84.1k
      line_start = ptr->len;
240
84.1k
      more = get_line (ptr);
241
84.1k
    }
242
243
  /* Return 1 on success, 0 on unexpected EOF.  */
244
6.30k
  return depth == 0;
245
6.30k
}
246
247
/* Pick up a token.  */
248
249
static size_t
250
get_token (size_t idx, sb *in, sb *name)
251
702k
{
252
702k
  if (idx < in->len
253
702k
      && is_name_beginner (in->ptr[idx]))
254
654k
    {
255
654k
      sb_add_char (name, in->ptr[idx++]);
256
3.17M
      while (idx < in->len
257
3.17M
       && is_part_of_name (in->ptr[idx]))
258
2.52M
  {
259
2.52M
    sb_add_char (name, in->ptr[idx++]);
260
2.52M
  }
261
654k
      if (idx < in->len
262
654k
       && is_name_ender (in->ptr[idx]))
263
0
  {
264
0
    sb_add_char (name, in->ptr[idx++]);
265
0
  }
266
654k
    }
267
  /* Ignore trailing &.  */
268
702k
  if (flag_macro_alternate && idx < in->len && in->ptr[idx] == '&')
269
0
    idx++;
270
702k
  return idx;
271
702k
}
272
273
/* Pick up a string.  */
274
275
static size_t
276
getstring (size_t idx, sb *in, sb *acc)
277
363
{
278
726
  while (idx < in->len
279
662
   && (in->ptr[idx] == '"'
280
581
       || (in->ptr[idx] == '<' && (flag_macro_alternate || flag_mri))
281
299
       || (in->ptr[idx] == '\'' && flag_macro_alternate)))
282
363
    {
283
363
      if (in->ptr[idx] == '<')
284
282
  {
285
282
    int nest = 0;
286
282
    idx++;
287
282
    while (idx < in->len)
288
282
      {
289
282
        if (in->ptr[idx] == '!' && idx + 1 < in->len)
290
0
    idx++;
291
282
        else if (in->ptr[idx] == '>')
292
282
    {
293
282
      if (nest == 0)
294
282
        {
295
282
          idx++;
296
282
          break;
297
282
        }
298
0
      nest--;
299
0
    }
300
0
        else if (in->ptr[idx] == '<')
301
0
    nest++;
302
303
0
        sb_add_char (acc, in->ptr[idx]);
304
0
        idx++;
305
0
      }
306
282
  }
307
81
      else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
308
81
  {
309
81
    char tchar = in->ptr[idx];
310
81
    int escaped = 0;
311
312
81
    idx++;
313
607
    while (idx < in->len)
314
556
      {
315
556
        if (in->ptr[idx - 1] == '\\')
316
0
    escaped ^= 1;
317
556
        else
318
556
    escaped = 0;
319
320
556
        if (flag_macro_alternate
321
0
      && in->ptr[idx] == '!' && idx + 1 < in->len)
322
0
    {
323
0
      idx++;
324
0
    }
325
556
        else if (!escaped && in->ptr[idx] == tchar)
326
69
    {
327
69
      idx++;
328
69
      if (idx >= in->len || in->ptr[idx] != tchar)
329
30
        break;
330
69
    }
331
526
        sb_add_char (acc, in->ptr[idx]);
332
526
        idx++;
333
526
      }
334
81
  }
335
363
    }
336
337
363
  return idx;
338
363
}
339
340
/* Fetch string from the input stream,
341
   rules:
342
    %<expr>   -> return string of decimal value of <expr>
343
    "string"    -> return string
344
    (string)    -> return (string-including-whitespaces)
345
    xyx<whitespace>     -> return xyz.  */
346
347
static size_t
348
get_any_string (size_t idx, sb *in, sb *out)
349
7.88k
{
350
7.88k
  sb_reset (out);
351
7.88k
  idx = sb_skip_white (idx, in);
352
353
7.88k
  if (idx < in->len)
354
7.88k
    {
355
7.88k
      if (in->ptr[idx] == '%' && flag_macro_alternate)
356
0
  {
357
    /* Turn the following expression into a string.  */
358
0
    expressionS ex;
359
0
    char buf[64];
360
361
0
    sb_terminate (in);
362
363
0
    temp_ilp (in->ptr + idx + 1);
364
0
    expression_and_evaluate (&ex);
365
0
    idx = input_line_pointer - in->ptr;
366
0
    restore_ilp ();
367
368
0
    if (ex.X_op != O_constant)
369
0
      as_bad (_("%% operator needs absolute expression"));
370
371
0
    sprintf (buf, "%" PRId64, (int64_t) ex.X_add_number);
372
0
    sb_add_string (out, buf);
373
0
  }
374
7.88k
      else if (in->ptr[idx] == '"'
375
7.80k
         || (in->ptr[idx] == '<' && (flag_macro_alternate || flag_mri))
376
7.52k
         || (flag_macro_alternate && in->ptr[idx] == '\''))
377
363
  {
378
363
    if (flag_macro_alternate && ! macro_strip_at && in->ptr[idx] != '<')
379
0
      {
380
        /* Keep the quotes.  */
381
0
        sb_add_char (out, '"');
382
0
        idx = getstring (idx, in, out);
383
0
        sb_add_char (out, '"');
384
0
      }
385
363
    else
386
363
      {
387
363
        idx = getstring (idx, in, out);
388
363
      }
389
363
  }
390
7.52k
      else
391
7.52k
  {
392
7.52k
    char *br_buf = XNEWVEC (char, 1);
393
7.52k
    char *in_br = br_buf;
394
395
7.52k
    *in_br = '\0';
396
52.3k
    while (idx < in->len
397
51.3k
     && (*in_br || !is_whitespace (in->ptr[idx]))
398
50.0k
     && in->ptr[idx] != ','
399
45.1k
     && (in->ptr[idx] != '<'
400
284
         || (! flag_macro_alternate && ! flag_mri)))
401
44.8k
      {
402
44.8k
        char tchar = in->ptr[idx];
403
404
44.8k
        switch (tchar)
405
44.8k
    {
406
5
    case '"':
407
5
    case '\'':
408
5
      sb_add_char (out, in->ptr[idx++]);
409
5
      while (idx < in->len
410
1
       && in->ptr[idx] != tchar)
411
0
        sb_add_char (out, in->ptr[idx++]);
412
5
      if (idx == in->len)
413
4
        {
414
4
          free (br_buf);
415
4
          return idx;
416
4
        }
417
1
      break;
418
458
    case '(':
419
458
    case '[':
420
458
      if (in_br > br_buf)
421
0
        --in_br;
422
458
      else
423
458
        {
424
458
          br_buf = XNEWVEC (char, strlen (in_br) + 2);
425
458
          strcpy (br_buf + 1, in_br);
426
458
          free (in_br);
427
458
          in_br = br_buf;
428
458
        }
429
458
      *in_br = tchar;
430
458
      break;
431
3.24k
    case ')':
432
3.24k
      if (*in_br == '(')
433
423
        ++in_br;
434
3.24k
      break;
435
1
    case ']':
436
1
      if (*in_br == '[')
437
0
        ++in_br;
438
1
      break;
439
44.8k
    }
440
44.8k
        sb_add_char (out, tchar);
441
44.8k
        ++idx;
442
44.8k
      }
443
7.51k
    free (br_buf);
444
7.51k
  }
445
7.88k
    }
446
447
7.88k
  return idx;
448
7.88k
}
449
450
/* Allocate a new formal.  */
451
452
static formal_entry *
453
new_formal (void)
454
122
{
455
122
  formal_entry *formal;
456
457
122
  formal = XNEW (formal_entry);
458
459
122
  sb_new (&formal->name);
460
122
  sb_new (&formal->def);
461
122
  sb_new (&formal->actual);
462
122
  formal->next = NULL;
463
122
  formal->type = FORMAL_OPTIONAL;
464
122
  return formal;
465
122
}
466
467
/* Free a formal.  */
468
469
static void
470
del_formal (formal_entry *formal)
471
122
{
472
122
  sb_kill (&formal->actual);
473
122
  sb_kill (&formal->def);
474
122
  sb_kill (&formal->name);
475
122
  free (formal);
476
122
}
477
478
/* Pick up the formal parameters of a macro definition.  */
479
480
static size_t
481
do_formals (macro_entry *macro, size_t idx, sb *in)
482
60
{
483
60
  formal_entry **p = &macro->formals;
484
60
  const char *name;
485
486
60
  idx = sb_skip_white (idx, in);
487
98
  while (idx < in->len)
488
69
    {
489
69
      formal_entry *formal = new_formal ();
490
69
      size_t cidx;
491
492
69
      idx = get_token (idx, in, &formal->name);
493
69
      if (formal->name.len == 0)
494
31
  {
495
31
    if (macro->formal_count)
496
4
      --idx;
497
31
    del_formal (formal);  /* 'formal' goes out of scope.  */
498
31
    break;
499
31
  }
500
38
      idx = sb_skip_white (idx, in);
501
      /* This is a formal.  */
502
38
      name = sb_terminate (&formal->name);
503
38
      if (! flag_mri
504
18
    && idx < in->len
505
10
    && in->ptr[idx] == ':'
506
0
    && (! is_name_beginner (':')
507
0
        || idx + 1 >= in->len
508
0
        || ! is_part_of_name (in->ptr[idx + 1])))
509
0
  {
510
    /* Got a qualifier.  */
511
0
    sb qual;
512
513
0
    sb_new (&qual);
514
0
    idx = get_token (sb_skip_white (idx + 1, in), in, &qual);
515
0
    sb_terminate (&qual);
516
0
    if (qual.len == 0)
517
0
      as_bad_where (macro->file,
518
0
        macro->line,
519
0
        _("Missing parameter qualifier for `%s' in macro `%s'"),
520
0
        name,
521
0
        macro->name);
522
0
    else if (strcmp (qual.ptr, "req") == 0)
523
0
      formal->type = FORMAL_REQUIRED;
524
0
    else if (strcmp (qual.ptr, "vararg") == 0)
525
0
      formal->type = FORMAL_VARARG;
526
0
    else
527
0
      as_bad_where (macro->file,
528
0
        macro->line,
529
0
        _("`%s' is not a valid parameter qualifier for `%s' in macro `%s'"),
530
0
        qual.ptr,
531
0
        name,
532
0
        macro->name);
533
0
    sb_kill (&qual);
534
0
    idx = sb_skip_white (idx, in);
535
0
  }
536
38
      if (idx < in->len && in->ptr[idx] == '=')
537
4
  {
538
    /* Got a default.  */
539
4
    idx = get_any_string (idx + 1, in, &formal->def);
540
4
    idx = sb_skip_white (idx, in);
541
4
    if (formal->type == FORMAL_REQUIRED)
542
0
      {
543
0
        sb_reset (&formal->def);
544
0
        as_warn_where (macro->file,
545
0
          macro->line,
546
0
          _("Pointless default value for required parameter `%s' in macro `%s'"),
547
0
          name,
548
0
          macro->name);
549
0
      }
550
4
  }
551
552
      /* Add to macro's hash table.  */
553
38
      if (str_hash_insert (macro->formal_hash, name, formal, 0) != NULL)
554
0
  {
555
0
    as_bad_where (macro->file, macro->line,
556
0
      _("A parameter named `%s' "
557
0
        "already exists for macro `%s'"),
558
0
      name, macro->name);
559
0
  }
560
561
38
      formal->index = macro->formal_count++;
562
38
      *p = formal;
563
38
      p = &formal->next;
564
38
      if (formal->type == FORMAL_VARARG)
565
0
  break;
566
38
      cidx = idx;
567
38
      idx = sb_skip_comma (idx, in);
568
38
      if (idx != cidx && idx >= in->len)
569
0
  {
570
0
    idx = cidx;
571
0
    break;
572
0
  }
573
38
    }
574
575
60
  if (flag_mri)
576
43
    {
577
43
      formal_entry *formal = new_formal ();
578
579
      /* Add a special NARG formal, which macro_expand will set to the
580
   number of arguments.  */
581
      /* The same MRI assemblers which treat '@' characters also use
582
   the name $NARG.  At least until we find an exception.  */
583
43
      if (macro_strip_at)
584
0
  name = "$NARG";
585
43
      else
586
43
  name = "NARG";
587
588
43
      sb_add_string (&formal->name, name);
589
590
      /* Add to macro's hash table.  */
591
43
      if (str_hash_insert (macro->formal_hash, name, formal, 0) != NULL)
592
0
  {
593
0
    as_bad_where (macro->file, macro->line,
594
0
      _("Reserved word `%s' used as parameter in macro `%s'"),
595
0
      name, macro->name);
596
0
  }
597
598
43
      formal->index = NARG_INDEX;
599
43
      *p = formal;
600
43
    }
601
602
60
  return idx;
603
60
}
604
605
/* Free the memory allocated to a macro.  */
606
607
static void
608
free_macro (macro_entry *macro)
609
60
{
610
60
  formal_entry *formal;
611
612
141
  for (formal = macro->formals; formal; )
613
81
    {
614
81
      formal_entry *f;
615
616
81
      f = formal;
617
81
      formal = formal->next;
618
81
      del_formal (f);
619
81
    }
620
60
  htab_delete (macro->formal_hash);
621
60
  sb_kill (&macro->sub);
622
60
  free ((char *) macro->name);
623
60
  free (macro);
624
60
}
625
626
/* Define a new macro.  */
627
628
macro_entry *
629
define_macro (sb *in, sb *label, size_t (*get_line) (sb *))
630
60
{
631
60
  macro_entry *macro;
632
60
  sb name;
633
60
  size_t idx;
634
60
  const char *error = NULL;
635
636
60
  macro = XNEW (macro_entry);
637
60
  sb_new (&macro->sub);
638
60
  sb_new (&name);
639
60
  macro->file = as_where (&macro->line);
640
641
60
  macro->formal_count = 0;
642
60
  macro->formals = 0;
643
60
  macro->formal_hash = str_htab_create ();
644
60
  macro->count = 0;
645
646
60
  idx = sb_skip_white (0, in);
647
60
  if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
648
34
    error = _("unexpected end of file in macro `%s' definition");
649
60
  if (label != NULL && label->len != 0)
650
1
    {
651
1
      sb_add_sb (&name, label);
652
1
      macro->name = sb_terminate (&name);
653
1
      if (idx < in->len && in->ptr[idx] == '(')
654
1
  {
655
    /* It's the label: MACRO (formals,...)  sort  */
656
1
    idx = do_formals (macro, idx + 1, in);
657
1
    if (idx < in->len && in->ptr[idx] == ')')
658
0
      idx = sb_skip_white (idx + 1, in);
659
1
    else if (!error)
660
0
      error = _("missing `)' after formals in macro definition `%s'");
661
1
  }
662
0
      else
663
0
  {
664
    /* It's the label: MACRO formals,...  sort  */
665
0
    idx = do_formals (macro, idx, in);
666
0
  }
667
1
    }
668
59
  else
669
59
    {
670
59
      size_t cidx;
671
672
59
      idx = get_token (idx, in, &name);
673
59
      macro->name = sb_terminate (&name);
674
59
      if (name.len == 0)
675
18
  error = _("Missing macro name");
676
59
      cidx = sb_skip_white (idx, in);
677
59
      idx = sb_skip_comma (cidx, in);
678
59
      if (idx == cidx || idx < in->len)
679
59
  idx = do_formals (macro, idx, in);
680
0
      else
681
0
  idx = cidx;
682
59
    }
683
60
  if (!error && idx < in->len)
684
0
    error = _("Bad parameter list for macro `%s'");
685
686
  /* And stick it in the macro hash table.  */
687
157
  for (idx = 0; idx < name.len; idx++)
688
97
    name.ptr[idx] = TOLOWER (name.ptr[idx]);
689
60
  if (!error)
690
26
    {
691
26
      if (str_hash_insert (macro_hash, macro->name, macro, 0) != NULL)
692
2
  error = _("Macro `%s' was already defined");
693
26
    }
694
695
60
  if (!error)
696
24
    macro_defined = 1;
697
36
  else
698
36
    {
699
36
      as_bad_where (macro->file, macro->line, error, macro->name);
700
36
      free_macro (macro);
701
36
      macro = NULL;
702
36
    }
703
704
60
  return macro;
705
60
}
706
707
/* Scan a token, and then skip KIND.  */
708
709
static size_t
710
get_apost_token (size_t idx, sb *in, sb *name, int kind)
711
684k
{
712
684k
  idx = get_token (idx, in, name);
713
684k
  if (idx < in->len
714
684k
      && in->ptr[idx] == kind
715
4.05k
      && (! flag_mri || macro_strip_at)
716
0
      && (! macro_strip_at || kind == '@'))
717
1.63k
    idx++;
718
684k
  return idx;
719
684k
}
720
721
/* Substitute the actual value for a formal parameter.  */
722
723
static size_t
724
sub_actual (size_t start, sb *in, sb *t, struct htab *formal_hash,
725
      int kind, sb *out, int copyifnotthere)
726
684k
{
727
684k
  size_t src;
728
684k
  formal_entry *ptr;
729
730
684k
  src = get_apost_token (start, in, t, kind);
731
  /* See if it's in the macro's hash table, unless this is
732
     macro_strip_at and kind is '@' and the token did not end in '@'.  */
733
684k
  if (macro_strip_at
734
0
      && kind == '@'
735
0
      && (src == start || in->ptr[src - 1] != '@'))
736
0
    ptr = NULL;
737
684k
  else
738
684k
    ptr = str_hash_find (formal_hash, sb_terminate (t));
739
684k
  if (ptr)
740
18.2k
    {
741
18.2k
      if (ptr->actual.len)
742
12.8k
  {
743
12.8k
    sb_add_sb (out, &ptr->actual);
744
12.8k
  }
745
5.36k
      else
746
5.36k
  {
747
5.36k
    sb_add_sb (out, &ptr->def);
748
5.36k
  }
749
18.2k
    }
750
666k
  else if (kind == '&')
751
5.17k
    {
752
      /* Doing this permits people to use & in macro bodies.  */
753
5.17k
      sb_add_char (out, '&');
754
5.17k
      sb_add_sb (out, t);
755
5.17k
      if (src != start && in->ptr[src - 1] == '&')
756
1.63k
  sb_add_char (out, '&');
757
5.17k
    }
758
661k
  else if (copyifnotthere)
759
625k
    {
760
625k
      sb_add_sb (out, t);
761
625k
    }
762
36.1k
  else
763
36.1k
    {
764
36.1k
      sb_add_char (out, '\\');
765
36.1k
      sb_add_sb (out, t);
766
36.1k
    }
767
684k
  return src;
768
684k
}
769
770
/* Expand the body of a macro.  */
771
772
static const char *
773
macro_expand_body (sb *in, sb *out, formal_entry *formals,
774
       struct htab *formal_hash, const macro_entry *macro,
775
       unsigned int instance)
776
45.7k
{
777
45.7k
  sb t;
778
45.7k
  size_t src = 0;
779
45.7k
  int inquote = 0, macro_line = 0;
780
45.7k
  formal_entry *loclist = NULL;
781
45.7k
  const char *err = NULL;
782
783
45.7k
  sb_new (&t);
784
785
7.26M
  while (src < in->len && !err)
786
7.21M
    {
787
7.21M
      if (in->ptr[src] == '&')
788
21.3k
  {
789
21.3k
    sb_reset (&t);
790
21.3k
    if (flag_mri)
791
16.1k
      {
792
16.1k
        if (src + 1 < in->len && in->ptr[src + 1] == '&')
793
78
    src = sub_actual (src + 2, in, &t, formal_hash, '\'', out, 1);
794
16.0k
        else
795
16.0k
    sb_add_char (out, in->ptr[src++]);
796
16.1k
      }
797
5.17k
    else
798
5.17k
      {
799
        /* Permit macro parameter substitution delineated with
800
     an '&' prefix and optional '&' suffix.  */
801
5.17k
        src = sub_actual (src + 1, in, &t, formal_hash, '&', out, 0);
802
5.17k
      }
803
21.3k
  }
804
7.19M
      else if (in->ptr[src] == '\\')
805
38.3k
  {
806
38.3k
    src++;
807
38.3k
    if (src < in->len && in->ptr[src] == '(')
808
9
      {
809
        /* Sub in till the next ')' literally.  */
810
9
        src++;
811
2.03k
        while (src < in->len && in->ptr[src] != ')')
812
2.02k
    {
813
2.02k
      sb_add_char (out, in->ptr[src++]);
814
2.02k
    }
815
9
        if (src < in->len)
816
0
    src++;
817
9
        else if (!macro)
818
9
    err = _("missing `)'");
819
0
        else
820
0
    as_bad_where (macro->file, macro->line + macro_line, _("missing `)'"));
821
9
      }
822
38.2k
    else if (src < in->len && in->ptr[src] == '@')
823
272
      {
824
        /* Sub in the total macro invocation number.  */
825
826
272
        char buffer[12];
827
272
        src++;
828
272
        sprintf (buffer, "%u", macro_number);
829
272
        sb_add_string (out, buffer);
830
272
      }
831
38.0k
    else if (src < in->len && in->ptr[src] == '+')
832
895
      {
833
        /* Sub in the current macro invocation number.  */
834
835
895
        char buffer[12];
836
895
        src++;
837
895
        sprintf (buffer, "%d", instance);
838
895
        sb_add_string (out, buffer);
839
895
      }
840
37.1k
    else if (src < in->len && in->ptr[src] == '&')
841
24
      {
842
        /* This is a preprocessor variable name, we don't do them
843
     here.  */
844
24
        sb_add_char (out, '\\');
845
24
        sb_add_char (out, '&');
846
24
        src++;
847
24
      }
848
37.1k
    else if (flag_mri && src < in->len && ISALNUM (in->ptr[src]))
849
961
      {
850
961
        int ind;
851
961
        formal_entry *f;
852
853
961
        if (ISDIGIT (in->ptr[src]))
854
8
    ind = in->ptr[src] - '0';
855
953
        else if (ISUPPER (in->ptr[src]))
856
688
    ind = in->ptr[src] - 'A' + 10;
857
265
        else
858
265
    ind = in->ptr[src] - 'a' + 10;
859
961
        ++src;
860
1.93k
        for (f = formals; f != NULL; f = f->next)
861
982
    {
862
982
      if (f->index == ind - 1)
863
6
        {
864
6
          if (f->actual.len != 0)
865
6
      sb_add_sb (out, &f->actual);
866
0
          else
867
0
      sb_add_sb (out, &f->def);
868
6
          break;
869
6
        }
870
982
    }
871
961
      }
872
36.1k
    else
873
36.1k
      {
874
36.1k
        sb_reset (&t);
875
36.1k
        src = sub_actual (src, in, &t, formal_hash, '\'', out, 0);
876
36.1k
      }
877
38.3k
  }
878
7.15M
      else if ((flag_macro_alternate || flag_mri)
879
2.41M
         && is_name_beginner (in->ptr[src])
880
643k
         && (! inquote
881
315k
       || ! macro_strip_at
882
0
       || (src > 0 && in->ptr[src - 1] == '@')))
883
643k
  {
884
643k
    if (! macro
885
4.00k
        || src + 5 >= in->len
886
3.98k
        || strncasecmp (in->ptr + src, "LOCAL", 5) != 0
887
0
        || ! is_whitespace (in->ptr[src + 5])
888
        /* PR 11507: Skip keyword LOCAL if it is found inside a quoted string.  */
889
0
        || inquote)
890
643k
      {
891
643k
        sb_reset (&t);
892
643k
        src = sub_actual (src, in, &t, formal_hash,
893
643k
        (macro_strip_at && inquote) ? '@' : '\'',
894
643k
        out, 1);
895
643k
      }
896
0
    else
897
0
      {
898
0
        src = sb_skip_white (src + 5, in);
899
0
        while (in->ptr[src] != '\n')
900
0
    {
901
0
      const char *name;
902
0
      formal_entry *f = new_formal ();
903
904
0
      src = get_token (src, in, &f->name);
905
0
      name = sb_terminate (&f->name);
906
0
      if (str_hash_insert (formal_hash, name, f, 0) != NULL)
907
0
        {
908
0
          as_bad_where (macro->file, macro->line + macro_line,
909
0
            _("`%s' was already used as parameter "
910
0
              "(or another local) name"), name);
911
0
          del_formal (f);
912
0
        }
913
0
      else
914
0
        {
915
0
          static int loccnt;
916
0
          char buf[20];
917
918
0
          f->index = LOCAL_INDEX;
919
0
          f->next = loclist;
920
0
          loclist = f;
921
922
0
          sprintf (buf, IS_ELF ? ".LL%04x" : "LL%04x", ++loccnt);
923
0
          sb_add_string (&f->actual, buf);
924
0
        }
925
926
0
      src = sb_skip_comma (src, in);
927
0
    }
928
0
      }
929
643k
  }
930
6.51M
      else if (in->ptr[src] == '"'
931
6.25M
         || (flag_mri && in->ptr[src] == '\''))
932
258k
  {
933
258k
    inquote = !inquote;
934
258k
    sb_add_char (out, in->ptr[src++]);
935
258k
  }
936
6.25M
      else if (in->ptr[src] == '@' && macro_strip_at)
937
0
  {
938
0
    ++src;
939
0
    if (src < in->len
940
0
        && in->ptr[src] == '@')
941
0
      {
942
0
        sb_add_char (out, '@');
943
0
        ++src;
944
0
      }
945
0
  }
946
6.25M
      else if (flag_mri
947
1.65M
         && in->ptr[src] == '='
948
54.0k
         && src + 1 < in->len
949
54.0k
         && in->ptr[src + 1] == '=')
950
11.8k
  {
951
11.8k
    formal_entry *ptr;
952
953
11.8k
    sb_reset (&t);
954
11.8k
    src = get_token (src + 2, in, &t);
955
11.8k
    ptr = str_hash_find (formal_hash, sb_terminate (&t));
956
11.8k
    if (ptr == NULL)
957
11.8k
      {
958
        /* FIXME: We should really return a warning string here,
959
     but we can't, because the == might be in the MRI
960
     comment field, and, since the nature of the MRI
961
     comment field depends upon the exact instruction
962
     being used, we don't have enough information here to
963
     figure out whether it is or not.  Instead, we leave
964
     the == in place, which should cause a syntax error if
965
     it is not in a comment.  */
966
11.8k
        sb_add_char (out, '=');
967
11.8k
        sb_add_char (out, '=');
968
11.8k
        sb_add_sb (out, &t);
969
11.8k
      }
970
0
    else
971
0
      {
972
0
        if (ptr->actual.len)
973
0
    {
974
0
      sb_add_string (out, "-1");
975
0
    }
976
0
        else
977
0
    {
978
0
      sb_add_char (out, '0');
979
0
    }
980
0
      }
981
11.8k
  }
982
6.24M
      else
983
6.24M
  {
984
6.24M
    if (in->ptr[src] == '\n')
985
385k
      ++macro_line;
986
6.24M
    sb_add_char (out, in->ptr[src++]);
987
6.24M
  }
988
7.21M
    }
989
990
45.7k
  sb_kill (&t);
991
992
45.7k
  while (loclist != NULL)
993
0
    {
994
0
      formal_entry *f;
995
0
      const char *name;
996
997
0
      f = loclist->next;
998
0
      name = sb_terminate (&loclist->name);
999
0
      str_hash_delete (formal_hash, name);
1000
0
      del_formal (loclist);
1001
0
      loclist = f;
1002
0
    }
1003
1004
45.7k
  if (!err && (out->len == 0 || out->ptr[out->len - 1] != '\n'))
1005
1.27k
    sb_add_char (out, '\n');
1006
45.7k
  return err;
1007
45.7k
}
1008
1009
/* Assign values to the formal parameters of a macro, and expand the
1010
   body.  */
1011
1012
static const char *
1013
macro_expand (size_t idx, sb *in, macro_entry *m, sb *out)
1014
83
{
1015
83
  sb t;
1016
83
  formal_entry *ptr;
1017
83
  formal_entry *f;
1018
83
  int is_keyword = 0;
1019
83
  int narg = 0;
1020
83
  const char *err = NULL;
1021
1022
83
  sb_new (&t);
1023
1024
  /* Reset any old value the actuals may have.  */
1025
235
  for (f = m->formals; f; f = f->next)
1026
152
    sb_reset (&f->actual);
1027
83
  f = m->formals;
1028
83
  while (f != NULL && f->index < 0)
1029
0
    f = f->next;
1030
1031
83
  if (flag_mri)
1032
62
    {
1033
      /* The macro may be called with an optional qualifier, which may
1034
   be referred to in the macro body as \0.  */
1035
62
      if (idx < in->len && in->ptr[idx] == '.')
1036
0
  {
1037
    /* The Microtec assembler ignores this if followed by a white space.
1038
       (Macro invocation with empty extension) */
1039
0
    idx++;
1040
0
    if (idx < in->len && !is_whitespace (in->ptr[idx]))
1041
0
      {
1042
0
        formal_entry *n = new_formal ();
1043
1044
0
        n->index = QUAL_INDEX;
1045
1046
0
        n->next = m->formals;
1047
0
        m->formals = n;
1048
1049
0
        idx = get_any_string (idx, in, &n->actual);
1050
0
      }
1051
0
  }
1052
62
    }
1053
1054
  /* Peel off the actuals and store them away in the hash tables' actuals.  */
1055
83
  idx = sb_skip_white (idx, in);
1056
174
  while (idx < in->len)
1057
94
    {
1058
      /* Look and see if it's a positional or keyword arg.  */
1059
94
      size_t scan;
1060
1061
94
      sb_reset (&t);
1062
94
      scan = !flag_macro_alternate ? get_token (idx, in, &t) : idx;
1063
1064
94
      if (scan > idx && scan < in->len && in->ptr[scan] == '=')
1065
0
  {
1066
0
    is_keyword = 1;
1067
1068
    /* It's OK to go from positional to keyword.  */
1069
1070
    /* Lookup the formal in the macro's list.  */
1071
0
    ptr = str_hash_find (m->formal_hash, sb_terminate (&t));
1072
0
    if (!ptr)
1073
0
      {
1074
0
        as_bad (_("Parameter named `%s' does not exist for macro `%s'"),
1075
0
          t.ptr,
1076
0
          m->name);
1077
0
        sb_reset (&t);
1078
        /* Skip what would be the actual stuff.  */
1079
0
        idx = get_any_string (scan + 1, in, &t);
1080
0
      }
1081
0
    else
1082
0
      {
1083
        /* Insert this value into the right place.  */
1084
0
        if (ptr->actual.len)
1085
0
    {
1086
0
      as_warn (_("Value for parameter `%s' of macro `%s' was already specified"),
1087
0
         ptr->name.ptr,
1088
0
         m->name);
1089
0
      sb_reset (&ptr->actual);
1090
0
    }
1091
        /* Fetch the actual stuff.  */
1092
0
        idx = get_any_string (scan + 1, in, &ptr->actual);
1093
0
        if (ptr->actual.len > 0)
1094
0
    ++narg;
1095
0
      }
1096
0
  }
1097
94
      else
1098
94
  {
1099
94
    if (is_keyword)
1100
0
      {
1101
0
        err = _("can't mix positional and keyword arguments");
1102
0
        break;
1103
0
      }
1104
1105
94
    if (!f)
1106
13
      {
1107
13
        formal_entry **pf;
1108
13
        int c;
1109
1110
13
        if (!flag_mri)
1111
3
    {
1112
3
      err = _("too many positional arguments");
1113
3
      break;
1114
3
    }
1115
1116
10
        f = new_formal ();
1117
1118
10
        c = -1;
1119
29
        for (pf = &m->formals; *pf != NULL; pf = &(*pf)->next)
1120
19
    if ((*pf)->index >= c)
1121
10
      c = (*pf)->index + 1;
1122
10
        if (c == -1)
1123
0
    c = 0;
1124
10
        *pf = f;
1125
10
        f->index = c;
1126
10
      }
1127
1128
91
    if (f->type != FORMAL_VARARG)
1129
91
      idx = get_any_string (idx, in, &f->actual);
1130
0
    else if (idx < in->len)
1131
0
      {
1132
0
        sb_add_buffer (&f->actual, in->ptr + idx, in->len - idx);
1133
0
        idx = in->len;
1134
0
      }
1135
91
    if (f->actual.len > 0)
1136
89
      ++narg;
1137
91
    do
1138
150
      {
1139
150
        f = f->next;
1140
150
      }
1141
150
    while (f != NULL && f->index < 0);
1142
91
  }
1143
1144
91
      if (! flag_mri)
1145
19
  idx = sb_skip_comma (idx, in);
1146
72
      else
1147
72
  {
1148
72
    if (idx < in->len && in->ptr[idx] == ',')
1149
0
      ++idx;
1150
72
    if (idx < in->len && is_whitespace (in->ptr[idx]))
1151
0
      break;
1152
72
  }
1153
91
    }
1154
1155
83
  if (! err)
1156
80
    {
1157
239
      for (ptr = m->formals; ptr; ptr = ptr->next)
1158
159
  {
1159
159
    if (ptr->type == FORMAL_REQUIRED && ptr->actual.len == 0)
1160
0
      as_bad (_("Missing value for required parameter `%s' of macro `%s'"),
1161
0
        ptr->name.ptr,
1162
0
        m->name);
1163
159
  }
1164
1165
80
      if (flag_mri)
1166
62
  {
1167
62
    ptr = str_hash_find (m->formal_hash,
1168
62
             macro_strip_at ? "$NARG" : "NARG");
1169
62
    if (ptr)
1170
60
      {
1171
60
        char buffer[20];
1172
60
        sprintf (buffer, "%d", narg);
1173
60
        sb_add_string (&ptr->actual, buffer);
1174
60
      }
1175
62
  }
1176
1177
80
      err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m,
1178
80
             m->count);
1179
80
    }
1180
1181
  /* Discard any unnamed formal arguments.  */
1182
83
  if (flag_mri)
1183
62
    {
1184
62
      formal_entry **pf;
1185
1186
62
      pf = &m->formals;
1187
197
      while (*pf != NULL)
1188
135
  {
1189
135
    if ((*pf)->name.len != 0)
1190
125
      pf = &(*pf)->next;
1191
10
    else
1192
10
      {
1193
10
        f = (*pf)->next;
1194
10
        del_formal (*pf);
1195
10
        *pf = f;
1196
10
      }
1197
135
  }
1198
62
    }
1199
1200
83
  sb_kill (&t);
1201
83
  if (!err)
1202
80
    {
1203
80
      macro_number++;
1204
80
      m->count++;
1205
80
    }
1206
1207
83
  return err;
1208
83
}
1209
1210
/* Check for a macro.  If one is found, put the expansion into
1211
   *EXPAND.  Return 1 if a macro is found, 0 otherwise.  */
1212
1213
int
1214
check_macro (const char *line, sb *expand,
1215
       const char **error, macro_entry **info)
1216
1.39k
{
1217
1.39k
  const char *s;
1218
1.39k
  char *copy, *cls;
1219
1.39k
  macro_entry *macro;
1220
1.39k
  sb line_sb;
1221
1222
1.39k
  if (! is_name_beginner (*line)
1223
55
      && (! flag_mri || *line != '.'))
1224
55
    return 0;
1225
1226
1.34k
  s = line + 1;
1227
8.76k
  while (is_part_of_name (*s))
1228
7.42k
    ++s;
1229
1.34k
  if (is_name_ender (*s))
1230
0
    ++s;
1231
1232
1.34k
  copy = xmemdup0 (line, s - line);
1233
10.1k
  for (cls = copy; *cls != '\0'; cls ++)
1234
8.76k
    *cls = TOLOWER (*cls);
1235
1236
1.34k
  macro = str_hash_find (macro_hash, copy);
1237
1.34k
  free (copy);
1238
1239
1.34k
  if (macro == NULL)
1240
1.26k
    return 0;
1241
1242
  /* Wrap the line up in an sb.  */
1243
83
  sb_new (&line_sb);
1244
760
  while (*s != '\0' && *s != '\n' && *s != '\r')
1245
677
    sb_add_char (&line_sb, *s++);
1246
1247
83
  sb_new (expand);
1248
83
  *error = macro_expand (0, &line_sb, macro, expand);
1249
1250
83
  sb_kill (&line_sb);
1251
1252
  /* Export the macro information if requested.  */
1253
83
  if (info)
1254
83
    *info = macro;
1255
1256
83
  return 1;
1257
1.34k
}
1258
1259
/* Delete a macro.  */
1260
1261
void
1262
delete_macro (const char *name)
1263
0
{
1264
0
  char *copy;
1265
0
  size_t i, len;
1266
0
  macro_entry *macro;
1267
1268
0
  len = strlen (name);
1269
0
  copy = XNEWVEC (char, len + 1);
1270
0
  for (i = 0; i < len; ++i)
1271
0
    copy[i] = TOLOWER (name[i]);
1272
0
  copy[i] = '\0';
1273
1274
0
  macro = str_hash_find (macro_hash, copy);
1275
0
  if (macro != NULL)
1276
0
    str_hash_delete (macro_hash, copy);
1277
0
  else
1278
0
    as_warn (_("Attempt to purge non-existing macro `%s'"), copy);
1279
0
  free (copy);
1280
0
}
1281
1282
/* Handle the MRI IRP and IRPC pseudo-ops.  These are handled as a
1283
   combined macro definition and execution.  This returns NULL on
1284
   success, or an error message otherwise.  */
1285
1286
const char *
1287
expand_irp (int irpc, size_t idx, sb *in, sb *out, size_t (*get_line) (sb *))
1288
5.98k
{
1289
5.98k
  sb sub;
1290
5.98k
  formal_entry f;
1291
5.98k
  struct htab *h;
1292
5.98k
  const char *err = NULL;
1293
1294
5.98k
  idx = sb_skip_white (idx, in);
1295
1296
5.98k
  sb_new (&sub);
1297
5.98k
  if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
1298
29
    {
1299
29
      err = _("unexpected end of file in irp or irpc");
1300
29
      goto out2;
1301
29
    }
1302
1303
5.95k
  sb_new (&f.name);
1304
5.95k
  sb_new (&f.def);
1305
5.95k
  sb_new (&f.actual);
1306
1307
5.95k
  idx = get_token (idx, in, &f.name);
1308
5.95k
  if (f.name.len == 0)
1309
1.13k
    {
1310
1.13k
      err = _("missing model parameter");
1311
1.13k
      goto out1;
1312
1.13k
    }
1313
1314
4.82k
  h = str_htab_create ();
1315
1316
4.82k
  str_hash_insert (h, sb_terminate (&f.name), &f, 0);
1317
1318
4.82k
  f.index = 1;
1319
4.82k
  f.next = NULL;
1320
4.82k
  f.type = FORMAL_OPTIONAL;
1321
1322
4.82k
  sb_reset (out);
1323
1324
4.82k
  idx = sb_skip_comma (idx, in);
1325
4.82k
  if (idx >= in->len)
1326
0
    {
1327
      /* Expand once with a null string.  */
1328
0
      err = macro_expand_body (&sub, out, &f, h, NULL, 0);
1329
0
    }
1330
4.82k
  else
1331
4.82k
    {
1332
4.82k
      bool in_quotes = false;
1333
4.82k
      unsigned int instance = 0;
1334
1335
50.4k
      while (idx < in->len)
1336
45.6k
  {
1337
45.6k
    if (!irpc)
1338
7.79k
      idx = get_any_string (idx, in, &f.actual);
1339
37.8k
    else
1340
37.8k
      {
1341
37.8k
        if (in->ptr[idx] == '"')
1342
26
    {
1343
26
      in_quotes = ! in_quotes;
1344
26
      ++idx;
1345
1346
26
      if (! in_quotes)
1347
11
        {
1348
11
          idx = sb_skip_white (idx, in);
1349
11
          if (idx >= in->len)
1350
0
      break;
1351
11
        }
1352
26
      continue;
1353
26
    }
1354
37.8k
        sb_reset (&f.actual);
1355
37.8k
        sb_add_char (&f.actual, in->ptr[idx]);
1356
37.8k
        ++idx;
1357
37.8k
      }
1358
1359
45.6k
    err = macro_expand_body (&sub, out, &f, h, NULL, instance);
1360
45.6k
    ++instance;
1361
45.6k
    if (err != NULL)
1362
9
      break;
1363
45.6k
    if (!irpc)
1364
7.79k
      idx = sb_skip_comma (idx, in);
1365
37.8k
    else if (! in_quotes)
1366
37.3k
      idx = sb_skip_white (idx, in);
1367
45.6k
  }
1368
4.82k
    }
1369
1370
4.82k
  htab_delete (h);
1371
5.95k
 out1:
1372
5.95k
  sb_kill (&f.actual);
1373
5.95k
  sb_kill (&f.def);
1374
5.95k
  sb_kill (&f.name);
1375
5.98k
 out2:
1376
5.98k
  sb_kill (&sub);
1377
1378
5.98k
  return err;
1379
5.95k
}