justify: distinguish between tabs and spaces when comparing indentation

That is: two consecutive lines are considered to belong to separate
paragraphs when the smallest indentation of those two lines is not
character-by-character identical with the corresponding piece of
indentation of the other line.

In other words: if one line is indented with spaces, and a consecutive
line is indented by the same distance but with tabs, they are taken to
belong to different paragraphs: a justification will not merge them.

This fixes https://savannah.gnu.org/bugs/?57404.

Bug existed since version 2.9.8, commit 432a7d77.
master
Benno Schulenberg 2019-12-13 13:55:24 +01:00
parent 9631e858f2
commit 594ef2225f
1 changed files with 10 additions and 2 deletions

View File

@ -1751,10 +1751,18 @@ bool begpar(const linestruct *const line, int depth)
if (line->prev->data[quote_len + prev_dent_len] == '\0') if (line->prev->data[quote_len + prev_dent_len] == '\0')
return TRUE; return TRUE;
/* If the indentation of the preceding line differs characterwise
* from the indentation of this line, this IS a BOP. */
if (prev_dent_len > 0 && indent_len > 0) {
size_t lowest = (prev_dent_len < indent_len ? prev_dent_len : indent_len);
if (strncmp(line->prev->data + quote_len, line->data + quote_len, lowest) != 0)
return TRUE;
}
/* If the indentation of the preceding line equals the indentation /* If the indentation of the preceding line equals the indentation
* of this line, this is not a BOP. */ * of this line, this is not a BOP. */
if (prev_dent_len == indent_len && strncmp(line->prev->data + quote_len, if (prev_dent_len == indent_len)
line->data + quote_len, indent_len) == 0)
return FALSE; return FALSE;
/* Otherwise, this is a BOP if the preceding line is not. */ /* Otherwise, this is a BOP if the preceding line is not. */