mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Fix bug in parser, on incomplete blocks. This bug was handled correctly by the error handler, so it was non-critical.
darcs-hash:20070422094847-ac50b-f8aff4c2939725e256b2f6d020f98240d2658d50.gz
This commit is contained in:
parent
8ab1d0254c
commit
e9790db64a
1 changed files with 58 additions and 55 deletions
103
parser.c
103
parser.c
|
@ -2161,72 +2161,75 @@ static int parse_job( process_t *p,
|
|||
BLOCK_END_ERR_MSG );
|
||||
|
||||
}
|
||||
|
||||
if( !make_sub_block )
|
||||
else
|
||||
{
|
||||
int done=0;
|
||||
|
||||
for( tok_init( &subtok, end, 0 );
|
||||
!done && tok_has_next( &subtok );
|
||||
tok_next( &subtok ) )
|
||||
if( !make_sub_block )
|
||||
{
|
||||
int done=0;
|
||||
|
||||
switch( tok_last_type( &subtok ) )
|
||||
for( tok_init( &subtok, end, 0 );
|
||||
!done && tok_has_next( &subtok );
|
||||
tok_next( &subtok ) )
|
||||
{
|
||||
case TOK_END:
|
||||
done = 1;
|
||||
break;
|
||||
|
||||
case TOK_REDIRECT_OUT:
|
||||
case TOK_REDIRECT_APPEND:
|
||||
case TOK_REDIRECT_IN:
|
||||
case TOK_REDIRECT_FD:
|
||||
case TOK_PIPE:
|
||||
switch( tok_last_type( &subtok ) )
|
||||
{
|
||||
done = 1;
|
||||
make_sub_block = 1;
|
||||
break;
|
||||
}
|
||||
case TOK_END:
|
||||
done = 1;
|
||||
break;
|
||||
|
||||
case TOK_STRING:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case TOK_REDIRECT_OUT:
|
||||
case TOK_REDIRECT_APPEND:
|
||||
case TOK_REDIRECT_IN:
|
||||
case TOK_REDIRECT_FD:
|
||||
case TOK_PIPE:
|
||||
{
|
||||
done = 1;
|
||||
make_sub_block = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
done = 1;
|
||||
error( SYNTAX_ERROR,
|
||||
current_tokenizer_pos,
|
||||
BLOCK_END_ERR_MSG );
|
||||
case TOK_STRING:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
done = 1;
|
||||
error( SYNTAX_ERROR,
|
||||
current_tokenizer_pos,
|
||||
BLOCK_END_ERR_MSG );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tok_destroy( &subtok );
|
||||
}
|
||||
|
||||
tok_destroy( &subtok );
|
||||
}
|
||||
|
||||
if( make_sub_block )
|
||||
{
|
||||
|
||||
int end_pos = end-tok_string( tok );
|
||||
wchar_t *sub_block= halloc_wcsndup( j,
|
||||
tok_string( tok ) + current_tokenizer_pos,
|
||||
end_pos - current_tokenizer_pos);
|
||||
|
||||
p->type = INTERNAL_BLOCK;
|
||||
al_set( args, 0, sub_block );
|
||||
|
||||
tok_set_pos( tok,
|
||||
end_pos );
|
||||
|
||||
while( prev_block != current_block )
|
||||
if( make_sub_block )
|
||||
{
|
||||
parser_pop_block();
|
||||
}
|
||||
|
||||
int end_pos = end-tok_string( tok );
|
||||
wchar_t *sub_block= halloc_wcsndup( j,
|
||||
tok_string( tok ) + current_tokenizer_pos,
|
||||
end_pos - current_tokenizer_pos);
|
||||
|
||||
p->type = INTERNAL_BLOCK;
|
||||
al_set( args, 0, sub_block );
|
||||
|
||||
tok_set_pos( tok,
|
||||
end_pos );
|
||||
|
||||
while( prev_block != current_block )
|
||||
{
|
||||
parser_pop_block();
|
||||
}
|
||||
|
||||
}
|
||||
else tok_next( tok );
|
||||
}
|
||||
else tok_next( tok );
|
||||
|
||||
}
|
||||
else tok_next( tok );
|
||||
|
|
Loading…
Reference in a new issue