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 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_promisc(buffer, &tag, &tag_ptr)) return; type = fix_tag_type(tag); switch (type) { case FIX_TYPE_INT: self->fields[nr_fields++] = FIX_INT_FIELD(tag, strtol(tag_ptr, NULL, 10)); goto retry; case FIX_TYPE_FLOAT: self->fields[nr_fields++] = FIX_FLOAT_FIELD(tag, strtod(tag_ptr, NULL)); goto retry; case FIX_TYPE_CHAR: 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 = strtol(tag_ptr, NULL, 10); goto retry; default: goto retry; } self->nr_fields = nr_fields; }