| ... | ... |
@@ -66,6 +66,7 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 66 | 66 |
highlighter_t *hl; |
| 67 | 67 |
if(redata==NULL || slot==NULL) |
| 68 | 68 |
return(-1); |
| 69 |
+#if 1 |
|
| 69 | 70 |
/* "forest" theme */ |
| 70 | 71 |
colors=hl_initcolors(&ncolors, |
| 71 | 72 |
color_keyword,"\x38\x17\x1e\xff", |
| ... | ... |
@@ -83,6 +84,25 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 83 | 84 |
color_symbol,"\x69\x2a\x44\xff", |
| 84 | 85 |
color_endenum,DEFAULTCOLOR, |
| 85 | 86 |
-1); |
| 87 |
+#else |
|
| 88 |
+ /* "alternative" theme (dark) */ |
|
| 89 |
+ colors=hl_initcolors(&ncolors, |
|
| 90 |
+ color_keyword,"\xcc\x99\xcc\xff",// |
|
| 91 |
+ color_directive,"\x38\x4b\x00\xff", |
|
| 92 |
+ color_directivekeyword,"\x63\x7d\x16\xff", |
|
| 93 |
+ color_directivestring,"\x07\x20\x3b\xff", |
|
| 94 |
+ color_directiveinclude,"\x16\x63\x7d\xff", |
|
| 95 |
+ color_directiveincludestring,"\x6\x13\x2d\xff", |
|
| 96 |
+ color_normal,"\xf2\xf0\xec\xff",// |
|
| 97 |
+ color_string,"\x99\xcc\x99\xff",// |
|
| 98 |
+ color_multilinecomment,"\x74\x73\x69\xff",// |
|
| 99 |
+ color_linecomment,"\x74\x73\x69\xff",// |
|
| 100 |
+ color_number,"\xf9\x91\x57\xff",// |
|
| 101 |
+ color_operator,"\x66\xcc\xcc\xff",// |
|
| 102 |
+ color_symbol,"\x91\xa7\xff\xff",// |
|
| 103 |
+ color_endenum,"\xf2\xf0\xec\xff",// |
|
| 104 |
+ -1); |
|
| 105 |
+#endif |
|
| 86 | 106 |
if(colors==NULL || (hl=malloc(sizeof(highlighter_t)))==NULL) {
|
| 87 | 107 |
if(colors!=NULL) |
| 88 | 108 |
free(colors),colors=NULL; |
| ... | ... |
@@ -171,7 +171,6 @@ redata_highlighter_getcolorindex(redata_t *redata, int line, int nthbyte) |
| 171 | 171 |
static void |
| 172 | 172 |
redata_highlighter_util_applytheme(int *template3,hcolor_t *color,int invert) |
| 173 | 173 |
{
|
| 174 |
- unsigned char c[3]; |
|
| 175 | 174 |
if(template3==NULL || color==NULL || template3[0]<0 || template3[0]>2 || template3[1]<0 || template3[1]>2 || template3[2]<0 || template3[2]>2) |
| 176 | 175 |
return; /* sanity check error */ |
| 177 | 176 |
if(invert==0) {
|
| ... | ... |
@@ -200,7 +199,7 @@ redata_highlighter_settheme(redata_t *redata, int ntheme, int invert) |
| 200 | 199 |
return(-1); |
| 201 | 200 |
for(i=0;i<ncolors;i++) |
| 202 | 201 |
redata_highlighter_util_applytheme(permutationtemplate,colors+i,invert); |
| 203 |
- return; |
|
| 202 |
+ return(0); |
|
| 204 | 203 |
} |
| 205 | 204 |
|
| 206 | 205 |
static int |
| ... | ... |
@@ -354,6 +353,7 @@ hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 354 | 353 |
mode_in_linecomment, |
| 355 | 354 |
mode_in_directive, |
| 356 | 355 |
mode_in_string, |
| 356 |
+ mode_in_singlestring, |
|
| 357 | 357 |
mode_in_directivestring, |
| 358 | 358 |
} mode,mlcprevmode; |
| 359 | 359 |
if(redata==NULL || hl==NULL || nline<0) |
| ... | ... |
@@ -471,6 +471,11 @@ hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 471 | 471 |
linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_string); |
| 472 | 472 |
continue; |
| 473 | 473 |
} |
| 474 |
+ if(ptr[i]=='\'') {
|
|
| 475 |
+ mode=mode_in_singlestring; |
|
| 476 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_string); |
|
| 477 |
+ continue; |
|
| 478 |
+ } |
|
| 474 | 479 |
if(!cant_define && ptr[i]=='#') {
|
| 475 | 480 |
mode=mode_in_directive; |
| 476 | 481 |
is_directiveinclude=0; |
| ... | ... |
@@ -592,11 +597,12 @@ hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 592 | 597 |
linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,(is_directiveinclude==0)?color_directivestring:color_directiveincludestring); |
| 593 | 598 |
continue; |
| 594 | 599 |
} |
| 595 |
- if(mode==mode_in_string) {
|
|
| 600 |
+ if(mode==mode_in_string || mode_in_singlestring) {
|
|
| 596 | 601 |
if(prev_char=='\\' || ptr[i]=='\\') {
|
| 597 | 602 |
continue; |
| 598 | 603 |
} |
| 599 |
- if(ptr[i]=='\"') {
|
|
| 604 |
+ if((mode==mode_in_string && ptr[i]=='\"') |
|
| 605 |
+ || (mode==mode_in_singlestring && ptr[i]=='\'')) {
|
|
| 600 | 606 |
mode=mode_whatever; |
| 601 | 607 |
linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_string); |
| 602 | 608 |
continue; |
| ... | ... |
@@ -168,6 +168,41 @@ redata_highlighter_getcolorindex(redata_t *redata, int line, int nthbyte) |
| 168 | 168 |
return(-1); |
| 169 | 169 |
} |
| 170 | 170 |
|
| 171 |
+static void |
|
| 172 |
+redata_highlighter_util_applytheme(int *template3,hcolor_t *color,int invert) |
|
| 173 |
+{
|
|
| 174 |
+ unsigned char c[3]; |
|
| 175 |
+ if(template3==NULL || color==NULL || template3[0]<0 || template3[0]>2 || template3[1]<0 || template3[1]>2 || template3[2]<0 || template3[2]>2) |
|
| 176 |
+ return; /* sanity check error */ |
|
| 177 |
+ if(invert==0) {
|
|
| 178 |
+ ((unsigned char *)color->rgba)[0]=((unsigned char *)color->origrgba)[template3[0]]; |
|
| 179 |
+ ((unsigned char *)color->rgba)[1]=((unsigned char *)color->origrgba)[template3[1]]; |
|
| 180 |
+ ((unsigned char *)color->rgba)[2]=((unsigned char *)color->origrgba)[template3[2]]; |
|
| 181 |
+ } else {
|
|
| 182 |
+ ((unsigned char *)color->rgba)[0]=255-((unsigned char *)color->origrgba)[template3[0]]; |
|
| 183 |
+ ((unsigned char *)color->rgba)[1]=255-((unsigned char *)color->origrgba)[template3[1]]; |
|
| 184 |
+ ((unsigned char *)color->rgba)[2]=255-((unsigned char *)color->origrgba)[template3[2]]; |
|
| 185 |
+ } |
|
| 186 |
+ return; |
|
| 187 |
+} |
|
| 188 |
+ |
|
| 189 |
+int |
|
| 190 |
+redata_highlighter_settheme(redata_t *redata, int ntheme, int invert) |
|
| 191 |
+{
|
|
| 192 |
+ int permutations[6][3]={{0,1,2},{0,2,1},{1,0,2},{1,2,0},{2,1,0},{2,0,1}};
|
|
| 193 |
+ int *permutationtemplate; |
|
| 194 |
+ hcolor_t *colors; |
|
| 195 |
+ int ncolors,i; |
|
| 196 |
+ ntheme=(ntheme<0)?0:ntheme; |
|
| 197 |
+ ntheme%=6; |
|
| 198 |
+ permutationtemplate=permutations[ntheme]; |
|
| 199 |
+ if((colors=redata_highlighter_getcolors(redata, &ncolors))==NULL) |
|
| 200 |
+ return(-1); |
|
| 201 |
+ for(i=0;i<ncolors;i++) |
|
| 202 |
+ redata_highlighter_util_applytheme(permutationtemplate,colors+i,invert); |
|
| 203 |
+ return; |
|
| 204 |
+} |
|
| 205 |
+ |
|
| 171 | 206 |
static int |
| 172 | 207 |
redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo, int is_unadd) |
| 173 | 208 |
{
|
| ... | ... |
@@ -248,6 +283,8 @@ hl_initcolors(int *ncolors, /* int color, char *colordef, */ ...) |
| 248 | 283 |
colordef=va_arg(paramlist,char *); |
| 249 | 284 |
maxcolor=(maxcolor<color)?color:maxcolor; |
| 250 | 285 |
if(round==1) {
|
| 286 |
+ strncpy(hcolors[color].origrgba,colordef,sizeof(hcolors[color].origrgba)); |
|
| 287 |
+ hcolors[color].origrgba[sizeof(hcolors[color].origrgba)-1]='\0'; |
|
| 251 | 288 |
strncpy(hcolors[color].rgba,colordef,sizeof(hcolors[color].rgba)); |
| 252 | 289 |
hcolors[color].rgba[sizeof(hcolors[color].rgba)-1]='\0'; |
| 253 | 290 |
} |
| ... | ... |
@@ -788,3 +825,4 @@ hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int poso |
| 788 | 825 |
return(linecolor); |
| 789 | 826 |
} |
| 790 | 827 |
|
| 828 |
+ |
| ... | ... |
@@ -71,7 +71,7 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 71 | 71 |
color_keyword,"\x38\x17\x1e\xff", |
| 72 | 72 |
color_directive,"\x38\x4b\x00\xff", |
| 73 | 73 |
color_directivekeyword,"\x63\x7d\x16\xff", |
| 74 |
- color_directivestring,"\x07\x20\3b\xff", |
|
| 74 |
+ color_directivestring,"\x07\x20\x3b\xff", |
|
| 75 | 75 |
color_directiveinclude,"\x16\x63\x7d\xff", |
| 76 | 76 |
color_directiveincludestring,"\x6\x13\x2d\xff", |
| 77 | 77 |
color_normal,"\x9a\x67\x43\xff", |
| ... | ... |
@@ -193,7 +193,7 @@ redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t |
| 193 | 193 |
} |
| 194 | 194 |
} |
| 195 | 195 |
/* special case: check if pos is inside last line */ |
| 196 |
- if(nline>=hl->usedlines && (hl->lines[hl->usedlines-1].pos+hl->lines[hl->usedlines-1].len)>=pos) |
|
| 196 |
+ if(nline>=hl->usedlines) |
|
| 197 | 197 |
nline=hl->usedlines-1; |
| 198 | 198 |
/* invalidate from this line on */ |
| 199 | 199 |
nline=(nline<0)?0:nline; |
| ... | ... |
@@ -365,7 +365,7 @@ hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 365 | 365 |
/* make sure we have previous lines highlighted */ |
| 366 | 366 |
for(i=hl->usedlines;i<nline;i++) {
|
| 367 | 367 |
if(hl_doline(redata,hl,i)==-1) |
| 368 |
- return(-1); /* error highlighting line */ |
|
| 368 |
+ return(-1); /* error highlighting line */ |
|
| 369 | 369 |
} |
| 370 | 370 |
hl_invalidatefrom(redata,hl,nline); |
| 371 | 371 |
line=hl->lines+nline; |
| ... | ... |
@@ -391,7 +391,7 @@ hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 391 | 391 |
mlcprevmode=mode_whatever; |
| 392 | 392 |
do {
|
| 393 | 393 |
if(redata_line_rawinfo(redata,realpos+posoffset,&pos,&ptr,&len,NULL)==-1) |
| 394 |
- return(-1); /* couldn't get line data */ |
|
| 394 |
+ return(-1); /* couldn't get line data */ |
|
| 395 | 395 |
has_nl=((len>0 && ptr[len-1]=='\n')?1:0); |
| 396 | 396 |
has_next=(len==0)?1:(ptr[len-1]=='\n')?0:1; |
| 397 | 397 |
/* special case: line with only a newline */ |
| ... | ... |
@@ -788,4 +788,3 @@ hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int poso |
| 788 | 788 |
return(linecolor); |
| 789 | 789 |
} |
| 790 | 790 |
|
| 791 |
- |
| ... | ... |
@@ -46,8 +46,6 @@ typedef enum colorsenum_t {
|
| 46 | 46 |
} colorsenum_t; |
| 47 | 47 |
|
| 48 | 48 |
|
| 49 |
-static int redata_highlighter_add(redata_t *redata, redata_plugin_t *slot, undo_t *undo); |
|
| 50 |
-static int redata_highlighter_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo); |
|
| 51 | 49 |
static int redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo, int is_unadd); |
| 52 | 50 |
static int redata_highlighter_postload(redata_t *redata, redata_plugin_t *slot,char *filename); |
| 53 | 51 |
|
| ... | ... |
@@ -68,6 +66,7 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 68 | 66 |
highlighter_t *hl; |
| 69 | 67 |
if(redata==NULL || slot==NULL) |
| 70 | 68 |
return(-1); |
| 69 |
+ /* "forest" theme */ |
|
| 71 | 70 |
colors=hl_initcolors(&ncolors, |
| 72 | 71 |
color_keyword,"\x38\x17\x1e\xff", |
| 73 | 72 |
color_directive,"\x38\x4b\x00\xff", |
| ... | ... |
@@ -97,8 +96,7 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 97 | 96 |
slot->name[sizeof(slot->name)-1]='\0'; |
| 98 | 97 |
slot->unregister=redata_highlighter_unregister; |
| 99 | 98 |
slot->postload=redata_highlighter_postload; |
| 100 |
- slot->add=redata_highlighter_add; |
|
| 101 |
- slot->unadd=redata_highlighter_unadd; |
|
| 99 |
+ slot->add_or_unadd=redata_highlighter_add_or_unadd; |
|
| 102 | 100 |
slot->userptr=hl; |
| 103 | 101 |
return(0); |
| 104 | 102 |
} |
| ... | ... |
@@ -170,36 +168,20 @@ redata_highlighter_getcolorindex(redata_t *redata, int line, int nthbyte) |
| 170 | 168 |
return(-1); |
| 171 | 169 |
} |
| 172 | 170 |
|
| 173 |
- |
|
| 174 |
-static int |
|
| 175 |
-redata_highlighter_add(redata_t *redata, redata_plugin_t *slot, undo_t *undo) |
|
| 176 |
-{
|
|
| 177 |
- return(redata_highlighter_add_or_unadd(redata, slot, undo, 0)); |
|
| 178 |
-} |
|
| 179 |
- |
|
| 180 |
-static int |
|
| 181 |
-redata_highlighter_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo) |
|
| 182 |
-{
|
|
| 183 |
- return(redata_highlighter_add_or_unadd(redata, slot, undo, 1)); |
|
| 184 |
-} |
|
| 185 |
- |
|
| 186 |
- |
|
| 187 | 171 |
static int |
| 188 | 172 |
redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo, int is_unadd) |
| 189 | 173 |
{
|
| 190 | 174 |
long pos; |
| 191 | 175 |
int nline; |
| 192 |
- undostack_t *stack; |
|
| 193 | 176 |
highlighter_t *hl=(highlighter_t *) ((slot!=NULL)?(slot->userptr):NULL); |
| 194 |
- stack=redata_getstack(redata,undo); |
|
| 195 |
- if(redata==NULL || slot==NULL || hl==NULL || undo==NULL || stack==NULL || slot->active==0) |
|
| 177 |
+ if(redata==NULL || slot==NULL || hl==NULL || undo==NULL || slot->active==0) |
|
| 196 | 178 |
return(-1); /* sanity check failed */ |
| 197 | 179 |
if(hl->usedlines==0) {
|
| 198 | 180 |
return(0); /* nothing to do */ |
| 199 | 181 |
} |
| 200 | 182 |
/* get the first pos of the operation */ |
| 201 | 183 |
pos=undo->posorig; |
| 202 |
- if(undo->type=='D') |
|
| 184 |
+ if((!is_unadd && undo->type=='D') || (is_unadd && undo->type=='A')) |
|
| 203 | 185 |
pos-=undo->len; |
| 204 | 186 |
if(undo->type=='M' && undo->posdest<pos) |
| 205 | 187 |
pos=undo->posdest; |
| ... | ... |
@@ -517,7 +517,7 @@ hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 517 | 517 |
if(prev_char=='/' && ptr[i]=='/') {
|
| 518 | 518 |
mode=mode_in_linecomment; |
| 519 | 519 |
linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i-1,color_linecomment); |
| 520 |
- linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_linecomment); |
|
| 520 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_linecomment); |
|
| 521 | 521 |
continue; |
| 522 | 522 |
} |
| 523 | 523 |
if(prev_char=='/' && ptr[i]=='*') {
|
| ... | ... |
@@ -704,6 +704,7 @@ hl_C_getdirectives(char ***directives,int *ndirectives, int *maxlen) |
| 704 | 704 |
"line", |
| 705 | 705 |
"error", |
| 706 | 706 |
"pragma", |
| 707 |
+NULL |
|
| 707 | 708 |
}; |
| 708 | 709 |
if(directives==NULL || ndirectives==NULL) |
| 709 | 710 |
return(-1); |
| ... | ... |
@@ -767,6 +768,7 @@ hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int poso |
| 767 | 768 |
linecolor->len=1; |
| 768 | 769 |
linecolor->color=color; |
| 769 | 770 |
*opaque=1; |
| 771 |
+ hl->usedbuf=line->off+line->len; |
|
| 770 | 772 |
return(linecolor); |
| 771 | 773 |
} |
| 772 | 774 |
/* if posoff was already done, truncate */ |
| ... | ... |
@@ -800,7 +802,7 @@ hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int poso |
| 800 | 802 |
linecolor->color=color; |
| 801 | 803 |
*opaque+=1; |
| 802 | 804 |
line->len+=sizeof(linecolor_t); |
| 803 |
- hl->usedbuf+=sizeof(linecolor_t); |
|
| 805 |
+ hl->usedbuf=line->off+line->len; |
|
| 804 | 806 |
return(linecolor); |
| 805 | 807 |
} |
| 806 | 808 |
|
| ... | ... |
@@ -75,8 +75,8 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 75 | 75 |
color_directivestring,"\x07\x20\3b\xff", |
| 76 | 76 |
color_directiveinclude,"\x16\x63\x7d\xff", |
| 77 | 77 |
color_directiveincludestring,"\x6\x13\x2d\xff", |
| 78 |
- color_normal,"\x9d\x15\x00\xff", |
|
| 79 |
- color_string,"\x68\x00\x01\xff", |
|
| 78 |
+ color_normal,"\x9a\x67\x43\xff", |
|
| 79 |
+ color_string,"\x9d\x15\x00\xff", |
|
| 80 | 80 |
color_multilinecomment,"\x4f\x40\x57\xff", |
| 81 | 81 |
color_linecomment,"\xc6\x8c\xa4\xff", |
| 82 | 82 |
color_number,"\x3b\x10\x35\xff", |
| ... | ... |
@@ -69,13 +69,13 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 69 | 69 |
if(redata==NULL || slot==NULL) |
| 70 | 70 |
return(-1); |
| 71 | 71 |
colors=hl_initcolors(&ncolors, |
| 72 |
- color_normal,"\x38\x17\x1e\xff", |
|
| 72 |
+ color_keyword,"\x38\x17\x1e\xff", |
|
| 73 | 73 |
color_directive,"\x38\x4b\x00\xff", |
| 74 | 74 |
color_directivekeyword,"\x63\x7d\x16\xff", |
| 75 | 75 |
color_directivestring,"\x07\x20\3b\xff", |
| 76 | 76 |
color_directiveinclude,"\x16\x63\x7d\xff", |
| 77 | 77 |
color_directiveincludestring,"\x6\x13\x2d\xff", |
| 78 |
- color_keyword,"\x9d\x15\x00\xff", |
|
| 78 |
+ color_normal,"\x9d\x15\x00\xff", |
|
| 79 | 79 |
color_string,"\x68\x00\x01\xff", |
| 80 | 80 |
color_multilinecomment,"\x4f\x40\x57\xff", |
| 81 | 81 |
color_linecomment,"\xc6\x8c\xa4\xff", |
| ... | ... |
@@ -155,6 +155,22 @@ redata_highlighter_getline(redata_t *redata, int line, int *nlinecolors) |
| 155 | 155 |
return((linecolor_t *) (hl->buf+hl->lines[line].off)); |
| 156 | 156 |
} |
| 157 | 157 |
|
| 158 |
+int |
|
| 159 |
+redata_highlighter_getcolorindex(redata_t *redata, int line, int nthbyte) |
|
| 160 |
+{
|
|
| 161 |
+ int i,n; |
|
| 162 |
+ int nlinecolors; |
|
| 163 |
+ linecolor_t *linecolors; |
|
| 164 |
+ if((linecolors=redata_highlighter_getline(redata,line,&nlinecolors))==NULL) |
|
| 165 |
+ return(-1); |
|
| 166 |
+ for(i=0,n=0;n<nlinecolors;i+=linecolors[n].len,n++) {
|
|
| 167 |
+ if(nthbyte<(i+linecolors[n].len)) |
|
| 168 |
+ return(linecolors[n].color); |
|
| 169 |
+ } |
|
| 170 |
+ return(-1); |
|
| 171 |
+} |
|
| 172 |
+ |
|
| 173 |
+ |
|
| 158 | 174 |
static int |
| 159 | 175 |
redata_highlighter_add(redata_t *redata, redata_plugin_t *slot, undo_t *undo) |
| 160 | 176 |
{
|
| ... | ... |
@@ -179,9 +179,6 @@ redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t |
| 179 | 179 |
if(redata==NULL || slot==NULL || hl==NULL || undo==NULL || stack==NULL || slot->active==0) |
| 180 | 180 |
return(-1); /* sanity check failed */ |
| 181 | 181 |
if(hl->usedlines==0) {
|
| 182 |
-#if 0 |
|
| 183 |
-fprintf(stderr,"INVALIDATING USEDLINELINES==0 (nothing to do)\n"); |
|
| 184 |
-#endif |
|
| 185 | 182 |
return(0); /* nothing to do */ |
| 186 | 183 |
} |
| 187 | 184 |
/* get the first pos of the operation */ |
| ... | ... |
@@ -203,9 +200,6 @@ fprintf(stderr,"INVALIDATING USEDLINELINES==0 (nothing to do)\n"); |
| 203 | 200 |
/* invalidate from this line on */ |
| 204 | 201 |
nline=(nline<0)?0:nline; |
| 205 | 202 |
hl_invalidatefrom(redata,hl,nline); |
| 206 |
-#if 0 |
|
| 207 |
-fprintf(stderr,"INVALIDATING LINE %i\n",nline); |
|
| 208 |
-#endif |
|
| 209 | 203 |
return(0); |
| 210 | 204 |
} |
| 211 | 205 |
|
| ... | ... |
@@ -372,9 +366,6 @@ hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 372 | 366 |
} |
| 373 | 367 |
/* make sure we have previous lines highlighted */ |
| 374 | 368 |
for(i=hl->usedlines;i<nline;i++) {
|
| 375 |
-#if 0 |
|
| 376 |
-fprintf(stderr,"Recursing from %i to %i\n",nline,i); |
|
| 377 |
-#endif |
|
| 378 | 369 |
if(hl_doline(redata,hl,i)==-1) |
| 379 | 370 |
return(-1); /* error highlighting line */ |
| 380 | 371 |
} |
| ... | ... |
@@ -395,77 +386,24 @@ fprintf(stderr,"Recursing from %i to %i\n",nline,i); |
| 395 | 386 |
opaque=0; |
| 396 | 387 |
linecolor=hl_addtolinecolor(&opaque,hl,NULL,color_normal,0); |
| 397 | 388 |
posoffset=0; |
| 398 |
-#if 0 |
|
| 399 |
-fprintf(stderr,"Doing line %i pos:%li\n",nline,line->pos); |
|
| 400 |
-#endif |
|
| 401 | 389 |
prev_char='\0'; |
| 402 | 390 |
prev_char_mask=0xff; |
| 403 | 391 |
hl->usedkeywordbuf=0; |
| 404 | 392 |
hl->useddirectivebuf=0; |
| 405 | 393 |
mlcprevmode=mode_whatever; |
| 406 | 394 |
do {
|
| 407 |
- if(redata_line_rawinfo(redata,realpos+posoffset,&pos,&ptr,&len,NULL)==-1) {
|
|
| 408 |
-#if 0 |
|
| 409 |
-fprintf(stderr,"nline:%i ERROR: couldn't get lineinfo for realpos:%li posoffset:%i realpos+posoffset:%li redataused:%li\n", |
|
| 410 |
-nline,realpos,posoffset,realpos+posoffset,redata_getused(redata)); |
|
| 411 |
-#endif |
|
| 395 |
+ if(redata_line_rawinfo(redata,realpos+posoffset,&pos,&ptr,&len,NULL)==-1) |
|
| 412 | 396 |
return(-1); /* couldn't get line data */ |
| 413 |
- } |
|
| 414 | 397 |
has_nl=((len>0 && ptr[len-1]=='\n')?1:0); |
| 415 | 398 |
has_next=(len==0)?1:(ptr[len-1]=='\n')?0:1; |
| 416 | 399 |
/* special case: line with only a newline */ |
| 417 | 400 |
if(posoffset==0 && has_nl==1 && len==1) {
|
| 418 | 401 |
/* delete the existing linecolor and break */ |
| 419 | 402 |
line->len=0; |
| 420 |
-#if 0 |
|
| 421 |
-fprintf(stderr,"nline:%i detected blank line, exiting\n",nline); |
|
| 422 |
-#endif |
|
| 423 | 403 |
break; |
| 424 | 404 |
} |
| 425 | 405 |
/* iterate */ |
| 426 |
-#if 0 |
|
| 427 |
-#define HDEBUGLINE 775 |
|
| 428 |
-if(nline==HDEBUGLINE || nline==(HDEBUGLINE+1)) {
|
|
| 429 |
-fprintf(stderr,"Line %i chunk at posoffset:%i (realpos:%li)\n",nline, posoffset,realpos); |
|
| 430 |
-fprintf(stderr,"NEW RAWINFO, nline:%i len:%i has_nl:%i has_next:%i mode:%s(%i) mlcprevmode:%s(%i)\n",nline,len,has_nl,has_next, |
|
| 431 |
-mode==mode_whatever?"whatever": |
|
| 432 |
-mode==mode_in_multilinecomment?"mlc": |
|
| 433 |
-mode==mode_in_linecomment?"comment": |
|
| 434 |
-mode==mode_in_directive?"directive": |
|
| 435 |
-mode==mode_in_string?"string": |
|
| 436 |
-mode==mode_in_directivestring?"directivestring":"unknown", |
|
| 437 |
-mode, |
|
| 438 |
-mlcprevmode==mode_whatever?"whatever": |
|
| 439 |
-mlcprevmode==mode_in_multilinecomment?"mlc": |
|
| 440 |
-mlcprevmode==mode_in_linecomment?"comment": |
|
| 441 |
-mlcprevmode==mode_in_directive?"directive": |
|
| 442 |
-mlcprevmode==mode_in_string?"string": |
|
| 443 |
-mlcprevmode==mode_in_directivestring?"directivestring":"unknown", |
|
| 444 |
-mlcprevmode |
|
| 445 |
-); |
|
| 446 |
-} |
|
| 447 |
-#endif |
|
| 448 | 406 |
for(i=0;i<(len-has_nl);prev_char=(ptr[i]&prev_char_mask),prev_char_mask=0xff,i++) {
|
| 449 |
-#if 0 |
|
| 450 |
-if(nline==HDEBUGLINE || nline==(HDEBUGLINE+1)) {
|
|
| 451 |
-fprintf(stderr,"ptr[%i]='%c' prev_char='%s%c' mode=%s(%i) mlcprevmode=%s(%i)\n",i,ptr[i],(prev_char=='\0')?"\\":"",(prev_char=='\0')?'0':prev_char, |
|
| 452 |
-mode==mode_whatever?"whatever": |
|
| 453 |
-mode==mode_in_multilinecomment?"mlc": |
|
| 454 |
-mode==mode_in_linecomment?"comment": |
|
| 455 |
-mode==mode_in_directive?"directive": |
|
| 456 |
-mode==mode_in_string?"string": |
|
| 457 |
-mode==mode_in_directivestring?"directivestring":"unknown", |
|
| 458 |
-mode, |
|
| 459 |
-mlcprevmode==mode_whatever?"whatever": |
|
| 460 |
-mlcprevmode==mode_in_multilinecomment?"mlc": |
|
| 461 |
-mlcprevmode==mode_in_linecomment?"comment": |
|
| 462 |
-mlcprevmode==mode_in_directive?"directive": |
|
| 463 |
-mlcprevmode==mode_in_string?"string": |
|
| 464 |
-mlcprevmode==mode_in_directivestring?"directivestring":"unknown", |
|
| 465 |
-mlcprevmode |
|
| 466 |
-); |
|
| 467 |
-} |
|
| 468 |
-#endif |
|
| 469 | 407 |
/* special case: keyword ends in a change of mode */ |
| 470 | 408 |
if(mode!=mode_whatever && hl->usedkeywordbuf>0) {
|
| 471 | 409 |
if(hl_searchlist(keywords,nkeywords,hl->keywordbuf,hl->usedkeywordbuf,NULL)==0) {
|
| ... | ... |
@@ -793,31 +731,6 @@ hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int poso |
| 793 | 731 |
hline_t *line; |
| 794 | 732 |
if(opaque==NULL || *opaque<0 || hl==NULL || (posoff!=0 && linecolor==NULL) || color<0 || posoff<0) |
| 795 | 733 |
return(NULL); /* sanity check failed */ |
| 796 |
-#if 0 |
|
| 797 |
-#define DEBUGLINE 775 |
|
| 798 |
-if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 799 |
-int i,k; |
|
| 800 |
-int l=hl->lines[hl->usedlines].len; |
|
| 801 |
-linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 802 |
-fprintf(stderr,"addtolinecolor pre.: nline:%i *opaque:%i posoff:%i color:%i current:\"",hl->usedlines,*opaque,posoff,color); |
|
| 803 |
-for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 804 |
- for(i=0;i<lc->len;i++) |
|
| 805 |
- fprintf(stderr,"%x",lc->color); |
|
| 806 |
-} |
|
| 807 |
-hl->keywordbuf[hl->usedkeywordbuf]='\0'; |
|
| 808 |
-hl->directivebuf[hl->useddirectivebuf]='\0'; |
|
| 809 |
-fprintf(stderr,"\" (%i%s%s%s,%i%s%s%s)\n", |
|
| 810 |
-hl->usedkeywordbuf, |
|
| 811 |
-(hl->usedkeywordbuf==0)?"":" \"", |
|
| 812 |
-(hl->usedkeywordbuf==0)?"":hl->keywordbuf, |
|
| 813 |
-(hl->usedkeywordbuf==0)?"":"\"", |
|
| 814 |
-hl->useddirectivebuf, |
|
| 815 |
-(hl->useddirectivebuf==0)?"":" \"", |
|
| 816 |
-(hl->useddirectivebuf==0)?"":hl->directivebuf, |
|
| 817 |
-(hl->useddirectivebuf==0)?"":"\"" |
|
| 818 |
-); |
|
| 819 |
-} |
|
| 820 |
-#endif |
|
| 821 | 734 |
/* make sure there is a space for a linecolor_t in buf */ |
| 822 | 735 |
if((hl->usedbuf+sizeof(linecolor_t))>=hl->sizebuf) {
|
| 823 | 736 |
char *newbuf; |
| ... | ... |
@@ -838,19 +751,6 @@ hl->useddirectivebuf, |
| 838 | 751 |
linecolor->len=1; |
| 839 | 752 |
linecolor->color=color; |
| 840 | 753 |
*opaque=1; |
| 841 |
-#if 0 |
|
| 842 |
-if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 843 |
-int i,k; |
|
| 844 |
-int l=hl->lines[hl->usedlines].len; |
|
| 845 |
-linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 846 |
-fprintf(stderr,"addtolinecolor post: nline:%i *opaque:%i posoff:%i color:%i \"",hl->usedlines,*opaque,posoff,color); |
|
| 847 |
-for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 848 |
- for(i=0;i<lc->len;i++) |
|
| 849 |
- fprintf(stderr,"%x",lc->color); |
|
| 850 |
-} |
|
| 851 |
-fprintf(stderr,"\"\n"); |
|
| 852 |
-} |
|
| 853 |
-#endif |
|
| 854 | 754 |
return(linecolor); |
| 855 | 755 |
} |
| 856 | 756 |
/* if posoff was already done, truncate */ |
| ... | ... |
@@ -877,19 +777,6 @@ fprintf(stderr,"\"\n"); |
| 877 | 777 |
int added=(posoff-*opaque)+1; |
| 878 | 778 |
linecolor[-1].len+=added; |
| 879 | 779 |
*opaque+=added; |
| 880 |
-#if 0 |
|
| 881 |
-if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 882 |
-int i,k; |
|
| 883 |
-int l=hl->lines[hl->usedlines].len; |
|
| 884 |
-linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 885 |
-fprintf(stderr,"addtolinecolor post: nline:%i *opaque:%i posoff:%i color:%i \"",hl->usedlines,*opaque,posoff,color); |
|
| 886 |
-for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 887 |
- for(i=0;i<lc->len;i++) |
|
| 888 |
- fprintf(stderr,"%x",lc->color); |
|
| 889 |
-} |
|
| 890 |
-fprintf(stderr,"\"\n"); |
|
| 891 |
-} |
|
| 892 |
-#endif |
|
| 893 | 780 |
return(linecolor-1); |
| 894 | 781 |
} |
| 895 | 782 |
/* add new linecolor */ |
| ... | ... |
@@ -898,19 +785,6 @@ fprintf(stderr,"\"\n"); |
| 898 | 785 |
*opaque+=1; |
| 899 | 786 |
line->len+=sizeof(linecolor_t); |
| 900 | 787 |
hl->usedbuf+=sizeof(linecolor_t); |
| 901 |
-#if 0 |
|
| 902 |
-if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 903 |
-int i,k; |
|
| 904 |
-int l=hl->lines[hl->usedlines].len; |
|
| 905 |
-linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 906 |
-fprintf(stderr,"addtolinecolor post: nline:%i *opaque:%i posoff:%i color:%i \"",hl->usedlines,*opaque,posoff,color); |
|
| 907 |
-for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 908 |
- for(i=0;i<lc->len;i++) |
|
| 909 |
- fprintf(stderr,"%x",lc->color); |
|
| 910 |
-} |
|
| 911 |
-fprintf(stderr,"\"\n"); |
|
| 912 |
-} |
|
| 913 |
-#endif |
|
| 914 | 788 |
return(linecolor); |
| 915 | 789 |
} |
| 916 | 790 |
|
| ... | ... |
@@ -179,7 +179,7 @@ redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t |
| 179 | 179 |
if(redata==NULL || slot==NULL || hl==NULL || undo==NULL || stack==NULL || slot->active==0) |
| 180 | 180 |
return(-1); /* sanity check failed */ |
| 181 | 181 |
if(hl->usedlines==0) {
|
| 182 |
-#if 1 |
|
| 182 |
+#if 0 |
|
| 183 | 183 |
fprintf(stderr,"INVALIDATING USEDLINELINES==0 (nothing to do)\n"); |
| 184 | 184 |
#endif |
| 185 | 185 |
return(0); /* nothing to do */ |
| ... | ... |
@@ -203,7 +203,7 @@ fprintf(stderr,"INVALIDATING USEDLINELINES==0 (nothing to do)\n"); |
| 203 | 203 |
/* invalidate from this line on */ |
| 204 | 204 |
nline=(nline<0)?0:nline; |
| 205 | 205 |
hl_invalidatefrom(redata,hl,nline); |
| 206 |
-#if 1 |
|
| 206 |
+#if 0 |
|
| 207 | 207 |
fprintf(stderr,"INVALIDATING LINE %i\n",nline); |
| 208 | 208 |
#endif |
| 209 | 209 |
return(0); |
| ... | ... |
@@ -404,25 +404,67 @@ fprintf(stderr,"Doing line %i pos:%li\n",nline,line->pos); |
| 404 | 404 |
hl->useddirectivebuf=0; |
| 405 | 405 |
mlcprevmode=mode_whatever; |
| 406 | 406 |
do {
|
| 407 |
- if(redata_line_rawinfo(redata,realpos+posoffset,&pos,&ptr,&len,NULL)==-1) |
|
| 407 |
+ if(redata_line_rawinfo(redata,realpos+posoffset,&pos,&ptr,&len,NULL)==-1) {
|
|
| 408 |
+#if 0 |
|
| 409 |
+fprintf(stderr,"nline:%i ERROR: couldn't get lineinfo for realpos:%li posoffset:%i realpos+posoffset:%li redataused:%li\n", |
|
| 410 |
+nline,realpos,posoffset,realpos+posoffset,redata_getused(redata)); |
|
| 411 |
+#endif |
|
| 408 | 412 |
return(-1); /* couldn't get line data */ |
| 413 |
+ } |
|
| 409 | 414 |
has_nl=((len>0 && ptr[len-1]=='\n')?1:0); |
| 410 | 415 |
has_next=(len==0)?1:(ptr[len-1]=='\n')?0:1; |
| 411 | 416 |
/* special case: line with only a newline */ |
| 412 | 417 |
if(posoffset==0 && has_nl==1 && len==1) {
|
| 413 | 418 |
/* delete the existing linecolor and break */ |
| 414 | 419 |
line->len=0; |
| 420 |
+#if 0 |
|
| 421 |
+fprintf(stderr,"nline:%i detected blank line, exiting\n",nline); |
|
| 422 |
+#endif |
|
| 415 | 423 |
break; |
| 416 | 424 |
} |
| 417 | 425 |
/* iterate */ |
| 418 | 426 |
#if 0 |
| 419 |
-fprintf(stderr,"Line %i chunk at posoffset %i\n",nline, posoffset); |
|
| 427 |
+#define HDEBUGLINE 775 |
|
| 428 |
+if(nline==HDEBUGLINE || nline==(HDEBUGLINE+1)) {
|
|
| 429 |
+fprintf(stderr,"Line %i chunk at posoffset:%i (realpos:%li)\n",nline, posoffset,realpos); |
|
| 430 |
+fprintf(stderr,"NEW RAWINFO, nline:%i len:%i has_nl:%i has_next:%i mode:%s(%i) mlcprevmode:%s(%i)\n",nline,len,has_nl,has_next, |
|
| 431 |
+mode==mode_whatever?"whatever": |
|
| 432 |
+mode==mode_in_multilinecomment?"mlc": |
|
| 433 |
+mode==mode_in_linecomment?"comment": |
|
| 434 |
+mode==mode_in_directive?"directive": |
|
| 435 |
+mode==mode_in_string?"string": |
|
| 436 |
+mode==mode_in_directivestring?"directivestring":"unknown", |
|
| 437 |
+mode, |
|
| 438 |
+mlcprevmode==mode_whatever?"whatever": |
|
| 439 |
+mlcprevmode==mode_in_multilinecomment?"mlc": |
|
| 440 |
+mlcprevmode==mode_in_linecomment?"comment": |
|
| 441 |
+mlcprevmode==mode_in_directive?"directive": |
|
| 442 |
+mlcprevmode==mode_in_string?"string": |
|
| 443 |
+mlcprevmode==mode_in_directivestring?"directivestring":"unknown", |
|
| 444 |
+mlcprevmode |
|
| 445 |
+); |
|
| 446 |
+} |
|
| 420 | 447 |
#endif |
| 421 |
-#warning FALTA PONER DE UN COLOR DIFERENTE lo de <nombre.h> de los #include (pero no de los #define!) |
|
| 422 | 448 |
for(i=0;i<(len-has_nl);prev_char=(ptr[i]&prev_char_mask),prev_char_mask=0xff,i++) {
|
| 423 | 449 |
#if 0 |
| 424 |
-if(nline==1) |
|
| 425 |
- fprintf(stderr,"ptr[%i]='%c' prev_char='%s%c'\n",i,ptr[i],(prev_char=='\0')?"\\":"",(prev_char=='\0')?'0':prev_char); |
|
| 450 |
+if(nline==HDEBUGLINE || nline==(HDEBUGLINE+1)) {
|
|
| 451 |
+fprintf(stderr,"ptr[%i]='%c' prev_char='%s%c' mode=%s(%i) mlcprevmode=%s(%i)\n",i,ptr[i],(prev_char=='\0')?"\\":"",(prev_char=='\0')?'0':prev_char, |
|
| 452 |
+mode==mode_whatever?"whatever": |
|
| 453 |
+mode==mode_in_multilinecomment?"mlc": |
|
| 454 |
+mode==mode_in_linecomment?"comment": |
|
| 455 |
+mode==mode_in_directive?"directive": |
|
| 456 |
+mode==mode_in_string?"string": |
|
| 457 |
+mode==mode_in_directivestring?"directivestring":"unknown", |
|
| 458 |
+mode, |
|
| 459 |
+mlcprevmode==mode_whatever?"whatever": |
|
| 460 |
+mlcprevmode==mode_in_multilinecomment?"mlc": |
|
| 461 |
+mlcprevmode==mode_in_linecomment?"comment": |
|
| 462 |
+mlcprevmode==mode_in_directive?"directive": |
|
| 463 |
+mlcprevmode==mode_in_string?"string": |
|
| 464 |
+mlcprevmode==mode_in_directivestring?"directivestring":"unknown", |
|
| 465 |
+mlcprevmode |
|
| 466 |
+); |
|
| 467 |
+} |
|
| 426 | 468 |
#endif |
| 427 | 469 |
/* special case: keyword ends in a change of mode */ |
| 428 | 470 |
if(mode!=mode_whatever && hl->usedkeywordbuf>0) {
|
| ... | ... |
@@ -595,7 +637,7 @@ if(nline==1) |
| 595 | 637 |
} |
| 596 | 638 |
} |
| 597 | 639 |
posoffset+=len; |
| 598 |
- } while(has_next!=0 && (pos+posoffset)<redataused); |
|
| 640 |
+ } while(has_next!=0 && (realpos+posoffset)<redataused); |
|
| 599 | 641 |
/* special case: keyword ends at end-of-line */ |
| 600 | 642 |
if(mode==mode_whatever && hl->usedkeywordbuf>0 && hl_searchlist(keywords,nkeywords,hl->keywordbuf,hl->usedkeywordbuf,NULL)==0) {
|
| 601 | 643 |
linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->keywordbufstart,color_keyword); |
| ... | ... |
@@ -752,8 +794,8 @@ hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int poso |
| 752 | 794 |
if(opaque==NULL || *opaque<0 || hl==NULL || (posoff!=0 && linecolor==NULL) || color<0 || posoff<0) |
| 753 | 795 |
return(NULL); /* sanity check failed */ |
| 754 | 796 |
#if 0 |
| 755 |
-#define DEBUGLINE 12 |
|
| 756 |
-if(hl->usedlines==DEBUGLINE) {
|
|
| 797 |
+#define DEBUGLINE 775 |
|
| 798 |
+if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 757 | 799 |
int i,k; |
| 758 | 800 |
int l=hl->lines[hl->usedlines].len; |
| 759 | 801 |
linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
| ... | ... |
@@ -797,7 +839,7 @@ hl->useddirectivebuf, |
| 797 | 839 |
linecolor->color=color; |
| 798 | 840 |
*opaque=1; |
| 799 | 841 |
#if 0 |
| 800 |
-if(hl->usedlines==DEBUGLINE) {
|
|
| 842 |
+if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 801 | 843 |
int i,k; |
| 802 | 844 |
int l=hl->lines[hl->usedlines].len; |
| 803 | 845 |
linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
| ... | ... |
@@ -836,7 +878,7 @@ fprintf(stderr,"\"\n"); |
| 836 | 878 |
linecolor[-1].len+=added; |
| 837 | 879 |
*opaque+=added; |
| 838 | 880 |
#if 0 |
| 839 |
-if(hl->usedlines==DEBUGLINE) {
|
|
| 881 |
+if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 840 | 882 |
int i,k; |
| 841 | 883 |
int l=hl->lines[hl->usedlines].len; |
| 842 | 884 |
linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
| ... | ... |
@@ -857,7 +899,7 @@ fprintf(stderr,"\"\n"); |
| 857 | 899 |
line->len+=sizeof(linecolor_t); |
| 858 | 900 |
hl->usedbuf+=sizeof(linecolor_t); |
| 859 | 901 |
#if 0 |
| 860 |
-if(hl->usedlines==DEBUGLINE) {
|
|
| 902 |
+if(hl->usedlines==DEBUGLINE || hl->usedlines==(DEBUGLINE+1)) {
|
|
| 861 | 903 |
int i,k; |
| 862 | 904 |
int l=hl->lines[hl->usedlines].len; |
| 863 | 905 |
linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
| ... | ... |
@@ -22,19 +22,26 @@ |
| 22 | 22 |
#include "re_plugin_highlighter.h" |
| 23 | 23 |
|
| 24 | 24 |
#define PLUGINNAME "highlighter" |
| 25 |
+#define HLINETBLOCK (16*1024) |
|
| 26 |
+#define BUFBLOCK (64*1024) |
|
| 25 | 27 |
#define HIGHLIGHTERGROWSIZE (256*1024) |
| 26 | 28 |
#define DEFAULTCOLOR "\x80\x80\x80\xff" |
| 27 | 29 |
|
| 28 | 30 |
|
| 29 | 31 |
typedef enum colorsenum_t {
|
| 30 | 32 |
color_normal=0, |
| 31 |
- color_define, |
|
| 32 |
- color_definestring, |
|
| 33 |
+ color_directive, |
|
| 34 |
+ color_directivekeyword, |
|
| 35 |
+ color_directivestring, |
|
| 36 |
+ color_directiveinclude, |
|
| 37 |
+ color_directiveincludestring, |
|
| 33 | 38 |
color_keyword, |
| 34 | 39 |
color_string, |
| 35 | 40 |
color_multilinecomment, |
| 36 | 41 |
color_linecomment, |
| 37 | 42 |
color_number, |
| 43 |
+ color_operator, |
|
| 44 |
+ color_symbol, |
|
| 38 | 45 |
color_endenum, |
| 39 | 46 |
} colorsenum_t; |
| 40 | 47 |
|
| ... | ... |
@@ -42,13 +49,16 @@ typedef enum colorsenum_t {
|
| 42 | 49 |
static int redata_highlighter_add(redata_t *redata, redata_plugin_t *slot, undo_t *undo); |
| 43 | 50 |
static int redata_highlighter_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo); |
| 44 | 51 |
static int redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo, int is_unadd); |
| 45 |
-static int redata_highlighter_commit(redata_t *redata, redata_plugin_t *slot,char *filename); |
|
| 46 | 52 |
static int redata_highlighter_postload(redata_t *redata, redata_plugin_t *slot,char *filename); |
| 47 | 53 |
|
| 48 | 54 |
static int hl_invalidatefrom(redata_t *redata, highlighter_t *hl, int nline); |
| 49 | 55 |
hcolor_t *hl_initcolors(int *ncolors, /* int color, char *colordef, */ ...); |
| 50 | 56 |
static highlighter_t *hl_getplugin(redata_t *redata); |
| 51 | 57 |
static int hl_doline(redata_t *redata, highlighter_t *hl, int nline); |
| 58 |
+int hl_C_getkeywords(char ***keywords,int *nkeywords, int *maxlen); |
|
| 59 |
+int hl_C_getdirectives(char ***directives,int *ndirectives, int *maxlen); |
|
| 60 |
+int hl_searchlist(char **wordlist, int wordlistlen, char *word, int wordlen, int *res); |
|
| 61 |
+linecolor_t *hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int posoff, int color); |
|
| 52 | 62 |
|
| 53 | 63 |
int |
| 54 | 64 |
redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| ... | ... |
@@ -60,13 +70,18 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 60 | 70 |
return(-1); |
| 61 | 71 |
colors=hl_initcolors(&ncolors, |
| 62 | 72 |
color_normal,"\x38\x17\x1e\xff", |
| 63 |
- color_define,"\x0d\x2b\x04\xff", |
|
| 64 |
- color_definestring,"\x07\x20\3b\xff", |
|
| 73 |
+ color_directive,"\x38\x4b\x00\xff", |
|
| 74 |
+ color_directivekeyword,"\x63\x7d\x16\xff", |
|
| 75 |
+ color_directivestring,"\x07\x20\3b\xff", |
|
| 76 |
+ color_directiveinclude,"\x16\x63\x7d\xff", |
|
| 77 |
+ color_directiveincludestring,"\x6\x13\x2d\xff", |
|
| 65 | 78 |
color_keyword,"\x9d\x15\x00\xff", |
| 66 | 79 |
color_string,"\x68\x00\x01\xff", |
| 67 | 80 |
color_multilinecomment,"\x4f\x40\x57\xff", |
| 68 |
- color_linecomment,"\xaa\x8c\xcd\xff", |
|
| 81 |
+ color_linecomment,"\xc6\x8c\xa4\xff", |
|
| 69 | 82 |
color_number,"\x3b\x10\x35\xff", |
| 83 |
+ color_operator,"\xaa\x8c\xcd\xff", |
|
| 84 |
+ color_symbol,"\x69\x2a\x44\xff", |
|
| 70 | 85 |
color_endenum,DEFAULTCOLOR, |
| 71 | 86 |
-1); |
| 72 | 87 |
if(colors==NULL || (hl=malloc(sizeof(highlighter_t)))==NULL) {
|
| ... | ... |
@@ -84,7 +99,6 @@ redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
| 84 | 99 |
slot->postload=redata_highlighter_postload; |
| 85 | 100 |
slot->add=redata_highlighter_add; |
| 86 | 101 |
slot->unadd=redata_highlighter_unadd; |
| 87 |
- slot->commit=redata_highlighter_commit; |
|
| 88 | 102 |
slot->userptr=hl; |
| 89 | 103 |
return(0); |
| 90 | 104 |
} |
| ... | ... |
@@ -104,6 +118,12 @@ redata_highlighter_unregister(redata_t *redata, redata_plugin_t *slot, char *fil |
| 104 | 118 |
if(hl->lines!=NULL) |
| 105 | 119 |
free(hl->lines),hl->lines=NULL; |
| 106 | 120 |
hl->sizelines=hl->usedlines=0; |
| 121 |
+ if(hl->keywordbuf!=NULL) |
|
| 122 |
+ free(hl->keywordbuf),hl->keywordbuf=NULL; |
|
| 123 |
+ hl->sizekeywordbuf=hl->usedkeywordbuf=0; |
|
| 124 |
+ if(hl->directivebuf!=NULL) |
|
| 125 |
+ free(hl->directivebuf),hl->directivebuf=NULL; |
|
| 126 |
+ hl->sizedirectivebuf=hl->useddirectivebuf=0; |
|
| 107 | 127 |
if(slot->userptr!=NULL) |
| 108 | 128 |
free(slot->userptr),slot->userptr=NULL; |
| 109 | 129 |
return(0); |
| ... | ... |
@@ -131,7 +151,7 @@ redata_highlighter_getline(redata_t *redata, int line, int *nlinecolors) |
| 131 | 151 |
if(line<0 || line>=hl->usedlines) |
| 132 | 152 |
return(NULL); |
| 133 | 153 |
if(nlinecolors!=NULL) |
| 134 |
- *nlinecolors=(hl->lines[line].len)/sizeof(hcolor_t); |
|
| 154 |
+ *nlinecolors=(hl->lines[line].len)/sizeof(linecolor_t); |
|
| 135 | 155 |
return((linecolor_t *) (hl->buf+hl->lines[line].off)); |
| 136 | 156 |
} |
| 137 | 157 |
|
| ... | ... |
@@ -158,6 +178,12 @@ redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t |
| 158 | 178 |
stack=redata_getstack(redata,undo); |
| 159 | 179 |
if(redata==NULL || slot==NULL || hl==NULL || undo==NULL || stack==NULL || slot->active==0) |
| 160 | 180 |
return(-1); /* sanity check failed */ |
| 181 |
+ if(hl->usedlines==0) {
|
|
| 182 |
+#if 1 |
|
| 183 |
+fprintf(stderr,"INVALIDATING USEDLINELINES==0 (nothing to do)\n"); |
|
| 184 |
+#endif |
|
| 185 |
+ return(0); /* nothing to do */ |
|
| 186 |
+ } |
|
| 161 | 187 |
/* get the first pos of the operation */ |
| 162 | 188 |
pos=undo->posorig; |
| 163 | 189 |
if(undo->type=='D') |
| ... | ... |
@@ -171,21 +197,15 @@ redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t |
| 171 | 197 |
break; |
| 172 | 198 |
} |
| 173 | 199 |
} |
| 200 |
+ /* special case: check if pos is inside last line */ |
|
| 201 |
+ if(nline>=hl->usedlines && (hl->lines[hl->usedlines-1].pos+hl->lines[hl->usedlines-1].len)>=pos) |
|
| 202 |
+ nline=hl->usedlines-1; |
|
| 174 | 203 |
/* invalidate from this line on */ |
| 204 |
+ nline=(nline<0)?0:nline; |
|
| 175 | 205 |
hl_invalidatefrom(redata,hl,nline); |
| 176 |
- return(0); |
|
| 177 |
-} |
|
| 178 |
- |
|
| 179 |
-static int |
|
| 180 |
-redata_highlighter_commit(redata_t *redata, redata_plugin_t *slot,char *filename) |
|
| 181 |
-{
|
|
| 182 |
- highlighter_t *hl=(highlighter_t *) ((slot!=NULL)?(slot->userptr):NULL); |
|
| 183 |
- if(redata==NULL || hl==NULL || filename==NULL) |
|
| 184 |
- return(-1); /* sanity check failed */ |
|
| 185 |
- if(hl->flag_doneall) |
|
| 186 |
- return(0); |
|
| 187 |
- /* calc highlight of one additional line */ |
|
| 188 |
- hl_doline(redata, hl, hl->usedlines); |
|
| 206 |
+#if 1 |
|
| 207 |
+fprintf(stderr,"INVALIDATING LINE %i\n",nline); |
|
| 208 |
+#endif |
|
| 189 | 209 |
return(0); |
| 190 | 210 |
} |
| 191 | 211 |
|
| ... | ... |
@@ -274,12 +294,582 @@ hl_getplugin(redata_t *redata) |
| 274 | 294 |
return(hl); |
| 275 | 295 |
} |
| 276 | 296 |
|
| 277 |
- |
|
| 278 | 297 |
static int |
| 279 | 298 |
hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
| 280 | 299 |
{
|
| 300 |
+ int i; |
|
| 301 |
+ long realpos; |
|
| 302 |
+ long pos; |
|
| 303 |
+ char *ptr; |
|
| 304 |
+ int len; |
|
| 305 |
+ hline_t *line; |
|
| 306 |
+ long redataused; |
|
| 307 |
+ int has_nl; |
|
| 308 |
+ int has_next; |
|
| 309 |
+ char **keywords; |
|
| 310 |
+ int nkeywords; |
|
| 311 |
+ char **directives; |
|
| 312 |
+ int ndirectives; |
|
| 313 |
+ int maxlenkeywords,maxlendirectives; |
|
| 314 |
+ linecolor_t *linecolor; |
|
| 315 |
+ int prev_char; |
|
| 316 |
+ int prev_char_mask; |
|
| 317 |
+ int cant_define; |
|
| 318 |
+ int cant_directivekeyword; |
|
| 319 |
+ int is_directiveinclude; |
|
| 320 |
+ int opaque; |
|
| 321 |
+ int posoffset; |
|
| 322 |
+ enum {
|
|
| 323 |
+ mode_whatever=0, |
|
| 324 |
+ mode_in_multilinecomment, |
|
| 325 |
+ mode_in_linecomment, |
|
| 326 |
+ mode_in_directive, |
|
| 327 |
+ mode_in_string, |
|
| 328 |
+ mode_in_directivestring, |
|
| 329 |
+ } mode,mlcprevmode; |
|
| 330 |
+ if(redata==NULL || hl==NULL || nline<0) |
|
| 331 |
+ return(-1); /* sanoty check failed */ |
|
| 332 |
+ if(hl->usedlines>nline) |
|
| 333 |
+ return(0); /* nothing to do */ |
|
| 334 |
+ if(hl_C_getkeywords(&keywords,&nkeywords,&maxlenkeywords)==-1) |
|
| 335 |
+ return(-1); /* couldn't get keyword list */ |
|
| 336 |
+ if(hl_C_getdirectives(&directives,&ndirectives,&maxlendirectives)==-1) |
|
| 337 |
+ return(-1); /* couldn't get directive list */ |
|
| 338 |
+ /* make sure keywordbuf is large enough */ |
|
| 339 |
+ if(maxlenkeywords>hl->sizekeywordbuf) {
|
|
| 340 |
+ char *newkeywordbuf; |
|
| 341 |
+ int newsize; |
|
| 342 |
+ newsize=maxlenkeywords; |
|
| 343 |
+ if((newkeywordbuf=realloc(hl->keywordbuf,newsize))==NULL) |
|
| 344 |
+ return(-1); /* insufficient memory */ |
|
| 345 |
+ memset(newkeywordbuf,0,newsize); |
|
| 346 |
+ hl->keywordbuf=newkeywordbuf; |
|
| 347 |
+ hl->sizekeywordbuf=newsize; |
|
| 348 |
+ hl->usedkeywordbuf=0; |
|
| 349 |
+ } |
|
| 350 |
+ /* make sure directivebuf is large enough */ |
|
| 351 |
+ if(maxlendirectives>hl->sizedirectivebuf) {
|
|
| 352 |
+ char *newdirectivebuf; |
|
| 353 |
+ int newsize; |
|
| 354 |
+ newsize=maxlendirectives; |
|
| 355 |
+ if((newdirectivebuf=realloc(hl->directivebuf,newsize))==NULL) |
|
| 356 |
+ return(-1); /* insufficient memory */ |
|
| 357 |
+ memset(newdirectivebuf,0,newsize); |
|
| 358 |
+ hl->directivebuf=newdirectivebuf; |
|
| 359 |
+ hl->sizedirectivebuf=newsize; |
|
| 360 |
+ hl->useddirectivebuf=0; |
|
| 361 |
+ } |
|
| 362 |
+ /* make sure we have enough hline_t structs */ |
|
| 363 |
+ if(hl->sizelines<=nline) {
|
|
| 364 |
+ hline_t *newlines; |
|
| 365 |
+ int newsize=(nline+1+HLINETBLOCK)/HLINETBLOCK; |
|
| 366 |
+ newsize*=HLINETBLOCK; |
|
| 367 |
+ if((newlines=realloc(hl->lines,newsize*sizeof(hline_t)))==NULL) |
|
| 368 |
+ return(-1); /* insufficient memory */ |
|
| 369 |
+ hl->lines=newlines; |
|
| 370 |
+ memset(hl->lines+hl->sizelines,0,(newsize-hl->sizelines)*sizeof(hline_t)); |
|
| 371 |
+ hl->sizelines=newsize; |
|
| 372 |
+ } |
|
| 373 |
+ /* make sure we have previous lines highlighted */ |
|
| 374 |
+ for(i=hl->usedlines;i<nline;i++) {
|
|
| 375 |
+#if 0 |
|
| 376 |
+fprintf(stderr,"Recursing from %i to %i\n",nline,i); |
|
| 377 |
+#endif |
|
| 378 |
+ if(hl_doline(redata,hl,i)==-1) |
|
| 379 |
+ return(-1); /* error highlighting line */ |
|
| 380 |
+ } |
|
| 381 |
+ hl_invalidatefrom(redata,hl,nline); |
|
| 382 |
+ line=hl->lines+nline; |
|
| 383 |
+ if(redata_linecol2pos(redata,nline,0,&realpos,NULL)==-1) |
|
| 384 |
+ return(-1); /* couldn't get line pos */ |
|
| 281 | 385 |
/* NOTE: here comes the highlighter */ |
| 282 |
-#warning XXX TODO: implement this |
|
| 283 |
- return(-1); |
|
| 386 |
+ line->pos=realpos; |
|
| 387 |
+ line->off=(nline==0)?0:hl->lines[nline-1].off+hl->lines[nline-1].len; |
|
| 388 |
+ line->len=0; |
|
| 389 |
+ line->endingmode=mode_whatever; |
|
| 390 |
+ redataused=redata_getused(redata); |
|
| 391 |
+ mode=(nline>0)?line[-1].endingmode:mode_whatever; |
|
| 392 |
+ cant_define=0; |
|
| 393 |
+ cant_directivekeyword=0; |
|
| 394 |
+ is_directiveinclude=0; |
|
| 395 |
+ opaque=0; |
|
| 396 |
+ linecolor=hl_addtolinecolor(&opaque,hl,NULL,color_normal,0); |
|
| 397 |
+ posoffset=0; |
|
| 398 |
+#if 0 |
|
| 399 |
+fprintf(stderr,"Doing line %i pos:%li\n",nline,line->pos); |
|
| 400 |
+#endif |
|
| 401 |
+ prev_char='\0'; |
|
| 402 |
+ prev_char_mask=0xff; |
|
| 403 |
+ hl->usedkeywordbuf=0; |
|
| 404 |
+ hl->useddirectivebuf=0; |
|
| 405 |
+ mlcprevmode=mode_whatever; |
|
| 406 |
+ do {
|
|
| 407 |
+ if(redata_line_rawinfo(redata,realpos+posoffset,&pos,&ptr,&len,NULL)==-1) |
|
| 408 |
+ return(-1); /* couldn't get line data */ |
|
| 409 |
+ has_nl=((len>0 && ptr[len-1]=='\n')?1:0); |
|
| 410 |
+ has_next=(len==0)?1:(ptr[len-1]=='\n')?0:1; |
|
| 411 |
+ /* special case: line with only a newline */ |
|
| 412 |
+ if(posoffset==0 && has_nl==1 && len==1) {
|
|
| 413 |
+ /* delete the existing linecolor and break */ |
|
| 414 |
+ line->len=0; |
|
| 415 |
+ break; |
|
| 416 |
+ } |
|
| 417 |
+ /* iterate */ |
|
| 418 |
+#if 0 |
|
| 419 |
+fprintf(stderr,"Line %i chunk at posoffset %i\n",nline, posoffset); |
|
| 420 |
+#endif |
|
| 421 |
+#warning FALTA PONER DE UN COLOR DIFERENTE lo de <nombre.h> de los #include (pero no de los #define!) |
|
| 422 |
+ for(i=0;i<(len-has_nl);prev_char=(ptr[i]&prev_char_mask),prev_char_mask=0xff,i++) {
|
|
| 423 |
+#if 0 |
|
| 424 |
+if(nline==1) |
|
| 425 |
+ fprintf(stderr,"ptr[%i]='%c' prev_char='%s%c'\n",i,ptr[i],(prev_char=='\0')?"\\":"",(prev_char=='\0')?'0':prev_char); |
|
| 426 |
+#endif |
|
| 427 |
+ /* special case: keyword ends in a change of mode */ |
|
| 428 |
+ if(mode!=mode_whatever && hl->usedkeywordbuf>0) {
|
|
| 429 |
+ if(hl_searchlist(keywords,nkeywords,hl->keywordbuf,hl->usedkeywordbuf,NULL)==0) {
|
|
| 430 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->keywordbufstart,color_keyword); |
|
| 431 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->keywordbufstart+hl->usedkeywordbuf-1,color_keyword); |
|
| 432 |
+ } |
|
| 433 |
+ hl->usedkeywordbuf=0; |
|
| 434 |
+ } |
|
| 435 |
+ /* end of special case */ |
|
| 436 |
+ if(mode==mode_whatever) {
|
|
| 437 |
+ if(prev_char=='\\' || ptr[i]=='\\') {
|
|
| 438 |
+ /* escape char mark or escaped char */ |
|
| 439 |
+ continue; |
|
| 440 |
+ } |
|
| 441 |
+ if(prev_char=='/' && ptr[i]=='/') {
|
|
| 442 |
+ mode=mode_in_linecomment; |
|
| 443 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i-1,color_linecomment); |
|
| 444 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_linecomment); |
|
| 445 |
+ continue; |
|
| 446 |
+ } |
|
| 447 |
+ if(prev_char=='/' && ptr[i]=='*') {
|
|
| 448 |
+ mlcprevmode=mode; |
|
| 449 |
+ mode=mode_in_multilinecomment; |
|
| 450 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i-1,color_multilinecomment); |
|
| 451 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_multilinecomment); |
|
| 452 |
+ continue; |
|
| 453 |
+ } |
|
| 454 |
+ if(ptr[i]=='\"') {
|
|
| 455 |
+ mode=mode_in_string; |
|
| 456 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_string); |
|
| 457 |
+ continue; |
|
| 458 |
+ } |
|
| 459 |
+ if(!cant_define && ptr[i]=='#') {
|
|
| 460 |
+ mode=mode_in_directive; |
|
| 461 |
+ is_directiveinclude=0; |
|
| 462 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_directive); |
|
| 463 |
+ continue; |
|
| 464 |
+ } |
|
| 465 |
+ /* keyword detection */ |
|
| 466 |
+ if(hl->usedkeywordbuf==0 && ((ptr[i]>='a' && ptr[i]<='z') || (ptr[i]>='A' && ptr[i]<='Z') || ptr[i]=='_')) {
|
|
| 467 |
+ cant_define=1; |
|
| 468 |
+ hl->keywordbuf[hl->usedkeywordbuf++]=ptr[i]; |
|
| 469 |
+ hl->keywordbufstart=posoffset+i; |
|
| 470 |
+ } else if(hl->usedkeywordbuf>0 && ((ptr[i]>='0' && ptr[i]<='9') || (ptr[i]>='a' && ptr[i]<='z') || (ptr[i]>='A' && ptr[i]<='Z') || ptr[i]=='_')) {
|
|
| 471 |
+ if(hl->usedkeywordbuf<hl->sizekeywordbuf) {
|
|
| 472 |
+ hl->keywordbuf[hl->usedkeywordbuf++]=ptr[i]; |
|
| 473 |
+ } else {
|
|
| 474 |
+ hl->keywordbuf[0]='\0'; /* too long */ |
|
| 475 |
+ } |
|
| 476 |
+ } |
|
| 477 |
+ if(hl->usedkeywordbuf>0 && !((ptr[i]>='0' && ptr[i]<='9') || (ptr[i]>='a' && ptr[i]<='z') || (ptr[i]>='A' && ptr[i]<='Z') || ptr[i]=='_')) {
|
|
| 478 |
+ if(hl_searchlist(keywords,nkeywords,hl->keywordbuf,hl->usedkeywordbuf,NULL)==0) {
|
|
| 479 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->keywordbufstart,color_keyword); |
|
| 480 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->keywordbufstart+hl->usedkeywordbuf-1,color_keyword); |
|
| 481 |
+ } |
|
| 482 |
+ hl->usedkeywordbuf=0; |
|
| 483 |
+ |
|
| 484 |
+ } |
|
| 485 |
+ /* keyword detection */ |
|
| 486 |
+ if(strchr("0123456789",ptr[i])!=NULL) {
|
|
| 487 |
+ cant_define=1; |
|
| 488 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_number); |
|
| 489 |
+ continue; |
|
| 490 |
+ } |
|
| 491 |
+ if(strchr("<>=+-%*/!|&^",ptr[i])!=NULL) {
|
|
| 492 |
+ cant_define=1; |
|
| 493 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_operator); |
|
| 494 |
+ continue; |
|
| 495 |
+ } |
|
| 496 |
+ if(strchr("(){}[],;",ptr[i])!=NULL) {
|
|
| 497 |
+ cant_define=1; |
|
| 498 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_symbol); |
|
| 499 |
+ continue; |
|
| 500 |
+ } |
|
| 501 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_normal); |
|
| 502 |
+ continue; |
|
| 503 |
+ } |
|
| 504 |
+ if(mode==mode_in_multilinecomment) {
|
|
| 505 |
+ if(prev_char=='\\' || ptr[i]=='\\') {
|
|
| 506 |
+ continue; |
|
| 507 |
+ } |
|
| 508 |
+ if(prev_char=='*' && ptr[i]=='/') {
|
|
| 509 |
+ prev_char_mask=0x00; |
|
| 510 |
+ mode=mlcprevmode; |
|
| 511 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_multilinecomment); |
|
| 512 |
+ continue; |
|
| 513 |
+ } |
|
| 514 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_multilinecomment); |
|
| 515 |
+ continue; |
|
| 516 |
+ } |
|
| 517 |
+ if(mode==mode_in_directive) {
|
|
| 518 |
+ if(prev_char=='\\' || ptr[i]=='\\') {
|
|
| 519 |
+ continue; |
|
| 520 |
+ } |
|
| 521 |
+ if(prev_char=='/' && ptr[i]=='/') {
|
|
| 522 |
+ mode=mode_in_linecomment; |
|
| 523 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i-1,color_linecomment); |
|
| 524 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_linecomment); |
|
| 525 |
+ continue; |
|
| 526 |
+ } |
|
| 527 |
+ if(prev_char=='/' && ptr[i]=='*') {
|
|
| 528 |
+ mlcprevmode=mode; |
|
| 529 |
+ mode=mode_in_multilinecomment; |
|
| 530 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i-1,color_multilinecomment); |
|
| 531 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_multilinecomment); |
|
| 532 |
+ continue; |
|
| 533 |
+ } |
|
| 534 |
+ /* directive detection */ |
|
| 535 |
+ if(!cant_directivekeyword && hl->useddirectivebuf==0 && ((ptr[i]>='a' && ptr[i]<='z') || (ptr[i]>='A' && ptr[i]<='Z') || ptr[i]=='_')) {
|
|
| 536 |
+ hl->directivebuf[hl->useddirectivebuf++]=ptr[i]; |
|
| 537 |
+ hl->directivebufstart=posoffset+i; |
|
| 538 |
+ } else if(hl->useddirectivebuf>0 && ((ptr[i]>='0' && ptr[i]<='9') || (ptr[i]>='a' && ptr[i]<='z') || (ptr[i]>='A' && ptr[i]<='Z') || ptr[i]=='_')) {
|
|
| 539 |
+ if(hl->useddirectivebuf<hl->sizedirectivebuf) {
|
|
| 540 |
+ hl->directivebuf[hl->useddirectivebuf++]=ptr[i]; |
|
| 541 |
+ } else {
|
|
| 542 |
+ hl->directivebuf[0]='\0'; /* too long */ |
|
| 543 |
+ cant_directivekeyword=1; |
|
| 544 |
+ } |
|
| 545 |
+ } |
|
| 546 |
+ if(hl->useddirectivebuf>0 && !((ptr[i]>='0' && ptr[i]<='9') || (ptr[i]>='a' && ptr[i]<='z') || (ptr[i]>='A' && ptr[i]<='Z') || ptr[i]=='_')) {
|
|
| 547 |
+ int nfound; |
|
| 548 |
+ if(hl_searchlist(directives,ndirectives,hl->directivebuf,hl->useddirectivebuf,&nfound)==0) {
|
|
| 549 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->directivebufstart,color_directivekeyword); |
|
| 550 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->directivebufstart+hl->useddirectivebuf-1,color_directivekeyword); |
|
| 551 |
+ if(strcmp(directives[nfound],"include")==0) |
|
| 552 |
+ is_directiveinclude=1; |
|
| 553 |
+ } |
|
| 554 |
+ hl->useddirectivebuf=0; |
|
| 555 |
+ cant_directivekeyword=1; |
|
| 556 |
+ } |
|
| 557 |
+ if(ptr[i]!=' ' && ptr[i]!='\t') |
|
| 558 |
+ cant_directivekeyword=1; |
|
| 559 |
+ /* directive detection */ |
|
| 560 |
+ if(ptr[i]=='\"') {
|
|
| 561 |
+ mode=mode_in_directivestring; |
|
| 562 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,(is_directiveinclude==0)?color_directivestring:color_directiveincludestring); |
|
| 563 |
+ continue; |
|
| 564 |
+ } |
|
| 565 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,(is_directiveinclude==0)?color_directive:color_directiveinclude); |
|
| 566 |
+ continue; |
|
| 567 |
+ } |
|
| 568 |
+ if(mode==mode_in_directivestring) {
|
|
| 569 |
+ if(prev_char=='\\' || ptr[i]=='\\') {
|
|
| 570 |
+ continue; |
|
| 571 |
+ } |
|
| 572 |
+ if(ptr[i]=='\"') {
|
|
| 573 |
+ mode=mode_in_directive; |
|
| 574 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,(is_directiveinclude==0)?color_directivestring:color_directiveincludestring); |
|
| 575 |
+ continue; |
|
| 576 |
+ } |
|
| 577 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,(is_directiveinclude==0)?color_directivestring:color_directiveincludestring); |
|
| 578 |
+ continue; |
|
| 579 |
+ } |
|
| 580 |
+ if(mode==mode_in_string) {
|
|
| 581 |
+ if(prev_char=='\\' || ptr[i]=='\\') {
|
|
| 582 |
+ continue; |
|
| 583 |
+ } |
|
| 584 |
+ if(ptr[i]=='\"') {
|
|
| 585 |
+ mode=mode_whatever; |
|
| 586 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_string); |
|
| 587 |
+ continue; |
|
| 588 |
+ } |
|
| 589 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_string); |
|
| 590 |
+ continue; |
|
| 591 |
+ } |
|
| 592 |
+ if(mode==mode_in_linecomment) {
|
|
| 593 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,posoffset+i,color_linecomment); |
|
| 594 |
+ continue; |
|
| 595 |
+ } |
|
| 596 |
+ } |
|
| 597 |
+ posoffset+=len; |
|
| 598 |
+ } while(has_next!=0 && (pos+posoffset)<redataused); |
|
| 599 |
+ /* special case: keyword ends at end-of-line */ |
|
| 600 |
+ if(mode==mode_whatever && hl->usedkeywordbuf>0 && hl_searchlist(keywords,nkeywords,hl->keywordbuf,hl->usedkeywordbuf,NULL)==0) {
|
|
| 601 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->keywordbufstart,color_keyword); |
|
| 602 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->keywordbufstart+hl->usedkeywordbuf-1,color_keyword); |
|
| 603 |
+ } |
|
| 604 |
+ /* end of special case */ |
|
| 605 |
+ /* special case: deirectivekeyword ends at end-of-line */ |
|
| 606 |
+ if(mode==mode_in_directive && hl->useddirectivebuf>0 && hl_searchlist(directives,ndirectives,hl->directivebuf,hl->useddirectivebuf,NULL)==0) {
|
|
| 607 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->directivebufstart,color_directivekeyword); |
|
| 608 |
+ linecolor=hl_addtolinecolor(&opaque,hl,linecolor,hl->directivebufstart+hl->useddirectivebuf-1,color_directivekeyword); |
|
| 609 |
+ } |
|
| 610 |
+ /* end of special case */ |
|
| 611 |
+ if(linecolor==NULL) |
|
| 612 |
+ return(-1); |
|
| 613 |
+ if((prev_char=='\\' && mode!=mode_in_linecomment) || mode==mode_in_multilinecomment) |
|
| 614 |
+ line->endingmode=mode; |
|
| 615 |
+ hl->usedlines++; |
|
| 616 |
+ return(0); |
|
| 617 |
+} |
|
| 618 |
+ |
|
| 619 |
+ |
|
| 620 |
+int |
|
| 621 |
+hl_C_getkeywords(char ***keywords,int *nkeywords, int *maxlen) |
|
| 622 |
+{
|
|
| 623 |
+ static int init=0; |
|
| 624 |
+ static int staticnkeywords=0; |
|
| 625 |
+ static int staticmaxlen=0; |
|
| 626 |
+ static const char *C_keywords[]={
|
|
| 627 |
+"auto", |
|
| 628 |
+"break", |
|
| 629 |
+"case", |
|
| 630 |
+"char", |
|
| 631 |
+"const", |
|
| 632 |
+"continue", |
|
| 633 |
+"default", |
|
| 634 |
+"do", |
|
| 635 |
+"double", |
|
| 636 |
+"else", |
|
| 637 |
+"enum", |
|
| 638 |
+"extern", |
|
| 639 |
+"float", |
|
| 640 |
+"for", |
|
| 641 |
+"goto", |
|
| 642 |
+"if", |
|
| 643 |
+"inline", |
|
| 644 |
+"int", |
|
| 645 |
+"long", |
|
| 646 |
+"register", |
|
| 647 |
+"restrict", |
|
| 648 |
+"return", |
|
| 649 |
+"short", |
|
| 650 |
+"signed", |
|
| 651 |
+"sizeof", |
|
| 652 |
+"static", |
|
| 653 |
+"struct", |
|
| 654 |
+"switch", |
|
| 655 |
+"typedef", |
|
| 656 |
+"union", |
|
| 657 |
+"unsigned", |
|
| 658 |
+"void", |
|
| 659 |
+"volatile", |
|
| 660 |
+"while", |
|
| 661 |
+"_Alignas", |
|
| 662 |
+"_Alignof", |
|
| 663 |
+"_Atomic", |
|
| 664 |
+"_Bool", |
|
| 665 |
+"_Complex", |
|
| 666 |
+"_Generic", |
|
| 667 |
+"_Imaginary", |
|
| 668 |
+"_Noreturn", |
|
| 669 |
+"_Static_assert", |
|
| 670 |
+"_Thread_local", |
|
| 671 |
+NULL |
|
| 672 |
+}; |
|
| 673 |
+ if(keywords==NULL || nkeywords==NULL) |
|
| 674 |
+ return(-1); |
|
| 675 |
+ if(init==0) {
|
|
| 676 |
+ int k,l,maxl; |
|
| 677 |
+ for(k=0,maxl=0;C_keywords[k]!=NULL;k++) {
|
|
| 678 |
+ l=strlen(C_keywords[k]); |
|
| 679 |
+ maxl=(l>maxl)?l:maxl; |
|
| 680 |
+ } |
|
| 681 |
+ staticnkeywords=k; |
|
| 682 |
+ staticmaxlen=maxl; |
|
| 683 |
+ init=1; |
|
| 684 |
+ } |
|
| 685 |
+ *keywords=(char **)C_keywords; |
|
| 686 |
+ *nkeywords=staticnkeywords; |
|
| 687 |
+ if(maxlen!=NULL) |
|
| 688 |
+ *maxlen=staticmaxlen; |
|
| 689 |
+ return(0); |
|
| 690 |
+} |
|
| 691 |
+ |
|
| 692 |
+int |
|
| 693 |
+hl_C_getdirectives(char ***directives,int *ndirectives, int *maxlen) |
|
| 694 |
+{
|
|
| 695 |
+ static int init=0; |
|
| 696 |
+ static int staticndirectives=0; |
|
| 697 |
+ static int staticmaxlen=0; |
|
| 698 |
+ static const char *C_directives[]={
|
|
| 699 |
+"define", |
|
| 700 |
+"undef", |
|
| 701 |
+"include", |
|
| 702 |
+"if", |
|
| 703 |
+"ifdef", |
|
| 704 |
+"ifndef", |
|
| 705 |
+"else", |
|
| 706 |
+"elif", |
|
| 707 |
+"endif", |
|
| 708 |
+"line", |
|
| 709 |
+"error", |
|
| 710 |
+"pragma", |
|
| 711 |
+}; |
|
| 712 |
+ if(directives==NULL || ndirectives==NULL) |
|
| 713 |
+ return(-1); |
|
| 714 |
+ if(init==0) {
|
|
| 715 |
+ int k,l,maxl; |
|
| 716 |
+ for(k=0,maxl=0;C_directives[k]!=NULL;k++) {
|
|
| 717 |
+ l=strlen(C_directives[k]); |
|
| 718 |
+ maxl=(l>maxl)?l:maxl; |
|
| 719 |
+ } |
|
| 720 |
+ staticndirectives=k; |
|
| 721 |
+ staticmaxlen=maxl; |
|
| 722 |
+ init=1; |
|
| 723 |
+ } |
|
| 724 |
+ *directives=(char **)C_directives; |
|
| 725 |
+ *ndirectives=staticndirectives; |
|
| 726 |
+ if(maxlen!=NULL) |
|
| 727 |
+ *maxlen=staticmaxlen; |
|
| 728 |
+ return(0); |
|
| 729 |
+} |
|
| 730 |
+ |
|
| 731 |
+int |
|
| 732 |
+hl_searchlist(char **wordlist, int wordlistlen, char *word, int wordlen, int *res) |
|
| 733 |
+{
|
|
| 734 |
+ int k; |
|
| 735 |
+ if(wordlist==NULL || wordlistlen<0 || word==NULL || wordlen<0) |
|
| 736 |
+ return(-1); /* sanity check failed */ |
|
| 737 |
+ for(k=0;k<wordlistlen;k++) {
|
|
| 738 |
+ if(memcmp(wordlist[k],word,wordlen)==0 && (wordlist[k])[wordlen]=='\0') {
|
|
| 739 |
+ if(res!=NULL) |
|
| 740 |
+ *res=k; |
|
| 741 |
+ return(0); /* word found */ |
|
| 742 |
+ } |
|
| 743 |
+ } |
|
| 744 |
+ return(-1); /* word not found */ |
|
| 745 |
+} |
|
| 746 |
+ |
|
| 747 |
+ |
|
| 748 |
+linecolor_t * |
|
| 749 |
+hl_addtolinecolor(int *opaque, highlighter_t *hl,linecolor_t *linecolor,int posoff,int color) |
|
| 750 |
+{
|
|
| 751 |
+ hline_t *line; |
|
| 752 |
+ if(opaque==NULL || *opaque<0 || hl==NULL || (posoff!=0 && linecolor==NULL) || color<0 || posoff<0) |
|
| 753 |
+ return(NULL); /* sanity check failed */ |
|
| 754 |
+#if 0 |
|
| 755 |
+#define DEBUGLINE 12 |
|
| 756 |
+if(hl->usedlines==DEBUGLINE) {
|
|
| 757 |
+int i,k; |
|
| 758 |
+int l=hl->lines[hl->usedlines].len; |
|
| 759 |
+linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 760 |
+fprintf(stderr,"addtolinecolor pre.: nline:%i *opaque:%i posoff:%i color:%i current:\"",hl->usedlines,*opaque,posoff,color); |
|
| 761 |
+for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 762 |
+ for(i=0;i<lc->len;i++) |
|
| 763 |
+ fprintf(stderr,"%x",lc->color); |
|
| 764 |
+} |
|
| 765 |
+hl->keywordbuf[hl->usedkeywordbuf]='\0'; |
|
| 766 |
+hl->directivebuf[hl->useddirectivebuf]='\0'; |
|
| 767 |
+fprintf(stderr,"\" (%i%s%s%s,%i%s%s%s)\n", |
|
| 768 |
+hl->usedkeywordbuf, |
|
| 769 |
+(hl->usedkeywordbuf==0)?"":" \"", |
|
| 770 |
+(hl->usedkeywordbuf==0)?"":hl->keywordbuf, |
|
| 771 |
+(hl->usedkeywordbuf==0)?"":"\"", |
|
| 772 |
+hl->useddirectivebuf, |
|
| 773 |
+(hl->useddirectivebuf==0)?"":" \"", |
|
| 774 |
+(hl->useddirectivebuf==0)?"":hl->directivebuf, |
|
| 775 |
+(hl->useddirectivebuf==0)?"":"\"" |
|
| 776 |
+); |
|
| 777 |
+} |
|
| 778 |
+#endif |
|
| 779 |
+ /* make sure there is a space for a linecolor_t in buf */ |
|
| 780 |
+ if((hl->usedbuf+sizeof(linecolor_t))>=hl->sizebuf) {
|
|
| 781 |
+ char *newbuf; |
|
| 782 |
+ int newsize=(hl->sizebuf+sizeof(linecolor_t)+BUFBLOCK-1)/BUFBLOCK; |
|
| 783 |
+ newsize*=BUFBLOCK; |
|
| 784 |
+ if((newbuf=realloc(hl->buf,newsize))==NULL) |
|
| 785 |
+ return(NULL); /* insufficient memory */ |
|
| 786 |
+ hl->buf=newbuf; |
|
| 787 |
+ memset(hl->buf+hl->sizebuf,0,(newsize-hl->sizebuf)); |
|
| 788 |
+ hl->sizebuf=newsize; |
|
| 789 |
+ } |
|
| 790 |
+ line=hl->lines+hl->usedlines; |
|
| 791 |
+ /* posoff==0 means "do init" */ |
|
| 792 |
+ if(posoff==0) {
|
|
| 793 |
+ line->off=(hl->usedlines==0)?0:hl->lines[hl->usedlines-1].off+hl->lines[hl->usedlines-1].len; |
|
| 794 |
+ line->len=sizeof(linecolor_t); |
|
| 795 |
+ linecolor=(linecolor_t *) (hl->buf+line->off); |
|
| 796 |
+ linecolor->len=1; |
|
| 797 |
+ linecolor->color=color; |
|
| 798 |
+ *opaque=1; |
|
| 799 |
+#if 0 |
|
| 800 |
+if(hl->usedlines==DEBUGLINE) {
|
|
| 801 |
+int i,k; |
|
| 802 |
+int l=hl->lines[hl->usedlines].len; |
|
| 803 |
+linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 804 |
+fprintf(stderr,"addtolinecolor post: nline:%i *opaque:%i posoff:%i color:%i \"",hl->usedlines,*opaque,posoff,color); |
|
| 805 |
+for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 806 |
+ for(i=0;i<lc->len;i++) |
|
| 807 |
+ fprintf(stderr,"%x",lc->color); |
|
| 808 |
+} |
|
| 809 |
+fprintf(stderr,"\"\n"); |
|
| 810 |
+} |
|
| 811 |
+#endif |
|
| 812 |
+ return(linecolor); |
|
| 813 |
+ } |
|
| 814 |
+ /* if posoff was already done, truncate */ |
|
| 815 |
+ if(posoff<*opaque) {
|
|
| 816 |
+ int delta,maxdelta; |
|
| 817 |
+ int l; |
|
| 818 |
+ maxdelta=line->len; |
|
| 819 |
+ line->len=0; |
|
| 820 |
+ for(delta=0,l=0;delta<maxdelta;l+=linecolor->len,delta+=sizeof(linecolor_t)) {
|
|
| 821 |
+ linecolor=(linecolor_t *) (hl->buf+line->off+delta); |
|
| 822 |
+ line->len=delta; |
|
| 823 |
+ if((l+linecolor->len)>=posoff) {
|
|
| 824 |
+ line->len+=sizeof(linecolor_t); |
|
| 825 |
+ linecolor->len=posoff-l; |
|
| 826 |
+ *opaque=posoff; |
|
| 827 |
+ break; |
|
| 828 |
+ } |
|
| 829 |
+ } |
|
| 830 |
+ hl->usedbuf=line->off+line->len; |
|
| 831 |
+ } |
|
| 832 |
+ linecolor=(linecolor_t *) (hl->buf+line->off+line->len); |
|
| 833 |
+ /* if we have not changed color, expand */ |
|
| 834 |
+ if(linecolor[-1].color==color) {
|
|
| 835 |
+ int added=(posoff-*opaque)+1; |
|
| 836 |
+ linecolor[-1].len+=added; |
|
| 837 |
+ *opaque+=added; |
|
| 838 |
+#if 0 |
|
| 839 |
+if(hl->usedlines==DEBUGLINE) {
|
|
| 840 |
+int i,k; |
|
| 841 |
+int l=hl->lines[hl->usedlines].len; |
|
| 842 |
+linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 843 |
+fprintf(stderr,"addtolinecolor post: nline:%i *opaque:%i posoff:%i color:%i \"",hl->usedlines,*opaque,posoff,color); |
|
| 844 |
+for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 845 |
+ for(i=0;i<lc->len;i++) |
|
| 846 |
+ fprintf(stderr,"%x",lc->color); |
|
| 847 |
+} |
|
| 848 |
+fprintf(stderr,"\"\n"); |
|
| 284 | 849 |
} |
| 850 |
+#endif |
|
| 851 |
+ return(linecolor-1); |
|
| 852 |
+ } |
|
| 853 |
+ /* add new linecolor */ |
|
| 854 |
+ linecolor->len=1; |
|
| 855 |
+ linecolor->color=color; |
|
| 856 |
+ *opaque+=1; |
|
| 857 |
+ line->len+=sizeof(linecolor_t); |
|
| 858 |
+ hl->usedbuf+=sizeof(linecolor_t); |
|
| 859 |
+#if 0 |
|
| 860 |
+if(hl->usedlines==DEBUGLINE) {
|
|
| 861 |
+int i,k; |
|
| 862 |
+int l=hl->lines[hl->usedlines].len; |
|
| 863 |
+linecolor_t *lc=(linecolor_t *) (hl->buf+hl->lines[hl->usedlines].off); |
|
| 864 |
+fprintf(stderr,"addtolinecolor post: nline:%i *opaque:%i posoff:%i color:%i \"",hl->usedlines,*opaque,posoff,color); |
|
| 865 |
+for(k=0;k<l;k+=sizeof(linecolor_t),lc++) {
|
|
| 866 |
+ for(i=0;i<lc->len;i++) |
|
| 867 |
+ fprintf(stderr,"%x",lc->color); |
|
| 868 |
+} |
|
| 869 |
+fprintf(stderr,"\"\n"); |
|
| 870 |
+} |
|
| 871 |
+#endif |
|
| 872 |
+ return(linecolor); |
|
| 873 |
+} |
|
| 874 |
+ |
|
| 285 | 875 |
|
| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,285 @@ |
| 1 |
+/* |
|
| 2 |
+ * re_plugin_highlighter.c |
|
| 3 |
+ * |
|
| 4 |
+ * A programmers editor |
|
| 5 |
+ * |
|
| 6 |
+ * re_data plugin to support the syntax highlighter. |
|
| 7 |
+ * |
|
| 8 |
+ * Author: Dario Rodriguez dario@softhome.net |
|
| 9 |
+ * This program is licensed under the terms of GNU GPL v2.1+ |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include <stdio.h> |
|
| 13 |
+#include <stdlib.h> |
|
| 14 |
+#include <unistd.h> |
|
| 15 |
+#include <string.h> |
|
| 16 |
+#include <fcntl.h> |
|
| 17 |
+#include <stdarg.h> |
|
| 18 |
+#include <sys/types.h> |
|
| 19 |
+#include <sys/stat.h> |
|
| 20 |
+ |
|
| 21 |
+ |
|
| 22 |
+#include "re_plugin_highlighter.h" |
|
| 23 |
+ |
|
| 24 |
+#define PLUGINNAME "highlighter" |
|
| 25 |
+#define HIGHLIGHTERGROWSIZE (256*1024) |
|
| 26 |
+#define DEFAULTCOLOR "\x80\x80\x80\xff" |
|
| 27 |
+ |
|
| 28 |
+ |
|
| 29 |
+typedef enum colorsenum_t {
|
|
| 30 |
+ color_normal=0, |
|
| 31 |
+ color_define, |
|
| 32 |
+ color_definestring, |
|
| 33 |
+ color_keyword, |
|
| 34 |
+ color_string, |
|
| 35 |
+ color_multilinecomment, |
|
| 36 |
+ color_linecomment, |
|
| 37 |
+ color_number, |
|
| 38 |
+ color_endenum, |
|
| 39 |
+} colorsenum_t; |
|
| 40 |
+ |
|
| 41 |
+ |
|
| 42 |
+static int redata_highlighter_add(redata_t *redata, redata_plugin_t *slot, undo_t *undo); |
|
| 43 |
+static int redata_highlighter_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo); |
|
| 44 |
+static int redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo, int is_unadd); |
|
| 45 |
+static int redata_highlighter_commit(redata_t *redata, redata_plugin_t *slot,char *filename); |
|
| 46 |
+static int redata_highlighter_postload(redata_t *redata, redata_plugin_t *slot,char *filename); |
|
| 47 |
+ |
|
| 48 |
+static int hl_invalidatefrom(redata_t *redata, highlighter_t *hl, int nline); |
|
| 49 |
+hcolor_t *hl_initcolors(int *ncolors, /* int color, char *colordef, */ ...); |
|
| 50 |
+static highlighter_t *hl_getplugin(redata_t *redata); |
|
| 51 |
+static int hl_doline(redata_t *redata, highlighter_t *hl, int nline); |
|
| 52 |
+ |
|
| 53 |
+int |
|
| 54 |
+redata_highlighter_register(redata_t *redata, redata_plugin_t *slot) |
|
| 55 |
+{
|
|
| 56 |
+ hcolor_t *colors; |
|
| 57 |
+ int ncolors; |
|
| 58 |
+ highlighter_t *hl; |
|
| 59 |
+ if(redata==NULL || slot==NULL) |
|
| 60 |
+ return(-1); |
|
| 61 |
+ colors=hl_initcolors(&ncolors, |
|
| 62 |
+ color_normal,"\x38\x17\x1e\xff", |
|
| 63 |
+ color_define,"\x0d\x2b\x04\xff", |
|
| 64 |
+ color_definestring,"\x07\x20\3b\xff", |
|
| 65 |
+ color_keyword,"\x9d\x15\x00\xff", |
|
| 66 |
+ color_string,"\x68\x00\x01\xff", |
|
| 67 |
+ color_multilinecomment,"\x4f\x40\x57\xff", |
|
| 68 |
+ color_linecomment,"\xaa\x8c\xcd\xff", |
|
| 69 |
+ color_number,"\x3b\x10\x35\xff", |
|
| 70 |
+ color_endenum,DEFAULTCOLOR, |
|
| 71 |
+ -1); |
|
| 72 |
+ if(colors==NULL || (hl=malloc(sizeof(highlighter_t)))==NULL) {
|
|
| 73 |
+ if(colors!=NULL) |
|
| 74 |
+ free(colors),colors=NULL; |
|
| 75 |
+ return(-1); /* insufficient memory */ |
|
| 76 |
+ } |
|
| 77 |
+ memset(hl,0,sizeof(highlighter_t)); |
|
| 78 |
+ hl->sizebuf=hl->usedbuf=0; |
|
| 79 |
+ hl->sizecolors=ncolors; |
|
| 80 |
+ hl->colors=colors; |
|
| 81 |
+ strncpy(slot->name,PLUGINNAME,sizeof(slot->name)); |
|
| 82 |
+ slot->name[sizeof(slot->name)-1]='\0'; |
|
| 83 |
+ slot->unregister=redata_highlighter_unregister; |
|
| 84 |
+ slot->postload=redata_highlighter_postload; |
|
| 85 |
+ slot->add=redata_highlighter_add; |
|
| 86 |
+ slot->unadd=redata_highlighter_unadd; |
|
| 87 |
+ slot->commit=redata_highlighter_commit; |
|
| 88 |
+ slot->userptr=hl; |
|
| 89 |
+ return(0); |
|
| 90 |
+} |
|
| 91 |
+ |
|
| 92 |
+int |
|
| 93 |
+redata_highlighter_unregister(redata_t *redata, redata_plugin_t *slot, char *filename) |
|
| 94 |
+{
|
|
| 95 |
+ highlighter_t *hl=(highlighter_t *) ((slot!=NULL)?(slot->userptr):NULL); |
|
| 96 |
+ if(redata==NULL || slot==NULL || hl==NULL) |
|
| 97 |
+ return(-1); |
|
| 98 |
+ if(hl->buf!=NULL) |
|
| 99 |
+ free(hl->buf),hl->buf=NULL; |
|
| 100 |
+ hl->sizebuf=hl->usedbuf=0; |
|
| 101 |
+ if(hl->colors!=NULL) |
|
| 102 |
+ free(hl->colors),hl->colors=NULL; |
|
| 103 |
+ hl->sizecolors=0; |
|
| 104 |
+ if(hl->lines!=NULL) |
|
| 105 |
+ free(hl->lines),hl->lines=NULL; |
|
| 106 |
+ hl->sizelines=hl->usedlines=0; |
|
| 107 |
+ if(slot->userptr!=NULL) |
|
| 108 |
+ free(slot->userptr),slot->userptr=NULL; |
|
| 109 |
+ return(0); |
|
| 110 |
+} |
|
| 111 |
+ |
|
| 112 |
+hcolor_t * |
|
| 113 |
+redata_highlighter_getcolors(redata_t *redata, int *ncolors) |
|
| 114 |
+{
|
|
| 115 |
+ highlighter_t *hl; |
|
| 116 |
+ if(redata==NULL || (hl=hl_getplugin(redata))==NULL) |
|
| 117 |
+ return(NULL); /* sanity check failed or plugin not found */ |
|
| 118 |
+ if(ncolors!=NULL) |
|
| 119 |
+ *ncolors=hl->sizecolors; |
|
| 120 |
+ return(hl->colors); |
|
| 121 |
+} |
|
| 122 |
+ |
|
| 123 |
+linecolor_t * |
|
| 124 |
+redata_highlighter_getline(redata_t *redata, int line, int *nlinecolors) |
|
| 125 |
+{
|
|
| 126 |
+ highlighter_t *hl; |
|
| 127 |
+ if(redata==NULL || line<0 || (hl=hl_getplugin(redata))==NULL) |
|
| 128 |
+ return(NULL); /* sanity check failed or plugin not found */ |
|
| 129 |
+ if(!hl->flag_doneall) |
|
| 130 |
+ hl_doline(redata,hl,line); |
|
| 131 |
+ if(line<0 || line>=hl->usedlines) |
|
| 132 |
+ return(NULL); |
|
| 133 |
+ if(nlinecolors!=NULL) |
|
| 134 |
+ *nlinecolors=(hl->lines[line].len)/sizeof(hcolor_t); |
|
| 135 |
+ return((linecolor_t *) (hl->buf+hl->lines[line].off)); |
|
| 136 |
+} |
|
| 137 |
+ |
|
| 138 |
+static int |
|
| 139 |
+redata_highlighter_add(redata_t *redata, redata_plugin_t *slot, undo_t *undo) |
|
| 140 |
+{
|
|
| 141 |
+ return(redata_highlighter_add_or_unadd(redata, slot, undo, 0)); |
|
| 142 |
+} |
|
| 143 |
+ |
|
| 144 |
+static int |
|
| 145 |
+redata_highlighter_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo) |
|
| 146 |
+{
|
|
| 147 |
+ return(redata_highlighter_add_or_unadd(redata, slot, undo, 1)); |
|
| 148 |
+} |
|
| 149 |
+ |
|
| 150 |
+ |
|
| 151 |
+static int |
|
| 152 |
+redata_highlighter_add_or_unadd(redata_t *redata, redata_plugin_t *slot, undo_t *undo, int is_unadd) |
|
| 153 |
+{
|
|
| 154 |
+ long pos; |
|
| 155 |
+ int nline; |
|
| 156 |
+ undostack_t *stack; |
|
| 157 |
+ highlighter_t *hl=(highlighter_t *) ((slot!=NULL)?(slot->userptr):NULL); |
|
| 158 |
+ stack=redata_getstack(redata,undo); |
|
| 159 |
+ if(redata==NULL || slot==NULL || hl==NULL || undo==NULL || stack==NULL || slot->active==0) |
|
| 160 |
+ return(-1); /* sanity check failed */ |
|
| 161 |
+ /* get the first pos of the operation */ |
|
| 162 |
+ pos=undo->posorig; |
|
| 163 |
+ if(undo->type=='D') |
|
| 164 |
+ pos-=undo->len; |
|
| 165 |
+ if(undo->type=='M' && undo->posdest<pos) |
|
| 166 |
+ pos=undo->posdest; |
|
| 167 |
+ /* get line of pos */ |
|
| 168 |
+ for(nline=0;nline<hl->usedlines;nline++) {
|
|
| 169 |
+ if(hl->lines[nline].pos>pos) {
|
|
| 170 |
+ nline--; |
|
| 171 |
+ break; |
|
| 172 |
+ } |
|
| 173 |
+ } |
|
| 174 |
+ /* invalidate from this line on */ |
|
| 175 |
+ hl_invalidatefrom(redata,hl,nline); |
|
| 176 |
+ return(0); |
|
| 177 |
+} |
|
| 178 |
+ |
|
| 179 |
+static int |
|
| 180 |
+redata_highlighter_commit(redata_t *redata, redata_plugin_t *slot,char *filename) |
|
| 181 |
+{
|
|
| 182 |
+ highlighter_t *hl=(highlighter_t *) ((slot!=NULL)?(slot->userptr):NULL); |
|
| 183 |
+ if(redata==NULL || hl==NULL || filename==NULL) |
|
| 184 |
+ return(-1); /* sanity check failed */ |
|
| 185 |
+ if(hl->flag_doneall) |
|
| 186 |
+ return(0); |
|
| 187 |
+ /* calc highlight of one additional line */ |
|
| 188 |
+ hl_doline(redata, hl, hl->usedlines); |
|
| 189 |
+ return(0); |
|
| 190 |
+} |
|
| 191 |
+ |
|
| 192 |
+static int |
|
| 193 |
+redata_highlighter_postload(redata_t *redata, redata_plugin_t *slot,char *filename) |
|
| 194 |
+{
|
|
| 195 |
+#warning XXX TODO: get the language from the filename |
|
| 196 |
+ return(-1); |
|
| 197 |
+} |
|
| 198 |
+ |
|
| 199 |
+ |
|
| 200 |
+static int |
|
| 201 |
+hl_invalidatefrom(redata_t *redata, highlighter_t *hl, int nline) |
|
| 202 |
+{
|
|
| 203 |
+ if(redata==NULL || hl==NULL || nline<0) |
|
| 204 |
+ return(-1); /* sanity check failed */ |
|
| 205 |
+ if(nline>=hl->usedlines) |
|
| 206 |
+ return(0); /* nothing to do */ |
|
| 207 |
+ if(nline==0) {
|
|
| 208 |
+ hl->usedbuf=0; |
|
| 209 |
+ hl->usedlines=0; |
|
| 210 |
+ } |
|
| 211 |
+ hl->usedbuf=hl->lines[nline].off; |
|
| 212 |
+ hl->usedlines=nline; |
|
| 213 |
+ hl->flag_doneall=0; |
|
| 214 |
+ return(0); |
|
| 215 |
+} |
|
| 216 |
+ |
|
| 217 |
+hcolor_t * |
|
| 218 |
+hl_initcolors(int *ncolors, /* int color, char *colordef, */ ...) |
|
| 219 |
+{
|
|
| 220 |
+ int maxcolor; |
|
| 221 |
+ int color; |
|
| 222 |
+ char *colordef; |
|
| 223 |
+ int round; |
|
| 224 |
+ hcolor_t *hcolors; |
|
| 225 |
+ va_list paramlist; |
|
| 226 |
+ int i; |
|
| 227 |
+ static char defcolor[]={DEFAULTCOLOR};
|
|
| 228 |
+ if(ncolors==NULL) |
|
| 229 |
+ return(NULL); /* sanity check failed */ |
|
| 230 |
+ *ncolors=0; |
|
| 231 |
+ hcolors=NULL; |
|
| 232 |
+ for(round=0;round<2;round++) {
|
|
| 233 |
+ maxcolor=-1; |
|
| 234 |
+ va_start(paramlist,ncolors); |
|
| 235 |
+ while((color=va_arg(paramlist,int))>=0) {
|
|
| 236 |
+ colordef=va_arg(paramlist,char *); |
|
| 237 |
+ maxcolor=(maxcolor<color)?color:maxcolor; |
|
| 238 |
+ if(round==1) {
|
|
| 239 |
+ strncpy(hcolors[color].rgba,colordef,sizeof(hcolors[color].rgba)); |
|
| 240 |
+ hcolors[color].rgba[sizeof(hcolors[color].rgba)-1]='\0'; |
|
| 241 |
+ } |
|
| 242 |
+ } |
|
| 243 |
+ va_end(paramlist); |
|
| 244 |
+ if(maxcolor<0) |
|
| 245 |
+ return(NULL); /* no colors were defined */ |
|
| 246 |
+ if(round==0) {
|
|
| 247 |
+ if((hcolors=malloc(sizeof(hcolor_t)*(maxcolor+1)))==NULL) |
|
| 248 |
+ return(NULL); /* insufficient memory */ |
|
| 249 |
+ memset(hcolors,0,sizeof(hcolor_t)*(maxcolor+1)); |
|
| 250 |
+ for(i=0;i<=maxcolor;i++) |
|
| 251 |
+ memcpy(hcolors[i].rgba,defcolor,sizeof(defcolor)); |
|
| 252 |
+ } |
|
| 253 |
+ } |
|
| 254 |
+ *ncolors=maxcolor+1; |
|
| 255 |
+ return(hcolors); |
|
| 256 |
+} |
|
| 257 |
+ |
|
| 258 |
+static highlighter_t * |
|
| 259 |
+hl_getplugin(redata_t *redata) |
|
| 260 |
+{
|
|
| 261 |
+ highlighter_t *hl; |
|
| 262 |
+ int i; |
|
| 263 |
+ if(redata==NULL) |
|
| 264 |
+ return(NULL); /* sanity check failed */ |
|
| 265 |
+ for(i=0;i<redata->sizeplugins;i++) {
|
|
| 266 |
+ if(strcmp(redata->plugins[i].name,PLUGINNAME)==0) |
|
| 267 |
+ break; |
|
| 268 |
+ } |
|
| 269 |
+ if(i>=redata->sizeplugins || redata->plugins[i].active==0) |
|
| 270 |
+ return(NULL); /* plugin not found or nor active */ |
|
| 271 |
+ hl=(highlighter_t *) (redata->plugins[i].userptr); |
|
| 272 |
+ if(hl==NULL) |
|
| 273 |
+ return(NULL); /* internal error */ |
|
| 274 |
+ return(hl); |
|
| 275 |
+} |
|
| 276 |
+ |
|
| 277 |
+ |
|
| 278 |
+static int |
|
| 279 |
+hl_doline(redata_t *redata, highlighter_t *hl, int nline) |
|
| 280 |
+{
|
|
| 281 |
+ /* NOTE: here comes the highlighter */ |
|
| 282 |
+#warning XXX TODO: implement this |
|
| 283 |
+ return(-1); |
|
| 284 |
+} |
|
| 285 |
+ |