commit bash-20100728 snapshot

This commit is contained in:
Chet Ramey
2011-12-12 22:03:58 -05:00
parent 9ec5ed6640
commit 5f8cde236a
79 changed files with 37373 additions and 3813 deletions
+25 -20
View File
@@ -864,9 +864,9 @@ array_variable_part (s, subp, lenp)
is non-null it gets 1 if the array reference is name[*], 2 if the
reference is name[@], and 0 otherwise. */
static char *
array_value_internal (s, quoted, allow_all, rtype, indp)
array_value_internal (s, quoted, flags, rtype, indp)
char *s;
int quoted, allow_all, *rtype;
int quoted, flags, *rtype;
arrayind_t *indp;
{
int len;
@@ -893,7 +893,7 @@ array_value_internal (s, quoted, allow_all, rtype, indp)
{
if (rtype)
*rtype = (t[0] == '*') ? 1 : 2;
if (allow_all == 0)
if ((flags & AV_ALLOWALL) == 0)
{
err_badarraysub (s);
return ((char *)NULL);
@@ -932,17 +932,22 @@ array_value_internal (s, quoted, allow_all, rtype, indp)
*rtype = 0;
if (var == 0 || array_p (var) || assoc_p (var) == 0)
{
ind = array_expand_index (t, len);
if (ind < 0)
if ((flags & AV_USEIND) == 0 || indp == 0)
{
/* negative subscripts to indexed arrays count back from end */
if (var && array_p (var))
ind = array_max_index (array_cell (var)) + 1 + ind;
ind = array_expand_index (t, len);
if (ind < 0)
INDEX_ERROR();
{
/* negative subscripts to indexed arrays count back from end */
if (var && array_p (var))
ind = array_max_index (array_cell (var)) + 1 + ind;
if (ind < 0)
INDEX_ERROR();
}
if (indp)
*indp = ind;
}
if (indp)
*indp = ind;
else if (indp)
ind = *indp;
}
else if (assoc_p (var))
{
@@ -972,25 +977,25 @@ array_value_internal (s, quoted, allow_all, rtype, indp)
/* Return a string containing the elements described by the array and
subscript contained in S, obeying quoting for subscripts * and @. */
char *
array_value (s, quoted, rtype, indp)
array_value (s, quoted, flags, rtype, indp)
char *s;
int quoted, *rtype;
int quoted, flags, *rtype;
arrayind_t *indp;
{
return (array_value_internal (s, quoted, 1, rtype, indp));
return (array_value_internal (s, quoted, flags|AV_ALLOWALL, rtype, indp));
}
/* Return the value of the array indexing expression S as a single string.
If ALLOW_ALL is 0, do not allow `@' and `*' subscripts. This is used
by other parts of the shell such as the arithmetic expression evaluator
in expr.c. */
If (FLAGS & AV_ALLOWALL) is 0, do not allow `@' and `*' subscripts. This
is used by other parts of the shell such as the arithmetic expression
evaluator in expr.c. */
char *
get_array_value (s, allow_all, rtype, indp)
get_array_value (s, flags, rtype, indp)
char *s;
int allow_all, *rtype;
int flags, *rtype;
arrayind_t *indp;
{
return (array_value_internal (s, 0, allow_all, rtype, indp));
return (array_value_internal (s, 0, flags, rtype, indp));
}
char *