OpcodeTable::OpcodeTable() { DEFINE_HANDLER(C2SHeartbeat, heartbeat_handler); DEFINE_HANDLER(C2SLoginReq, user_login_handler); DEFINE_HANDLER(C2SRegisterReq, user_register_handler); DEFINE_HANDLER(C2SGetPlayerProfileReq, get_player_profile_handler); DEFINE_HANDLER(C2SChatMessageReq, chat_message_handler); DEFINE_HANDLER(C2SRoomCreateReq, room_create_handler); DEFINE_HANDLER(C2SSRoomInfoChangeReq, room_info_change_handler); DEFINE_HANDLER(C2SGetRoomListReq, get_room_list_handler); DEFINE_HANDLER(C2SEnterRoomReq, enter_room_handler); }
WorldListener::HandlerTable::HandlerTable() { #define DEFINE_HANDLER(opc, func) _handlers[opc] = { func, #opc } DEFINE_HANDLER(BNET_CHANGE_TOON_ONLINE_STATE, &WorldListener::HandleToonOnlineStatusChange); #undef DEFINE_HANDLER }
int main(int ac, char** av) { #define DEFINE_HANDLER(__s) { #__s, sizeof(#__s) - 1, do_ ## __s } static struct { const char* s; uint8_t len; void (*f)(const char*, uint8_t); } h[] = { DEFINE_HANDLER(addr), DEFINE_HANDLER(rmem), DEFINE_HANDLER(wmem), DEFINE_HANDLER(rrom), DEFINE_HANDLER(llen) }; static const uint8_t n = sizeof(h) / sizeof(h[0]); uint8_t i; uint8_t len; uart_setup(); ds2433_setup(); while (1) { len = read_line(line_buf, sizeof(line_buf)); if (len == 0) continue ; for (i = 0; i != n; ++i) { if (len < h[i].len) continue ; if (is_eq(line_buf, h[i].s, h[i].len)) break ; } if (i != n) h[i].f(line_buf + h[i].len, len - h[i].len); else write_ko(); } return 0; }