我正在使用“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的所有帮助!
答案 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