فهم تنسيق ملف `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
إليك نفس الملف المعروض في Hex:
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