Вопрос

Я использую "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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top