aboutsummaryrefslogtreecommitdiff
path: root/gas/macro.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1995-11-03 18:31:25 +0000
committerIan Lance Taylor <ian@airs.com>1995-11-03 18:31:25 +0000
commit07d012f66c135c8d021001454bc14b6d0d9ace8e (patch)
tree6745a0f6e70a7fb2a0c9ae28f85a59178ad2933c /gas/macro.c
parenta132c404b60006e8038cc19bc84e08c056c11e6e (diff)
downloadgdb-07d012f66c135c8d021001454bc14b6d0d9ace8e.zip
gdb-07d012f66c135c8d021001454bc14b6d0d9ace8e.tar.gz
gdb-07d012f66c135c8d021001454bc14b6d0d9ace8e.tar.bz2
* as.c (main): On TC_A29K, call macro_init with macro_alternate
set to 1. * macro.c (get_any_string): Don't keep quotes if macro_strip_at is set, even if macro_alternate is set. (get_apost_token): If macro_strip_at, only skip kind if it is '@'. (sub_actual): If macro_strip_at, and kind is '@', don't look up the token unless it ended in '@'. * config/tc-a29k.c (line_separator_chars): Remove '@'. * doc/c-a29k.texi: Document macro usage on A29K.
Diffstat (limited to 'gas/macro.c')
-rw-r--r--gas/macro.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/gas/macro.c b/gas/macro.c
index e256fee..5743f79 100644
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -23,7 +23,11 @@
#include "config.h"
#include <stdio.h>
+#ifdef HAVE_STRING_H
#include <string.h>
+#else
+#include <strings.h>
+#endif
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
@@ -382,7 +386,9 @@ get_any_string (idx, in, out, expand, pretend_quoted)
|| in->ptr[idx] == '<'
|| (macro_alternate && in->ptr[idx] == '\''))
{
- if (macro_alternate && expand)
+ if (macro_alternate
+ && ! macro_strip_at
+ && expand)
{
/* Keep the quotes */
sb_add_char (out, '\"');
@@ -573,8 +579,10 @@ get_apost_token (idx, in, name, kind)
int kind;
{
idx = get_token (idx, in, name);
- if (idx < in->len && in->ptr[idx] == kind
- && (! macro_mri || macro_strip_at))
+ if (idx < in->len
+ && in->ptr[idx] == kind
+ && (! macro_mri || macro_strip_at)
+ && (! macro_strip_at || kind == '@'))
idx++;
return idx;
}
@@ -582,8 +590,8 @@ get_apost_token (idx, in, name, kind)
/* Substitute the actual value for a formal parameter. */
static int
-sub_actual (src, in, t, formal_hash, kind, out, copyifnotthere)
- int src;
+sub_actual (start, in, t, formal_hash, kind, out, copyifnotthere)
+ int start;
sb *in;
sb *t;
struct hash_control *formal_hash;
@@ -591,11 +599,18 @@ sub_actual (src, in, t, formal_hash, kind, out, copyifnotthere)
sb *out;
int copyifnotthere;
{
+ int src;
formal_entry *ptr;
- src = get_apost_token (src, in, t, kind);
- /* See if it's in the macro's hash table */
- ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
+ src = get_apost_token (start, in, t, kind);
+ /* See if it's in the macro's hash table, unless this is
+ macro_strip_at and kind is '@' and the token did not end in '@'. */
+ if (macro_strip_at
+ && kind == '@'
+ && (src == start || in->ptr[src - 1] != '@'))
+ ptr = NULL;
+ else
+ ptr = (formal_entry *) hash_find (formal_hash, sb_terminate (t));
if (ptr)
{
if (ptr->actual.len)