diff --git a/src/move.c b/src/move.c index 5075d6cb..3aad48a5 100644 --- a/src/move.c +++ b/src/move.c @@ -172,39 +172,41 @@ void do_page_down(void) #ifdef ENABLE_JUSTIFY /* Move to the beginning of the first-found beginning-of-paragraph line * before the current line. */ -void do_para_begin(void) +void do_para_begin(filestruct **line) { - if (openfile->current != openfile->fileage) - openfile->current = openfile->current->prev; + if ((*line)->prev != NULL) + *line = (*line)->prev; - while (!begpar(openfile->current, 0)) - openfile->current = openfile->current->prev; - - openfile->current_x = 0; + while (!begpar(*line, 0)) + *line = (*line)->prev; } /* Move down to the beginning of the last line of the current paragraph. * Then move down one line farther if there is such a line, or to the - * end of the current line if not. A line is the last line of a paragraph - * if it is in a paragraph, and the next line either is the beginning line - * of a paragraph or isn't in a paragraph. */ -void do_para_end(void) + * end of the current line if not. + * A line is the last line of a paragraph if it is + * in a paragraph, and the next line either is the beginning line of a + * paragraph or isn't in a paragraph. Return whether the last line of + * the paragraph is part of the paragraph (instead of the line following + * the paragraph). */ +bool do_para_end(filestruct **line) { - while (openfile->current != openfile->filebot && - !inpar(openfile->current)) - openfile->current = openfile->current->next; + while ((*line)->next != NULL && + !inpar(*line)) + *line = (*line)->next; - while (openfile->current != openfile->filebot && - inpar(openfile->current->next) && - !begpar(openfile->current->next, 0)) { - openfile->current = openfile->current->next; + while ((*line)->next != NULL && + inpar((*line)->next) && + !begpar((*line)->next, 0)) { + *line = (*line)->next; } - if (openfile->current != openfile->filebot) { - openfile->current = openfile->current->next; - openfile->current_x = 0; - } else - openfile->current_x = strlen(openfile->current->data); + if ((*line)->next != NULL) { + *line = (*line)->next; + return FALSE; + } + + return TRUE; } /* Move up to first start of a paragraph before the current line. */ @@ -212,7 +214,8 @@ void do_para_begin_void(void) { filestruct *was_current = openfile->current; - do_para_begin(); + do_para_begin(&openfile->current); + openfile->current_x = 0; edit_redraw(was_current, CENTERING); } @@ -222,7 +225,10 @@ void do_para_end_void(void) { filestruct *was_current = openfile->current; - do_para_end(); + if (do_para_end(&openfile->current)) + openfile->current_x = strlen(openfile->current->data); + else + openfile->current_x = 0; edit_redraw(was_current, CENTERING); } diff --git a/src/proto.h b/src/proto.h index b6c50e58..d5249c5b 100644 --- a/src/proto.h +++ b/src/proto.h @@ -363,8 +363,8 @@ void to_last_line(void); void do_page_up(void); void do_page_down(void); #ifdef ENABLE_JUSTIFY -void do_para_begin(void); -void do_para_end(void); +void do_para_begin(filestruct **line); +bool do_para_end(filestruct **line); void do_para_begin_void(void); void do_para_end_void(void); #endif diff --git a/src/text.c b/src/text.c index 93b2e00a..442efe95 100644 --- a/src/text.c +++ b/src/text.c @@ -2131,7 +2131,8 @@ bool find_paragraph(size_t *const quote, size_t *const par) /* If the current line isn't in a paragraph, move forward to the * last line of the next paragraph, if any. */ if (!inpar(openfile->current)) { - do_para_end(); + if (do_para_end(&openfile->current)) + openfile->current_x = strlen(openfile->filebot->data); /* If we end up past the beginning of the line, it means that * we're at the end of the last line of the file, and the line @@ -2153,14 +2154,15 @@ bool find_paragraph(size_t *const quote, size_t *const par) /* If the current line is in a paragraph and isn't its first line, move * back to the first line of the paragraph. */ if (inpar(openfile->current) && !begpar(openfile->current, 0)) - do_para_begin(); + do_para_begin(&openfile->current); /* Now current is the first line of the paragraph. Set quote_len to * the quotation length of that line, and set par_len to the number * of lines in this paragraph. */ quote_len = quote_length(openfile->current->data); current_save = openfile->current; - do_para_end(); + if (do_para_end(&openfile->current)) + openfile->current_x = strlen(openfile->filebot->data); par_len = openfile->current->lineno - current_save->lineno; /* If we end up past the beginning of the line, it means that we're at