了解`CTAGS -e`文件格式(CTAGS为Emacs)
题
我使用“ExuberantCtags”也被称为“CTAGS -e”,也被称为只是“ETag的”
和我想了解其由ETag的生成的命令标签文件格式,特别是我想了解标签文件的线#2。
维基说该行#2这样描述:
{src_file},{size_of_tag_definition_data_in_bytes}
在虽然TAGS文件行实用术语:2 “的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”从后79直至并包括“91 ^ J”指的是在标签文件的字节数。
非常有意义。
现在的数字20,59,91在此实例中维基说指的是{byte_offset字节}
什么是{byte_offset字节}偏离?
感谢所有帮助肯!
解决方案
这是数之后的换行符以下标记的数据的字节数。
编辑:它也不包括文件的标签数据之间的^字母L。记住的ETag不久前来自一个时间,读取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
有两组标签数据在这个例子中:45个字节用于hello.cc数据和用于hello.h 15个字节
就行了以下45个字节的数据hello.cc开始“hello.cc,45 ^ J”和运行 - 这也恰好是完整行。为什么字节给出的理由是这样的代码读取文件可以直接分配空间,45字节的字符串和读取45个字节。的“^ L ^ J”线是45个字节标签数据之后。您可以使用此作为一个标记有剩余的,也验证文件格式正确更多的文件。
以下 “hello.h,15 ^ J” 和管路15个字节线上的hello.h数据开始。
其他提示
在{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