From 7ef5c532633d1896115a7e7b98d7a5fb55385098 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg <bensberg@justemail.net> Date: Sun, 12 Feb 2017 22:34:31 +0100 Subject: [PATCH] painting: mark an unpaired start match as CWOULDBE The lines that come after an unpaired start have to know about this. This fixes https://savannah.gnu.org/bugs/?50293. --- src/color.c | 10 +++++++++- src/nano.h | 2 ++ src/winio.c | 8 ++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/color.c b/src/color.c index 97a9d040..5bff6806 100644 --- a/src/color.c +++ b/src/color.c @@ -423,6 +423,12 @@ void precalc_multicolorinfo(void) /* Assume nothing applies until proven otherwise below. */ line->multidata[ink->id] = CNONE; + /* For an unpaired start match, mark all remaining lines. */ + if (line->prev && line->prev->multidata[ink->id] == CWOULDBE) { + line->multidata[ink->id] = CWOULDBE; + continue; + } + /* When the line contains a start match, look for an end, and if * found, mark all the lines that are affected. */ while (regexec(ink->start, line->data + index, 1, @@ -456,8 +462,10 @@ void precalc_multicolorinfo(void) tailline = tailline->next; } - if (tailline == NULL) + if (tailline == NULL) { + line->multidata[ink->id] = CWOULDBE; break; + } /* We found it, we found it, la la la la la. Mark all * the lines in between and the end properly. */ diff --git a/src/nano.h b/src/nano.h index 91e4a054..964f96d4 100644 --- a/src/nano.h +++ b/src/nano.h @@ -288,6 +288,8 @@ typedef struct lintstruct { /* Whole line engulfed by the regex, start < me, end > me. */ #define CSTARTENDHERE (1<<5) /* Regex starts and ends within this line. */ +#define CWOULDBE (1<<6) + /* An unpaired start match on or before this line. */ #endif /* !DISABLE_COLOR */ /* More structure types. */ diff --git a/src/winio.c b/src/winio.c index e1e8f886..32e8985e 100644 --- a/src/winio.c +++ b/src/winio.c @@ -2506,8 +2506,10 @@ void edit_draw(filestruct *fileptr, const char *converted, end_line = end_line->next; /* If there is no end, there is nothing to paint. */ - if (end_line == NULL) + if (end_line == NULL) { + fileptr->multidata[varnish->id] = CWOULDBE; goto tail_of_loop; + } /* If the end is on a later line, paint whole line, and be done. */ if (end_line != fileptr) { @@ -2589,8 +2591,10 @@ void edit_draw(filestruct *fileptr, const char *converted, end_line = end_line->next; /* If there is no end, we're done with this regex. */ - if (end_line == NULL) + if (end_line == NULL) { + fileptr->multidata[varnish->id] = CWOULDBE; break; + } /* Paint the rest of the line. */ mvwaddnstr(edit, row, margin + start_col, thetext, -1); -- GitLab