mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 04:43:10 +00:00
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:
parent
7cae1ae415
commit
39863ce4d7
3 changed files with 22 additions and 16 deletions
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue