summaryrefslogtreecommitdiff
path: root/gas/macro.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2006-02-28 07:55:36 +0000
committerJan Beulich <jbeulich@novell.com>2006-02-28 07:55:36 +0000
commit40eea0cbb997d0406b0b6ebf123003ace7635478 (patch)
tree5dd7195edc1214e1311511582141e069aeb002b7 /gas/macro.c
parent1ce6bb0136f891bb52f435f319716196ae03e1b6 (diff)
downloadbinutils-redhat-40eea0cbb997d0406b0b6ebf123003ace7635478.tar.gz
gas/
2006-02-28 Jan Beulich <jbeulich@novell.com> PR/1070 * macro.c (getstring): Don't treat parentheses special anymore. (get_any_string): Don't consider '(' and ')' as quoting anymore. Special-case '(', ')', '[', and ']' when dealing with non-quoting characters. gas/testsuite/ 2006-02-28 Jan Beulich <jbeulich@novell.com> * gas/macros/paren[sd]: New. * gas/macros/macros.exp: Run new test.
Diffstat (limited to 'gas/macro.c')
-rw-r--r--gas/macro.c77
1 files changed, 40 insertions, 37 deletions
diff --git a/gas/macro.c b/gas/macro.c
index 23156a1242..0f3d507d9f 100644
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -303,18 +303,14 @@ 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] == '<')
{
int nest = 0;
- char start_char = '>';
- char end_char = '>';
-
idx++;
- while ((in->ptr[idx] != end_char || nest)
+ while ((in->ptr[idx] != '>' || nest)
&& idx < in->len)
{
if (in->ptr[idx] == '!')
@@ -324,37 +320,15 @@ getstring (int idx, sb *in, sb *acc)
}
else
{
- if (in->ptr[idx] == end_char)
+ if (in->ptr[idx] == '>')
nest--;
- if (in->ptr[idx] == start_char)
+ if (in->ptr[idx] == '<')
nest++;
sb_add_char (acc, in->ptr[idx++]);
}
}
idx++;
}
- else if (in->ptr[idx] == '(')
- {
- int nest = 0;
- char c;
-
- do
- {
- c = in->ptr[idx];
-
- if (c == '!')
- c = in->ptr[++idx];
- else if (c == ')')
- nest--;
- else if (c == '(')
- nest++;
-
- sb_add_char (acc, c);
- idx++;
- }
- while ((c != ')' || nest)
- && idx < in->len);
- }
else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
{
char tchar = in->ptr[idx];
@@ -438,7 +412,6 @@ 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] == '\''))
{
@@ -457,27 +430,57 @@ get_any_string (int idx, sb *in, sb *out)
}
else
{
+ char *br_buf = xmalloc(1);
+ char *in_br = br_buf;
+
+ *in_br = '\0';
while (idx < in->len
- && in->ptr[idx] != ' '
- && in->ptr[idx] != '\t'
+ && (*in_br
+ || (in->ptr[idx] != ' '
+ && in->ptr[idx] != '\t'))
&& in->ptr[idx] != ','
&& (in->ptr[idx] != '<'
|| (! macro_alternate && ! macro_mri)))
{
- if (in->ptr[idx] == '"'
- || in->ptr[idx] == '\'')
- {
- char tchar = in->ptr[idx];
+ char tchar = in->ptr[idx];
+ switch (tchar)
+ {
+ case '"':
+ case '\'':
sb_add_char (out, in->ptr[idx++]);
while (idx < in->len
&& in->ptr[idx] != tchar)
sb_add_char (out, in->ptr[idx++]);
if (idx == in->len)
return idx;
+ break;
+ case '(':
+ case '[':
+ if (in_br > br_buf)
+ --in_br;
+ else
+ {
+ br_buf = xmalloc(strlen(in_br) + 2);
+ strcpy(br_buf + 1, in_br);
+ free(in_br);
+ in_br = br_buf;
+ }
+ *in_br = tchar;
+ break;
+ case ')':
+ if (*in_br == '(')
+ ++in_br;
+ break;
+ case ']':
+ if (*in_br == '[')
+ ++in_br;
+ break;
}
- sb_add_char (out, in->ptr[idx++]);
+ sb_add_char (out, tchar);
+ ++idx;
}
+ free(br_buf);
}
}