سؤال

أنا أستخدم "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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top