aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2006-08-31 10:45:25 +1000
committerGravatar axel <axel@liljencrantz.se>2006-08-31 10:45:25 +1000
commitb1439075c6c6691d7b595f949391e5f4d5947ad7 (patch)
treef4743f6617e229e6bde27bae4fd9abe250ede5ab
parent7df536023b264be8bc88251656eb5dc4d789a9f6 (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.c83
1 files changed, 51 insertions, 32 deletions
diff --git a/reader.c b/reader.c
index 5ba2d6a6..5d44bf1b 100644
--- a/reader.c
+++ b/reader.c
@@ -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 )