diff options
author | axel <axel@liljencrantz.se> | 2007-04-22 19:48:47 +1000 |
---|---|---|
committer | axel <axel@liljencrantz.se> | 2007-04-22 19:48:47 +1000 |
commit | e9790db64a642bedb7c359c634e84980e523e627 (patch) | |
tree | a456161b14334e9cade57ab485718477d0c38112 /parser.c | |
parent | 8ab1d0254c1a4550ebcb77b027fcc76f00ca71e6 (diff) |
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
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 103 |
1 files changed, 53 insertions, 50 deletions
@@ -2161,73 +2161,76 @@ 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 ) { - - switch( tok_last_type( &subtok ) ) + int done=0; + + 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_REDIRECT_OUT: + case TOK_REDIRECT_APPEND: + case TOK_REDIRECT_IN: + case TOK_REDIRECT_FD: + case TOK_PIPE: + { + done = 1; + make_sub_block = 1; + break; + } - case TOK_STRING: - { - break; - } + case TOK_STRING: + { + break; + } - default: - { - done = 1; - error( SYNTAX_ERROR, - current_tokenizer_pos, - BLOCK_END_ERR_MSG ); + default: + { + done = 1; + error( SYNTAX_ERROR, + current_tokenizer_pos, + BLOCK_END_ERR_MSG ); + } } } - } - tok_destroy( &subtok ); - } + tok_destroy( &subtok ); + } - if( make_sub_block ) - { + 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); + 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 ); + p->type = INTERNAL_BLOCK; + al_set( args, 0, sub_block ); - tok_set_pos( tok, - end_pos ); + tok_set_pos( tok, + end_pos ); - while( prev_block != current_block ) - { - parser_pop_block(); - } + while( prev_block != current_block ) + { + parser_pop_block(); + } + } + else tok_next( tok ); } - else tok_next( tok ); - + } else tok_next( tok ); |