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); }
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()); }
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; }
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; }
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; }