最近闲来无事,在图书馆看到有 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往后挪.
阅读(752) | 评论(1) | 转发(0) |