Понимание формата файла `ctags -e` (ctags для emacs)
Вопрос
Я использую "ExuberantCtags", также известный как "ctags -e", также известный просто как "etags".
и я пытаюсь понять формат файла тегов, который генерируется командой etags, в частности, я хочу понять строку # 2 файла тегов.
В Википедии говорится эта строка № 2 описывается следующим образом:
{src_file},{size_of_tag_definition_data_in_bytes}
С практической точки зрения, хотя строка файла ТЕГОВ: 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 между данными тега файла.Помните, что etags появился в давние времена, когда чтение файла размером 500 КБ было дорогостоящей операцией.;)
Вот полный файл тегов.Я показываю это двумя способами, первый с управляющими символами в виде ^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 и 15 байт для hello.h.
Данные hello.cc начинаются со строки, следующей за "hello.cc,45 ^ J", и занимают 45 байт - это также могут быть полные строки.Причина, по которой задаются байты, заключается в том, что код, считывающий файл, может просто выделить место для 45-байтовой строки и прочитать 45 байт.Строка "^L^ J" находится после 45 байт данных тега.Вы используете это как признак того, что осталось больше файлов, а также для проверки того, что файл правильно отформатирован.
Данные hello.h начинаются со строки, следующей за "hello.h,15^ J", и занимают 15 байт.
Другие советы
{byte_offset} для записи тега - это количество байтов от начала файла, в котором определена функция.Число перед смещением в байтах - это номер строки.В вашем примере:
hello.c,79^J
float foo (float x) {^?foo^A3,20^J
функция foo начинается с 20 байт с начала hello.c.Вы можете убедиться в этом с помощью текстового редактора, который показывает ваше положение курсора в файле.Вы также можете использовать команду Unix tail для отображения файла, количество байт в:
tail -c +20 hello.c