tweaks: reshuffle some code to avoid several checks for having justified
Move some fragments out of the justifying loop, and adjust/clarify comments to account for the changes. This will allow some of the code to be cleaned up and simplified in the next commits.master
parent
c8852aa5e2
commit
22c8ef6c39
81
src/text.c
81
src/text.c
|
@ -2185,6 +2185,10 @@ bool find_paragraph(size_t *const quote, size_t *const par)
|
||||||
* full_justify is TRUE. */
|
* full_justify is TRUE. */
|
||||||
void do_justify(bool full_justify)
|
void do_justify(bool full_justify)
|
||||||
{
|
{
|
||||||
|
size_t quote_len;
|
||||||
|
/* Length of the quote part of the current paragraph. */
|
||||||
|
size_t par_len;
|
||||||
|
/* Number of lines in the current paragraph. */
|
||||||
filestruct *first_par_line = NULL;
|
filestruct *first_par_line = NULL;
|
||||||
/* Will be the first line of the justified paragraph(s), if any.
|
/* Will be the first line of the justified paragraph(s), if any.
|
||||||
* For restoring after unjustify. */
|
* For restoring after unjustify. */
|
||||||
|
@ -2218,63 +2222,44 @@ void do_justify(bool full_justify)
|
||||||
if (full_justify)
|
if (full_justify)
|
||||||
openfile->current = openfile->fileage;
|
openfile->current = openfile->fileage;
|
||||||
|
|
||||||
|
/* Find the first line of the paragraph(s) to be justified.
|
||||||
|
* If the search failed, it means that there are no paragraph(s) to
|
||||||
|
* justify, so refresh the screen and get out. */
|
||||||
|
if (!find_paragraph("e_len, &par_len)) {
|
||||||
|
refresh_needed = TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move the original paragraph(s)
|
||||||
|
* to the justify buffer, splice a copy of the original
|
||||||
|
* paragraph(s) into the file in the same place, and set
|
||||||
|
* first_par_line to the first line of the copy. */
|
||||||
|
{
|
||||||
|
backup_lines(openfile->current, full_justify ?
|
||||||
|
openfile->filebot->lineno - openfile->current->lineno +
|
||||||
|
((openfile->filebot->data[0] != '\0') ? 1 : 0) : par_len);
|
||||||
|
first_par_line = openfile->current;
|
||||||
|
}
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
filestruct *firstline;
|
filestruct *firstline;
|
||||||
/* The first line of the current paragraph. */
|
/* The first line of the current paragraph. */
|
||||||
filestruct *sampleline;
|
filestruct *sampleline;
|
||||||
/* The line from which the indentation is copied -- either
|
/* The line from which the indentation is copied -- either
|
||||||
* the first and only or the second line of the paragraph. */
|
* the first and only or the second line of the paragraph. */
|
||||||
size_t quote_len;
|
|
||||||
/* Length of the quote part of the current paragraph. */
|
|
||||||
size_t lead_len;
|
size_t lead_len;
|
||||||
/* Length of the quote part plus the indentation part. */
|
/* Length of the quote part plus the indentation part. */
|
||||||
size_t par_len;
|
|
||||||
/* Number of lines in the current paragraph. */
|
|
||||||
ssize_t break_pos;
|
ssize_t break_pos;
|
||||||
/* Where we will break lines. */
|
/* Where we will break lines. */
|
||||||
char *lead_string;
|
char *lead_string;
|
||||||
/* The quote+indent stuff that is copied from the sample line. */
|
/* The quote+indent stuff that is copied from the sample line. */
|
||||||
|
|
||||||
/* Find the first line of the paragraph to be justified. That
|
|
||||||
* is the start of this paragraph if we're in one, or the start
|
|
||||||
* of the next otherwise. Save the quote length and paragraph
|
|
||||||
* length (number of lines). Don't refresh the screen yet,
|
|
||||||
* since we'll do that after we justify.
|
|
||||||
*
|
|
||||||
* If the search failed, we do one of two things. If we're
|
|
||||||
* justifying the whole file, and we've found at least one
|
|
||||||
* paragraph, it means that we should justify all the way to the
|
|
||||||
* last line of the file, so set the last line of the text to be
|
|
||||||
* justified to the last line of the file and break out of the
|
|
||||||
* loop. Otherwise, it means that there are no paragraph(s) to
|
|
||||||
* justify, so refresh the screen and get out. */
|
|
||||||
if (!find_paragraph("e_len, &par_len)) {
|
|
||||||
if (full_justify && first_par_line != NULL) {
|
|
||||||
last_par_line = openfile->filebot;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
refresh_needed = TRUE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* par_len will be one greater than the number of lines between
|
/* par_len will be one greater than the number of lines between
|
||||||
* current and filebot if filebot is the last line in the
|
* current and filebot if filebot is the last line in the
|
||||||
* paragraph. Set filebot_inpar to TRUE if this is the case. */
|
* paragraph. Set filebot_inpar to TRUE if this is the case. */
|
||||||
filebot_inpar = (openfile->current->lineno + par_len ==
|
filebot_inpar = (openfile->current->lineno + par_len ==
|
||||||
openfile->filebot->lineno + 1);
|
openfile->filebot->lineno + 1);
|
||||||
|
|
||||||
/* If we haven't already done it, move the original paragraph(s)
|
|
||||||
* to the justify buffer, splice a copy of the original
|
|
||||||
* paragraph(s) into the file in the same place, and set
|
|
||||||
* first_par_line to the first line of the copy. */
|
|
||||||
if (first_par_line == NULL) {
|
|
||||||
backup_lines(openfile->current, full_justify ?
|
|
||||||
openfile->filebot->lineno - openfile->current->lineno +
|
|
||||||
((openfile->filebot->data[0] != '\0') ? 1 : 0) : par_len);
|
|
||||||
first_par_line = openfile->current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remember the first line of the current paragraph. */
|
/* Remember the first line of the current paragraph. */
|
||||||
firstline = openfile->current;
|
firstline = openfile->current;
|
||||||
|
|
||||||
|
@ -2405,12 +2390,20 @@ void do_justify(bool full_justify)
|
||||||
* paragraphs in the file. */
|
* paragraphs in the file. */
|
||||||
if (!full_justify)
|
if (!full_justify)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* Find the next line of the paragraph(s) to be justified.
|
||||||
|
* If the search failed, it means that there are no paragraph(s) to
|
||||||
|
* justify, so break out of the loop. */
|
||||||
|
if (!find_paragraph("e_len, &par_len)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are now done justifying the paragraph or the file, so clean
|
/* We are now done justifying the paragraph(s), so clean
|
||||||
* up. totsize has been maintained above. If we actually justified
|
* up. totsize has been maintained above.
|
||||||
* something, set last_par_line to the new end of the paragraph. */
|
* Set last_par_line to the end of the paragraph(s) justified.
|
||||||
if (first_par_line != NULL)
|
* If we've justified the entire file and broken out of the loop,
|
||||||
|
* this should be the last line of the file. */
|
||||||
last_par_line = openfile->current;
|
last_par_line = openfile->current;
|
||||||
|
|
||||||
#ifndef NANO_TINY
|
#ifndef NANO_TINY
|
||||||
|
@ -2448,9 +2441,9 @@ void do_justify(bool full_justify)
|
||||||
|| func == do_undo
|
|| func == do_undo
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
/* If we actually justified something, then splice the preserved
|
/* Splice the preserved
|
||||||
* unjustified text back into the file, */
|
* unjustified text back into the file, */
|
||||||
if (first_par_line != NULL) {
|
{
|
||||||
filestruct *trash = NULL, *dummy = NULL;
|
filestruct *trash = NULL, *dummy = NULL;
|
||||||
|
|
||||||
/* Throw away the justified paragraph, and replace it with
|
/* Throw away the justified paragraph, and replace it with
|
||||||
|
|
Loading…
Reference in New Issue