]> jfr.im git - irc/quakenet/newserv.git/blob - newsearch/ns-modes.c
SearchCtx should contain 'type' - this is to make life easier when defining new searc...
[irc/quakenet/newserv.git] / newsearch / ns-modes.c
1 /*
2 * MODES functionality
3 */
4
5 #include "newsearch.h"
6
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 struct modes_localdata {
11 flag_t setmodes;
12 flag_t clearmodes;
13 };
14
15 void *modes_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
16 void modes_free(searchCtx *ctx, struct searchNode *thenode);
17
18 struct searchNode *modes_parse(searchCtx *ctx, int argc, char **argv) {
19 struct modes_localdata *localdata;
20 struct searchNode *thenode;
21 const flag *flaglist;
22
23 if (argc!=1) {
24 parseError="modes: usage: modes (mode string)";
25 return NULL;
26 }
27
28 switch (ctx->type) {
29 case SEARCHTYPE_CHANNEL:
30 flaglist=cmodeflags;
31 break;
32
33 case SEARCHTYPE_NICK:
34 flaglist=umodeflags;
35 break;
36
37 default:
38 parseError="modes: unsupported search type";
39 return NULL;
40 }
41
42 if (!(localdata=(struct modes_localdata *)malloc(sizeof(struct modes_localdata)))) {
43 parseError = "malloc: could not allocate memory for this search.";
44 return NULL;
45 }
46
47 localdata->setmodes=0;
48 localdata->clearmodes = ~0;
49
50 setflags(&(localdata->setmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE);
51 setflags(&(localdata->clearmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE);
52
53 localdata->clearmodes = ~(localdata->clearmodes);
54
55 if (!(thenode=(struct searchNode *)malloc(sizeof(struct searchNode)))) {
56 /* couldn't malloc() memory for thenode, so free localdata to avoid leakage */
57 parseError = "malloc: could not allocate memory for this search.";
58 free(localdata);
59 return NULL;
60 }
61
62 thenode->returntype = RETURNTYPE_BOOL;
63 thenode->localdata = (void *)localdata;
64 thenode->exe = modes_exe;
65 thenode->free = modes_free;
66
67 return thenode;
68 }
69
70 void *modes_exe(searchCtx *ctx, struct searchNode *thenode, void *value) {
71 struct modes_localdata *localdata;
72 nick *np;
73 chanindex *cip;
74 flag_t flags;
75
76 localdata = (struct modes_localdata *)thenode->localdata;
77
78 switch (ctx->type) {
79 case SEARCHTYPE_CHANNEL:
80 cip=(chanindex *)value;
81 if (!cip->channel)
82 return NULL;
83 flags=cip->channel->flags;
84 break;
85
86 case SEARCHTYPE_NICK:
87 np=(nick *)value;
88 flags=np->umodes;
89 break;
90
91 default:
92 return NULL;
93 }
94
95 if (~flags & (localdata->setmodes))
96 return (void *)0;
97
98 if (flags & (localdata->clearmodes))
99 return (void *)0;
100
101 return (void *)1;
102 }
103
104 void modes_free(searchCtx *ctx, struct searchNode *thenode) {
105 free (thenode->localdata);
106 free (thenode);
107 }