Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}