理解`ctags -e`文件格式(emacs的ctags)

时间:2010-01-02 04:11:02

标签: c emacs ctags etag

我正在使用“ExuberantCtags”,也称为“ctags -e”,也称为“etags”

我正在尝试理解etags命令生成的TAGS文件格式,特别是我想了解TAGS文件的第2行。

Wikipedia says第2行描述如下:

{src_file},{size_of_tag_definition_data_in_bytes}

实际上虽然TAGS文件行:2表示“foo.c”看起来像这样

foo.c,1683

我的窘境在于它是如何找到这个号码的:1683

我知道它是“tag_definition”的大小所以我想知道的是什么 “tag_definition”?

我试过翻阅ctags source code,但也许在C比我更好的人会有更多的成功来解决这个问题。

谢谢!

编辑#2:

^L^J
hello.c,79^J
float foo (float x) {^?foo^A3,20^J
float bar () {^?bar^A7,59^J
int main() {^?main^A11,91^J

好吧,如果我理解正确的话,“79”指的是TAGS文件中从79下降到包括“91 ^ J”的字节数。

有一个完美的感觉。

现在维基百科这个例子中的数字20,59,91表示引用{byte_offset}

{byte_offset}的偏移是什么?

感谢Ken的所有帮助!

2 个答案:

答案 0 :(得分:5)

这是数字后的换行符之后的标记数据的字节数。

编辑:它还不包括文件标签数据之间的^ L字符。记住etags来自很久以前读取500KB文件是一项昂贵的操作。 ;)

这是一个完整的标签文件。我用两种方式展示它,第一种是控制字符为^ X而没有不可见的字符。您的示例中隐含的行尾字符是^ J here:

^L^J
hello.cc,45^J
int main(^?5,41^J
int foo(^?9,92^J
int bar(^?13,121^J
^L^J
hello.h,15^J
#define X ^?2,1^J

这是以十六进制显示的相同文件:

0000000    0c  0a  68  65  6c  6c  6f  2e  63  63  2c  34  35  0a  69  6e
          ff  nl   h   e   l   l   o   .   c   c   ,   4   5  nl   i   n
0000020    74  20  6d  61  69  6e  28  7f  35  2c  34  31  0a  69  6e  74
           t  sp   m   a   i   n   ( del   5   ,   4   1  nl   i   n   t
0000040    20  66  6f  6f  28  7f  39  2c  39  32  0a  69  6e  74  20  62
          sp   f   o   o   ( del   9   ,   9   2  nl   i   n   t  sp   b
0000060    61  72  28  7f  31  33  2c  31  32  31  0a  0c  0a  68  65  6c
           a   r   ( del   1   3   ,   1   2   1  nl  ff  nl   h   e   l
0000100    6c  6f  2e  68  2c  31  35  0a  23  64  65  66  69  6e  65  20
           l   o   .   h   ,   1   5  nl   #   d   e   f   i   n   e  sp
0000120    58  20  7f  32  2c  31  0a                                    
           X  sp del   2   ,   1  nl

此示例中有两组标记数据:hello.cc的45个字节数据和hello.h的15个字节。

hello.cc数据从“hello.cc,45 ^ J”后的行开始,运行45个字节 - 这也恰好是完整的行。给出字节的原因是读取文件的代码只能为45字节字符串分配空间并读取45字节。 “^ L ^ J”行位于45个字节的标签数据之后。您可以将其用作标记,表示剩余的文件更多,并且还要验证文件格式是否正确。

hello.h数据从“hello.h,15 ^ J”后的行开始,运行15个字节。

答案 1 :(得分:5)

标记条目的{byte_offset}是从定义函数的文件的开头起的字节数。字节偏移之前的数字是行号。在您的示例中:

hello.c,79^J
float foo (float x) {^?foo^A3,20^J

foo函数从hello.c开始的20个字节开始。您可以使用文本编辑器验证该文件,该文本编辑器显示文件中的光标位置。您还可以使用Unix tail命令在以下位置显示多个字节的文件:

tail -c +20 hello.c