Comprendre le format de fichier `-e` ctags (ctags pour emacs)
Question
J'utilise "ExuberantCtags" également connu sous le nom "ctags -e", aussi connu comme juste "etags"
et je suis en train de comprendre le format de fichier TAGS qui est généré par la commande etags, en particulier, je veux comprendre la ligne n ° 2 du fichier TAGS.
Wikipedia dit que la ligne n ° 2 est décrit comme ceci:
{src_file},{size_of_tag_definition_data_in_bytes}
En pratique Bien que la ligne de fichier TAGS: 2 pour "foo.c" ressemble à ceci
foo.c,1683
Mon dilemme est de savoir comment exactement il trouver ce numéro: 1683
Je sais qu'il est la taille de la « tag_definition » donc ce que je veux savoir est ce qui est le "tag_definition"?
Je l'ai essayé de regarder à travers le ctags code source , mais peut-être quelqu'un de mieux à C que moi aurai plus le succès essayant de se faire.
Merci!
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
Bon, si je comprends bien, « 79 » fait référence au nombre d'octets dans le fichier de TAGS après 79 jusques et y compris « 91 ^ J ».
Donne son sens.
Maintenant, les numéros 20, 59, 91 dans cet exemple wikipedia dit se référer à la {byte_offset}
Quel est le {} byte_offset décalage par rapport?
Merci pour toute l'aide Ken!
La solution
Il est le nombre d'octets de données de tag de la nouvelle ligne après le numéro.
Edit: Il ne comprend pas le caractère ^ L entre les données d'étiquette de fichier. Rappelez-vous etags vient d'une époque où il y a longtemps la lecture d'un fichier 500KB était une opération coûteuse. ;)
Voici un fichier complet des balises. Je le montrer deux façons, la première avec des caractères de contrôle comme ^ X et pas de caractères invisibles. Les caractères de fin de ligne implicites dans votre exemple sont ^ J ici:
^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
Voici le même fichier affiché en hexadécimal:
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
Il existe deux ensembles de données d'étiquette dans cet exemple:. 45 octets de données pour hello.cc et 15 octets pour hello.h
Les données de hello.cc commence sur la ligne suivante « hello.cc, 45 ^ J » et se poursuit pendant 45 octets - cela arrive aussi d'être des lignes complètes. La raison pour laquelle les octets sont données est donc la lecture du code du fichier peut simplement allouer de l'espace pour une chaîne de 45 octets et lu 45 octets. La ligne « ^ L ^ J » est après les 45 octets de données d'étiquette. Vous utilisez cela comme un marqueur qu'il ya plus de fichiers restants et aussi pour vérifier que le fichier est correctement formaté.
Les données de hello.h commence sur la ligne suivante "hello.h, 15 ^ J" et fonctionne pour 15 octets.
Autres conseils
La {} byte_offset pour une entrée de balise est le nombre d'octets à partir du début du fichier de la fonction est définie. Le numéro avant l'octet de décalage est le numéro de ligne. Dans votre exemple:
hello.c,79^J
float foo (float x) {^?foo^A3,20^J
la fonction foo commence 20 octets à partir du début de hello.c. Vous pouvez vérifier que avec un éditeur de texte qui indique votre position du curseur dans le fichier. Vous pouvez également utiliser la commande Unix queue pour afficher un fichier un nombre d'octets dans:
tail -c +20 hello.c