diff options
author | axel <axel@liljencrantz.se> | 2006-10-02 02:02:58 +1000 |
---|---|---|
committer | axel <axel@liljencrantz.se> | 2006-10-02 02:02:58 +1000 |
commit | 15724d079801df9183d0d86cadfbb7dec5b2821b (patch) | |
tree | f971d85d58390e28fd4e0429badcca584381709b /tokenizer.c | |
parent | 2839f5e567e21a15850c3adfa2cc3cd1d7372ea9 (diff) |
First stab at multiline editing
darcs-hash:20061001160258-ac50b-1a760913e64b96e30ff321d7fbe4069ca161cdfe.gz
Diffstat (limited to 'tokenizer.c')
-rw-r--r-- | tokenizer.c | 215 |
1 files changed, 112 insertions, 103 deletions
diff --git a/tokenizer.c b/tokenizer.c index 9be49c72..ae9e5bb8 100644 --- a/tokenizer.c +++ b/tokenizer.c @@ -234,132 +234,140 @@ static void read_string( tokenizer *tok ) { // debug(1, L"%lc", *tok->buff ); - if( *tok->buff == L'\\' ) - { - tok->buff++; - if( *tok->buff == L'\0' ) + if( *tok->buff == L'\\' ) { - tok_error( tok, EOL_ERROR ); - return; + tok->buff++; + if( *tok->buff == L'\0' ) + { + tok_error( tok, EOL_ERROR ); + return; + } + else if( *tok->buff == L'\n' && mode == 0) + { + tok->buff--; + do_loop = 0; + break; + } + + tok->buff++; + continue; } - tok->buff++; - continue; - } - - /* - The modes are as follows: - - 0: regular text - 1: inside of subshell - 2: inside of array brackets - 3: inside of array brackets and subshell, like in '$foo[(ech' - */ - switch( mode ) - { - case 0: + + + /* + The modes are as follows: + + 0: regular text + 1: inside of subshell + 2: inside of array brackets + 3: inside of array brackets and subshell, like in '$foo[(ech' + */ + switch( mode ) { - switch( *tok->buff ) + case 0: { - case L'(': - { - paran_count=1; - mode = 1; - break; - } - - case L'[': - { - if( tok->buff != start ) - mode=2; - break; - } - - case L'\'': - case L'"': + switch( *tok->buff ) { - - const wchar_t *end = quote_end( tok->buff ); - tok->last_quote = *tok->buff; - if( end ) + case L'(': { - tok->buff=(wchar_t *)end; + paran_count=1; + mode = 1; + break; } - else + + case L'[': { - tok->buff += wcslen( tok->buff ); - - if( (!tok->accept_unfinished) ) + if( tok->buff != start ) + mode=2; + break; + } + + case L'\'': + case L'"': + { + + const wchar_t *end = quote_end( tok->buff ); + tok->last_quote = *tok->buff; + if( end ) { - tok_error( tok, EOL_ERROR ); - return; + tok->buff=(wchar_t *)end; } - do_loop = 0; + else + { + tok->buff += wcslen( tok->buff ); + + if( (!tok->accept_unfinished) ) + { + tok_error( tok, EOL_ERROR ); + return; + } + do_loop = 0; + } + break; } - break; - } - default: - { - if( !is_string_char(*(tok->buff)) ) + default: { - do_loop=0; + if( !is_string_char(*(tok->buff)) ) + { + do_loop=0; + } } } + break; } - break; - } - case 3: - case 1: - switch( *tok->buff ) - { - case L'\'': - case L'\"': + case 3: + case 1: + switch( *tok->buff ) { - const wchar_t *end = quote_end( tok->buff ); - if( end ) + case L'\'': + case L'\"': { - tok->buff=(wchar_t *)end; + const wchar_t *end = quote_end( tok->buff ); + if( end ) + { + tok->buff=(wchar_t *)end; + } + else + do_loop = 0; + break; } - else + + case L'(': + paran_count++; + break; + case L')': + paran_count--; + if( paran_count == 0 ) + { + mode--; + } + break; + case L'\0': do_loop = 0; - break; + break; } + break; + case 2: + switch( *tok->buff ) + { + case L'(': + paran_count=1; + mode = 3; + break; - case L'(': - paran_count++; - break; - case L')': - paran_count--; - if( paran_count == 0 ) - { - mode--; - } - break; - case L'\0': - do_loop = 0; - break; - } - break; - case 2: - switch( *tok->buff ) - { - case L'(': - paran_count=1; - mode = 3; - break; - - case L']': - mode=0; - break; - - case L'\0': - do_loop = 0; - break; - } - break; - } + case L']': + mode=0; + break; + + case L'\0': + do_loop = 0; + break; + } + break; + } } @@ -531,6 +539,8 @@ void tok_next( tokenizer *tok ) if(( *(tok->buff) == L'\\') &&( *(tok->buff+1) == L'\n') ) { tok->buff+=2; + tok->last_type = TOK_END; + return; } break; } @@ -594,7 +604,6 @@ void tok_next( tokenizer *tok ) default: { - if( iswdigit( *tok->buff ) ) { wchar_t *orig = tok->buff; |