From 432a7d77291eae9c1fa5544db0c4d1a9ab55e875 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Mon, 21 May 2018 10:19:40 +0200 Subject: [PATCH] justification: find the beginning of a paragraph in a better way Any line whose indentation differs from that of a pair of adjacent lines is the beginning of a paragraph, also when its indentation is smaller. This fulfills https://savannah.gnu.org/bugs/?53932, and fixes point 2) of https://savannah.gnu.org/bugs/?53933. --- src/text.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/text.c b/src/text.c index 1002d597..5277701d 100644 --- a/src/text.c +++ b/src/text.c @@ -1990,49 +1990,44 @@ bool quotes_match(const char *a_line, size_t a_quote, const char *b_line) bool indents_match(const char *a_line, size_t a_indent, const char *b_line, size_t b_indent) { - return (b_indent <= a_indent && strncmp(a_line, b_line, b_indent) == 0); + return (a_indent == b_indent && strncmp(a_line, b_line, b_indent) == 0); } -/* Return TRUE when the given line is the beginning of a paragraph. - * - * A line consists of a "quote part", followed by an "indentation part", - * followed by a "text part". Each of these parts can be empty. A line - * is part of a paragraph if it has a non-empty text part. - * - * A line is "the beginning of a paragraph" if it has a text part AND - * 1) it is the top line of the file, or - * 2) the line above it is not part of a paragraph, or - * 3) the line above it has a different quote part, or - * 4) the indentation of this line is not an initial substring of - * the indentation of the previous line. */ +/* Return TRUE when the given line is the beginning of a paragraph (BOP). */ bool begpar(const filestruct *const line) { size_t quote_len, indent_len, temp_id_len; - /* Case 1). */ + /* If this is the very first line of the buffer, it counts as a BOP + * even when it contains no text. */ if (line == openfile->fileage) return TRUE; quote_len = quote_length(line->data); indent_len = indent_length(line->data + quote_len); - /* Not part of a paragraph. */ + /* If this line contains no text, it is not a BOP. */ if (line->data[quote_len + indent_len] == '\0') return FALSE; - /* Case 3). */ + /* If the quote part of the preceding line differs, this is a BOP. */ if (!quotes_match(line->data, quote_len, line->prev->data)) return TRUE; temp_id_len = indent_length(line->prev->data + quote_len); - /* Case 2) or 4). */ - if (line->prev->data[quote_len + temp_id_len] == '\0' || - !indents_match(line->prev->data + quote_len, temp_id_len, - line->data + quote_len, indent_len)) + /* If the preceding line contains no text, this is a BOP. */ + if (line->prev->data[quote_len + temp_id_len] == '\0') return TRUE; - return FALSE; + /* If the indentation of the preceding line equals the indentation + * of this line, this is not a BOP. */ + if (indents_match(line->prev->data + quote_len, temp_id_len, + line->data + quote_len, indent_len)) + return FALSE; + + /* Otherwise, this is a BOP if the preceding line is not. */ + return !begpar(line->prev); } /* Return TRUE when the given line is part of a paragraph. */