SourceInsight的宏语言使用

  • 格式:doc
  • 大小:89.00 KB
  • 文档页数:5

Source Insight使用进阶篇——宏语言使用Source Insight是阅读和编写代码的好东东,基本上也算得上是经典之作了,虽然还有一点点小bug,不过对于我们这些C程序员来说可是一旦拥有别无所求。

但是大家可能很少用到Source Insight的宏语言(Source Insight macro language)。

Source Insight中的宏语言类同于MS Office中的VBA,也具有程序化执行用户预定义操作的通用宏语言功能。

VBA功能的强大就不用多作说明了,而Source Insight的宏语言也不逊色。

以下就以项目中一次实际应用为例进行说明。

Source Insight宏语言语法和C语言类似,包括:顺序、分支和循环的程序结构。

同时宏语言可以实现字符操作、文件操作、控制Source Insight文件窗口、访问symbol列表和symbol类型、查找替换等访问控制操作。

在一个移植类项目中,遇到了一个代码整体移植的需求。

其中,有一项主要工作为代码复制及主要symbol替换。

即给绝大部分全局函数和全局变量追加前缀以便与移植前区别,例如:函数”extern void func();”替换为”extern void prefix_func();”,函数和变量的声明、定义和使用都需进行替换。

项目需求示意图如图1:
原有代码需要新生成的代码
图 1 项目需求示意图
这项工作人工进行需要找出需替换的symbol,再做替换操作。

由于代码量较大(约几十万行代码总量,其中有5000多个symbol需要替换),人工替换非常繁琐,又易出错。

一时又找不到合适的工具,这时我们想到了Source Insight的宏语言。

通过Source Insight 的宏语言,访问Source Insight的symbol列表,可以区分函数,全局变量,局部变量等C
语言语法上的类型,还可以自动执行替换操作。

及保证了效率,又保证了替换的准确度。

追加前缀的工作可以分4步来完成:
1、建立Source Insight工程,并整理全部文件的列表。

文件列表保存在文件"C:\\filelist.txt"中,列表包含路径。

这步不需要Source Insight的宏语言。

路径可以是绝对路径,也可以是Source Insight工程的相对路径。

2、抽出需加前缀的symbol。

对第1步整理的文件列表中的每一个文件,获取文件中所有的symbol,遇到symbol为变量或函数的声明则记录到文件"C:\\replacewhat"。

宏语言访问到的symbol类型与Source Insight中的symbol type一致。

完成此功能使用了自定义的宏SymbolCollect(源码见附录1)。

3、追加前缀。

对第1步整理的文件列表中的每一个文件,查找第2步抽出的symbol并追加前缀。

调用宏语言提供的函数ReplaceInBuf(Source Insight提供)追加前缀,设置为区分大小写,整个单词匹配。

完成此功能使用了自定义的宏replaceExe(源码见附录2)。

4、运行自定义的宏语言。

(1) 宏语言写在一个扩展名为em的文件里,将文件加入到Source Insight工程中,并进行同步。

(2) 选择菜单Options→Menu Assignments,在图 2 Menu Assignments对话框的Command中可以找到自定义的宏,并加入到菜单中。

然后就可以和其它菜单项一样使用了。

(3) 如图 3 增加宏命令后的菜单,首先选择Options→SymbolCollect抽出需追加前缀的symbol,然后选择Options→replaceExe执行替换操作。

图 2 Menu Assignments对话框
图 3 增加宏命令后的菜单
通过使用宏语言对应该项工作,一名担当从不了解宏语言,到试验、编写和调试脚本用了一天左右,再用一个多小时执行脚本,完成了估计约3人日的工作,而且原来枯燥的工作过程现在变得轻松愉快。

本文只是提到了Source Insight宏语言的一种应用实例。

使用宏语言可以自定义一些有用的小脚本, 插入某种格式的字符串(文件头,函数头), 自动执行编辑操作等。

大家说不定什么时候也能派上用场,到时可以参考Source Insight的帮助和网上相关资料。

最后,提醒大家使用宏语言时,建议把不要写太复杂的函数,宏语言的调试环境比不了VC的便捷,最好把复杂的步骤进行拆分,控制每一个宏的规模。