Frage

Ich bin mit "ExuberantCtags" auch als "ctags -en", auch bekannt als einfach "etags" bekannt

und ich versuche, das TAGS-Datei-Format zu verstehen, die von dem etags erzeugt wird gebiete, insbesondere möge ich Zeile # 2 der TAGS-Datei verstehen.

Wikipedia sagt dieser Zeile # 2 wie folgt beschrieben wird:

{src_file},{size_of_tag_definition_data_in_bytes}

In der Praxis allerdings TAGS Dateizeile: 2 für "foo.c" sieht wie folgt aus

foo.c,1683

Mein Dilemma ist, wie genau funktioniert es, diese Zahl zu finden: 1683

Ich weiß, es ist die Größe des „tag_definition“ so, was ich wissen will, ist, was ist die "tag_definition"?

Ich habe versuchte die Suche durch den ctags Quellcode , aber vielleicht jemand besser auf C als ich mehr Erfolg Bezifferung dieses aus.

Danke!

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

In Ordnung, also wenn ich richtig verstehe, „79“ bezieht sich auf die Anzahl von Bytes in der TAGS-Datei von der 79. bis einschließlich „91 ^ J“.

macht absolut Sinn.

Nun sind die Zahlen 20, 59, 91 in diesem Beispiel wikipedia sagt beziehen sich auf die {byte_offset}

Was ist der {byte_offset} versetzt?

Vielen Dank für all die Hilfe Ken!

War es hilfreich?

Lösung

Es ist die Anzahl der Bytes der Tag-Daten nach dem Newline nach der Zahl.

Edit: Es ist auch nicht die ^ L Zeichen zwischen Datei-Tag-Daten. Denken Sie daran, etags aus einer Zeit kommen schon vor langer Zeit, wo eine 500 KB-Datei zu lesen war eine teuere Operation. ;)

Hier ist eine komplette Tags-Datei. Ich zeige es zwei Möglichkeiten, die erste mit Steuerzeichen wie ^ X und keine unsichtbaren Zeichen. Die End-of-line Zeichen implizit in Ihrem Beispiel sind ^ J hier:

^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

Hier ist die gleiche Datei in hex angezeigt:

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

Es gibt zwei Arten von Tag-Daten in diesem Beispiel.: 45 Byte Daten für hello.cc und 15 Bytes für hello.h

Die hello.cc Daten beginnt auf der Zeile nach „hello.cc, 45 ^ J“ und läuft für 45 Bytes - dies geschieht auch komplette Linien sein. Der Grund, warum Bytes angegeben wird, ist so Code Lese die Datei nur Platz für ein 45-Byte-String zuordnen und 45 Bytes lesen. Die "^ L ^ J" -Linie ist nach dem 45 Bytes der Tag-Daten. Sie verwenden diese als Marker, dass es mehr Dateien verbleiben und auch zu überprüfen, ob die Datei korrekt formatiert ist.

Die hello.h Daten beginnt auf der Zeile nach "hello.h, 15 ^ J" und dauert 15 Bytes.

Andere Tipps

Der {byte_offset} für einen Tag-Eintrag ist die Anzahl der Bytes vom Anfang der Datei die Funktion in definiert ist. Die Zahl vor dem Byte-Offset ist die Zeilennummer. In Ihrem Beispiel:

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

die foo Funktion beginnt 20 Bytes vom Beginn der hello.c. Sie können das mit einem Texteditor überprüfen, die Cursorposition in der Datei zeigt. Sie können auch den Unix-Befehl tail verwenden, um eine Datei, die eine Anzahl von Bytes, in:

tail -c +20 hello.c
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top