summaryrefslogtreecommitdiff
path: root/gas/macro.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2005-08-08 11:15:33 +0000
committerNick Clifton <nickc@redhat.com>2005-08-08 11:15:33 +0000
commit377a21542e0aada9b3ad85615211926e144f24e6 (patch)
tree3cd4fee446de786d1c37ff99698583799437659b /gas/macro.c
parentefc54726c720fc892030e00eb3fa664280c7d316 (diff)
downloadbinutils-redhat-377a21542e0aada9b3ad85615211926e144f24e6.tar.gz
PR 1070
* macro.c (getstring): Treat round parentheses in the same way as angle brackets. (get_any_string): Likewise.
Diffstat (limited to 'gas/macro.c')
-rw-r--r--gas/macro.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/gas/macro.c b/gas/macro.c
index afc560fbbc..fbe266612c 100644
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -306,14 +306,19 @@ getstring (int idx, sb *in, sb *acc)
{
while (idx < in->len
&& (in->ptr[idx] == '"'
+ || in->ptr[idx] == '('
|| (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
|| (in->ptr[idx] == '\'' && macro_alternate)))
{
- if (in->ptr[idx] == '<')
+ if (in->ptr[idx] == '<'
+ || in->ptr[idx] == '(')
{
int nest = 0;
+ char start_char = in->ptr[idx];
+ char end_char = in->ptr[idx] == '<' ? '>' : ')';
+
idx++;
- while ((in->ptr[idx] != '>' || nest)
+ while ((in->ptr[idx] != end_char || nest)
&& idx < in->len)
{
if (in->ptr[idx] == '!')
@@ -323,9 +328,9 @@ getstring (int idx, sb *in, sb *acc)
}
else
{
- if (in->ptr[idx] == '>')
+ if (in->ptr[idx] == end_char)
nest--;
- if (in->ptr[idx] == '<')
+ if (in->ptr[idx] == start_char)
nest++;
sb_add_char (acc, in->ptr[idx++]);
}
@@ -382,10 +387,10 @@ getstring (int idx, sb *in, sb *acc)
/* Fetch string from the input stream,
rules:
'Bxyx<whitespace> -> return 'Bxyza
- %<char> -> return string of decimal value of x
- "<string>" -> return string
- xyx<whitespace> -> return xyz
-*/
+ %<expr> -> return string of decimal value of <expr>
+ "string" -> return string
+ (string) -> return string
+ xyx<whitespace> -> return xyz. */
static int
get_any_string (int idx, sb *in, sb *out)
@@ -404,6 +409,7 @@ get_any_string (int idx, sb *in, sb *out)
{
int val;
char buf[20];
+
/* Turns the next expression into a string. */
/* xgettext: no-c-format */
idx = (*macro_expr) (_("% operator needs absolute expression"),
@@ -414,6 +420,7 @@ get_any_string (int idx, sb *in, sb *out)
sb_add_string (out, buf);
}
else if (in->ptr[idx] == '"'
+ || in->ptr[idx] == '('
|| (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
|| (macro_alternate && in->ptr[idx] == '\''))
{
@@ -443,6 +450,7 @@ get_any_string (int idx, sb *in, sb *out)
|| in->ptr[idx] == '\'')
{
char tchar = in->ptr[idx];
+
sb_add_char (out, in->ptr[idx++]);
while (idx < in->len
&& in->ptr[idx] != tchar)