fix bug in do_justify() in a better way: add on_next_line flag, used to

indicate when we've moved to the next line after justifying the current
line, and only run the respacing routine when it's true; this keeps the
respacing routine from erroneously being run more than once on the same
line


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1840 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
David Lawrence Ramsey 2004-07-03 14:15:58 +00:00
parent 01a6bf4f9a
commit 4693864a78
2 changed files with 29 additions and 16 deletions

View File

@ -28,12 +28,11 @@ CVS code -
--disable-justify again. (DLR; found by Mike Frysinger)
- nano.c:
do_justify()
- If all the text from the next line has been moved to the
current line and the next line has been deleted, continue the
justification loop from there and skip the respacing routine
in order to avoid running it more than once on the same line
(since it assumes that we've moved to the next line, which
isn't true in that case). (DLR)
- Add on_next_line flag, used to indicate when we've moved to
the next line after justifying the current line, and only run
the respacing routine when it's true. This keeps the
respacing routine from erroneously being run more than once on
the same line. (DLR)
do_exit()
- Tweak for efficiency. (David Benbennick)
- proto.h:

View File

@ -2382,6 +2382,10 @@ void do_justify(int full_justify)
/* When the paragraph gets modified, all lines from the changed
* one down are stored in the cutbuffer. We back up the
* original to restore it later. */
int allow_respacing;
/* Whether we should change the spacing at the end of a line
* after justifying it. This should be TRUE whenever we move
* to the next line after justifying the current line. */
/* We save these global variables to be restored if the user
* unjustifies. Note we don't need to save totlines. */
@ -2440,6 +2444,11 @@ void do_justify(int full_justify)
int break_pos;
/* Where we will break the line. */
/* We'll be moving to the next line after justifying the
* current line in almost all cases, so allow changing the
* spacing at the ends of justified lines by default. */
allow_respacing = TRUE;
indent_len = quote_len + indent_length(current->data +
quote_len);
@ -2521,6 +2530,8 @@ void do_justify(int full_justify)
}
#endif
null_at(&current->data, break_pos);
/* Go to the next line. */
current = current->next;
} else if (display_len < fill && par_len > 1) {
size_t next_line_len;
@ -2570,9 +2581,11 @@ void do_justify(int full_justify)
totsize -= indent_len;
current_y--;
/* Don't go to the next line, since there isn't one
* anymore. Just continue the loop from here. */
continue;
/* Don't go to the next line. Accordingly, don't
* allow changing the spacing at the end of the
* previous justified line, since we've already done
* it once. */
allow_respacing = FALSE;
} else {
charmove(current->next->data + indent_len,
current->next->data + indent_len + break_pos + 1,
@ -2587,13 +2600,14 @@ void do_justify(int full_justify)
/* Go to the next line. */
current = current->next;
/* If we've gone to the next line, the line we were on
* before still exists, and it was not the last line of the
* paragraph, add a space to the end of it to replace the
* one removed or left out by justify_format(). If it was
* the last line of the paragraph, and justify_format() left
* a space on the end of it, remove the space. */
if (current->prev != NULL) {
/* We've moved to the next line after justifying the
* current line. If the justified line was not the last
* line of the paragraph, add a space to the end of it to
* replace the one removed or left out by justify_format().
* If it was the last line of the paragraph, and
* justify_format() left a space on the end of it, remove
* the space. */
if (allow_respacing) {
size_t prev_line_len = strlen(current->prev->data);
if (par_len > 1) {