예제 #1
0
static void fix_message_unparse(struct fix_message *self)
{
	struct fix_field sender_comp_id;
	struct fix_field target_comp_id;
	struct fix_field begin_string;
	struct fix_field sending_time;
	struct fix_field body_length;
	struct fix_field msg_seq_num;
	struct fix_field check_sum;
	struct fix_field msg_type;
	unsigned long cksum;
	char fmt[64], buf[64];
	struct timeval tv;
	struct tm *tm;
	int i;

	gettimeofday(&tv, NULL);
	tm = gmtime(&tv.tv_sec);
	assert(tm != NULL);

	/* YYYYMMDD-HH:MM:SS.sss */
	strftime(fmt, sizeof fmt, "%Y%m%d-%H:%M:%S", tm);
	snprintf(buf, sizeof buf, "%s.%03ld", fmt, (long)tv.tv_usec / 1000);

	/* standard header */
	msg_type	= FIX_STRING_FIELD(MsgType, self->msg_type);
	sender_comp_id	= FIX_STRING_FIELD(SenderCompID, self->sender_comp_id);
	target_comp_id	= FIX_STRING_FIELD(TargetCompID, self->target_comp_id);
	msg_seq_num	= FIX_INT_FIELD   (MsgSeqNum, self->msg_seq_num);
	sending_time	= FIX_STRING_FIELD(SendingTime, buf);

	/* body */
	fix_field_unparse(&msg_type, self->body_buf);
	fix_field_unparse(&sender_comp_id, self->body_buf);
	fix_field_unparse(&target_comp_id, self->body_buf);
	fix_field_unparse(&msg_seq_num, self->body_buf);
	fix_field_unparse(&sending_time, self->body_buf);

	for (i = 0; i < self->nr_fields; i++)
		fix_field_unparse(&self->fields[i], self->body_buf);

	/* head */
	begin_string	= FIX_STRING_FIELD(BeginString, self->begin_string);
	body_length	= FIX_INT_FIELD(BodyLength, buffer_size(self->body_buf));

	fix_field_unparse(&begin_string, self->head_buf);
	fix_field_unparse(&body_length, self->head_buf);

	/* trailer */
	cksum		= buffer_sum(self->head_buf) + buffer_sum(self->body_buf);
	check_sum	= FIX_CHECKSUM_FIELD(CheckSum, cksum % 256);
	fix_field_unparse(&check_sum, self->body_buf);
}
예제 #2
0
void fix_message_unparse(struct fix_message *self)
{
    struct fix_field sender_comp_id;
    struct fix_field target_comp_id;
    struct fix_field begin_string;
    struct fix_field sending_time;
    struct fix_field body_length;
    struct fix_field msg_seq_num;
    struct fix_field check_sum;
    struct fix_field msg_type;
    unsigned long cksum;
    char buf[64];
    int i;

    TRACE(LIBTRADING_FIX_MESSAGE_UNPARSE(self));

    strncpy(buf, self->str_now, sizeof(buf));

    /* standard header */
    msg_type	= (self->type != FIX_MSG_TYPE_UNKNOWN) ?
                  FIX_STRING_FIELD(MsgType, fix_msg_types[self->type]) :
                  FIX_STRING_FIELD(MsgType, self->msg_type);
    sender_comp_id	= FIX_STRING_FIELD(SenderCompID, self->sender_comp_id);
    target_comp_id	= FIX_STRING_FIELD(TargetCompID, self->target_comp_id);
    msg_seq_num	= FIX_INT_FIELD   (MsgSeqNum, self->msg_seq_num);
    sending_time	= FIX_STRING_FIELD(SendingTime, buf);

    /* body */
    fix_field_unparse(&msg_type, self->body_buf);
    fix_field_unparse(&sender_comp_id, self->body_buf);
    fix_field_unparse(&target_comp_id, self->body_buf);
    fix_field_unparse(&msg_seq_num, self->body_buf);
    fix_field_unparse(&sending_time, self->body_buf);

    for (i = 0; i < self->nr_fields; i++)
        fix_field_unparse(&self->fields[i], self->body_buf);

    /* head */
    begin_string	= FIX_STRING_FIELD(BeginString, self->begin_string);
    body_length	= FIX_INT_FIELD(BodyLength, buffer_size(self->body_buf));

    fix_field_unparse(&begin_string, self->head_buf);
    fix_field_unparse(&body_length, self->head_buf);

    /* trailer */
    cksum		= buffer_sum(self->head_buf) + buffer_sum(self->body_buf);
    check_sum	= FIX_CHECKSUM_FIELD(CheckSum, cksum % 256);
    fix_field_unparse(&check_sum, self->body_buf);

    TRACE(LIBTRADING_FIX_MESSAGE_UNPARSE_RET());
}
예제 #3
0
static void rest_of_message(struct fix_message *self, struct buffer *buffer)
{
	int tag = 0;
	const char *tag_ptr = NULL;
	unsigned long nr_fields = 0;

	self->nr_fields = 0;

retry:
	if (!(tag_ptr = parse_field_promisc(buffer, &tag)))
		return;

	switch (tag) {
	case CheckSum:
		break;
	case BeginSeqNo:
	case EndSeqNo:
		self->fields[nr_fields++] = FIX_INT_FIELD(tag, strtol(tag_ptr, NULL, 10));
		goto retry;
	case MsgSeqNum:
		self->msg_seq_num = strtol(tag_ptr, NULL, 10);
		goto retry;
	default:
		goto retry;
	};

	self->nr_fields = nr_fields;
}
예제 #4
0
    static void rest_of_message(struct fix_message *self, struct fix_dialect *dialect, struct buffer *buffer)
{
    int tag = 0;
    const char *tag_ptr = NULL;
    unsigned long nr_fields = 0;
    enum fix_type type;

    self->nr_fields = 0;

retry:
    if (parse_field(buffer, &tag, &tag_ptr))
        return;

    type = dialect->tag_type(tag);

    switch (type) {
    case FIX_TYPE_INT:
        self->fields[nr_fields++] = FIX_INT_FIELD(tag, fix_atoi64(tag_ptr, NULL));
        goto retry;
    case FIX_TYPE_FLOAT:
        self->fields[nr_fields++] = FIX_FLOAT_FIELD(tag, strtod(tag_ptr, NULL));
        goto retry;
    case FIX_TYPE_CHAR:
        self->fields[nr_fields++] = FIX_CHAR_FIELD(tag, tag_ptr[0]);
        goto retry;
    case FIX_TYPE_STRING:
        self->fields[nr_fields++] = FIX_STRING_FIELD(tag, tag_ptr);
        goto retry;
    case FIX_TYPE_CHECKSUM:
        break;
    case FIX_TYPE_MSGSEQNUM:
        self->msg_seq_num = fix_uatoi(tag_ptr, NULL);
        goto retry;
    default:
        goto retry;
    }

    self->nr_fields = nr_fields;
}
예제 #5
0
파일: test.c 프로젝트: Hegen/libtrading
int init_elem(struct felem *elem, char *line)
{
	char *start;
	char *end;
	int tag;

	if (!elem)
		return 1;

	start = strcpy(elem->buf, line);

	while (1) {
		if (*start == 0x00 || *start == 0x0A)
			break;

		tag = strtol(start, &end, 10);
		end++;

		switch (tag) {
			case EncryptMethod:
			case HeartBtInt:
			case BeginSeqNo:
			case NewSeqNo:
			case EndSeqNo:
				elem->msg.fields[elem->msg.nr_fields++] = FIX_INT_FIELD(tag, strtol(end, NULL, 10));
				break;
			case ResetSeqNumFlag:
			case GapFillFlag:
			case SendingTime:
			case TestReqID:
				elem->msg.fields[elem->msg.nr_fields++] = FIX_STRING_FIELD(tag, end);
				break;
			case MsgSeqNum:
				elem->msg.msg_seq_num = strtol(end, NULL, 10);
				break;
			case BodyLength:
				elem->msg.body_length = strtol(end, NULL, 10);
				break;
			case SenderCompID:
				elem->msg.sender_comp_id = end;
				break;
			case TargetCompID:
				elem->msg.target_comp_id = end;
				break;
			case BeginString:
				elem->msg.begin_string = end;
				break;
			case CheckSum:
				elem->msg.check_sum = end;
				break;
			case MsgType:
				elem->msg.type = fix_msg_type_parse(end);
				elem->msg.msg_type = end;
				break;
			default: /* Unsupported Tag */
				return 1;
		}

		while (*end != 0x00 && *end != 0x01 && *end != 0x0A)
			end++;

		if (*end == 0x00 || *end == 0x0A) {
			*end = 0x00;
			break;
		}

		*end = 0x00;

		start = end + 1;
	}

	return 0;
}