/* * Created by yuuta on 7/19/22. */ #include "log.h" #include "common.h" #include "libac.h" #include int ac_object_free(ac_obj_t *obj) { switch (obj->type & 192 /* 0b11000000 */) { case AC_TYPE_EVENT: { switch (obj->type) { case AC_EVENT_PLAYER_JOIN: { ac_event_player_join_t *v = (ac_event_player_join_t *) obj; if (v->player.name) free(v->player.name); if (v->player.uuid) free(v->player.uuid); if (v->player.type) free(v->player.type); goto ok; } case AC_EVENT_PLAYER_DISCONNECT: { ac_event_player_disconnect_t *v = (ac_event_player_disconnect_t *) obj; if (v->player) { if (v->player->name) free(v->player->name); if (v->player->uuid) free(v->player->uuid); if (v->player->type) free(v->player->type); free(v->player); } if (v->reason) free(v->reason); goto ok; } case AC_EVENT_ENTITY_DEATH: { ac_event_entity_death_t *v = (ac_event_entity_death_t *) obj; if (v->entity.name) free(v->entity.name); if (v->entity.uuid) free(v->entity.uuid); if (v->entity.type) free(v->entity.type); if (v->message) free(v->message); goto ok; } case AC_EVENT_PLAYER_MESSAGE: { ac_event_player_message_t *v = (ac_event_player_message_t *) obj; if (v->player.name) free(v->player.name); if (v->player.uuid) free(v->player.uuid); if (v->player.type) free(v->player.type); if (v->text) free(v->text); goto ok; } case AC_EVENT_LAGGING: { goto ok; } } } case AC_TYPE_REQUEST: /* Request objects are user-allocated. Do not free them and report an error. */ break; case AC_TYPE_RESPONSE: { switch (obj->type) { case AC_RESPONSE_CMD_RESULT: { goto ok; } case AC_RESPONSE_CMD_OUT: { ac_response_cmd_out_t *v = (ac_response_cmd_out_t *) obj; if (v->sender) free(v->sender); if (v->out) free(v->out); goto ok; } case AC_RESPONSE_ERROR: { ac_response_error_t *v = (ac_response_error_t *) obj; if (v->message) free(v->message); goto ok; } case AC_RESPONSE_OK: { goto ok; } } break; } } LOGE("Invalid type passed to ac_obj_free function."); return AC_E_INVALID_REQUEST; ok: { free(obj); return AC_E_OK; }; }