int fix_message_parse(struct fix_message *self, struct buffer *buffer) { int ret = FIX_MSG_STATE_PARTIAL; unsigned long size; const char *start; self->head_buf = buffer; retry: start = buffer_start(buffer); size = buffer_size(buffer); if (!size) goto fail; ret = first_three_fields(self); if (ret) goto fail; ret = checksum(self, buffer); if (ret) goto fail; rest_of_message(self, buffer); return 0; fail: if (ret != FIX_MSG_STATE_PARTIAL) goto retry; buffer_advance(buffer, start - buffer_start(buffer)); return -1; }
int fix_message_parse(struct fix_message *self, struct buffer *buffer) { unsigned long size; const char *start; self->head_buf = buffer; retry: start = buffer_start(buffer); size = buffer_size(buffer); if (!size) goto fail; if (!first_three_fields(self)) goto fail; if (!checksum(self, buffer)) goto fail; rest_of_message(self, buffer); return 0; fail: if (size > FIX_MAX_MESSAGE_SIZE) goto retry; buffer_advance(buffer, start - buffer_start(buffer)); return -1; }
int fix_message_parse(struct fix_message *self, struct fix_dialect *dialect, struct buffer *buffer, unsigned long flags) { const char *start; int ret; self->head_buf = buffer; TRACE(LIBTRADING_FIX_MESSAGE_PARSE(self, dialect, buffer)); retry: ret = FIX_MSG_STATE_PARTIAL; start = buffer_start(buffer); if (!buffer_size(buffer)) goto fail; ret = first_three_fields(self, flags); if (ret) goto fail; ret = checksum(self, buffer, flags); if (ret) goto fail; rest_of_message(self, dialect, buffer); self->iov[0].iov_base = (void *)start; self->iov[0].iov_len = buffer_start(buffer) - start; TRACE(LIBTRADING_FIX_MESSAGE_PARSE_RET()); return 0; fail: if (ret != FIX_MSG_STATE_PARTIAL) goto retry; buffer_advance(buffer, start - buffer_start(buffer)); TRACE(LIBTRADING_FIX_MESSAGE_PARSE_ERR()); return -1; }