[Quest API] Perl Group Validation Macro

Add validation macro to all group methods.
This commit is contained in:
Kinglykrab 2021-02-01 22:10:22 -05:00
parent 9b8845949e
commit 6cfe7853f5

View File

@ -42,6 +42,18 @@
#undef THIS #undef THIS
#endif #endif
#define VALIDATE_THIS_IS_GROUP \
do { \
if (sv_derived_from(ST(0), "Group")) { \
IV tmp = SvIV((SV*)SvRV(ST(0))); \
THIS = INT2PTR(Group*, tmp); \
} else { \
Perl_croak(aTHX_ "THIS is not of type Group"); \
} \
if (THIS == nullptr) { \
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \
} \
} while (0);
XS(XS_Group_DisbandGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_DisbandGroup); /* prototype to pass -Wmissing-prototypes */
XS(XS_Group_DisbandGroup) { XS(XS_Group_DisbandGroup) {
@ -50,15 +62,7 @@ XS(XS_Group_DisbandGroup) {
Perl_croak(aTHX_ "Usage: Group::DisbandGroup(THIS)"); Perl_croak(aTHX_ "Usage: Group::DisbandGroup(THIS)");
{ {
Group *THIS; Group *THIS;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->DisbandGroup(); THIS->DisbandGroup();
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -73,15 +77,7 @@ XS(XS_Group_IsGroupMember) {
Group *THIS; Group *THIS;
bool RETVAL; bool RETVAL;
Mob *client; Mob *client;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
client = INT2PTR(Mob *, tmp); client = INT2PTR(Mob *, tmp);
@ -106,15 +102,7 @@ XS(XS_Group_CastGroupSpell) {
Group *THIS; Group *THIS;
Mob *caster; Mob *caster;
uint16 spellid = (uint16) SvUV(ST(2)); uint16 spellid = (uint16) SvUV(ST(2));
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
caster = INT2PTR(Mob *, tmp); caster = INT2PTR(Mob *, tmp);
@ -137,15 +125,7 @@ XS(XS_Group_SplitExp) {
Group *THIS; Group *THIS;
uint32 exp = (uint32) SvUV(ST(1)); uint32 exp = (uint32) SvUV(ST(1));
Mob *other; Mob *other;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(2), "Mob")) { if (sv_derived_from(ST(2), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(2))); IV tmp = SvIV((SV *) SvRV(ST(2)));
other = INT2PTR(Mob *, tmp); other = INT2PTR(Mob *, tmp);
@ -169,15 +149,7 @@ XS(XS_Group_GroupMessage) {
Mob *sender; Mob *sender;
uint8 language; uint8 language;
char *message; char *message;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
sender = INT2PTR(Mob *, tmp); sender = INT2PTR(Mob *, tmp);
@ -210,15 +182,7 @@ XS(XS_Group_GetTotalGroupDamage) {
uint32 RETVAL; uint32 RETVAL;
dXSTARG; dXSTARG;
Mob *other; Mob *other;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
other = INT2PTR(Mob *, tmp); other = INT2PTR(Mob *, tmp);
@ -245,15 +209,7 @@ XS(XS_Group_SplitMoney) {
uint32 silver = (uint32) SvUV(ST(2)); uint32 silver = (uint32) SvUV(ST(2));
uint32 gold = (uint32) SvUV(ST(3)); uint32 gold = (uint32) SvUV(ST(3));
uint32 platinum = (uint32) SvUV(ST(4)); uint32 platinum = (uint32) SvUV(ST(4));
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->SplitMoney(copper, silver, gold, platinum); THIS->SplitMoney(copper, silver, gold, platinum);
} }
XSRETURN_EMPTY; XSRETURN_EMPTY;
@ -267,15 +223,7 @@ XS(XS_Group_SetLeader) {
{ {
Group *THIS; Group *THIS;
Mob *newleader; Mob *newleader;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
newleader = INT2PTR(Mob *, tmp); newleader = INT2PTR(Mob *, tmp);
@ -297,15 +245,7 @@ XS(XS_Group_GetLeader) {
{ {
Group *THIS; Group *THIS;
Mob *RETVAL; Mob *RETVAL;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetLeader(); RETVAL = THIS->GetLeader();
ST(0) = sv_newmortal(); ST(0) = sv_newmortal();
sv_setref_pv(ST(0), "Mob", (void *) RETVAL); sv_setref_pv(ST(0), "Mob", (void *) RETVAL);
@ -322,15 +262,7 @@ XS(XS_Group_GetLeaderName) {
Group *THIS; Group *THIS;
const char *RETVAL; const char *RETVAL;
dXSTARG; dXSTARG;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetLeaderName(); RETVAL = THIS->GetLeaderName();
sv_setpv(TARG, RETVAL); sv_setpv(TARG, RETVAL);
XSprePUSH; XSprePUSH;
@ -347,15 +279,7 @@ XS(XS_Group_SendHPPacketsTo) {
{ {
Group *THIS; Group *THIS;
Mob *newmember; Mob *newmember;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
newmember = INT2PTR(Mob *, tmp); newmember = INT2PTR(Mob *, tmp);
@ -377,15 +301,7 @@ XS(XS_Group_SendHPPacketsFrom) {
{ {
Group *THIS; Group *THIS;
Mob *newmember; Mob *newmember;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
newmember = INT2PTR(Mob *, tmp); newmember = INT2PTR(Mob *, tmp);
@ -408,15 +324,7 @@ XS(XS_Group_IsLeader) {
Group *THIS; Group *THIS;
bool RETVAL; bool RETVAL;
Mob *leadertest; Mob *leadertest;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
leadertest = INT2PTR(Mob *, tmp); leadertest = INT2PTR(Mob *, tmp);
@ -441,15 +349,7 @@ XS(XS_Group_GroupCount) {
Group *THIS; Group *THIS;
uint8 RETVAL; uint8 RETVAL;
dXSTARG; dXSTARG;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GroupCount(); RETVAL = THIS->GroupCount();
XSprePUSH; XSprePUSH;
PUSHu((UV) RETVAL); PUSHu((UV) RETVAL);
@ -466,15 +366,7 @@ XS(XS_Group_GetHighestLevel) {
Group *THIS; Group *THIS;
uint32 RETVAL; uint32 RETVAL;
dXSTARG; dXSTARG;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetHighestLevel(); RETVAL = THIS->GetHighestLevel();
XSprePUSH; XSprePUSH;
PUSHu((UV) RETVAL); PUSHu((UV) RETVAL);
@ -495,15 +387,7 @@ XS(XS_Group_TeleportGroup) {
float y = (float) SvNV(ST(4)); float y = (float) SvNV(ST(4));
float z = (float) SvNV(ST(5)); float z = (float) SvNV(ST(5));
float heading = (float) SvNV(ST(6)); float heading = (float) SvNV(ST(6));
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
if (sv_derived_from(ST(1), "Mob")) { if (sv_derived_from(ST(1), "Mob")) {
IV tmp = SvIV((SV *) SvRV(ST(1))); IV tmp = SvIV((SV *) SvRV(ST(1)));
sender = INT2PTR(Mob *, tmp); sender = INT2PTR(Mob *, tmp);
@ -526,15 +410,7 @@ XS(XS_Group_GetID) {
Group *THIS; Group *THIS;
uint32 RETVAL; uint32 RETVAL;
dXSTARG; dXSTARG;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetID(); RETVAL = THIS->GetID();
XSprePUSH; XSprePUSH;
PUSHu((UV) RETVAL); PUSHu((UV) RETVAL);
@ -552,15 +428,7 @@ XS(XS_Group_GetMember) {
Mob *member; Mob *member;
Client *RETVAL = nullptr; Client *RETVAL = nullptr;
dXSTARG; dXSTARG;
VALIDATE_THIS_IS_GROUP;
if (sv_derived_from(ST(0), "Group")) {
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
int index = (int) SvUV(ST(1)); int index = (int) SvUV(ST(1));
if (index < 0 || index > 5) if (index < 0 || index > 5)
RETVAL = nullptr; RETVAL = nullptr;
@ -584,14 +452,7 @@ XS(XS_Group_DoesAnyMemberHaveExpeditionLockout) {
} }
Group* THIS = nullptr; Group* THIS = nullptr;
if (sv_derived_from(ST(0), "Group")) { VALIDATE_THIS_IS_GROUP;
IV tmp = SvIV((SV *) SvRV(ST(0)));
THIS = INT2PTR(Group *, tmp);
} else
Perl_croak(aTHX_ "THIS is not of type Group");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
std::string expedition_name(SvPV_nolen(ST(1))); std::string expedition_name(SvPV_nolen(ST(1)));
std::string event_name(SvPV_nolen(ST(2))); std::string event_name(SvPV_nolen(ST(2)));
int max_check_count = (items == 4) ? static_cast<int>(SvIV(ST(3))) : 0; int max_check_count = (items == 4) ? static_cast<int>(SvIV(ST(3))) : 0;