diff options
author | 2006-08-31 10:45:25 +1000 | |
---|---|---|
committer | 2006-08-31 10:45:25 +1000 | |
commit | b1439075c6c6691d7b595f949391e5f4d5947ad7 (patch) | |
tree | f4743f6617e229e6bde27bae4fd9abe250ede5ab | |
parent | 7df536023b264be8bc88251656eb5dc4d789a9f6 (diff) |
Updated definiton of move_word, more intuitive behaviour when a token consists only of non-alphanumerics
darcs-hash:20060831004525-ac50b-aa6675809f0f17fa266982374700a8a4ce6b2f5a.gz
-rw-r--r-- | reader.c | 83 |
1 files changed, 51 insertions, 32 deletions
@@ -1984,11 +1984,25 @@ static void handle_token_history( int forward, int reset ) static void move_word( int dir, int erase ) { int end_buff_pos=data->buff_pos; - int mode=0; int step = dir?1:-1; - while( mode < 2 ) + /* + If we are beyond the last character and moving left, start by + moving one step, since otehrwise we'll start on the \0, which + should be ignored. + */ + if( !dir && (end_buff_pos == data->buff_len) ) + { + if( !end_buff_pos ) + return; + + end_buff_pos--; + } + + while( 1 ) { + wchar_t c; + if( !dir ) { if( end_buff_pos == 0 ) @@ -1999,41 +2013,46 @@ static void move_word( int dir, int erase ) if( end_buff_pos == data->buff_len ) break; } - end_buff_pos+=step; - if( end_buff_pos < data->buff_len ) - { - switch( mode ) - { - case 0: - if( iswalnum(data->buff[end_buff_pos] ) ) - mode++; - break; + c = data->buff[end_buff_pos]; - case 1: - if( !iswalnum(data->buff[end_buff_pos] ) ) - { - if( !dir ) - end_buff_pos -= step; - mode++; - } - break; -/* - case 2: - if( !iswspace(data->buff[end_buff_pos] ) ) - { - mode++; - if( !dir ) - end_buff_pos-=step; - } - break; -*/ - } + if( !iswspace( c ) ) + { + break; + } + + end_buff_pos+=step; + } + + while( 1 ) + { + wchar_t c; + + if( !dir ) + { + if( end_buff_pos == 0 ) + break; + } + else + { + if( end_buff_pos == data->buff_len ) + break; } - if( mode==2) - break; + c = data->buff[end_buff_pos]; + if( !iswalnum( c ) ) + { + /* + Don't gobble the boundary character if it was a + whitespace, but do for all other non-alphabetic + characters + */ + if( iswspace( c ) ) + end_buff_pos -= step; + break; + } + end_buff_pos+=step; } if( erase ) |