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