Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57197
  • 博文数量: 15
  • 博客积分: 1421
  • 博客等级: 上尉
  • 技术积分: 190
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-18 12:36
文章分类

全部博文(15)

文章存档

2013年(1)

2011年(4)

2010年(5)

2009年(5)

我的朋友

分类: LINUX

2011-03-14 23:33:42

最近闲来无事,在图书馆看到有 apache源码剖析,于是就萌发了看看的念头,按照书本的顺序阅读,并结合源码进行查看,用vim+ctags来提高阅读速度,原先使用的时候都是使用标准库中的tag,而且也没什么用就没有发现啥问题,今天正好将其应用到apapche源码上,刚开始几个函数、常量神马的都木有问题,还没读几行呢,就发现好几个函数都找不到tag,于是上tags文件上去查看,果然没有,当时相关函数的行还是有列出来的,只不过它没有把函数名列出来作为tag,而是函数前边的返回值 函数看成tag了。如下所示

APR_DECLARE    srclib/apr/atomic/netware/apr_atomic.c    /^APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *pool)$/;"    f
APR_DECLARE    srclib/apr/atomic/netware/apr_atomic.c    /^APR_DECLARE(apr_uint32_t) apr_atomic_inc32(volatile apr_uint32_t *mem)$/;"
    f
APR_DECLARE    srclib/apr/atomic/netware/apr_atomic.c    /^APR_DECLARE(apr_uint32_t) apr_atomic_read32(volatile apr_uint32_t *mem)$/;"    f
APR_DECLARE    srclib/apr/atomic/netware/apr_atomic.c    /^APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val)$/;"
    f
APR_DECLARE    srclib/apr/atomic/unix/builtins.c    /^APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p)$/;"    f
APR_DECLARE    srclib/apr/atomic/unix/builtins.c    /^APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, apr_uint32_t val)$/;"
    f
APR_DECLARE    srclib/apr/atomic/unix/builtins.c    /^APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem, apr_uint32_t with,$/;"    f
APR_DECLARE    srclib/apr/atomic/unix/builtins.c    /^APR_DECLARE(apr_uint32_t) apr_atomic_inc32(volatile apr_uint32_t *mem)$/;"
    f


很明显ctag在生成tag的时候出了点问题,APR_DECLARE明显不是我们应该得到的tag,比如说第一个,应该为apr_atomic_init,搞了半天才有点明白tags文件中各列表示的意思,其中第一列就是表示生成的tag进阶着是包含该tag的文件,后面是查找模式etc,因此出现以上情况的地方只要稍稍的做一下修改即可,将apr_atomic_init放到该行的第一列替换掉APR_DECLAR 即可,这个工作多亏了vi的寄存器功能,只需操作一次剩下的系统就自动帮你搞定了,哈哈^_^,qXX/@xx 也是我最喜欢的了,帮了我很多的忙。

当你修改好之后,这时应该还是会有个别tag用不了,因为默认生成tag是排好序的,so 还木有完事,你得对新的tag根据第一列按照ASCII顺序排序。如果没有排序的话,tag又默认为是排好序,就很有可能会漏掉一些tag,比如 A C B,当ctags搜索到C的时候它肯定就返回没有tag B了。而实际上B又是存在的。所以得对它们进行重排序。这里用系统的sort就能搞定!如果你的tag文件里的

!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/

这个变量为无序的话 就另当别论了。

在用sort排序的时候我遇到了一些问题,始终没有办法按照ASCII顺序来排序,原本还以为得加什么参数,一顿搜索页没有找到结果,尝试了各种参数,结果还是一样。后来认真读了一遍man page 发现sort默认就是ASCII顺序来排的,而且在最后有一句提醒:

*** WARNING *** 

The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values

看看本地的locale结果为:LC_ALL为空,按照提示修改LC_ALL的值之后,sort果然按照预期的根据ASCII对tag排好序了,终于解决。

btw:有时候系统中会存在两个ctags,一个是gnu的ctags、另一个是 Exuberant Ctags,一般我们用的是后者,最好把gnu的那个ctags给屏蔽了,具体做法很多:删了它、把它的PATH往后挪.
阅读(732) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-27 13:48:45

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com