das `ctags -e`-Dateiformat (ctags für Emacs) zu verstehen,
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!
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