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