如何使用cscope一次搜索多个C符号

时间:2018-03-12 08:46:18

标签: c cscope

是否可以让 Cscope 一次返回多个C符号的搜索结果?

我有一个包含大量header(.h).c文件的庞大项目,我希望在我的项目中找到foo()bar()(可能更多)的所有实例马上。

目前,当我执行cscope -d时,我可以一次搜索一个C符号,但我该如何执行以下操作:

Find this C symbol: foo || bar。 (这不起作用)

因此,简而言之,我希望Cscope搜索能够作为逻辑OR 工作。如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

来自Cscope(15.7a)的帮助信息部分地说:

  

反复按RETURN键移动到所需的输入字段,键入   要搜索的模式,然后按RETURN键。对于前4和   最后2个输入字段,模式可以是regcomp(3)正则表达式。   如果搜索成功,您可以使用这些单字符命令:

和引用的输入字段是:

找到这个C符号:

Find this global definition:
Find functions called by this function:
Find functions calling this function:
Find this text string:
Change this text string:
Find this egrep pattern:
Find this file:
Find files #including this file:

正则表达式匹配不适用于两个文本字符串操作或egrep模式。但是,帮助并没有明确表示它使用扩展的正则表达式,尽管研究源代码表明它确实如此。

在SourceForge的Cscope项目中,我从2015年4月开始有Cscope 15.8b的来源。目录cscope-15.8b/src中的文件是find.c。在find.c,在第712ff行,有代码:

 712     /* see if the pattern is a regular expression */
 713     if (strpbrk(pattern, "^.[{*+$") != NULL) {
 714         isregexp = YES;
 715     } else {

如果它发现了列出的正则表达式元字符之一,它使用扩展正则表达式模式。问题是,该字符列表不包括|(,两者都是元字符。

当代码更改为:

 712     /* see if the pattern is a regular expression */
 713     if (strpbrk(pattern, "^.[{*+$|(") != NULL) {
 714         isregexp = YES;
 715     } else {

并重新编译,然后我可以成功搜索foo|bar。如果没有更改,cscope会报告foo|bar不是有效的C符号 - 这是正确但无用的。

如果您能找到源代码,类似的更改可能会有所帮助。

当我使用Cscope 15.7a时,即使包含列出的一个字符似乎也没有打开扩展正则表达式,但它确实允许简单(基本)正则表达式工作。例如,err_(remark|error)$包含$,但不匹配任何内容。使用err.*确实有用;使用err_[er][er][mo][ar]r.*无法正常工作。因此,似乎正则表达式支持在Cscope 15.8或其附近主要是新的。

另请参阅SourceForge上的Cscope Issue 294。它交叉引用了这个问题。

答案 1 :(得分:0)

是。使用find this egrep pattern搜索字段(TAB访问)。

e.g:

找到这个egrep模式:(foo | bar)