summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <darkvater@openttd.org>2005-05-17 16:07:48 +0000
committerDarkvater <darkvater@openttd.org>2005-05-17 16:07:48 +0000
commit166c1badc91d8ab0211f16e7c90b8c011e2b4a74 (patch)
treeefcb05b249ff430eac804d30c6de32425edb026e
parent143dd26ef5a4edb1ab8b3d918c7c3268f8a6a077 (diff)
downloadopenttd-166c1badc91d8ab0211f16e7c90b8c011e2b4a74.tar.xz
(svn r2338) - CodeChange: only call the variable hooks when you set their value not when you query them
- Fix: typo in pool.c "Cleaing up" --> "Cleaning up"
-rw-r--r--console.c175
-rw-r--r--console_cmds.c2
-rw-r--r--pool.c2
3 files changed, 90 insertions, 89 deletions
diff --git a/console.c b/console.c
index 2a27dbf9c..95730c68e 100644
--- a/console.c
+++ b/console.c
@@ -472,6 +472,88 @@ bool GetArgumentInteger(uint32 *value, const char *arg)
return (arg == endptr) ? false : true;
}
+// * ************************* * //
+// * hooking code * //
+// * ************************* * //
+/**
+ * General internal hooking code that is the same for both commands and variables
+ * @param hooks @IConsoleHooks structure that will be set according to
+ * @param type type access trigger
+ * @param proc function called when the hook criteria is met
+ */
+static void IConsoleHookAdd(IConsoleHooks *hooks, IConsoleHookTypes type, IConsoleHook *proc)
+{
+ if (hooks == NULL || proc == NULL) return;
+
+ switch (type) {
+ case ICONSOLE_HOOK_ACCESS:
+ hooks->access = proc;
+ break;
+ case ICONSOLE_HOOK_PRE_ACTION:
+ hooks->pre = proc;
+ break;
+ case ICONSOLE_HOOK_POST_ACTION:
+ hooks->post = proc;
+ break;
+ default: NOT_REACHED();
+ }
+}
+
+/**
+ * Handle any special hook triggers. If the hook type is met check if
+ * there is a function associated with that and if so, execute it
+ * @param hooks @IConsoleHooks structure that will be checked
+ * @param type type of hook, trigger that needs to be activated
+ * @return true on a successfull execution of the hook command or if there
+ * is no hook/trigger present at all. False otherwise
+ */
+static bool IConsoleHookHandle(const IConsoleHooks *hooks, IConsoleHookTypes type)
+{
+ IConsoleHook *proc = NULL;
+ if (hooks == NULL) return false;
+
+ switch (type) {
+ case ICONSOLE_HOOK_ACCESS:
+ proc = hooks->access;
+ break;
+ case ICONSOLE_HOOK_PRE_ACTION:
+ proc = hooks->pre;
+ break;
+ case ICONSOLE_HOOK_POST_ACTION:
+ proc = hooks->post;
+ break;
+ default: NOT_REACHED();
+ }
+
+ return (proc == NULL) ? true : proc();
+}
+
+/**
+ * Add a hook to a command that will be triggered at certain points
+ * @param name name of the command that the hook is added to
+ * @param type type of hook that is added (ACCESS, BEFORE and AFTER change)
+ * @param proc function called when the hook criteria is met
+ */
+void IConsoleCmdHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc)
+{
+ IConsoleCmd *cmd = IConsoleCmdGet(name);
+ if (cmd == NULL) return;
+ IConsoleHookAdd(&cmd->hook, type, proc);
+}
+
+/**
+ * Add a hook to a variable that will be triggered at certain points
+ * @param name name of the variable that the hook is added to
+ * @param type type of hook that is added (ACCESS, BEFORE and AFTER change)
+ * @param proc function called when the hook criteria is met
+ */
+void IConsoleVarHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc)
+{
+ IConsoleVar *var = IConsoleVarGet(name);
+ if (var == NULL) return;
+ IConsoleHookAdd(&var->hook, type, proc);
+}
+
/**
* Perhaps ugly macro, but this saves us the trouble of writing the same function
* three types, just with different variables. Yes, templates would be handy. It was
@@ -729,6 +811,7 @@ IConsoleVar *IConsoleVarGet(const char *name)
*/
static void IConsoleVarSetValue(const IConsoleVar *var, uint32 value)
{
+ IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION);
switch (var->type) {
case ICONSOLE_VAR_BOOLEAN:
*(bool*)var->addr = (value != 0);
@@ -751,6 +834,7 @@ static void IConsoleVarSetValue(const IConsoleVar *var, uint32 value)
default: NOT_REACHED();
}
+ IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION);
IConsoleVarPrintSetValue(var);
}
@@ -764,7 +848,9 @@ static void IConsoleVarSetStringvalue(const IConsoleVar *var, char *value)
{
if (var->type != ICONSOLE_VAR_STRING || var->addr == NULL) return;
+ IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION);
ttd_strlcpy((char*)var->addr, (char*)value, var->size);
+ IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION);
IConsoleVarPrintSetValue(var); // print out the new value, giving feedback
return;
}
@@ -918,88 +1004,6 @@ void IConsoleVarExec(const IConsoleVar *var, byte tokencount, char *token[ICON_T
IConsoleError("invalid variable assignment");
}
-// * ************************* * //
-// * hooking code * //
-// * ************************* * //
-/**
- * General internal hooking code that is the same for both commands and variables
- * @param hooks @IConsoleHooks structure that will be set according to
- * @param type type access trigger
- * @param proc function called when the hook criteria is met
- */
-static void IConsoleHookAdd(IConsoleHooks *hooks, IConsoleHookTypes type, IConsoleHook *proc)
-{
- if (hooks == NULL || proc == NULL) return;
-
- switch (type) {
- case ICONSOLE_HOOK_ACCESS:
- hooks->access = proc;
- break;
- case ICONSOLE_HOOK_PRE_ACTION:
- hooks->pre = proc;
- break;
- case ICONSOLE_HOOK_POST_ACTION:
- hooks->post = proc;
- break;
- default: NOT_REACHED();
- }
-}
-
-/**
- * Handle any special hook triggers. If the hook type is met check if
- * there is a function associated with that and if so, execute it
- * @param hooks @IConsoleHooks structure that will be checked
- * @param type type of hook, trigger that needs to be activated
- * @return true on a successfull execution of the hook command or if there
- * is no hook/trigger present at all. False otherwise
- */
-static bool IConsoleHookHandle(IConsoleHooks *hooks, IConsoleHookTypes type)
-{
- IConsoleHook *proc = NULL;
- if (hooks == NULL) return false;
-
- switch (type) {
- case ICONSOLE_HOOK_ACCESS:
- proc = hooks->access;
- break;
- case ICONSOLE_HOOK_PRE_ACTION:
- proc = hooks->pre;
- break;
- case ICONSOLE_HOOK_POST_ACTION:
- proc = hooks->post;
- break;
- default: NOT_REACHED();
- }
-
- return (proc == NULL) ? true : proc();
-}
-
-/**
- * Add a hook to a command that will be triggered at certain points
- * @param name name of the command that the hook is added to
- * @param type type of hook that is added (ACCESS, BEFORE and AFTER change)
- * @param proc function called when the hook criteria is met
- */
-void IConsoleCmdHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc)
-{
- IConsoleCmd *cmd = IConsoleCmdGet(name);
- if (cmd == NULL) return;
- IConsoleHookAdd(&cmd->hook, type, proc);
-}
-
-/**
- * Add a hook to a variable that will be triggered at certain points
- * @param name name of the variable that the hook is added to
- * @param type type of hook that is added (ACCESS, BEFORE and AFTER change)
- * @param proc function called when the hook criteria is met
- */
-void IConsoleVarHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc)
-{
- IConsoleVar *var = IConsoleVarGet(name);
- if (var == NULL) return;
- IConsoleHookAdd(&var->hook, type, proc);
-}
-
/**
* Add a callback function to the variable. Some variables need
* very special processing, which can only be done with custom code
@@ -1109,12 +1113,9 @@ void IConsoleCmdExec(const char *cmdstr)
var = IConsoleVarGet(tokens[0]);
if (var != NULL) {
- if (IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_ACCESS)) {
- IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION);
+ if (IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_ACCESS))
IConsoleVarExec(var, t_index, &tokens[1]);
- if (t_index != 0) // value has indeed been changed
- IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION);
- }
+
return;
}
diff --git a/console_cmds.c b/console_cmds.c
index 3b2159142..d10c36ebf 100644
--- a/console_cmds.c
+++ b/console_cmds.c
@@ -1115,7 +1115,7 @@ DEF_CONSOLE_HOOK(ConHookServerName)
DEF_CONSOLE_HOOK(ConHookServerAdvertise)
{
- if (!_network_advertise)
+ if (!_network_advertise) // remove us from advertising
NetworkUDPRemoveAdvertise();
return true;
diff --git a/pool.c b/pool.c
index 4130c0723..5f4171668 100644
--- a/pool.c
+++ b/pool.c
@@ -10,7 +10,7 @@ void CleanPool(MemoryPool *pool)
{
uint i;
- DEBUG(misc, 4)("[Pool] (%s) Cleaing pool..", pool->name);
+ DEBUG(misc, 4)("[Pool] (%s) Cleaning pool..", pool->name);
/* Free all blocks */
for (i = 0; i < pool->current_blocks; i++)