« OpenSolaris-Land 中的... | Main | SMB 与 ZFS 比较 »
http://developers.sun.com.cn/blog/functionalca/date/20080430 星期三 2008年04月30日

使用 cscope 编写脚本

cscope(及cscope-fast)工具为我们在 Solaris 源代码内部搜索短语等特定实例提供了出色的方法。惟一的缺点在于,该工具是交互式的:它需要用户输入才能显示输出。那么,如何才能在脚本中利用这款工具呢?

正确的解决方案是对 cscope 和 cscope-fast 进行修改,让它支持 Non-Curses 类型的输出格式。但与此同时,我们可以采用一种更加简便的方法,即定义一个特殊的 "tty" 来确保输出中不包含任何转义序列(或其他不需要的内容)。

最后,结果如下所示:

$ ~/bin/cscope-grep ip_input
1       ip.c    <global>        15017   ip_input(ill_t  *ill,   ill_rx_ring_t  *ip_ring,        mblk_t  *mp_chain,
2       ip.h    <global>        3225    extern  void    ip_input(ill_t  *,     ill_rx_ring_t    *,      mblk_t  *,
3       ip_if.c ill_capability_dls_capabl       2925    dls.dls_rx      =      (uintptr_t)ip_input;
4       ip.c    ip_rput 14993   ip_input(ill,   NULL,   mp,     NULL);
5       ip_netinfo.c    ip_ni_queue_func_impl   1293    ip_input(ill,   NULL,  packet->ni_packet,       0);
6       ip_squeue.c     ip_soft_ring_assignment 754     ip_input(ill,   NULL,   mp_chain,       mhip);                          

更新

正如 Alan Burlinson 所说,cscope-fast 提供了一个命令行选项 "-l",可以生成不面向屏幕的输出。使用方法如下所示:

$ cscope-fast -l -d -0 ip_input
uts/common/inet/ip/ip.c <global> 15017 ip_input(ill_t *ill, ill_rx_ring_t *ip_ring, mblk_t *mp_chain,
uts/common/inet/ip.h <global> 3225 extern void ip_input(ill_t *, ill_rx_ring_t *, mblk_t *,
uts/common/inet/ip/ip_if.c ill_capability_dls_capable 2925 dls.dls_rx = (uintptr_t)ip_input;
uts/common/inet/ip/ip.c ip_rput 14993 ip_input(ill, NULL, mp, NULL);
uts/common/inet/ip/ip_netinfo.c ip_ni_queue_func_impl 1293 ip_input(ill, NULL, packet->ni_packet, 0);
uts/common/inet/ip/ip_squeue.c ip_soft_ring_assignment 754 ip_input(ill, NULL, mp_chain, mhip);
>>

虽然这为我们提供了便利,但仍然存在两个问题:

最后,我选择使用比较熟悉的 perl 脚本来实现,并且它支持拆分数组并打印输出。

#!/bin/perl
$args = join(' ',@ARGV);
open(I, "cat /dev/null | cscope-fast -l -d $args|") || die $!;
while (<I>) {
        last if (/^>>/);
        @F = split(/ /);
        @B = splice(@F,3,$#F);
        @A = splice(@F,0,3);
        print join("\t",@A)."\t".join(' ',@B)."\n";
}
close(I);
exit(0);

感谢 Alan 的建议和提醒。

本文翻译自:http://blogs.sun.com/avalon/date/20070717



发表于 jerry [JDS] ( 四月 30, 2008 12:29 上午 ) Permalink | 评论[0]
评论:

发表一条评论:
  • HTML语法: 禁用