mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-14 05:53:59 +00:00
Minor code polish for the validation code
darcs-hash:20060526112525-ac50b-d15f974d7abc5ffdc61273c1642c1cb711bc23fd.gz
This commit is contained in:
parent
17171c3277
commit
051f557e8f
1 changed files with 43 additions and 35 deletions
76
parser.c
76
parser.c
|
@ -2542,6 +2542,25 @@ int eval( const wchar_t *cmd, io_data_t *io, int block_type )
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int parser_get_block_type( const wchar_t *cmd )
|
||||||
|
{
|
||||||
|
if( wcscmp( cmd, L"while") == 0 )
|
||||||
|
return WHILE;
|
||||||
|
else if( wcscmp( cmd, L"for") == 0 )
|
||||||
|
return FOR;
|
||||||
|
else if( wcscmp( cmd, L"switch") == 0 )
|
||||||
|
return SWITCH;
|
||||||
|
else if( wcscmp( cmd, L"if") == 0 )
|
||||||
|
return IF;
|
||||||
|
else if( wcscmp( cmd, L"function") == 0 )
|
||||||
|
return FUNCTION_DEF;
|
||||||
|
else if( wcscmp( cmd, L"begin") == 0 )
|
||||||
|
return BEGIN;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int parser_test_argument( const wchar_t *arg, int babble )
|
static int parser_test_argument( const wchar_t *arg, int babble )
|
||||||
{
|
{
|
||||||
wchar_t *unesc;
|
wchar_t *unesc;
|
||||||
|
@ -2822,7 +2841,7 @@ int parser_test( const wchar_t * buff,
|
||||||
error( SYNTAX_ERROR,
|
error( SYNTAX_ERROR,
|
||||||
tok_get_pos( &tok ),
|
tok_get_pos( &tok ),
|
||||||
ILLEGAL_CMD_ERR_MSG,
|
ILLEGAL_CMD_ERR_MSG,
|
||||||
tok_last( &tok ) );
|
cmd );
|
||||||
|
|
||||||
print_errors();
|
print_errors();
|
||||||
}
|
}
|
||||||
|
@ -2830,6 +2849,11 @@ int parser_test( const wchar_t * buff,
|
||||||
|
|
||||||
if( needs_cmd )
|
if( needs_cmd )
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
end is not a valid command when a followup
|
||||||
|
command is needed, such as after 'and' or
|
||||||
|
'while'
|
||||||
|
*/
|
||||||
if( contains_str( cmd,
|
if( contains_str( cmd,
|
||||||
L"end",
|
L"end",
|
||||||
0 ) )
|
0 ) )
|
||||||
|
@ -2873,23 +2897,7 @@ int parser_test( const wchar_t * buff,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( wcscmp( tok_last(&tok), L"while") == 0 )
|
block_type[count] = parser_get_block_type( cmd );
|
||||||
block_type[count] = WHILE;
|
|
||||||
else if( wcscmp( tok_last(&tok), L"for") == 0 )
|
|
||||||
block_type[count] = FOR;
|
|
||||||
else if( wcscmp( tok_last(&tok), L"switch") == 0 )
|
|
||||||
block_type[count] = SWITCH;
|
|
||||||
else if( wcscmp( tok_last(&tok), L"if") == 0 )
|
|
||||||
block_type[count] = IF;
|
|
||||||
else if( wcscmp( tok_last(&tok), L"function") == 0 )
|
|
||||||
block_type[count] = FUNCTION_DEF;
|
|
||||||
else if( wcscmp( tok_last(&tok), L"begin") == 0 )
|
|
||||||
block_type[count] = BEGIN;
|
|
||||||
else
|
|
||||||
block_type[count] = -1;
|
|
||||||
|
|
||||||
// debug( 2, L"add block of type %d after cmd %ls\n", block_type[count], tok_last(&tok) );
|
|
||||||
|
|
||||||
block_pos[count] = current_tokenizer_pos;
|
block_pos[count] = current_tokenizer_pos;
|
||||||
tok_next( &tok );
|
tok_next( &tok );
|
||||||
count++;
|
count++;
|
||||||
|
@ -2903,17 +2911,20 @@ int parser_test( const wchar_t * buff,
|
||||||
argument. If parser_skip_arguments is true, the
|
argument. If parser_skip_arguments is true, the
|
||||||
second argument is optional.
|
second argument is optional.
|
||||||
*/
|
*/
|
||||||
if( parser_is_subcommand( tok_last( &tok ) ) && !parser_skip_arguments(tok_last( &tok ) ) )
|
if( parser_is_subcommand( cmd ) && !parser_skip_arguments(cmd ) )
|
||||||
{
|
{
|
||||||
needs_cmd = 1;
|
needs_cmd = 1;
|
||||||
had_cmd = 0;
|
had_cmd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( contains_str( tok_last( &tok ),
|
if( contains_str( cmd,
|
||||||
L"or",
|
L"or",
|
||||||
L"and",
|
L"and",
|
||||||
0 ) )
|
0 ) )
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
'or' and 'and' can not be used inside pipelines
|
||||||
|
*/
|
||||||
if( is_pipeline )
|
if( is_pipeline )
|
||||||
{
|
{
|
||||||
err=1;
|
err=1;
|
||||||
|
@ -2934,7 +2945,7 @@ int parser_test( const wchar_t * buff,
|
||||||
are forbidden, including when using the exec
|
are forbidden, including when using the exec
|
||||||
builtin.
|
builtin.
|
||||||
*/
|
*/
|
||||||
if( parser_is_pipe_forbidden( tok_last( &tok ) ) )
|
if( parser_is_pipe_forbidden( cmd ) )
|
||||||
{
|
{
|
||||||
if( is_pipeline )
|
if( is_pipeline )
|
||||||
{
|
{
|
||||||
|
@ -2953,17 +2964,14 @@ int parser_test( const wchar_t * buff,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test that the case builtin is only used in a switch block
|
Test that the case builtin is only used directly in a switch block
|
||||||
*/
|
*/
|
||||||
if( wcscmp( L"case", tok_last( &tok ) )==0 )
|
if( wcscmp( L"case", cmd )==0 )
|
||||||
{
|
{
|
||||||
if( !count || block_type[count-1]!=SWITCH )
|
if( !count || block_type[count-1]!=SWITCH )
|
||||||
{
|
{
|
||||||
err=1;
|
err=1;
|
||||||
|
|
||||||
// debug( 2, L"Error on block type %d\n", block_type[count-1] );
|
|
||||||
|
|
||||||
|
|
||||||
if( babble )
|
if( babble )
|
||||||
{
|
{
|
||||||
error( SYNTAX_ERROR,
|
error( SYNTAX_ERROR,
|
||||||
|
@ -2976,10 +2984,9 @@ int parser_test( const wchar_t * buff,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test that break and continue are only used in loop blocks
|
Test that break and continue are only used within loop blocks
|
||||||
*/
|
*/
|
||||||
if( wcscmp( L"break", tok_last( &tok ) )==0 ||
|
if( contains_str( cmd, L"break", L"continue", (void *)0 ) )
|
||||||
wcscmp( L"continue", tok_last( &tok ) )==0)
|
|
||||||
{
|
{
|
||||||
int found_loop=0;
|
int found_loop=0;
|
||||||
int i;
|
int i;
|
||||||
|
@ -3008,9 +3015,9 @@ int parser_test( const wchar_t * buff,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test that else is only used in an if-block
|
Test that else is only used directly in an if-block
|
||||||
*/
|
*/
|
||||||
if( wcscmp( L"else", tok_last( &tok ) )==0 )
|
if( wcscmp( L"else", cmd )==0 )
|
||||||
{
|
{
|
||||||
if( !count || block_type[count-1]!=IF )
|
if( !count || block_type[count-1]!=IF )
|
||||||
{
|
{
|
||||||
|
@ -3028,7 +3035,7 @@ int parser_test( const wchar_t * buff,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test that end is not used when not inside a blovk
|
Test that end is not used when not inside any block
|
||||||
*/
|
*/
|
||||||
if( count < 0 )
|
if( count < 0 )
|
||||||
{
|
{
|
||||||
|
@ -3046,6 +3053,9 @@ int parser_test( const wchar_t * buff,
|
||||||
{
|
{
|
||||||
err |= parser_test_argument( tok_last( &tok ), babble );
|
err |= parser_test_argument( tok_last( &tok ), babble );
|
||||||
|
|
||||||
|
/*
|
||||||
|
If possible, keep track of number of supplied arguments
|
||||||
|
*/
|
||||||
if( arg_count >= 0 && expand_is_clean( tok_last( &tok ) ) )
|
if( arg_count >= 0 && expand_is_clean( tok_last( &tok ) ) )
|
||||||
{
|
{
|
||||||
arg_count++;
|
arg_count++;
|
||||||
|
@ -3078,8 +3088,6 @@ int parser_test( const wchar_t * buff,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue