Comprendere il formato file `ctags -e` (ctags per emacs)
Domanda
Sto utilizzando "ExuberantCtags" noto anche come "ctags -e", noto anche semplicemente come "etags"
e sto cercando di capire il formato del file TAGS generato dal comando etags, in particolare voglio capire la riga n. 2 del file TAGS.
Wikipedia dice quella riga n. 2 è descritta in questo modo:
{src_file},{size_of_tag_definition_data_in_bytes}
In termini pratici, però, la riga del file TAGS:2 per "foo.c" assomiglia a questa
foo.c,1683
Il mio dilemma è come trova esattamente questo numero:1683
So che è la dimensione del "tag_definition", quindi quello che voglio sapere è cosa è il "tag_definition"?
Ho provato a guardare attraverso il file codice sorgente ctags, ma forse qualcuno più bravo di me in C avrà più successo nel capirlo.
Grazie!
MODIFICA N. 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
Va bene, quindi se ho capito bene, "79" si riferisce al numero di byte nel file TAGS da dopo 79 fino a "91 ^ J" incluso.
Ha perfettamente senso.
Ora i numeri 20, 59, 91 in questo esempio secondo Wikipedia si riferiscono a {byte_offset}
Da cosa deriva l'offset {byte_offset}?
Grazie per tutto l'aiuto Ken!
Soluzione
È il numero di byte di dati del tag che seguono il ritorno a capo dopo il numero.
Modificare:Inoltre non include il carattere ^L tra i dati dei tag del file.Ricorda che gli etag provengono da molto tempo fa in cui leggere un file da 500 KB era un'operazione costosa.;)
Ecco un file di tag completo.Lo mostro in due modi, il primo con caratteri di controllo come ^X e senza caratteri invisibili.I caratteri di fine riga impliciti nel tuo esempio sono ^J qui:
^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
Ecco lo stesso file visualizzato in esadecimale:
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
In questo esempio sono presenti due serie di dati di tag:45 byte di dati per hello.cc e 15 byte per hello.h.
I dati hello.cc iniziano sulla riga successiva a "hello.cc,45^J" e durano 45 byte: anche queste sono righe complete.Il motivo per cui vengono forniti i byte è che il codice che legge il file può semplicemente allocare spazio per una stringa di 45 byte e leggere 45 byte.La riga "^L^J" è dopo i 45 byte di dati del tag.Lo usi come indicatore del fatto che sono rimasti più file e anche per verificare che il file sia formattato correttamente.
I dati hello.h iniziano sulla riga successiva a "hello.h,15^J" e durano 15 byte.
Altri suggerimenti
Il {} byte_offset per una voce di tag è il numero di byte dall'inizio del file la funzione è definita in. Il numero che precede l'offset byte è il numero di riga. Nel tuo esempio:
hello.c,79^J
float foo (float x) {^?foo^A3,20^J
la funzione foo comincia 20 byte dall'inizio della ciao.c. È possibile verificare che con un editor di testo che mostra la posizione del cursore nel file. È inoltre possibile utilizzare il comando tail Unix per visualizzare un file di un certo numero di byte in:
tail -c +20 hello.c