El parámetro offset indica el desplazamiento en el almacenamiento intermedio de mensaje donde debe comenzar el análisis. Esto es necesario porque es posible que otro analizador sea propietario de una parte anterior del mensaje (por ejemplo, el analizador interno del intermediario de mensajes analizará una cabecera MQMD). El desplazamiento debe ser positivo y debe ser menor que el tamaño del almacenamiento intermedio. Se recomienda que la función de implementación verifique que el desplazamiento sea válido, porque esto puede mejorar la determinación de problemas si se produce un error en un analizador anterior.
El analizador debe devolver el tamaño del almacenamiento intermedio restante del que se convierte en propietario. Este tamaño debe ser menor o igual que el del almacenamiento intermedio menos el desplazamiento actual.
Un analizador no debe intentar producir el análisis de otras partes del árbol de elementos de sintaxis, por ejemplo navegando al elemento raíz y a otra rama. Esto puede producir resultados imprevisibles.
Si esta función de implementación se proporciona en la estructura CPI_VFT, no se puede especificar cpiParseBufferEncoded() ni cpiParseBufferFormatted(), porque la función cpiDefineParserClass() fallará con un código de retorno CCI_INVALID_IMPL_FUNCTION.
Definida en | Tipo | Miembro |
CPI_VFT | Condicional | iFpParseBuffer |
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset);
Tamaño (en bytes) de la parte restante del almacenamiento intermedio de mensaje del que el analizador se convierte en propietario.
Este ejemplo se ha tomado del archivo de analizador de ejemplo BipSampPluginParser.c (líneas 428 a 466):
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset, ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc; /* Obtener un puntero al almacenamiento intermedio de mensaje y establecer el desplazamiento */ pc->iBuffer = (void *)cpiBufferPointer(&rc, parser); pc->iIndex = 0; /* Guardar el tamaño del almacenamiento intermedio */ pc->iSize = cpiBufferSize(&rc, parser); /* Cargar el primer byte en la corriente de datos */ pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex); /* Establecer el elemento actual en el elemento raíz */ pc->iCurrentElement = cpiRootElement(&rc, parser); /* Restablecer el distintivo para asegurar que el análisis se restablece correctamente */ pc->iInTag = 0; if (pc->trace) { fprintf(pc->tracefile, "PLUGIN: <- cpiParseBuffer() retvalue=%d\n", pc->iSize); fflush(pc->tracefile); }