windgoto(msg_row, msg_col);
pend = (char_u *)(line_ga.ga_data) + line_ga.ga_len;
- /* we are done when a NL is entered, but not when it comes after a
- * backslash */
- if (line_ga.ga_len > 0 && pend[-1] == '\n'
- && (line_ga.ga_len <= 1 || pend[-2] != '\\'))
+ /* We are done when a NL is entered, but not when it comes after an
+ * odd number of backslashes, that results in a NUL. */
+ if (line_ga.ga_len > 0 && pend[-1] == '\n')
{
- --line_ga.ga_len;
- --pend;
- *pend = NUL;
- break;
+ int bcount = 0;
+
+ while (line_ga.ga_len - 2 >= bcount && pend[-2 - bcount] == '\\')
+ ++bcount;
+
+ if (bcount > 0)
+ {
+ /* Halve the number of backslashes: "\NL" -> "NUL", "\\NL" ->
+ * "\NL", etc. */
+ line_ga.ga_len -= (bcount + 1) / 2;
+ pend -= (bcount + 1) / 2;
+ pend[-1] = '\n';
+ }
+
+ if ((bcount & 1) == 0)
+ {
+ --line_ga.ga_len;
+ --pend;
+ *pend = NUL;
+ break;
+ }
}
}