From: David Lawrence Ramsey Date: Wed, 20 Jul 2005 21:31:19 +0000 (+0000) Subject: move do_(next|prev)_word(_void())? to move.c too X-Git-Tag: v1.3.9~142 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=c4037f305545878234077bf2171acf60cc3b3c04;p=nano.git move do_(next|prev)_word(_void())? to move.c too git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2904 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- diff --git a/ChangeLog b/ChangeLog index 5cf1cab1..f0a17448 100644 --- a/ChangeLog +++ b/ChangeLog @@ -97,13 +97,14 @@ CVS code - do_first_line(), do_last_line() - Simplify by only using edit_redraw(), and also make them call check_statusblank(). (DLR) - do_para_begin(), do_para_begin_void(), do_para_end(), - do_para_end_void() - - Move here from nano.c, as they're movement functions, and also - make them call check_statusblank(). do_page_up(), do_page_down() - If there's less than a page of text onscreen, just call do_(first|last)_line(). (DLR) + do_para_begin(), do_para_begin_void(), do_para_end(), + do_para_end_void(), do_next_word(), do_next_word_void(), + do_prev_word(), do_prev_word_void() + - Move here from nano.c, as they're movement functions, and also + make them call check_statusblank(). - nano.c: usage() - Properly mention the support for "[+LINE,COLUMN]" on the diff --git a/src/move.c b/src/move.c index d6c6ce32..bd83d431 100644 --- a/src/move.c +++ b/src/move.c @@ -206,6 +206,235 @@ void do_para_end_void(void) } #endif /* !DISABLE_JUSTIFY */ +#ifndef NANO_SMALL +/* Move to the next word in the current filestruct. If allow_punct is + * TRUE, treat punctuation as part of a word. If allow_update is TRUE, + * update the screen afterward. Return TRUE if we started on a word, + * and FALSE otherwise. */ +bool do_next_word(bool allow_punct, bool allow_update) +{ + size_t pww_save = openfile->placewewant; + const filestruct *current_save = openfile->current; + char *char_mb; + int char_mb_len; + bool end_line = FALSE, started_on_word = FALSE; + + assert(openfile->current != NULL && openfile->current->data != NULL); + + check_statusblank(); + + char_mb = charalloc(mb_cur_max()); + + /* Move forward until we find the character after the last letter of + * the current word. */ + while (!end_line) { + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); + + /* If we've found it, stop moving forward through the current + * line. */ + if (!is_word_mbchar(char_mb, allow_punct)) + break; + + /* If we haven't found it, then we've started on a word, so set + * started_on_word to TRUE. */ + started_on_word = TRUE; + + if (openfile->current->data[openfile->current_x] == '\0') + end_line = TRUE; + else + openfile->current_x += char_mb_len; + } + + /* Move forward until we find the first letter of the next word. */ + if (openfile->current->data[openfile->current_x] == '\0') + end_line = TRUE; + else + openfile->current_x += char_mb_len; + + for (; openfile->current != NULL; + openfile->current = openfile->current->next) { + while (!end_line) { + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); + + /* If we've found it, stop moving forward through the + * current line. */ + if (is_word_mbchar(char_mb, allow_punct)) + break; + + if (openfile->current->data[openfile->current_x] == '\0') + end_line = TRUE; + else + openfile->current_x += char_mb_len; + } + + /* If we've found it, stop moving forward to the beginnings of + * subsequent lines. */ + if (!end_line) + break; + + if (openfile->current->next != NULL) { + end_line = FALSE; + openfile->current_x = 0; + } + } + + free(char_mb); + + /* If we haven't found it, leave the cursor at the end of the + * file. */ + if (openfile->current == NULL) + openfile->current = openfile->filebot; + + openfile->placewewant = xplustabs(); + + /* If allow_update is TRUE, update the screen. */ + if (allow_update) + edit_redraw(current_save, pww_save); + + /* Return whether we started on a word. */ + return started_on_word; +} + +void do_next_word_void(void) +{ + do_next_word(FALSE, TRUE); +} + +/* Move to the previous word in the current filestruct. If allow_punct + * is TRUE, treat punctuation as part of a word. If allow_update is + * TRUE, update the screen afterward. Return TRUE if we started on a + * word, and FALSE otherwise. */ +bool do_prev_word(bool allow_punct, bool allow_update) +{ + size_t pww_save = openfile->placewewant; + const filestruct *current_save = openfile->current; + char *char_mb; + int char_mb_len; + bool begin_line = FALSE, started_on_word = FALSE; + + assert(openfile->current != NULL && openfile->current->data != NULL); + + check_statusblank(); + + char_mb = charalloc(mb_cur_max()); + + /* Move backward until we find the character before the first letter + * of the current word. */ + while (!begin_line) { + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); + + /* If we've found it, stop moving backward through the current + * line. */ + if (!is_word_mbchar(char_mb, allow_punct)) + break; + + /* If we haven't found it, then we've started on a word, so set + * started_on_word to TRUE. */ + started_on_word = TRUE; + + if (openfile->current_x == 0) + begin_line = TRUE; + else + openfile->current_x = move_mbleft(openfile->current->data, + openfile->current_x); + } + + /* Move backward until we find the last letter of the previous + * word. */ + if (openfile->current_x == 0) + begin_line = TRUE; + else + openfile->current_x = move_mbleft(openfile->current->data, + openfile->current_x); + + for (; openfile->current != NULL; + openfile->current = openfile->current->prev) { + while (!begin_line) { + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); + + /* If we've found it, stop moving backward through the + * current line. */ + if (is_word_mbchar(char_mb, allow_punct)) + break; + + if (openfile->current_x == 0) + begin_line = TRUE; + else + openfile->current_x = + move_mbleft(openfile->current->data, + openfile->current_x); + } + + /* If we've found it, stop moving backward to the ends of + * previous lines. */ + if (!begin_line) + break; + + if (openfile->current->prev != NULL) { + begin_line = FALSE; + openfile->current_x = strlen(openfile->current->prev->data); + } + } + + /* If we haven't found it, leave the cursor at the beginning of the + * file. */ + if (openfile->current == NULL) + openfile->current = openfile->fileage; + /* If we've found it, move backward until we find the character + * before the first letter of the previous word. */ + else if (!begin_line) { + if (openfile->current_x == 0) + begin_line = TRUE; + else + openfile->current_x = move_mbleft(openfile->current->data, + openfile->current_x); + + while (!begin_line) { + char_mb_len = + parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); + + /* If we've found it, stop moving backward through the + * current line. */ + if (!is_word_mbchar(char_mb, allow_punct)) + break; + + if (openfile->current_x == 0) + begin_line = TRUE; + else + openfile->current_x = + move_mbleft(openfile->current->data, + openfile->current_x); + } + + /* If we've found it, move forward to the first letter of the + * previous word. */ + if (!begin_line) + openfile->current_x += char_mb_len; + } + + free(char_mb); + + openfile->placewewant = xplustabs(); + + /* If allow_update is TRUE, update the screen. */ + if (allow_update) + edit_redraw(current_save, pww_save); + + /* Return whether we started on a word. */ + return started_on_word; +} + +void do_prev_word_void(void) +{ + do_prev_word(FALSE, TRUE); +} +#endif /* !NANO_SMALL */ + void do_home(void) { size_t pww_save = openfile->placewewant; diff --git a/src/nano.c b/src/nano.c index ec73e0ed..250ed8c2 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1536,233 +1536,6 @@ void do_enter(void) } #ifndef NANO_SMALL -/* Move to the next word in the current filestruct. If allow_punct is - * TRUE, treat punctuation as part of a word. If allow_update is TRUE, - * update the screen afterward. Return TRUE if we started on a word, - * and FALSE otherwise. */ -bool do_next_word(bool allow_punct, bool allow_update) -{ - size_t pww_save = openfile->placewewant; - const filestruct *current_save = openfile->current; - char *char_mb; - int char_mb_len; - bool end_line = FALSE, started_on_word = FALSE; - - assert(openfile->current != NULL && openfile->current->data != NULL); - - char_mb = charalloc(mb_cur_max()); - - /* Move forward until we find the character after the last letter of - * the current word. */ - while (!end_line) { - char_mb_len = parse_mbchar(openfile->current->data + - openfile->current_x, char_mb, NULL, NULL); - - /* If we've found it, stop moving forward through the current - * line. */ - if (!is_word_mbchar(char_mb, allow_punct)) - break; - - /* If we haven't found it, then we've started on a word, so set - * started_on_word to TRUE. */ - started_on_word = TRUE; - - if (openfile->current->data[openfile->current_x] == '\0') - end_line = TRUE; - else - openfile->current_x += char_mb_len; - } - - /* Move forward until we find the first letter of the next word. */ - if (openfile->current->data[openfile->current_x] == '\0') - end_line = TRUE; - else - openfile->current_x += char_mb_len; - - for (; openfile->current != NULL; - openfile->current = openfile->current->next) { - while (!end_line) { - char_mb_len = parse_mbchar(openfile->current->data + - openfile->current_x, char_mb, NULL, NULL); - - /* If we've found it, stop moving forward through the - * current line. */ - if (is_word_mbchar(char_mb, allow_punct)) - break; - - if (openfile->current->data[openfile->current_x] == '\0') - end_line = TRUE; - else - openfile->current_x += char_mb_len; - } - - /* If we've found it, stop moving forward to the beginnings of - * subsequent lines. */ - if (!end_line) - break; - - if (openfile->current->next != NULL) { - end_line = FALSE; - openfile->current_x = 0; - } - } - - free(char_mb); - - /* If we haven't found it, leave the cursor at the end of the - * file. */ - if (openfile->current == NULL) - openfile->current = openfile->filebot; - - openfile->placewewant = xplustabs(); - - /* If allow_update is TRUE, update the screen. */ - if (allow_update) - edit_redraw(current_save, pww_save); - - /* Return whether we started on a word. */ - return started_on_word; -} - -/* Move to the next word in the current filestruct, not counting - * punctuation as part of a word, and updating the screen afterward. */ -void do_next_word_void(void) -{ - do_next_word(FALSE, TRUE); -} - -/* Move to the previous word in the current filestruct. If allow_punct - * is TRUE, treat punctuation as part of a word. If allow_update is - * TRUE, update the screen afterward. Return TRUE if we started on a - * word, and FALSE otherwise. */ -bool do_prev_word(bool allow_punct, bool allow_update) -{ - size_t pww_save = openfile->placewewant; - const filestruct *current_save = openfile->current; - char *char_mb; - int char_mb_len; - bool begin_line = FALSE, started_on_word = FALSE; - - assert(openfile->current != NULL && openfile->current->data != NULL); - - char_mb = charalloc(mb_cur_max()); - - /* Move backward until we find the character before the first letter - * of the current word. */ - while (!begin_line) { - char_mb_len = parse_mbchar(openfile->current->data + - openfile->current_x, char_mb, NULL, NULL); - - /* If we've found it, stop moving backward through the current - * line. */ - if (!is_word_mbchar(char_mb, allow_punct)) - break; - - /* If we haven't found it, then we've started on a word, so set - * started_on_word to TRUE. */ - started_on_word = TRUE; - - if (openfile->current_x == 0) - begin_line = TRUE; - else - openfile->current_x = move_mbleft(openfile->current->data, - openfile->current_x); - } - - /* Move backward until we find the last letter of the previous - * word. */ - if (openfile->current_x == 0) - begin_line = TRUE; - else - openfile->current_x = move_mbleft(openfile->current->data, - openfile->current_x); - - for (; openfile->current != NULL; - openfile->current = openfile->current->prev) { - while (!begin_line) { - char_mb_len = parse_mbchar(openfile->current->data + - openfile->current_x, char_mb, NULL, NULL); - - /* If we've found it, stop moving backward through the - * current line. */ - if (is_word_mbchar(char_mb, allow_punct)) - break; - - if (openfile->current_x == 0) - begin_line = TRUE; - else - openfile->current_x = - move_mbleft(openfile->current->data, - openfile->current_x); - } - - /* If we've found it, stop moving backward to the ends of - * previous lines. */ - if (!begin_line) - break; - - if (openfile->current->prev != NULL) { - begin_line = FALSE; - openfile->current_x = strlen(openfile->current->prev->data); - } - } - - /* If we haven't found it, leave the cursor at the beginning of the - * file. */ - if (openfile->current == NULL) - openfile->current = openfile->fileage; - /* If we've found it, move backward until we find the character - * before the first letter of the previous word. */ - else if (!begin_line) { - if (openfile->current_x == 0) - begin_line = TRUE; - else - openfile->current_x = move_mbleft(openfile->current->data, - openfile->current_x); - - while (!begin_line) { - char_mb_len = - parse_mbchar(openfile->current->data + - openfile->current_x, char_mb, NULL, NULL); - - /* If we've found it, stop moving backward through the - * current line. */ - if (!is_word_mbchar(char_mb, allow_punct)) - break; - - if (openfile->current_x == 0) - begin_line = TRUE; - else - openfile->current_x = - move_mbleft(openfile->current->data, - openfile->current_x); - } - - /* If we've found it, move forward to the first letter of the - * previous word. */ - if (!begin_line) - openfile->current_x += char_mb_len; - } - - free(char_mb); - - openfile->placewewant = xplustabs(); - - /* If allow_update is TRUE, update the screen. */ - if (allow_update) - edit_redraw(current_save, pww_save); - - /* Return whether we started on a word. */ - return started_on_word; -} - -/* Move to the previous word in the current filestruct, not counting - * punctuation as part of a word, and updating the screen afterward. */ -void do_prev_word_void(void) -{ - do_prev_word(FALSE, TRUE); -} - void do_word_count(void) { size_t words = 0, current_x_save = openfile->current_x; diff --git a/src/proto.h b/src/proto.h index d8065d64..1adbdfde 100644 --- a/src/proto.h +++ b/src/proto.h @@ -329,6 +329,12 @@ void do_para_begin_void(void); void do_para_end(bool allow_update); void do_para_end_void(void); #endif +#ifndef NANO_SMALL +bool do_next_word(bool allow_punct, bool allow_update); +void do_next_word_void(void); +bool do_prev_word(bool allow_punct, bool allow_update); +void do_prev_word_void(void); +#endif void do_home(void); void do_end(void); void do_up(void); @@ -395,10 +401,6 @@ void do_delete(void); void do_tab(void); void do_enter(void); #ifndef NANO_SMALL -bool do_next_word(bool allow_punct, bool allow_update); -void do_next_word_void(void); -bool do_prev_word(bool allow_punct, bool allow_update); -void do_prev_word_void(void); void do_word_count(void); void do_mark(void); #endif