static int md_snapshot(struct fast_book *book, struct fast_message *msg) { struct price_level *levels; struct fast_decimal price; struct fast_field *field; struct price_level level; char type; i64 size; u32 ind; field = fast_get_field(msg, "MDEntryType"); if (!field || field_state_empty(field)) goto fail; type = field->string_value[0]; if (type == '0') { levels = book->ob.bids; } else if (type == '1') { levels = book->ob.asks; } else if (type == 'J') { book_add_flags(book, FAST_BOOK_EMPTY); goto exit; } else { goto fail; } field = fast_get_field(msg, "MDPriceLevel"); if (!field || field_state_empty(field)) goto fail; ind = field->uint_value - 1; field = fast_get_field(msg, "MDEntrySize"); if (!field || field_state_empty(field)) goto fail; size = field->int_value; field = fast_get_field(msg, "MDEntryPx"); if (!field || field_state_empty(field)) goto fail; price = field->decimal_value; if (price_align(&price, &book->tick)) goto fail; level.price = price.mnt; level.size = size; if (set_price_level(levels, book->ob.depth, &level, ind)) goto fail; exit: return 0; fail: return -1; }
static int md_increment(struct fast_book *book, struct fast_message *msg) { struct fast_decimal price; struct fast_field *field; struct ob_order order; char type; i64 size; field = fast_get_field(msg, "MDEntryType"); if (!field || field_state_empty(field)) goto fail; type = field->string_value[0]; if (type == '0') { order.buy = true; } else if (type == '1') { order.buy = false; } else if (type == 'J') { book_add_flags(book, FAST_BOOK_EMPTY); goto exit; } else { goto fail; } field = fast_get_field(msg, "MDEntrySize"); if (!field || field_state_empty(field)) goto fail; switch (field->type) { case FAST_TYPE_INT: size = field->int_value; break; case FAST_TYPE_DECIMAL: if (decimal_to_int(&field->decimal_value, &size)) goto fail; break; case FAST_TYPE_UINT: case FAST_TYPE_STRING: case FAST_TYPE_VECTOR: case FAST_TYPE_SEQUENCE: default: goto fail; } field = fast_get_field(msg, "MDEntryPx"); if (!field || field_state_empty(field)) goto fail; price = field->decimal_value; if (price_align(&price, &book->tick)) goto fail; order.seq_num = book->rptseq; order.price = price.mnt; order.size = size; field = fast_get_field(msg, "MDUpdateAction"); if (!field || field_state_empty(field)) goto fail; if (field->uint_value == 0) { if (ob_level_modify(&book->ob, &order)) goto fail; } else if (field->uint_value == 1) { if (ob_level_modify(&book->ob, &order)) goto fail; } else if (field->uint_value == 2) { if (book_has_flags(book, FAST_BOOK_ACTIVE)) { if (ob_level_delete(&book->ob, &order)) goto fail; } else { order.size = 0; if (ob_level_modify(&book->ob, &order)) goto fail; } } else { goto fail; } exit: return 0; fail: return -1; }