in edit_draw(), properly ignore zero-length regexes in multi-line
regexes as well as single-line ones; this avoids a segfault when trying to color e.g. "start="$" end="$"" git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3484 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
c7b9e15e9a
commit
a5f833de42
|
@ -198,6 +198,11 @@ CVS code -
|
|||
- Add Ctrl-/ as an alias for Ctrl-_. (DLR, found by Benno
|
||||
Schulenberg)
|
||||
- Simplify the if blocks wherever possible. (DLR)
|
||||
edit_draw()
|
||||
- Properly ignore zero-length regexes in multi-line regexes as
|
||||
well as single-line ones. This avoids a segfault when trying
|
||||
to color e.g. "start="$" end="$"". (DLR, found by Trevor
|
||||
Caira)
|
||||
- configure.ac:
|
||||
- Remove old warnings about color support. (DLR)
|
||||
- doc/faq.html:
|
||||
|
|
90
src/winio.c
90
src/winio.c
|
@ -2450,36 +2450,40 @@ void edit_draw(const filestruct *fileptr, const char *converted, int
|
|||
goto step_two;
|
||||
start_line = start_line->prev;
|
||||
}
|
||||
if (startmatch.rm_so == startmatch.rm_eo) {
|
||||
startmatch.rm_eo++;
|
||||
statusbar(_("Refusing zero-length regex match"));
|
||||
} else {
|
||||
/* No start found, so skip to the next step. */
|
||||
if (start_line == NULL)
|
||||
goto step_two;
|
||||
/* Now start_line is the first line before fileptr
|
||||
* containing a start match. Is there a start on this
|
||||
* line not followed by an end on this line? */
|
||||
* containing a start match. Is there a start on
|
||||
* this line not followed by an end on this line? */
|
||||
start_col = 0;
|
||||
while (TRUE) {
|
||||
start_col += startmatch.rm_so;
|
||||
startmatch.rm_eo -= startmatch.rm_so;
|
||||
if (regexec(tmpcolor->end, start_line->data +
|
||||
start_col + startmatch.rm_eo, 0, NULL,
|
||||
(start_col + startmatch.rm_eo == 0) ? 0 :
|
||||
REG_NOTBOL) == REG_NOMATCH)
|
||||
(start_col + startmatch.rm_eo == 0) ?
|
||||
0 : REG_NOTBOL) == REG_NOMATCH)
|
||||
/* No end found after this start. */
|
||||
break;
|
||||
start_col++;
|
||||
if (regexec(tmpcolor->start, start_line->data +
|
||||
start_col, 1, &startmatch, REG_NOTBOL) ==
|
||||
REG_NOMATCH)
|
||||
start_col, 1, &startmatch,
|
||||
REG_NOTBOL) == REG_NOMATCH)
|
||||
/* No later start on this line. */
|
||||
goto step_two;
|
||||
}
|
||||
/* Indeed, there is a start not followed on this line by
|
||||
* an end. */
|
||||
/* Indeed, there is a start not followed on this
|
||||
* line by an end. */
|
||||
|
||||
/* We have already checked that there is no end before
|
||||
* fileptr and after the start. Is there an end after
|
||||
* the start at all? We don't paint unterminated
|
||||
* starts. */
|
||||
/* We have already checked that there is no end
|
||||
* before fileptr and after the start. Is there an
|
||||
* end after the start at all? We don't paint
|
||||
* unterminated starts. */
|
||||
end_line = fileptr;
|
||||
while (end_line != NULL && regexec(tmpcolor->end,
|
||||
end_line->data, 1, &endmatch, 0) == REG_NOMATCH)
|
||||
|
@ -2492,17 +2496,17 @@ void edit_draw(const filestruct *fileptr, const char *converted, int
|
|||
|
||||
/* Now paint the start of fileptr. */
|
||||
if (end_line != fileptr)
|
||||
/* If the start of fileptr is on a different line
|
||||
* from the end, paintlen is -1, meaning that
|
||||
* everything on the line gets painted. */
|
||||
/* If the start of fileptr is on a different
|
||||
* line from the end, paintlen is -1, meaning
|
||||
* that everything on the line gets painted. */
|
||||
paintlen = -1;
|
||||
else
|
||||
/* Otherwise, paintlen is the expanded location of
|
||||
* the end of the match minus the expanded location
|
||||
* of the beginning of the page. */
|
||||
/* Otherwise, paintlen is the expanded location
|
||||
* of the end of the match minus the expanded
|
||||
* location of the beginning of the page. */
|
||||
paintlen = actual_x(converted,
|
||||
strnlenpt(fileptr->data, endmatch.rm_eo) -
|
||||
start);
|
||||
strnlenpt(fileptr->data,
|
||||
endmatch.rm_eo) - start);
|
||||
|
||||
mvwaddnstr(edit, line, 0, converted, paintlen);
|
||||
|
||||
|
@ -2512,9 +2516,9 @@ void edit_draw(const filestruct *fileptr, const char *converted, int
|
|||
|
||||
while (start_col < endpos) {
|
||||
if (regexec(tmpcolor->start, fileptr->data +
|
||||
start_col, 1, &startmatch, (start_col == 0) ?
|
||||
0 : REG_NOTBOL) == REG_NOMATCH || start_col +
|
||||
startmatch.rm_so >= endpos)
|
||||
start_col, 1, &startmatch, (start_col ==
|
||||
0) ? 0 : REG_NOTBOL) == REG_NOMATCH ||
|
||||
start_col + startmatch.rm_so >= endpos)
|
||||
/* No more starts on this line. */
|
||||
break;
|
||||
/* Translate the match to be relative to the
|
||||
|
@ -2522,39 +2526,39 @@ void edit_draw(const filestruct *fileptr, const char *converted, int
|
|||
startmatch.rm_so += start_col;
|
||||
startmatch.rm_eo += start_col;
|
||||
|
||||
if (startmatch.rm_so <= startpos)
|
||||
x_start = 0;
|
||||
else
|
||||
x_start = strnlenpt(fileptr->data,
|
||||
x_start = (startmatch.rm_so <= startpos) ? 0 :
|
||||
strnlenpt(fileptr->data,
|
||||
startmatch.rm_so) - start;
|
||||
|
||||
index = actual_x(converted, x_start);
|
||||
|
||||
if (regexec(tmpcolor->end, fileptr->data +
|
||||
startmatch.rm_eo, 1, &endmatch,
|
||||
(startmatch.rm_eo == 0) ? 0 : REG_NOTBOL) ==
|
||||
0) {
|
||||
/* Translate the end match to be relative to the
|
||||
* beginning of the line. */
|
||||
(startmatch.rm_eo == 0) ? 0 :
|
||||
REG_NOTBOL) == 0) {
|
||||
/* Translate the end match to be relative to
|
||||
* the beginning of the line. */
|
||||
endmatch.rm_so += startmatch.rm_eo;
|
||||
endmatch.rm_eo += startmatch.rm_eo;
|
||||
/* There is an end on this line. But does it
|
||||
* appear on this page, and is the match more
|
||||
* than zero characters long? */
|
||||
/* There is an end on this line. But does
|
||||
* it appear on this page, and is the match
|
||||
* more than zero characters long? */
|
||||
if (endmatch.rm_eo > startpos &&
|
||||
endmatch.rm_eo > startmatch.rm_so) {
|
||||
paintlen = actual_x(converted + index,
|
||||
strnlenpt(fileptr->data,
|
||||
endmatch.rm_eo) - start - x_start);
|
||||
endmatch.rm_eo) - start -
|
||||
x_start);
|
||||
|
||||
assert(0 <= x_start && x_start < COLS);
|
||||
|
||||
mvwaddnstr(edit, line, x_start, converted +
|
||||
index, paintlen);
|
||||
mvwaddnstr(edit, line, x_start,
|
||||
converted + index, paintlen);
|
||||
}
|
||||
} else {
|
||||
/* There is no end on this line. But we haven't
|
||||
* yet looked for one on later lines. */
|
||||
/* There is no end on this line. But we
|
||||
* haven't yet looked for one on later
|
||||
* lines. */
|
||||
end_line = fileptr->next;
|
||||
|
||||
while (end_line != NULL &&
|
||||
|
@ -2565,16 +2569,18 @@ void edit_draw(const filestruct *fileptr, const char *converted, int
|
|||
if (end_line != NULL) {
|
||||
assert(0 <= x_start && x_start < COLS);
|
||||
|
||||
mvwaddnstr(edit, line, x_start, converted +
|
||||
index, -1);
|
||||
mvwaddnstr(edit, line, x_start,
|
||||
converted + index, -1);
|
||||
/* We painted to the end of the line, so
|
||||
* don't bother checking any more starts. */
|
||||
* don't bother checking any more
|
||||
* starts. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
start_col = startmatch.rm_so + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wattroff(edit, A_BOLD);
|
||||
wattroff(edit, COLOR_PAIR(tmpcolor->pairnum));
|
||||
|
|
Loading…
Reference in New Issue