diff options
author | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-22 19:17:14 +0000 |
---|---|---|
committer | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-22 19:17:14 +0000 |
commit | dead3293929c5215fea523d0d83a188df8ba717a (patch) | |
tree | 6ac492e3e33761ee32ecc7a71fcec680adf93216 /gcc/gcc.c | |
parent | 7d3aa890515726b62a82a1f305e833d6e77d44e6 (diff) | |
download | gcc-dead3293929c5215fea523d0d83a188df8ba717a.tar.gz |
* gcc.c (validate_switches): Validate multiple switches named
in '|' (or) expressions in specs.
(handle_braces): If more than 1 alternative in a '|' spec
matches, call do_spec1 just once.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37667 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r-- | gcc/gcc.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c index f7d5a9a6084..074cd6a633b 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -4720,6 +4720,7 @@ handle_braces (p) { const char *filter, *body = NULL, *endbody = NULL; int pipe_p = 0; + int true_once = 0; /* If, in %{a|b:d}, at least one of a,b was seen. */ int negate; int suffix; int include_blanks = 1; @@ -4924,11 +4925,8 @@ next_member: give_switch (i, 0, include_blanks); } else - { - if (do_spec_1 (save_string (body, endbody - body - 1), - 0, NULL_PTR) < 0) - return 0; - } + /* Even if many alternatives are matched, only output once. */ + true_once = 1; } else if (pipe_p) { @@ -4943,6 +4941,14 @@ next_member: if (*p++ == '|') goto next_member; + /* Process the spec just once, regardless of match count. */ + if (true_once) + { + if (do_spec_1 (save_string (body, endbody - body - 1), + 0, NULL_PTR) < 0) + return 0; + } + return endbody; } @@ -5938,19 +5944,21 @@ validate_switches (start) register const char *p = start; const char *filter; register int i; - int suffix = 0; + int suffix; if (*p == '|') ++p; +next_member: if (*p == '!') ++p; + suffix = 0; if (*p == '.') suffix = 1, ++p; filter = p; - while (*p != ':' && *p != '}') + while (*p != ':' && *p != '}' && *p != '|') p++; if (suffix) @@ -5958,9 +5966,8 @@ validate_switches (start) else if (p[-1] == '*') { /* Mark all matching switches as valid. */ - --p; for (i = 0; i < n_switches; i++) - if (!strncmp (switches[i].part1, filter, p - filter)) + if (!strncmp (switches[i].part1, filter, p - filter - 1)) switches[i].validated = 1; } else @@ -5973,6 +5980,9 @@ validate_switches (start) switches[i].validated = 1; } } + + if (*p++ == '|') + goto next_member; } /* Check whether a particular argument was used. The first time we |