]> jfr.im git - irc/quakenet/newserv.git/blame - core/hooks.c
Merged.
[irc/quakenet/newserv.git] / core / hooks.c
CommitLineData
2c5db955
CP
1/* hooks.c */
2
3#include "hooks.h"
4#include <assert.h>
5#include "../lib/array.h"
6
7array hooks[HOOKMAX];
a451a113 8unsigned int hookqueuelength;
2c5db955
CP
9
10void inithooks() {
11 int i;
12
526e7c1d 13 hookqueuelength=0;
2c5db955
CP
14 for (i=0;i<HOOKMAX;i++) {
15 array_init(&(hooks[i]),sizeof(HookCallback));
16 array_setlim1(&(hooks[i]),2);
17 array_setlim2(&(hooks[i]),2);
18 }
19}
20
21int registerhook(int hooknum, HookCallback callback) {
22 int i;
23 HookCallback *hcbs;
24
25 if (hooknum>HOOKMAX)
26 return 1;
27
28 hcbs=(HookCallback *)(hooks[hooknum].content);
29 for(i=0;i<hooks[hooknum].cursi;i++)
30 if(hcbs[i]==callback)
31 return 1;
32
33 i=array_getfreeslot(&hooks[hooknum]);
34 hcbs=(HookCallback *)(hooks[hooknum].content);
35 hcbs[i]=callback;
36
37 return 0;
38}
39
40int deregisterhook(int hooknum, HookCallback callback) {
41 int i;
42 HookCallback *hcbs;
43
44 if (hooknum>HOOKMAX)
45 return 1;
46
47 hcbs=(HookCallback *)(hooks[hooknum].content);
48
49 for(i=0;i<hooks[hooknum].cursi;i++)
50 if(hcbs[i]==callback) {
51 array_delslot(&(hooks[hooknum]),i);
52 return 0;
53 }
54
55 return 1;
56}
57
58void triggerhook(int hooknum, void *arg) {
59 int i;
60 HookCallback *hcbs;
61
62 if (hooknum>HOOKMAX)
63 return;
64
526e7c1d 65 hookqueuelength++;
2c5db955
CP
66 hcbs=(HookCallback *)(hooks[hooknum].content);
67 for (i=0;i<hooks[hooknum].cursi;i++) {
68 (hcbs[i])(hooknum, arg);
69 }
526e7c1d
P
70 hookqueuelength--;
71
72 if (!hookqueuelength && hooknum!=HOOK_CORE_ENDOFHOOKSQUEUE)
73 triggerhook(HOOK_CORE_ENDOFHOOKSQUEUE, 0);
2c5db955
CP
74}
75