From 1032fbdbd05dca15f87d51394d0c9a2ccea2ecf9 Mon Sep 17 00:00:00 2001 From: Arkshine Date: Thu, 29 Oct 2015 12:12:26 +0100 Subject: [PATCH] Refactor 3 - Simplify macros and move them to shared file as well --- modules/fakemeta/pdata_gc.cpp | 144 ++++++++++---------------------- modules/fakemeta/pdata_shared.h | 37 ++++++++ 2 files changed, 81 insertions(+), 100 deletions(-) diff --git a/modules/fakemeta/pdata_gc.cpp b/modules/fakemeta/pdata_gc.cpp index bacbfdfe..3c5942bf 100644 --- a/modules/fakemeta/pdata_gc.cpp +++ b/modules/fakemeta/pdata_gc.cpp @@ -14,62 +14,6 @@ #include "fakemeta_amxx.h" #include "pdata_shared.h" -#define GET_TYPE_DESCRIPTION(position, data, baseType, list) \ - GET_TYPE_DESCRIPTION_START(position, data, baseType) \ - CHECK_##list##_OFFSET(className, memberName, data) \ - CHECK_ERROR(className, memberName) \ - GET_TYPE_DESCRIPTION_END(memberName, data, baseType) - -#define GET_TYPE_DESCRIPTION_START(position, data, baseType) \ - int classLength, memberLength; \ - const char *className = MF_GetAmxString(amx, params[position], 0, &classLength); \ - const char *memberName = MF_GetAmxString(amx, params[position + 1], 1, &memberLength); \ - if (!classLength || !memberLength) \ - { \ - MF_LogError(amx, AMX_ERR_NATIVE, "Either class (\"%s\") or member (\"%s\") is empty", className, memberName); \ - return 0; \ - } - -#define CHECK_ENTITY_OFFSET(className, memberName, data) \ - else if (!CommonConfig->GetOffsetByClass(className, memberName, &data)) - -#define CHECK_GAMERULES_OFFSET(className, memberName, data) \ - else if (!GamerulesConfig->GetOffsetByClass(className, memberName, &data)) - -#define CHECK_ALL_OFFSET(className, memberName, data) \ - else if (!CommonConfig->GetOffsetByClass(className, memberName, &data) && \ - !GamerulesConfig->GetOffsetByClass(className, memberName, &data)) - -#define CHECK_ERROR(className, memberName) \ - { \ - MF_LogError(amx, AMX_ERR_NATIVE, "Could not find class \"%s\" and/or member \"%s\" in gamedata", className, memberName); \ - return 0; \ - } - -#define GET_TYPE_DESCRIPTION_END(memberName, data, baseType) \ - else if (data.fieldOffset < 0) \ - { \ - MF_LogError(amx, AMX_ERR_NATIVE, "Invalid offset %d retrieved from \"%s\" member", data.fieldOffset, memberName); \ - return 0; \ - } \ - else if (baseType > BaseFieldType::None && baseType != GetBaseDataType(data)) \ - { \ - MF_LogError(amx, AMX_ERR_NATIVE, "Data field is not %s-based", BaseFieldTypeName[static_cast(baseType)]); \ - return 0; \ - } - -#define CHECK_ELEMENT(element) \ - if (element < 0 || (element > 0 && element >= data.fieldSize)) \ - { \ - MF_LogError(amx, AMX_ERR_NATIVE, "Invalid element index %d, value must be between 0 and %d", element, data.fieldSize); \ - return 0; \ - } \ - else if (element > 0 && !data.fieldSize) \ - { \ - MF_LogError(amx, AMX_ERR_NATIVE, "Member \"%s\" is not an array. Element %d is invalid.", memberName, element);\ - return 0; \ - } - #define CHECK_GAMERULES() \ if (!GameRulesAddress) \ { \ @@ -85,10 +29,10 @@ static cell AMX_NATIVE_CALL get_ent_data(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Integer, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Integer); return PvData::GetInt(entity, data, element); } @@ -100,10 +44,10 @@ static cell AMX_NATIVE_CALL set_ent_data(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Integer, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[5]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Integer); if (data.fieldType == FieldType::FIELD_STRUCTURE || data.fieldType == FieldType::FIELD_CLASS) { @@ -124,10 +68,10 @@ static cell AMX_NATIVE_CALL get_ent_data_float(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Float, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Float); return PvData::GetFloat(entity, data, element); } @@ -139,10 +83,10 @@ static cell AMX_NATIVE_CALL set_ent_data_float(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Float, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[5]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Float); PvData::SetFloat(entity, data, amx_ctof(params[4]), element); @@ -157,10 +101,10 @@ static cell AMX_NATIVE_CALL get_ent_data_vector(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Vector, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[5]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Vector); PvData::GetVector(entity, data, MF_GetAmxAddr(amx, params[4]), element); @@ -174,10 +118,10 @@ static cell AMX_NATIVE_CALL set_ent_data_vector(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Vector, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[5]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Vector); PvData::SetVector(entity, data, MF_GetAmxAddr(amx, params[4]), element); @@ -192,10 +136,10 @@ static cell AMX_NATIVE_CALL get_ent_data_entity(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Entity, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Entity); return PvData::GetEntity(entity, data, element); } @@ -214,10 +158,10 @@ static cell AMX_NATIVE_CALL set_ent_data_entity(AMX *amx, cell *params) } TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::Entity, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[5]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Entity); PvData::SetEntity(entity, data, value, element); @@ -232,10 +176,10 @@ static cell AMX_NATIVE_CALL get_ent_data_string(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::String, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[6]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::String); auto buffer = params[4]; auto maxlen = params[5]; @@ -257,10 +201,10 @@ static cell AMX_NATIVE_CALL set_ent_data_string(AMX *amx, cell *params) CHECK_ENTITY(entity); TypeDescription data; - GET_TYPE_DESCRIPTION(2, data, BaseFieldType::String, ENTITY); + GET_TYPE_DESCRIPTION(2, data, CommonConfig); int element = params[5]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::String); int length; const char *value = MF_GetAmxString(amx, params[4], 0, &length); @@ -273,7 +217,7 @@ static cell AMX_NATIVE_CALL set_ent_data_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_ent_data_size(AMX *amx, cell *params) { TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::None, ENTITY); + GET_TYPE_DESCRIPTION(1, data, CommonConfig); return data.fieldSize; } @@ -282,7 +226,7 @@ static cell AMX_NATIVE_CALL get_ent_data_size(AMX *amx, cell *params) static cell AMX_NATIVE_CALL find_ent_data_info(AMX *amx, cell *params) { TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::None, ENTITY); + GET_TYPE_DESCRIPTION(1, data, CommonConfig); *MF_GetAmxAddr(amx, params[3]) = static_cast(data.fieldType); *MF_GetAmxAddr(amx, params[4]) = ke::Max(0, data.fieldSize); @@ -300,10 +244,10 @@ static cell AMX_NATIVE_CALL get_gamerules_int(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Integer, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[3]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Integer); return PvData::GetInt(GameRulesAddress, data, element); } @@ -314,10 +258,10 @@ static cell AMX_NATIVE_CALL set_gamerules_int(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Integer, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Integer); if (data.fieldType == FieldType::FIELD_STRUCTURE || data.fieldType == FieldType::FIELD_CLASS) { @@ -337,10 +281,10 @@ static cell AMX_NATIVE_CALL get_gamerules_float(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Float, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[3]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Float); return PvData::GetFloat(GameRulesAddress, data, element); } @@ -351,10 +295,10 @@ static cell AMX_NATIVE_CALL set_gamerules_float(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Float, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Float); PvData::SetFloat(GameRulesAddress, data, amx_ctof(params[3]), element); @@ -368,10 +312,10 @@ static cell AMX_NATIVE_CALL get_gamerules_vector(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Vector, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Vector); PvData::GetVector(GameRulesAddress, data, MF_GetAmxAddr(amx, params[3]), element); @@ -384,10 +328,10 @@ static cell AMX_NATIVE_CALL set_gamerules_vector(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Vector, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Vector); PvData::GetVector(GameRulesAddress, data, MF_GetAmxAddr(amx, params[3]), element); @@ -401,10 +345,10 @@ static cell AMX_NATIVE_CALL get_gamerules_entity(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Entity, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[3]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Entity); return PvData::GetEntity(GameRulesAddress, data, element); } @@ -422,10 +366,10 @@ static cell AMX_NATIVE_CALL set_gamerules_entity(AMX *amx, cell *params) } TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::Entity, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::Entity); PvData::SetEntity(GameRulesAddress, data, params[3], element); @@ -439,10 +383,10 @@ static cell AMX_NATIVE_CALL get_gamerules_string(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::String, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[5]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::String); auto buffer = params[3]; auto maxlen = params[4]; @@ -463,10 +407,10 @@ static cell AMX_NATIVE_CALL set_gamerules_string(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::String, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); int element = params[4]; - CHECK_ELEMENT(element); + CHECK_DATA(data, element, BaseFieldType::String); int length; const char *value = MF_GetAmxString(amx, params[3], 0, &length); @@ -481,7 +425,7 @@ static cell AMX_NATIVE_CALL get_gamerules_size(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::None, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); return data.fieldSize; } @@ -492,7 +436,7 @@ static cell AMX_NATIVE_CALL find_gamerules_info(AMX *amx, cell *params) CHECK_GAMERULES(); TypeDescription data; - GET_TYPE_DESCRIPTION(1, data, BaseFieldType::None, GAMERULES); + GET_TYPE_DESCRIPTION(1, data, GamerulesConfig); *MF_GetAmxAddr(amx, params[3]) = static_cast(data.fieldType); *MF_GetAmxAddr(amx, params[4]) = ke::Max(0, data.fieldSize); diff --git a/modules/fakemeta/pdata_shared.h b/modules/fakemeta/pdata_shared.h index 983cc9e1..ba922765 100644 --- a/modules/fakemeta/pdata_shared.h +++ b/modules/fakemeta/pdata_shared.h @@ -26,6 +26,43 @@ enum class BaseFieldType String, }; +#define GET_TYPE_DESCRIPTION(position, data, conf) \ + int classLength, memberLength; \ + char const *className = MF_GetAmxString(amx, params[position], 0, &classLength); \ + char const *memberName = MF_GetAmxString(amx, params[position + 1], 1, &memberLength); \ + if (!classLength || !memberLength) \ + { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Either class (\"%s\") or member (\"%s\") is empty", className, memberName); \ + return 0; \ + } \ + else if (!conf->GetOffsetByClass(className, memberName, &data)) \ + { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Could not find class \"%s\" and/or member \"%s\" in gamedata", className, memberName); \ + return 0; \ + } \ + else if (data.fieldOffset < 0) \ + { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid offset %d retrieved from \"%s\" member", data.fieldOffset, memberName); \ + return 0; \ + } + +#define CHECK_DATA(data, element, baseType) \ + if (baseType > BaseFieldType::None && baseType != PvData::GetBaseDataType(data)) \ + { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Data field is not %s-based", PvData::GetBaseTypeName(baseType)); \ + return 0; \ + } \ + else if (element < 0 || (element > 0 && element >= data.fieldSize)) \ + { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid element index %d, value must be between 0 and %d", element, data.fieldSize); \ + return 0; \ + } \ + else if (element > 0 && !data.fieldSize) \ + { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Member \"%s\" is not an array. Element %d is invalid.", memberName, element); \ + return 0; \ + } + class PvData { public: