Add index ranges

Builtin 'set' now can set variable index ranges:
  set test[1..3] a b c #works
  set test[-1..-3] a b c #works if variable have enough elements
  set test[2..-2]  a b c #works
  set test[1..3 -1..-2] a b c b b #works

Expand now can parse index ranges. But not handle for now.

TODO:
  * Add variable substitution index ranges: echo $PATH[-1..1]
  * Add command substitution index range: echo (seq 10)[-1..-4]
  * Add process substitution indexes and ranges: echo %vim[-1]
This commit is contained in:
maxfl 2012-07-07 10:57:28 +08:00
parent b23d65b014
commit 0a5e7be129
2 changed files with 44 additions and 5 deletions

View file

@ -236,11 +236,33 @@ static int parse_index( std::vector<long> &indexes,
l_ind = var_count+l_ind+1; l_ind = var_count+l_ind+1;
} }
indexes.push_back( l_ind );
src = end; src = end;
count++; if ( *src==L'.' && *(src+1)==L'.' ){
while (iswspace(*src)) src++; src+=2;
} long l_ind2 = wcstol( src, &end, 10 );
if( end==src || errno )
{
return 1;
}
src = end;
if( l_ind2 < 0 )
{
l_ind2 = var_count+l_ind2+1;
}
int direction = l_ind2<l_ind ? -1 : 1 ;
for (long jjj = l_ind; jjj*direction <= l_ind2*direction; jjj+=direction) {
// debug(0, L"Expand range [set]: %i\n", jjj);
indexes.push_back( jjj );
count++;
}
}
else {
indexes.push_back( l_ind );
count++;
}
while (iswspace(*src)) src++;
}
return count; return count;
} }

View file

@ -759,8 +759,25 @@ static int parse_slice( const wchar_t *in, wchar_t **end_ptr, std::vector<long>
} }
// debug( 0, L"Push idx %d", tmp ); // debug( 0, L"Push idx %d", tmp );
idx.push_back(tmp);
pos = end-in; pos = end-in;
if ( in[pos]==L'.' && in[pos+1]==L'.' ){
pos+=2;
long tmp1 = wcstol( &in[pos], &end, 10 );
if( ( errno ) || ( end == &in[pos] ) )
{
return 1;
}
pos = end-in;
debug( 0, L"Push range idx %d %d", tmp, tmp1 );
idx.push_back(tmp);
// idx.push_back(tmp2);
continue;
}
debug( 0, L"Push idx %d", tmp );
idx.push_back(tmp);
// idx.push_back(tmp2);
} }
if( end_ptr ) if( end_ptr )