2010-01-02 5 views
4

Я использую«ExuberantCtags», также известный как«Ctags -e», также известный как просто«ETags»Понимание `Ctags Отформатируйте -e` File (Ctags для Emacs)

, и я пытаюсь понять TAGS, который генерируется командой etags, в частности, я хочу понять строку # 2 файла TAGS.

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, чем у меня, будет больше успеха, выясняя это.

Спасибо!

EDIT # 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 смещенной?

Спасибо за помощь!

ответ

5

Это число байтов данных тегов, следующих за новой строкой после номера.

Редактировать: Он также не содержит символ^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 байт.

+0

Спасибо, но теперь у меня есть другой вопрос, но я поставлю его на главный пост. –

+0

Большое спасибо за помощь, это имеет смысл сейчас, но что такое {bytes_offset}? Я обновил редактирование до главного сообщения. –

3

{byte_offset} для записи тега - это количество байт от начала файла, в котором функция определена. Число перед смещением байта - это номер строки. В вашем примере:

hello.c,79^J 
float foo (float x) {^?foo^A3,20^J 

Функция foo начинается с 20-го байта с начала hello.c. Вы можете проверить это с помощью текстового редактора, который показывает вашу позицию курсора в файле. Вы также можете использовать команду хвоста Unix для отображения файла в количестве байтов в:

tail -c +20 hello.c 
+0

Еще раз спасибо Кен! –