Commit 2fa11b83 authored by Chris Allegretta's avatar Chris Allegretta
Browse files

Two fixes, create new colorstrings array for each regex, allows proper order...

Two fixes, create new colorstrings array for each regex, allows proper order of highlighting, second make color work with the marker


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@915 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
parent 86c9676f
Showing with 123 additions and 160 deletions
+123 -160
......@@ -98,8 +98,8 @@ void colorinit_one(int colortoset, short fg, short bg, int bold)
int do_colorinit(void)
{
int i, fg, bg;
colortype *tmpcolor = NULL;
int i;
colortype *tmpcolor = NULL, *beforenow = NULL;
int defok = 0;
if (has_colors()) {
......@@ -115,24 +115,26 @@ int do_colorinit(void)
for (tmpcolor = colorstrings; tmpcolor != NULL;
tmpcolor = tmpcolor->next) {
if (tmpcolor->fg > 8)
fg = tmpcolor->fg - 8;
else
fg = tmpcolor->fg;
if (tmpcolor->bg > 8)
bg = tmpcolor->bg - 8;
else
bg = tmpcolor->bg;
if (defok && bg == -1)
init_pair(i, fg, -1);
else if (bg == -1)
init_pair(i, fg, COLOR_BLACK);
for (beforenow = colorstrings; beforenow != NULL
&& beforenow != tmpcolor &&
(beforenow->fg != tmpcolor->fg || beforenow->bg != tmpcolor->bg
|| beforenow->bright != tmpcolor->bright);
beforenow = beforenow->next)
;
if (beforenow != NULL && beforenow != tmpcolor) {
tmpcolor->pairnum = beforenow->pairnum;
continue;
}
if (defok && tmpcolor->bg == -1)
init_pair(i, tmpcolor->fg, -1);
else if (tmpcolor->bg == -1)
init_pair(i, tmpcolor->fg, COLOR_BLACK);
else /* They picked a fg and bg color */
init_pair(i, fg, bg);
init_pair(i, tmpcolor->fg, tmpcolor->bg);
fprintf(stderr, "Running init_pair with fg = %d and bg = %d\n", fg, bg);
fprintf(stderr, "Running init_pair with fg = %d and bg = %d\n", tmpcolor->fg, tmpcolor->bg);
tmpcolor->pairnum = i;
i++;
......
......@@ -129,6 +129,7 @@ typedef struct colorstr {
typedef struct colortype {
int fg;
int bg;
int bright;
int pairnum;
colorstr *str;
struct colortype *next;
......
......@@ -122,7 +122,7 @@ char *parse_next_word(char *ptr)
return ptr;
}
int colortoint(char *colorname, char *filename, int *lineno)
int colortoint(char *colorname, int *bright, char *filename, int *lineno)
{
int mcolor = 0;
......@@ -130,7 +130,7 @@ int colortoint(char *colorname, char *filename, int *lineno)
return -1;
if (strcasestr(colorname, "bright")) {
mcolor += 8;
*bright = 1;
colorname += 6;
}
......@@ -167,7 +167,7 @@ int colortoint(char *colorname, char *filename, int *lineno)
/* Parse the color stuff into the colorstrings array */
void parse_colors(FILE *rcstream, char *filename, int *lineno, char *buf, char *ptr)
{
int i = 0, fg, bg;
int i = 0, fg, bg, bright = 0;
char prev = '\\';
char *tmp = NULL, *beginning, *fgstr, *bgstr;
colortype *tmpcolor = NULL;
......@@ -188,8 +188,8 @@ void parse_colors(FILE *rcstream, char *filename, int *lineno, char *buf, char *
} else
bgstr = NULL;
fg = colortoint(fgstr, filename, lineno);
bg = colortoint(bgstr, filename, lineno);
fg = colortoint(fgstr, &bright, filename, lineno);
bg = colortoint(bgstr, &bright, filename, lineno);
/* Now the fun part, start adding regexps to individual strings
in the colorstrings array, woo! */
......@@ -219,45 +219,28 @@ void parse_colors(FILE *rcstream, char *filename, int *lineno, char *buf, char *
colorstrings = nmalloc(sizeof(colortype));
colorstrings->fg = fg;
colorstrings->bg = bg;
colorstrings->bright = bright;
colorstrings->str = NULL;
colorstrings->str = nmalloc(sizeof(colorstr));
colorstrings->str->val = tmp;
colorstrings->str->next = NULL;
colorstrings->next = NULL;
} else {
for (tmpcolor = colorstrings;
tmpcolor->next != NULL && !(tmpcolor->fg == fg
&& tmpcolor->bg == bg); tmpcolor = tmpcolor->next)
for (tmpcolor = colorstrings; tmpcolor->next != NULL;
tmpcolor = tmpcolor->next)
;
/* An entry for this color pair already exists, add it
to the str list */
if (tmpcolor->fg == fg && tmpcolor->bg == bg) {
for (tmpstr = tmpcolor->str; tmpstr->next != NULL;
tmpstr = tmpstr->next)
;
#ifdef DEBUG
fprintf(stderr, "Adding to existing entry for fg %d bg %d\n", fg, bg);
#endif
tmpstr->next = nmalloc (sizeof(colorstr));
tmpstr->next->val = tmp;
tmpstr->next->next = NULL;
} else {
#ifdef DEBUG
fprintf(stderr, "Adding new entry for fg %d bg %d\n", fg, bg);
#endif
tmpcolor->next = nmalloc(sizeof(colortype));
tmpcolor->next->fg = fg;
tmpcolor->next->bg = bg;
tmpcolor->next->str = nmalloc(sizeof(colorstr));
tmpcolor->next->str->val = tmp;
tmpcolor->next->str->next = NULL;
tmpcolor->next->next = NULL;
}
tmpcolor->next = nmalloc(sizeof(colortype));
tmpcolor->next->fg = fg;
tmpcolor->next->bg = bg;
tmpcolor->next->bright = bright;
tmpcolor->next->str = nmalloc(sizeof(colorstr));
tmpcolor->next->str->val = tmp;
tmpcolor->next->str->next = NULL;
tmpcolor->next->next = NULL;
}
i = 0;
......
......@@ -741,9 +741,6 @@ void add_marked_sameline(int begin, int end, filestruct * fileptr, int y,
sel_data_len = end - begin;
post_data_len = this_page_end - end;
/* Paint this line! */
mvwaddnstr(edit, y, 0, &fileptr->data[this_page_start], pre_data_len);
#ifdef ENABLE_COLOR
color_on(edit, COLOR_MARKER);
#else
......@@ -759,8 +756,6 @@ void add_marked_sameline(int begin, int end, filestruct * fileptr, int y,
wattroff(edit, A_REVERSE);
#endif /* ENABLE_COLOR */
mvwaddnstr(edit, y, end - this_page_start,
&fileptr->data[end], post_data_len);
}
#endif
......@@ -774,10 +769,65 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
{
#ifndef NANO_SMALL
colortype *tmpcolor = NULL;
colorstr *tmpstr = NULL;
int k, paintlen;
#endif
/* Just paint the string in any case (we'll add color or reverse on
just the text that needs it */
mvwaddnstr(edit, yval, 0, &fileptr->data[start],
get_page_end_virtual(this_page) - start + 1);
#ifndef NANO_SMALL
if (colorstrings != NULL)
for (tmpcolor = colorstrings; tmpcolor != NULL; tmpcolor = tmpcolor->next) {
for (tmpstr = tmpcolor->str; tmpstr != NULL; tmpstr = tmpstr->next) {
k = start;
regcomp(&search_regexp, tmpstr->val, 0);
while (!regexec(&search_regexp, &fileptr->data[k], 1,
regmatches, 0)) {
#ifdef DEBUG
fprintf(stderr, "Match! (%d chars) \"%s\"\n",
regmatches[0].rm_eo - regmatches[0].rm_so,
&fileptr->data[k + regmatches[0].rm_so]);
#endif
if (regmatches[0].rm_so < COLS - 1) {
if (tmpcolor->bright)
wattron(edit, A_BOLD);
wattron(edit, COLOR_PAIR(tmpcolor->pairnum));
if (regmatches[0].rm_eo - regmatches[0].rm_so
+ k <= COLS)
paintlen = regmatches[0].rm_eo - regmatches[0].rm_so;
else
paintlen = COLS - (regmatches[0].rm_eo
- regmatches[0].rm_so);
mvwaddnstr(edit, yval, regmatches[0].rm_so + k,
&fileptr->data[k + regmatches[0].rm_so],
paintlen);
}
if (tmpcolor->bright)
wattroff(edit, A_BOLD);
wattroff(edit, COLOR_PAIR(tmpcolor->pairnum));
k += regmatches[0].rm_eo;
}
}
}
/* There are quite a few cases that could take place; we'll deal
* with them each in turn */
if (ISSET(MARK_ISSET)
&& !((fileptr->lineno > mark_beginbuf->lineno
if (ISSET(MARK_ISSET) &&
!((fileptr->lineno > mark_beginbuf->lineno
&& fileptr->lineno > current->lineno)
|| (fileptr->lineno < mark_beginbuf->lineno
&& fileptr->lineno < current->lineno))) {
......@@ -832,41 +882,36 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
#else
wattron(edit, A_REVERSE);
#endif /* ENABLE_COLOR */
}
target =
(virt_mark_beginx <
COLS - 1) ? virt_mark_beginx : COLS - 1;
target =
(virt_mark_beginx < COLS - 1) ? virt_mark_beginx : COLS - 1;
mvwaddnstr(edit, yval, 0, fileptr->data, target);
if (mark_beginbuf->lineno < current->lineno) {
mvwaddnstr(edit, yval, 0, fileptr->data, target);
#ifdef ENABLE_COLOR
color_on(edit, COLOR_MARKER);
color_off(edit, COLOR_MARKER);
#else
wattron(edit, A_REVERSE);
wattroff(edit, A_REVERSE);
#endif /* ENABLE_COLOR */
} else {
}
if (mark_beginbuf->lineno < current->lineno) {
#ifdef ENABLE_COLOR
color_off(edit, COLOR_MARKER);
color_on(edit, COLOR_MARKER);
#else
wattroff(edit, A_REVERSE);
wattron(edit, A_REVERSE);
#endif /* ENABLE_COLOR */
}
target = (COLS - 1) - virt_mark_beginx;
target = (COLS - 1) - virt_mark_beginx;
if (target < 0)
target = 0;
if (target < 0)
target = 0;
mvwaddnstr(edit, yval, virt_mark_beginx,
mvwaddnstr(edit, yval, virt_mark_beginx,
&fileptr->data[virt_mark_beginx], target);
if (mark_beginbuf->lineno < current->lineno) {
#ifdef ENABLE_COLOR
color_off(edit, COLOR_MARKER);
#else
......@@ -889,44 +934,37 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
wattron(edit, A_REVERSE);
#endif /* ENABLE_COLOR */
}
if (virt_cur_x > COLS - 2) {
mvwaddnstr(edit, yval, 0,
if (virt_cur_x > COLS - 2) {
mvwaddnstr(edit, yval, 0,
&fileptr->data[this_page_start],
virt_cur_x - this_page_start);
} else {
mvwaddnstr(edit, yval, 0, fileptr->data, virt_cur_x);
}
if (mark_beginbuf->lineno > current->lineno) {
} else
mvwaddnstr(edit, yval, 0, fileptr->data, virt_cur_x);
#ifdef ENABLE_COLOR
color_on(edit, COLOR_MARKER);
color_off(edit, COLOR_MARKER);
#else
wattron(edit, A_REVERSE);
wattroff(edit, A_REVERSE);
#endif /* ENABLE_COLOR */
} else {
}
if (mark_beginbuf->lineno > current->lineno) {
#ifdef ENABLE_COLOR
color_off(edit, COLOR_MARKER);
color_on(edit, COLOR_MARKER);
#else
wattroff(edit, A_REVERSE);
wattron(edit, A_REVERSE);
#endif /* ENABLE_COLOR */
}
if (virt_cur_x > COLS - 2)
mvwaddnstr(edit, yval, virt_cur_x - this_page_start,
if (virt_cur_x > COLS - 2)
mvwaddnstr(edit, yval, virt_cur_x - this_page_start,
&fileptr->data[virt_cur_x],
this_page_end - virt_cur_x);
else
mvwaddnstr(edit, yval, virt_cur_x,
else
mvwaddnstr(edit, yval, virt_cur_x,
&fileptr->data[virt_cur_x], COLS - virt_cur_x);
if (mark_beginbuf->lineno > current->lineno) {
#ifdef ENABLE_COLOR
color_off(edit, COLOR_MARKER);
#else
......@@ -935,68 +973,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
}
}
} else
#endif
/* Just paint the string (no mark on this line) */
mvwaddnstr(edit, yval, 0, &fileptr->data[start],
get_page_end_virtual(this_page) - start + 1);
#ifdef ENABLE_COLOR
{
colortype *tmpcolor = NULL;
colorstr *tmpstr = NULL;
int k, paintlen;
if (colorstrings != NULL)
for (tmpcolor = colorstrings; tmpcolor != NULL; tmpcolor = tmpcolor->next) {
for (tmpstr = tmpcolor->str; tmpstr != NULL; tmpstr = tmpstr->next) {
k = start;
regcomp(&search_regexp, tmpstr->val, 0);
while (!regexec(&search_regexp, &fileptr->data[k], 1,
regmatches, 0)) {
#ifdef DEBUG
fprintf(stderr, "Match! (%d chars) \"%s\"\n",
regmatches[0].rm_eo - regmatches[0].rm_so,
&fileptr->data[k + regmatches[0].rm_so]);
#endif
if (regmatches[0].rm_so < COLS - 1) {
if (tmpcolor->fg > 8 || tmpcolor->bg > 8) {
wattron(edit, A_BOLD);
wattron(edit, COLOR_PAIR(tmpcolor->pairnum));
}
else
wattron(edit, COLOR_PAIR(tmpcolor->pairnum));
if (regmatches[0].rm_eo - regmatches[0].rm_so
+ k <= COLS)
paintlen = regmatches[0].rm_eo - regmatches[0].rm_so;
else
paintlen = COLS - (regmatches[0].rm_eo
- regmatches[0].rm_so);
mvwaddnstr(edit, yval, regmatches[0].rm_so + k,
&fileptr->data[k + regmatches[0].rm_so],
paintlen);
}
if (tmpcolor->fg > 8 || tmpcolor->bg > 8) {
wattroff(edit, A_BOLD);
wattroff(edit, COLOR_PAIR(tmpcolor->pairnum));
}
else
wattroff(edit, COLOR_PAIR(tmpcolor->pairnum));
k += regmatches[0].rm_eo;
}
}
}
}
#endif
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment