最近在折腾scintilla,无法调试,自定义的语法高亮很ao tou

来源:互联网 发布:谁有c语言数据结构视频 编辑:程序博客网 时间:2024/06/05 04:49

最近在折腾scintilla,无法调试,自定义的语法高亮很ao tou

 

2012.12.31日,目前搞定了大部分功能,包括语法高亮,自动完成,语法提示等功能。

 

语法高亮一直看不懂示例代码,后来直接把scintilla的源代码编译到工程中,这样就可以调试了,勉强加入了语法高亮功能。

加入了一个函数,至于效率,应该是不高的,好在也不用太高,功能有bug,慢慢去完善了。

 

 StyleContext加入了一个叫reset的函数,修改StyleContext的pos之后,调用reset,使各相关变量保持正确

int private_getchar(unsigned int pos){int ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));if (styler.IsLeadByte(static_cast<char>(ch))) {ch = ch << 8;ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));}return ch;}void reset(){if( ( int )( currentPos - 1 ) > 0 ){chPrev = private_getchar( currentPos - 1 );}else{chPrev = ' ';}ch = private_getchar( currentPos );if( currentPos < endPos ){chNext = private_getchar( currentPos + 1 );}else{chNext = ' ';}// End of line?// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win)// or on LF alone (Unix). Avoid triggering two times on Dos/Win.atLineEnd = (ch == '\r' && chNext != '\n') ||(ch == '\n') ||(currentPos >= endPos);if( currentPos < endPos ){atLineStart = atLineEnd;}else{atLineStart = false;atLineEnd = true;}}


下面这个函数用来分析代码中的各符号的类型

char * sst____token_buffer = new char[ 0x20000 ];const char ss____oper[ 0x40 ] = "|~!@#$%^&()[]{}=+-*/\\,.:;<>?";#defineIS_NULL(0)#defineIS_WORD(1)#defineIS_STRING(2)#defineIS_HEX(3)#defineIS_OPER(4)#defineIS_LINE_MASK(5)#defineIS_MASK(6)#defineIS_IF_0(7)#defineIS_IF_1(8)#defineIS_HEX_WRONG(9)// 输入的不完整的hexintis_ss_oper( int p ){size_t l = strlen( ss____oper );size_t i;for( i = 0; i < l; i++ ){if( p == ss____oper[ i ] ){return 1;}}return 0;}//***********// 向前预览一个单词// 返回长度// sc不变// 2012.12.14 修改bug,在行注释最后操作,仍然是行注释// 2012.12.14 修改bug,增加两个参数,返回上,下一个非空字符,如果没有,返回0//***********void sst( StyleContext *sc, int *type, int *len, int *prev_char, int *next_char ){char *q = sst____token_buffer;int count = 0;int ishex = 1;int ch;int oldpos = sc->currentPos;*prev_char = 0;*next_char = 0;if( !sc->More() ){*sst____token_buffer = 0x00;if( len ){*len = 0;}if( type ){type = IS_NULL;}return;}if( sc->currentPos > 0 ){sc->currentPos--;sc->reset();while( ( int )( sc->currentPos ) >= 0 ){if(0x20 == sc->ch ||0x09 == sc->ch){sc->currentPos--;sc->reset();}else{*prev_char = sc->ch;break;}}}if( 0x0d == *prev_char ||0x0a == *prev_char ){*prev_char = 0;}sc->currentPos = oldpos;sc->reset();do{q = sst____token_buffer;if( !sc->More() ){return;}if( sc->ch <= 0x20 ){*q++ = ( unsigned char )sc->ch;count++;sc->Forward();if( type ){*type = IS_NULL;}while( sc->More() ){if( sc->ch > 0x20 ){*q = 0;break;}*q++ = ( unsigned char )sc->ch;count++;sc->Forward();}}else if( '/' == sc->ch && '/' == sc->chNext ){*q++ = ( unsigned char )sc->ch;count++;sc->Forward();if( type ){*type = IS_LINE_MASK;}while( 1 ){if( 0x0d == sc->ch && 0x0a == sc->chNext ){*q = 0;count+= 2;break;}else if( 0x0a == sc->ch ){count++;*q = 0;break;}else{*q++ = ( unsigned char )sc->ch;count++;sc->Forward();}if( !sc->More() ){*q = 0;break;}}}else if( ...... ){........}else{sc->Forward();}if( count ){if( len ){if( 0x00 == sst____token_buffer[ count - 1 ] ){count--;}*len = count;}if( type && ( IS_WORD == *type ) && ishex ){if( count % 2 ){*type = IS_HEX_WRONG;}else{*type = IS_HEX;}}if( next_char ){while( sc->More() ){if(0x20 == sc->ch ||0x09 == sc->ch){sc->Forward();}else{*next_char = sc->ch;break;}}}sc->currentPos = oldpos;sc->reset();return;}} while( 1 );}


这个函数用来给scintilla调用,实现高亮

static void ColorSnooperApduNoCaseDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler){StyleContext sc(startPos, length, initStyle, styler);WordList &keywords = *keywordlists[ 0 ];WordList &pre_keywords = *keywordlists[ 1 ];WordList &functions = *keywordlists[ 2 ];int len;int type;char *tmp = ( char * )sst____token_buffer;int prev_char;int next_char;int next_is_var_left;int next_is_label;next_is_var_left = 0;next_is_label = 0;do{if( !sc.More() ){break;}sst( &sc, &type, &len, &prev_char, &next_char );if( 0 == len ){break;}if( IS_NULL == type ){if( has_crlf( tmp ) ){next_is_var_left = 0;}}else{if( next_is_var_left ){sc.SetState( SCE_SS_VARIABLE_LEFT );next_is_var_left = 0;goto FORWARD;}if( next_is_label ){sc.SetState( SCE_SS_LABEL );next_is_label = 0;goto FORWARD;}}if( IS_WORD == type || IS_HEX == type || IS_HEX_WRONG == type ){if( keywords.InList( tmp ) ){sc.SetState( SCE_SS_KEYWORD );if( !strcmp( tmp, "set" ) ){next_is_var_left = 1;}else if( !strcmp( tmp, "call" ) ){next_is_label = 1;}}}else if( ........ ){............}else{sc.SetState( SCE_SS_DEFAULT );}FORWARD:sc.Forward( len );} while( 1 );sc.Complete();}


最后加上这些,让系统链接进去

 

static const char * const snooper_apdu_WordLists[] ={    0};LexerModule lmSnooperApduNoCase( SCLEX_SNOOPER_APDU_NOCASE, ColorSnooperApduNoCaseDoc, "snooper_apdu_nocase", FoldSnooperApduDoc, snooper_apdu_WordLists);

 

Catalogue.cxx中加入

 LINK_LEXER(lmSnooperApduNoCase);


 

原创粉丝点击