void trans_check(MS_Mon_Transid_Type trans) {

    if (!TRANSID_EQUALS(trans, exp_trans)) {
        char exp_transbuf[100];
        char transbuf[100];
        util_format_transid(exp_transbuf, exp_trans);
        util_format_transid(transbuf, trans);
        printf("client=%d, expected trans=%s, actual trans=%s\n",
               client, exp_transbuf, transbuf);
    }
    assert(TRANSID_EQUALS(trans, exp_trans));
}
int tmlib(MS_Mon_Tmlib_Fun_Type  fun,
          MS_Mon_Transid_Type    transid,
          MS_Mon_Transid_Type   *transid_out) {
    const char          *funp;
    MS_Mon_Transid_Type  ltransid;

    if (exp_fun < 0) {
        printf("client=%d, cb not expected\n", client);
        assert(false); // callback not expected
    } else
        fun_check(fun);
    switch (fun) {
    case TMLIB_FUN_REG_TX:
        funp = "REG";
        trans_set_curr(transid);
        break;
    case TMLIB_FUN_CLEAR_TX:
        funp = "CLEAR";
        TRANSID_SET_NULL(ltransid);
        trans_set_curr(ltransid);
        break;
    case TMLIB_FUN_REINSTATE_TX:
        funp = "REINSTATE";
        if (client)
            trans_check(transid);
        trans_set_curr(transid);
        break;
    case TMLIB_FUN_GET_TX:
        funp = "GET";
        break;
    default:
        funp = "<unknown>";
        TRANSID_SET_NULL(ltransid);
        trans_set_curr(ltransid);
        break;
    }
    if (print) {
        char transidbuf[100];
        char curr_transidbuf[100];
        const char *clientp = client ? "client" : "server";
        util_format_transid(transidbuf, transid);
        util_format_transid(curr_transidbuf, curr_transid);
        printf("%s tmlib callback, fun=%s(%d), transid=%s, curr-transid=%s\n",
               clientp, funp, fun, transidbuf, curr_transidbuf);
    }
    fun_set(exp_fun_next, -1);
    if (fun == TMLIB_FUN_GET_TX)
        *transid_out = curr_transid;
    return 0;
}
void trans_check(MS_Mon_Transid_Type  trans,
                 MS_Mon_Transseq_Type startid) {

    if (!TRANSID_EQUALS(trans, exp_trans) || !TRANSSEQ_EQUALS(startid, exp_startid)) {
        char exp_startidbuf[100];
        char exp_transbuf[100];
        char transbuf[100];
        char startidbuf[100];
        util_format_transid(exp_transbuf, exp_trans);
        util_format_startid(exp_startidbuf, exp_startid);
        util_format_transid(transbuf, trans);
        util_format_startid(startidbuf, startid);
        printf("client=%d, expected trans=%s, actual trans=%s, expected startid=%s, startid=%s\n",
               client, exp_transbuf, transbuf, exp_startidbuf, startidbuf);
    }
    assert(TRANSID_EQUALS(trans, exp_trans));
    assert(TRANSSEQ_EQUALS(startid, exp_startid));
}