técnica de parseo - jacquesfauquex/DCKV GitHub Wiki
El metodo lee los atributos sucesivamente hasta encontrar un tag >= lastdatasettag o hasta superar lo largo predefinido de una secuencia o de un item.
El attributo SQ tiene tratamiento especifico. Una vez evacuado el caso de SQ vacío, arranca el loop de items y recursion de parseo de dataset
dataset loop ( <length or <tag )
|
+------------+------------+
| | |
attr vl attr vll SQ
|
+----------+-----------+------------+
| | | |
0000 lengthCero item loop ffff
|
+----------+----------+
| | |
00000000++ dataset ffffffff--
variables y recursión
- las variables pasadas por referencia son únicas, y pueden ser leidas y escritas desde cualquier nivel de la recursión
- hacemos referencia a mismos espacios en memoria por punteros buffer uint8_t y struct que apuntan al mismo espacio. El primer puntero sirve para lectura desde stdin y el segundo para análisis. https://stackoverflow.com/questions/19165134/correct-portable-way-to-interpret-buffer-as-a-struct
Por ejemplo el buffer kbuf está referido también por attrstruct y por itemstruct instanciados dentro de una recursión.
kbuf 0 -------- -------- -------- -------- -------- ... 148
primer nivel
attrstruct gGuUrrll
itemstruct gGuUrrll
secundo nivel
attrstruct gGuUrrll
itemstruct gGuUrrll
tercer nivel
attrstruct gGuUrrll
itemstruct gGuUrrll
...
- attrstruct es un slice de 8 bytes del buffer kbuf, que puede servir para lectura de stream. Leimos del stream directamente a attrstruct, rellenando así de a 8 bytes el buffer principal kbuf directamente desde el stream, sin copia secundaría. Es sumamente eficiente en cuanto a memoria. Más aún porque se usa el mismo attrstruct para todos los attrs de un dataset.
- la existencia de attrstruct e itemstruct permite hacer la transición entre un nivel de recursión y el siguiente dentro de una secuencia. Lo que era itemstruct en un nivel de la recursion pasa a ser attrstruct en el siguiente nivel.
En resumen, el buffer kbuf se modifica permanente a la ocasión del parseo de cada uno de los attributos de todas las profundidades. Se toman "instantaneas" fijas de mismo al momento de registrar cada attributo. El key tiene largo de un múltiple de 8 bytes (8 para el primer nivel, 16 para el segundo y así sucesivamente).