commit e027fc2eddd07b2e583c61d5a70677dde561c653
parent 8257bf145e50c03d528adf32692c15d6e5011677
Author: Chris Allegretta <chrisa@asty.org>
Date: Sun, 15 Feb 2009 02:40:16 +0000
2009-02-14 Chris Allegretta <chrisa@asty.org>
* nano.c (precalc_multicolorinfo) - Add debugging so we have a better clue if further
issues arise. Also start at the beginning of later lines when trying to match the
end of a multi-line regex. Fixes more overly aggressive highlighting found by
Mike Frysinger. Finally, advance to the match end for performance.
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4376 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Diffstat:
M | ChangeLog | | | 6 | ++++++ |
M | src/nano.c | | | 64 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ |
2 files changed, 64 insertions(+), 6 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,9 @@
+2009-02-14 Chris Allegretta <chrisa@asty.org>
+ * nano.c (precalc_multicolorinfo) - Add debugging so we have a better clue if further
+ issues arise. Also start at the beginning of later lines when trying to match the
+ end of a multi-line regex. Fixes more overly aggressive highlighting found by
+ Mike Frysinger. Finally, advance to the match end for performance.
+
2009-02-11 Chris Allegretta <chrisa@asty.org>
* nanorc.c (parse_include): Do call real_dir_from_tilde() on included
files in .nanorc, but still avoiding bug #25297. Fixes ~ and ~user
diff --git a/src/nano.c b/src/nano.c
@@ -1692,6 +1692,9 @@ void alloc_multidata_if_needed(filestruct *fileptr)
rendering (with any hope at all...) */
void precalc_multicolorinfo(void)
{
+#ifdef DEBUG
+ fprintf(stderr, "entering precalc_multicolorinfo()\n");
+#endif
if (openfile->colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX)) {
const colortype *tmpcolor = openfile->colorstrings;
regmatch_t startmatch, endmatch;
@@ -1710,9 +1713,19 @@ void precalc_multicolorinfo(void)
/* If it's not a multi-line regex, amscray */
if (tmpcolor->end == NULL)
continue;
+#ifdef DEBUG
+ fprintf(stderr, "working on color id %d\n", tmpcolor->id);
+#endif
+
for (fileptr = openfile->fileage; fileptr != NULL; fileptr = fileptr->next) {
int startx = 0;
+ int nostart = 0;
+
+
+#ifdef DEBUG
+ fprintf(stderr, "working on lineno %d\n", fileptr->lineno);
+#endif
alloc_multidata_if_needed(fileptr);
@@ -1722,44 +1735,84 @@ void precalc_multicolorinfo(void)
goto precalc_cleanup;
}
- fileptr->multidata[tmpcolor->id] = CNONE;
- while (regexec(tmpcolor->start, &fileptr->data[startx], 1, &startmatch, 0) == 0) {
+ while ((nostart = regexec(tmpcolor->start, &fileptr->data[startx], 1, &startmatch, 0)) == 0) {
/* Look for end and start marking how many lines are encompassed
whcih should speed up rendering later */
- startx += startmatch.rm_eo;
+ startx += startmatch.rm_eo;
+#ifdef DEBUG
+ fprintf(stderr, "match found at pos %d...", startx);
+#endif
/* Look on this line first for end */
if (regexec(tmpcolor->end, &fileptr->data[startx], 1, &endmatch, 0) == 0) {
startx += endmatch.rm_eo;
fileptr->multidata[tmpcolor->id] |= CSTARTENDHERE;
+#ifdef DEBUG
+ fprintf(stderr, "end found on this line\n");
+#endif
continue;
}
/* Nice, we didn't find the end regex on this line. Let's start looking for it */
for (endptr = fileptr->next; endptr != NULL; endptr = endptr->next) {
+#ifdef DEBUG
+ fprintf(stderr, "advancing to line %d to find end...\n", endptr->lineno);
+#endif
/* Check for keyboard input again */
if ((cur_check = time(NULL)) - last_check > 1) {
last_check = cur_check;
if (wgetch(edit) != ERR)
goto precalc_cleanup;
}
- if (regexec(tmpcolor->end, &endptr->data[startx], 1, &endmatch, 0) == 0)
+ if (regexec(tmpcolor->end, endptr->data, 1, &endmatch, 0) == 0)
break;
}
- if (endptr == NULL)
+ if (endptr == NULL) {
+#ifdef DEBUG
+ fprintf(stderr, "no end found, breaking out\n");
+#endif
break;
+ }
+
+
+#ifdef DEBUG
+ fprintf(stderr, "end found\n");
+#endif
/* We found it, we found it, la la la la la. Mark all the
lines in between and the ends properly */
fileptr->multidata[tmpcolor->id] |= CENDAFTER;
+#ifdef DEBUG
+ fprintf(stderr, "marking line %d as CENDAFTER\n", fileptr->lineno);
+#endif
for (fileptr = fileptr->next; fileptr != endptr; fileptr = fileptr->next) {
alloc_multidata_if_needed(fileptr);
fileptr->multidata[tmpcolor->id] = CWHOLELINE;
+#ifdef DEBUG
+ fprintf(stderr, "marking intermediary line %d as CWHOLELINE\n", fileptr->lineno);
+#endif
}
alloc_multidata_if_needed(endptr);
+#ifdef DEBUG
+ fprintf(stderr, "marking line %d as BEGINBEFORE\n", fileptr->lineno);
+#endif
endptr->multidata[tmpcolor->id] |= CBEGINBEFORE;
+ /* We should be able to skip all the way to the line of the match.
+ This may introduce more bugs but it's the Right Thing to do */
+ fileptr = endptr;
+ startx = endmatch.rm_eo;
+#ifdef DEBUG
+ fprintf(stderr, "jumping to line %d pos %d to continue\n", endptr->lineno, startx);
+#endif
+ }
+ if (nostart && startx == 0) {
+#ifdef DEBUG
+ fprintf(stderr, "no start found on line %d, continuing\n", fileptr->lineno);
+#endif
+ fileptr->multidata[tmpcolor->id] = CNONE;
+ continue;
}
}
}
@@ -1837,7 +1890,6 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
#ifndef NANO_TINY
update_undo(ADD);
-
/* Note that current_x has not yet been incremented. */
if (openfile->mark_set && openfile->current ==
openfile->mark_begin && openfile->current_x <