mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-06-23 13:57:58 +02:00
133 lines
3.3 KiB
Plaintext
133 lines
3.3 KiB
Plaintext
*** braces.c.orig Fri Sep 17 18:42:36 2004
|
|
--- braces.c Sat Jan 28 19:24:14 2006
|
|
***************
|
|
*** 81,94 ****
|
|
char *preamble, *postamble, *amble;
|
|
size_t alen;
|
|
char **tack, **result;
|
|
! int i, j, c;
|
|
|
|
DECLARE_MBSTATE;
|
|
|
|
/* Find the text of the preamble. */
|
|
tlen = strlen (text);
|
|
i = 0;
|
|
! c = brace_gobbler (text, tlen, &i, '{');
|
|
|
|
preamble = (char *)xmalloc (i + 1);
|
|
strncpy (preamble, text, i);
|
|
--- 81,121 ----
|
|
char *preamble, *postamble, *amble;
|
|
size_t alen;
|
|
char **tack, **result;
|
|
! int i, j, c, c1;
|
|
|
|
DECLARE_MBSTATE;
|
|
|
|
/* Find the text of the preamble. */
|
|
tlen = strlen (text);
|
|
i = 0;
|
|
! /* Make sure that when we exit this loop, c == 0 or text[i] begins a
|
|
! valid brace expansion sequence. */
|
|
! do
|
|
! {
|
|
! c = brace_gobbler (text, tlen, &i, '{'); /* } */
|
|
! c1 = c;
|
|
! /* Verify that c begins a valid brace expansion word. If it doesn't, we
|
|
! go on. Loop stops when there are no more open braces in the word. */
|
|
! if (c)
|
|
! {
|
|
! start = j = i + 1; /* { */
|
|
! c = brace_gobbler (text, tlen, &j, '}');
|
|
! if (c == 0) /* it's not */
|
|
! {
|
|
! i++;
|
|
! c = c1;
|
|
! continue;
|
|
! }
|
|
! else /* it is */
|
|
! {
|
|
! c = c1;
|
|
! break;
|
|
! }
|
|
! }
|
|
! else
|
|
! break;
|
|
! }
|
|
! while (c);
|
|
|
|
preamble = (char *)xmalloc (i + 1);
|
|
strncpy (preamble, text, i);
|
|
***************
|
|
*** 361,366 ****
|
|
--- 388,398 ----
|
|
index of the character matching SATISFY. This understands about
|
|
quoting. Return the character that caused us to stop searching;
|
|
this is either the same as SATISFY, or 0. */
|
|
+ /* If SATISFY is `}', we are looking for a brace expression, so we
|
|
+ should enforce the rules that govern valid brace expansions:
|
|
+ 1) to count as an arg separator, a comma or `..' has to be outside
|
|
+ an inner set of braces.
|
|
+ */
|
|
static int
|
|
brace_gobbler (text, tlen, indx, satisfy)
|
|
char *text;
|
|
***************
|
|
*** 368,374 ****
|
|
int *indx;
|
|
int satisfy;
|
|
{
|
|
! register int i, c, quoted, level, pass_next;
|
|
#if defined (SHELL)
|
|
int si;
|
|
char *t;
|
|
--- 400,406 ----
|
|
int *indx;
|
|
int satisfy;
|
|
{
|
|
! register int i, c, quoted, level, commas, pass_next;
|
|
#if defined (SHELL)
|
|
int si;
|
|
char *t;
|
|
***************
|
|
*** 376,381 ****
|
|
--- 408,414 ----
|
|
DECLARE_MBSTATE;
|
|
|
|
level = quoted = pass_next = 0;
|
|
+ commas = (satisfy == '}') ? 0 : 1;
|
|
|
|
i = *indx;
|
|
while (c = text[i])
|
|
***************
|
|
*** 436,442 ****
|
|
}
|
|
#endif
|
|
|
|
! if (c == satisfy && level == 0 && quoted == 0)
|
|
{
|
|
/* We ignore an open brace surrounded by whitespace, and also
|
|
an open brace followed immediately by a close brace preceded
|
|
--- 469,475 ----
|
|
}
|
|
#endif
|
|
|
|
! if (c == satisfy && level == 0 && quoted == 0 && commas > 0)
|
|
{
|
|
/* We ignore an open brace surrounded by whitespace, and also
|
|
an open brace followed immediately by a close brace preceded
|
|
***************
|
|
*** 456,461 ****
|
|
--- 489,499 ----
|
|
level++;
|
|
else if (c == '}' && level)
|
|
level--;
|
|
+ else if (satisfy == '}' && c == brace_arg_separator && level == 0)
|
|
+ commas++;
|
|
+ else if (satisfy == '}' && STREQN (text+i, BRACE_SEQ_SPECIFIER, 2) &&
|
|
+ text[i+2] != satisfy && level == 0)
|
|
+ commas++;
|
|
|
|
ADVANCE_CHAR (text, tlen, i);
|
|
}
|