]>
Commit | Line | Data |
---|---|---|
16cc6e32 | 1 | #include "../nick/nick.h" |
a92bb8e1 | 2 | #include "../lib/sstring.h" |
56a84a81 IB |
3 | #include "../parser/parser.h" |
4 | #include "../channel/channel.h" | |
5 | #include "../lib/flags.h" | |
e8ad630b | 6 | #include "../authext/authext.h" |
a92bb8e1 | 7 | #include "../patricia/patricia.h" |
c86edd1d | 8 | |
1188d606 P |
9 | #ifndef __NEWSEARCH_H |
10 | #define __NEWSEARCH_H | |
11 | ||
f16cabe4 | 12 | #define NSMAX_KILL_LIMIT 500 |
16cc6e32 | 13 | #define NSMAX_GLINE_LIMIT 500 |
22f7c5c6 IB |
14 | #define NSMAX_GLINE_CLONES 5 |
15 | ||
16cc6e32 IB |
16 | /* gline duration, in seconds */ |
17 | #define NSGLINE_DURATION 3600 | |
18 | ||
96429168 | 19 | #define NSMAX_REASON_LEN 120 |
4622c762 | 20 | #define NSMAX_NOTICE_LEN 250 |
a92bb8e1 | 21 | #define NSMAX_COMMAND_LEN 20 |
16cc6e32 | 22 | |
c86edd1d Q |
23 | #define RETURNTYPE_BOOL 0x01 |
24 | #define RETURNTYPE_INT 0x02 | |
25 | #define RETURNTYPE_STRING 0x03 | |
26 | #define RETURNTYPE_TYPE 0xFF | |
27 | #define RETURNTYPE_CONST 0x100 | |
28 | ||
b697c21c CP |
29 | #define VARIABLE_LEN 10 |
30 | #define MAX_VARIABLES 10 | |
31 | ||
c86edd1d | 32 | struct searchNode; |
c8be5183 | 33 | struct searchCtx; |
b697c21c | 34 | struct coercedata; |
c86edd1d | 35 | |
f33f3f52 | 36 | typedef struct searchNode *(*searchParseFunc)(struct searchCtx *ctx, char *input); |
c8be5183 | 37 | typedef void (*replyFunc)(nick *np, char *format, ...); |
0da2a4ae | 38 | typedef void (*wallFunc)(int level, char *format, ...); |
c8be5183 | 39 | |
f33f3f52 | 40 | typedef struct searchNode *(*parseFunc)(struct searchCtx *, int, char **); |
b697c21c CP |
41 | typedef void (*freeFunc)(struct searchCtx *, struct searchNode *); |
42 | typedef void *(*exeFunc)(struct searchCtx *, struct searchNode *, void *); | |
43 | typedef void (*ChanDisplayFunc)(struct searchCtx *, nick *, chanindex *); | |
44 | typedef void (*NickDisplayFunc)(struct searchCtx *, nick *, nick *); | |
45 | typedef void (*UserDisplayFunc)(struct searchCtx *, nick *, authname *); | |
46 | typedef void (*HeaderFunc)(void *sender, void *arg); | |
47 | ||
48 | struct coercedata { | |
49 | struct searchNode *child; | |
50 | union { | |
51 | char *stringbuf; | |
52 | unsigned long val; | |
53 | } u; | |
54 | }; | |
55 | ||
56 | typedef struct searchNode { | |
57 | int returntype; | |
58 | exeFunc exe; | |
59 | freeFunc free; | |
60 | void *localdata; | |
61 | } searchNode; | |
62 | ||
63 | struct searchVariable { | |
64 | char name[VARIABLE_LEN]; | |
65 | struct searchNode data; | |
66 | struct coercedata cdata; | |
67 | }; | |
68 | ||
a92bb8e1 P |
69 | typedef struct searchCmd { |
70 | void *defaultdisplayfunc; | |
71 | sstring *name; | |
72 | CommandHandler handler; | |
73 | struct CommandTree *outputtree; | |
74 | struct CommandTree *searchtree; | |
75 | } searchCmd; | |
76 | ||
77 | typedef struct searchList { | |
78 | void *cmd; | |
79 | sstring *name; | |
e8ff7b61 | 80 | char *help; |
a92bb8e1 P |
81 | struct searchList *next; |
82 | } searchList; | |
83 | ||
c8be5183 CP |
84 | typedef struct searchCtx { |
85 | searchParseFunc parser; | |
86 | replyFunc reply; | |
0da2a4ae | 87 | wallFunc wall; |
0a659cde | 88 | void *arg; |
b697c21c CP |
89 | struct searchVariable vars[MAX_VARIABLES]; |
90 | int lastvar; | |
a92bb8e1 | 91 | struct searchCmd *searchcmd; |
e8ff7b61 | 92 | nick *sender; |
6b2202d0 CP |
93 | int limit; |
94 | void *displayfn; | |
c8be5183 CP |
95 | } searchCtx; |
96 | ||
c86edd1d | 97 | /* Core functions */ |
c7f7a584 | 98 | /* Logical (BOOL -> BOOL)*/ |
f33f3f52 P |
99 | struct searchNode *and_parse(searchCtx *ctx, int argc, char **argv); |
100 | struct searchNode *not_parse(searchCtx *ctx, int argc, char **argv); | |
101 | struct searchNode *or_parse(searchCtx *ctx, int argc, char **argv); | |
c7f7a584 | 102 | |
103 | /* Comparison (INT -> BOOL) */ | |
f33f3f52 P |
104 | struct searchNode *eq_parse(searchCtx *ctx, int argc, char **argv); |
105 | struct searchNode *lt_parse(searchCtx *ctx, int argc, char **argv); | |
106 | struct searchNode *gt_parse(searchCtx *ctx, int argc, char **argv); | |
c7f7a584 | 107 | |
108 | /* String match (STRING -> BOOL) */ | |
f33f3f52 P |
109 | struct searchNode *match_parse(searchCtx *ctx, int argc, char **argv); |
110 | struct searchNode *regex_parse(searchCtx *ctx, int argc, char **argv); | |
c7f7a584 | 111 | |
112 | /* Length (STRING -> INT) */ | |
f33f3f52 | 113 | struct searchNode *length_parse(searchCtx *ctx, int argc, char **argv); |
c7f7a584 | 114 | |
115 | /* kill/gline actions (BOOL) */ | |
f33f3f52 P |
116 | struct searchNode *kill_parse(searchCtx *ctx, int argc, char **argv); |
117 | struct searchNode *gline_parse(searchCtx *ctx, int argc, char **argv); | |
c7f7a584 | 118 | |
4622c762 | 119 | /* notice action (BOOL) */ |
f33f3f52 | 120 | struct searchNode *notice_parse(searchCtx *ctx, int argc, char **argv); |
4622c762 | 121 | |
c7f7a584 | 122 | /* Nick/Channel functions (various types) */ |
f33f3f52 P |
123 | struct searchNode *nick_parse(searchCtx *ctx, int argc, char **argv); |
124 | struct searchNode *modes_parse(searchCtx *ctx, int argc, char **argv); | |
c7f7a584 | 125 | |
126 | /* Nick functions (various types) */ | |
f33f3f52 P |
127 | struct searchNode *hostmask_parse(searchCtx *ctx, int argc, char **argv); |
128 | struct searchNode *realname_parse(searchCtx *ctx, int argc, char **argv); | |
5144ddc4 | 129 | struct searchNode *away_parse(searchCtx *ctx, int argc, char **argv); |
f33f3f52 P |
130 | struct searchNode *authname_parse(searchCtx *ctx, int argc, char **argv); |
131 | struct searchNode *authts_parse(searchCtx *ctx, int argc, char **argv); | |
132 | struct searchNode *ident_parse(searchCtx *ctx, int argc, char **argv); | |
133 | struct searchNode *host_parse(searchCtx *ctx, int argc, char **argv); | |
134 | struct searchNode *channel_parse(searchCtx *ctx, int argc, char **argv); | |
135 | struct searchNode *timestamp_parse(searchCtx *ctx, int argc, char **argv); | |
136 | struct searchNode *country_parse(searchCtx *ctx, int argc, char **argv); | |
137 | struct searchNode *ip_parse(searchCtx *ctx, int argc, char **argv); | |
138 | struct searchNode *channels_parse(searchCtx *ctx, int argc, char **argv); | |
139 | struct searchNode *server_parse(searchCtx *ctx, int argc, char **argv); | |
140 | struct searchNode *authid_parse(searchCtx *ctx, int argc, char **argv); | |
8a959859 | 141 | struct searchNode *cidr_parse(searchCtx *ctx, int argc, char **argv); |
e3b5fea4 | 142 | struct searchNode *ipv6_parse(searchCtx *ctx, int argc, char **argv); |
c7f7a584 | 143 | |
144 | /* Channel functions (various types) */ | |
f33f3f52 P |
145 | struct searchNode *exists_parse(searchCtx *ctx, int argc, char **argv); |
146 | struct searchNode *services_parse(searchCtx *ctx, int argc, char **argv); | |
147 | struct searchNode *size_parse(searchCtx *ctx, int argc, char **argv); | |
148 | struct searchNode *name_parse(searchCtx *ctx, int argc, char **argv); | |
149 | struct searchNode *topic_parse(searchCtx *ctx, int argc, char **argv); | |
150 | struct searchNode *oppct_parse(searchCtx *ctx, int argc, char **argv); | |
de8c57b4 C |
151 | struct searchNode *cumodecount_parse(searchCtx *ctx, int argc, char **argv); |
152 | struct searchNode *cumodepct_parse(searchCtx *ctx, int argc, char **argv); | |
f33f3f52 P |
153 | struct searchNode *hostpct_parse(searchCtx *ctx, int argc, char **argv); |
154 | struct searchNode *authedpct_parse(searchCtx *ctx, int argc, char **argv); | |
155 | struct searchNode *kick_parse(searchCtx *ctx, int argc, char **argv); | |
c86edd1d | 156 | |
c7f7a584 | 157 | /* Interpret a string to give a node */ |
f33f3f52 | 158 | struct searchNode *search_parse(searchCtx *ctx, char *input); |
c86edd1d | 159 | |
b697c21c | 160 | /* Iteration functions */ |
f33f3f52 P |
161 | struct searchNode *any_parse(searchCtx *ctx, int argc, char **argv); |
162 | struct searchNode *all_parse(searchCtx *ctx, int argc, char **argv); | |
163 | struct searchNode *var_parse(searchCtx *ctx, int argc, char **argv); | |
b697c21c CP |
164 | |
165 | /* Iteraterable functions */ | |
f33f3f52 | 166 | struct searchNode *channeliter_parse(searchCtx *ctx, int argc, char **argv); |
cb857218 | 167 | struct searchNode *nickiter_parse(searchCtx *ctx, int argc, char **argv); |
b697c21c | 168 | |
90334b4c CP |
169 | /* Functions that operate on strings */ |
170 | struct searchNode *cumodes_parse(searchCtx *ctx, int argc, char **argv); | |
171 | ||
c7f7a584 | 172 | /* Force a node to return the thing you want */ |
c8be5183 | 173 | struct searchNode *coerceNode(searchCtx *ctx, struct searchNode *thenode, int type); |
c7f7a584 | 174 | |
c86edd1d | 175 | /* Registration functions */ |
a92bb8e1 P |
176 | searchCmd *registersearchcommand(char *name, int level, CommandHandler cmd, void *defaultdisplayfunc); |
177 | void deregistersearchcommand(searchCmd *scmd); | |
e8ff7b61 | 178 | void registersearchterm(searchCmd *cmd, char *term, parseFunc parsefunc, int level, char *help); |
a92bb8e1 | 179 | void deregistersearchterm(searchCmd *cmd, char *term, parseFunc parsefunc); |
e8ff7b61 P |
180 | |
181 | void registerglobalsearchterm(char *term, parseFunc parsefunc, char *help); | |
a92bb8e1 | 182 | void deregisterglobalsearchterm(char *term, parseFunc parsefunc); |
e8ff7b61 P |
183 | |
184 | void regdisp( searchCmd *cmd, const char *name, void *handler, int level, char *help); | |
a92bb8e1 | 185 | void unregdisp( searchCmd *cmd, const char *name, void *handler); |
c86edd1d | 186 | |
2ba836f2 CP |
187 | /* Special nick* printf */ |
188 | void nssnprintf(char *, size_t, const char *, nick *); | |
189 | ||
e3b5fea4 P |
190 | #ifdef NEWSEARCH_NEWPARSER |
191 | void displaystrerror(replyFunc reply, nick *np, const char *input); | |
192 | #endif | |
193 | ||
c86edd1d | 194 | extern const char *parseError; |
b697c21c | 195 | extern nick *senderNSExtern; |
6f8dfee9 | 196 | |
3d2bf13b | 197 | void printnick(searchCtx *, nick *, nick *); |
e8ad630b | 198 | void printuser(searchCtx *, nick *, authname *); |
e1b0e499 | 199 | void printchannel(searchCtx *, nick *, chanindex *); |
6f8dfee9 | 200 | |
6b2202d0 CP |
201 | void nicksearch_exe(struct searchNode *search, searchCtx *sctx); |
202 | void chansearch_exe(struct searchNode *search, searchCtx *sctx); | |
203 | void usersearch_exe(struct searchNode *search, searchCtx *ctx); | |
20b9980a CP |
204 | |
205 | int do_nicksearch_real(replyFunc reply, wallFunc wall, void *source, int cargc, char **cargv); | |
206 | int do_chansearch_real(replyFunc reply, wallFunc wall, void *source, int cargc, char **cargv); | |
e8ad630b | 207 | int do_usersearch_real(replyFunc reply, wallFunc wall, void *source, int cargc, char **cargv); |
0a659cde CP |
208 | |
209 | void *literal_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput); | |
210 | void literal_free(searchCtx *ctx, struct searchNode *thenode); | |
211 | ||
f33f3f52 P |
212 | struct searchVariable *var_register(searchCtx *ctx, char *arg, int type); |
213 | searchNode *var_get(searchCtx *ctx, char *arg); | |
b697c21c CP |
214 | void var_setstr(struct searchVariable *v, char *data); |
215 | ||
6b2202d0 | 216 | void newsearch_ctxinit(searchCtx *ctx, searchParseFunc searchfn, replyFunc replyfn, wallFunc wallfn, void *arg, searchCmd *cmd, nick *sender, void *displayfn, int limit); |
b697c21c | 217 | |
0a659cde CP |
218 | /* AST functions */ |
219 | ||
220 | struct searchASTNode; | |
221 | ||
222 | #define AST_NODE_CHILD 1 | |
223 | #define AST_NODE_LITERAL 2 | |
224 | ||
225 | /* items to store in the ast lookup cache */ | |
226 | #define AST_RECENT 10 | |
227 | ||
68d05acb CP |
228 | struct searchASTExpr; |
229 | ||
230 | typedef struct searchASTNode { | |
231 | parseFunc fn; | |
232 | int argc; | |
233 | struct searchASTExpr *argv; | |
234 | } searchASTNode; | |
235 | ||
0a659cde CP |
236 | typedef struct searchASTExpr { |
237 | int type; | |
238 | union { | |
239 | char *literal; | |
68d05acb CP |
240 | /* this was originally a pointer, but having it as one means you can't memcpy directly */ |
241 | struct searchASTNode child; | |
0a659cde | 242 | } u; |
0a659cde CP |
243 | } searchASTExpr; |
244 | ||
e3b5fea4 P |
245 | typedef struct searchASTCache { |
246 | searchASTExpr *tree; | |
247 | searchASTExpr *cache[AST_RECENT]; | |
248 | int nextpos; | |
249 | } searchASTCache; | |
250 | ||
68d05acb CP |
251 | #define __NSASTSizeOfArray(x) (sizeof(x) / sizeof(x[0])) |
252 | ||
253 | #define __NSASTExpr(x, y, ...) (searchASTExpr){.type = x, .u.y = __VA_ARGS__} | |
254 | #define __NSASTRawNode(x, c, y) (searchASTNode){.fn = x, .argc = c, .argv = y} | |
255 | ||
256 | #define __NSASTSizeNode(x, y) __NSASTRawNode(x, __NSASTSizeOfArray(y), y) | |
257 | #define __NSASTNode(x, ...) __NSASTSizeNode(x, ((searchASTExpr []){__VA_ARGS__})) | |
0a659cde | 258 | |
0a659cde CP |
259 | #define __NSASTChild(...) __NSASTExpr(AST_NODE_CHILD, child, __VA_ARGS__) |
260 | ||
68d05acb | 261 | #define NSASTLiteral(value) __NSASTExpr(AST_NODE_LITERAL, literal, value) |
0a659cde | 262 | #define NSASTNode(fn, ...) __NSASTChild(__NSASTNode(fn, __VA_ARGS__)) |
68d05acb | 263 | #define NSASTManualNode(fn, count, children) __NSASTChild(__NSASTRawNode(fn, count, children)) |
0a659cde | 264 | |
f33f3f52 | 265 | searchNode *search_astparse(searchCtx *, char *); |
0a659cde | 266 | |
2181a10f CP |
267 | int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NickDisplayFunc display, HeaderFunc header, void *headerarg, int limit); |
268 | int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, ChanDisplayFunc display, HeaderFunc header, void *headerarg, int limit); | |
269 | int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, UserDisplayFunc display, HeaderFunc header, void *headerarg, int limit); | |
0a659cde | 270 | |
a92bb8e1 P |
271 | char *ast_printtree(char *buf, size_t bufsize, searchASTExpr *expr, searchCmd *cmd); |
272 | ||
6cb1b086 | 273 | int parseopts(int cargc, char **cargv, int *arg, int *limit, void **subset, void *display, CommandTree *sl, replyFunc reply, void *sender); |
0a659cde | 274 | |
68d05acb CP |
275 | typedef int (*ASTFunc)(searchASTExpr *, replyFunc, void *, wallFunc, void *, HeaderFunc, void *, int limit); |
276 | ||
0a659cde | 277 | /* erk */ |
a92bb8e1 P |
278 | extern searchList *globalterms; |
279 | ||
280 | extern searchCmd *reg_nicksearch; | |
281 | extern searchCmd *reg_chansearch; | |
282 | extern searchCmd *reg_usersearch; | |
0a659cde | 283 | |
55dd7529 CP |
284 | extern UserDisplayFunc defaultuserfn; |
285 | extern NickDisplayFunc defaultnickfn; | |
286 | extern ChanDisplayFunc defaultchanfn; | |
287 | ||
31686847 CP |
288 | struct searchNode *argtoconststr(char *command, searchCtx *ctx, char *arg, char **p); |
289 | ||
1188d606 | 290 | #endif |