最近在折腾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);
- 最近在折腾scintilla,无法调试,自定义的语法高亮很ao tou
- tou
- 最近在折腾python,python在折腾我
- 最近在折腾VPS(持续完善)
- 最近一直在配置自己的服务器,折腾了一点心得,准备记录一下1
- 最近折腾硬盘的一点感慨
- 最近折腾的几个Linux发行版
- Scintilla在VC6和VS里的编译方法
- Scintilla控件在Win32环境下的使用(一)
- Scintilla控件在Win32环境下的使用(二)
- 使用AO无法获得地图比例尺的原因
- 使用AO无法获得地图比例尺的原因
- 语法高亮编辑控件Scintilla在MFC中的简单使用
- 语法高亮编辑控件Scintilla在MFC中的简单使用之完整示例
- 语法高亮编辑控件Scintilla在MFC中的简单使用
- 语法高亮编辑控件Scintilla在MFC中的简单使用
- 最近调试的javamail
- 无法在web服务器上启动调试。服务器因语法无效而未能处理调试请求。
- java 集合
- [VB]UserControl中的主要事件
- C#的XML文件的读取与写入
- 【NPC】10、无向汉密尔顿回路规约到有向汉密尔顿回路
- 关于Fedora16、Fedora17安装gnome-tweak-tool显示桌面提示有一个进程在运行的问题
- 最近在折腾scintilla,无法调试,自定义的语法高亮很ao tou
- tw9912 寄存器配置
- OpenCV under Mac OS with XCode
- 使用 GridView 控件和 SqlDataSource 控件显示乐知 班学生名单
- ABAP--Field Symbol 的Example(来自SAP的样例) .
- 单片机程序循环问题
- SQLAlchemy 使用经验
- 子衿的事(67)
- 在已部署的3层LightSwitch 应用程序中诊断问题(艾瑞克·埃尔哈特)