Fix for longstanding bug where set -e would fail to erase elements from an array.

This was introduced in 7b3377e78c
This commit is contained in:
ridiculousfish 2012-05-10 01:04:18 -07:00
parent 7cae1ae415
commit 39863ce4d7
3 changed files with 22 additions and 16 deletions

View file

@ -275,23 +275,21 @@ static int update_values( wcstring_list_t &list,
/** /**
Erase from a list of wcstring values at specified indexes Erase from a list of wcstring values at specified indexes
*/ */
static void erase_values(wcstring_list_t &list, std::vector<long> &indexes) static void erase_values(wcstring_list_t &list, const std::vector<long> &indexes)
{ {
size_t i; // Make a set of indexes.
wcstring_list_t result; // This both sorts them into ascending order and removes duplicates.
for (i = 0; i < list.size(); i++) const std::set<long> indexes_set(indexes.begin(), indexes.end());
{
if (std::find(indexes.begin(), indexes.end(), i + 1) != indexes.end()) // Now walk the set backwards, so we encounter larger indexes first, and remove elements at the given (1-based) indexes.
{ std::set<long>::const_reverse_iterator iter;
result.push_back( list[ i ] ); for (iter = indexes_set.rbegin(); iter != indexes_set.rend(); iter++) {
} long val = *iter;
} if (val > 0 && val <= list.size()) {
// One-based indexing!
// al_truncate(list,0); list.erase(list.begin() + val - 1);
list.clear(); }
copy(result.begin(),result.end(),back_inserter( list ) ); }
// al_destroy(&result);
} }

View file

@ -127,3 +127,10 @@ else
end end
set foo abc def
set -e foo[1]
if test $foo '=' def
echo Test 11 pass
else
echo Test 11 fail
end

View file

@ -8,3 +8,4 @@ Test 7 pass
Test 8 pass Test 8 pass
Test 9 pass Test 9 pass
Test 10 pass Test 10 pass
Test 11 pass