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!

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top