summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2016-02-28 02:17:21 +0100
committerHaru <haru@dotalux.com>2016-04-30 15:57:46 +0200
commit5db7c799055c6ae9c4463f6cf4c88a35597d5d31 (patch)
treee3cdf52436dc322aaab69babc6021af911bf7b9e /src
parent1ec93281b66061f7f7cff509450299bdcbf813b4 (diff)
downloadhercules-5db7c799055c6ae9c4463f6cf4c88a35597d5d31.tar.gz
hercules-5db7c799055c6ae9c4463f6cf4c88a35597d5d31.tar.bz2
hercules-5db7c799055c6ae9c4463f6cf4c88a35597d5d31.tar.xz
hercules-5db7c799055c6ae9c4463f6cf4c88a35597d5d31.zip
Added type-checking for the addHookPre() and addHookPost() macros
- The macros will now throw a warning at compile time if a plugin is using a wrong function type for a pre or post hook. This avoids some very subtle, hard to detect, issues. - The macros now require 3 arguments instead of 2. Example: old code: addHookPre("ifname->function" my_hook); becomes: addHookPre(ifname, function, my_hook); Signed-off-by: Haru <haru@dotalux.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/HPMHooking.h14
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc24
-rw-r--r--src/plugins/sample.c4
3 files changed, 38 insertions, 4 deletions
diff --git a/src/plugins/HPMHooking.h b/src/plugins/HPMHooking.h
index b2d95dd8d..44970863c 100644
--- a/src/plugins/HPMHooking.h
+++ b/src/plugins/HPMHooking.h
@@ -43,8 +43,18 @@ struct HPMHooking_core_interface {
#else // ! HERCULES_CORE
HPExport struct HPMHooking_interface HPMHooking_s;
-#define addHookPre(tname,hook) (HPMi->hooking->AddHook(HOOK_TYPE_PRE,(tname),(hook),HPMi->pid))
-#define addHookPost(tname,hook) (HPMi->hooking->AddHook(HOOK_TYPE_POST,(tname),(hook),HPMi->pid))
+#include "HPMHooking/HPMHooking.Defs.inc"
+
+#define addHookPre(ifname, funcname, hook) ( \
+ (void)((HPMHOOK_pre_ ## ifname ## _ ## funcname)0 == (hook)), \
+ HPMi->hooking->AddHook(HOOK_TYPE_PRE, #ifname "->" #funcname, (hook), HPMi->pid) \
+ )
+
+#define addHookPost(ifname, funcname, hook) ( \
+ (void)((HPMHOOK_post_ ## ifname ## _ ## funcname)0 == (hook)), \
+ HPMi->hooking->AddHook(HOOK_TYPE_POST, #ifname "->" #funcname, (hook), HPMi->pid) \
+ )
+
/* need better names ;/ */
/* will not run the original function after pre-hook processing is complete (other hooks will run) */
#define hookStop() (HPMi->hooking->HookStop(__func__,HPMi->pid))
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
new file mode 100644
index 000000000..72490c7c1
--- /dev/null
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -0,0 +1,24 @@
+/**
+ * This file is part of Hercules.
+ * http://herc.ws - http://github.com/HerculesWS/Hercules
+ *
+ * Copyright (C) 2013-2016 Hercules Dev Team
+ *
+ * Hercules is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * NOTE: This file was auto-generated and should never be manually edited,
+ * as it will get overwritten.
+ */
diff --git a/src/plugins/sample.c b/src/plugins/sample.c
index d6036dd70..1e45f9afd 100644
--- a/src/plugins/sample.c
+++ b/src/plugins/sample.c
@@ -200,13 +200,13 @@ HPExport void plugin_init (void) {
/* in this sample we add a PreHook to pc->dropitem */
/* to identify whether the item being dropped is on amount higher than 1 */
/* if so, it stores the amount on a variable (my_pc_dropitem_storage) and changes the amount to 1 */
- addHookPre("pc->dropitem",my_pc_dropitem_pre);
+ addHookPre(pc, dropitem, my_pc_dropitem_pre);
/* in this sample we add a PostHook to pc->dropitem */
/* if the original pc->dropitem was successful and the amount stored on my_pc_dropitem_storage is higher than 1, */
/* our posthook will display a message to the user about the cap */
/* - by checking whether it was successful (retVal value) it allows for the originals conditions to take place */
- addHookPost("pc->dropitem",my_pc_dropitem_post);
+ addHookPost(pc, dropitem, my_pc_dropitem_post);
}
}
/* triggered when server starts loading, before any server-specific data is set */