5

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

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

维基百科说第 2 行是这样描述的:

{src_file},{size_of_tag_definition_data_in_bytes}

实际上,尽管 TAGS 文件 line:2 for "foo.c" 看起来像这样

foo.c,1683

我的困惑是它究竟是如何找到这个数字的:1683

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

我曾尝试查看ctags 源代码,但也许比我更擅长 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} 偏移量是多少?

感谢所有的帮助肯!

4

2 回答 2

5

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

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

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

^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 个字节。

于 2010-01-02T05:42:13.950 回答
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
于 2010-01-02T22:43:34.277 回答