offset 매개변수는 구문 분석이 시작될 메시지 버퍼 내의 오프셋을 나타냅니다. 다른 구문 분석기가 메시지의 앞부분을 소유할 수 있기 때문에 이 매개변수가 필요합니다. (예를 들면, 메시지 브로커의 내부 구문 분석기가 MQMD 헤더를 구문 분석했을 수 있습니다.) 오프셋은 양수여야 하며, 버퍼 크기보다 작아야 합니다. 구현 함수가 오프셋의 유효성을 검증하는 것이 좋습니다. 그러면 이전의 구문 분석기에 오류가 있을 경우 문제점 판별에 도움이 되기 때문입니다.
구문 분석기는 해당 플러그인이 소유하는 나머지 버퍼의 크기를 리턴해야 합니다. 이 크기는 현재 오프셋보다 작은 버퍼 크기 이하여야 합니다.
구문 분석기는 가령, 루트 요소나 다른 분기로 이동하여 구문 요소 트리의 다른 부분에 대한 구문 분석이 수행되도록 해서는 안 됩니다. 이 경우 예상치 못한 결과가 발생할 수 있습니다.
이 구현 함수가 CPI_VFT 구조에 제공된 경우, cpiParseBufferEncoded()와 cpiParseBufferFormatted() 모두 지정할 수 없습니다. CCI_INVALID_IMPL_FUNCTION 리턴 코드가 표시되면서 cpiDefineParserClass() 함수가 작동 중지되기 때문입니다.
정의 대상 | 유형 | 구성원 |
CPI_VFT | 조건부 | iFpParseBuffer |
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset);
구문 분석기가 소유하는 메시지 버퍼의 나머지 부분 크기(바이트 단위).
다음 예는 샘플 구문 분석기 파일 BipSampPluginParser.c에서 발췌한 것입니다(428 - 466행).
int cpiParseBuffer( CciParser* parser, CciContext* context, int offset, ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc; /* Get a pointer to the message buffer and set the offset */ pc->iBuffer = (void *)cpiBufferPointer(&rc, parser); pc->iIndex = 0; /* Save size of the buffer */ pc->iSize = cpiBufferSize(&rc, parser); /* Prime the first byte in the stream */ pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex); /* Set the current element to the root element */ pc->iCurrentElement = cpiRootElement(&rc, parser); /* Reset flag to ensure parsing is reset correctly */ pc->iInTag = 0; if (pc->trace) { fprintf(pc->tracefile, "PLUGIN: <- cpiParseBuffer() retvalue=%d\n", pc->iSize); fflush(pc->tracefile); }