Descripción del formato de fichero `ctags -e` (ctags para emacs)
Pregunta
Estoy utilizando "ExuberantCtags", también conocido como "ctags -e", también conocido simplemente como "etags"
y estoy tratando de entender el formato de fichero de etiquetas que se genera por las etags mandar, en particular, quiero entender la línea # 2 del fichero de etiquetas.
Wikipedia dice que línea # 2 se describe así:
{src_file},{size_of_tag_definition_data_in_bytes}
En la práctica sin embargo fichero línea TAGS: 2 para las miradas "Foo.c" como éste
foo.c,1683
Mi dilema es cómo es exactamente lo que encontrar este número: 1683
Sé que es el tamaño de la "tag_definition" así que lo que quiero saber es lo que es la "tag_definition"?
He intentado mirar a través del ctags código fuente , pero tal vez alguien mejor en C que yo tendré más éxito calcular esto.
Gracias!
EDITAR # 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
Muy bien, así que si he entendido bien, "79" se refiere al número de bytes en el archivo de etiquetas de después de 79 hasta e incluyendo "91 ^ J".
tiene mucho sentido.
Ahora los números 20, 59, 91 en este ejemplo wikipedia dice consulte la {byte_offset}
¿Cuál es el {} byte_offset desplazamiento desde?
Gracias por toda la ayuda Ken!
Solución
Es el número de bytes de datos de la etiqueta después de la nueva línea después del número.
Edit: También no incluye el carácter ^ L entre los datos de identificación de ficheros. Recuerde etags proviene de una época hace tiempo en la lectura de un archivo de 500 KB fue una operación costosa. ;)
Aquí hay un archivo de etiquetas completa. Estoy mostrando que dos caminos, el primero con caracteres de control como ^ X y no hay caracteres invisibles. Los caracteres de fin de línea implícitas en su ejemplo son ^ J aquí:
^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
Este es el mismo archivo está representada en hexadecimal:
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
Hay dos conjuntos de datos de la etiqueta en este ejemplo:. 45 bytes de datos para hello.cc y 15 bytes para hello.h
Los datos hello.cc se inicia en la línea siguiente "hello.cc, 45 ^ J" y carreras para 45 bytes - esto también pasa a ser líneas completas. La razón por la cual se dan bytes es tan código de lectura del archivo solo puede asignar espacio para una cadena de 45 bytes y leer 45 bytes. La línea "^ L ^ J" es después de los 45 bytes de datos de la etiqueta. Se utiliza esto como un marcador que hay más archivos restantes y también para comprobar que el archivo tiene el formato correcto.
Los datos hello.h se inicia en la línea siguiente "hello.h, 15 ^ J" y se ejecuta durante 15 bytes.
Otros consejos
El byte_offset {} para una entrada de etiqueta es el número de bytes desde el comienzo del archivo de la función se define. El número antes del desplazamiento de bytes es el número de línea. En su ejemplo:
hello.c,79^J
float foo (float x) {^?foo^A3,20^J
la función foo comienza 20 bytes desde el comienzo del hola.c. Se puede comprobar que con un editor de texto que muestra la posición del cursor en el archivo. También puede utilizar el comando de la cola de Unix para mostrar un archivo de un número de bytes en:
tail -c +20 hello.c