5 #include "../control/control.h"
6 #include "../irc/irc_config.h"
7 #include "../lib/irc_string.h"
8 #include "../parser/parser.h"
9 #include "../lib/splitline.h"
10 #include "../lib/version.h"
11 #include "../lib/stringbuf.h"
12 #include "../lib/strlfunc.h"
13 #include "patriciasearch.h"
14 #include "../lib/version.h"
15 #include "../newsearch/newsearch.h"
19 searchCmd
*reg_nodesearch
;
21 int do_pnodesearch(void *source
, int cargc
, char **cargv
);
23 NodeDisplayFunc defaultpnodefn
= printnode
;
26 reg_nodesearch
= (searchCmd
*)registersearchcommand("nodesearch",NO_OPER
,do_pnodesearch
, printnode
);
28 registersearchterm(reg_nodesearch
, "users", ps_users_parse
, 0, "");
29 registersearchterm(reg_nodesearch
, "nick", ps_nick_parse
, 0, "");
30 registersearchterm(reg_nodesearch
, "ipvsix", ps_ipv6_parse
, 0, "");
34 deregistersearchcommand( reg_nodesearch
);
37 static void controlwallwrapper(int level
, char *format
, ...) {
42 vsnprintf(buf
, sizeof(buf
), format
, ap
);
43 controlwall(NO_OPER
, level
, "%s", buf
);
47 int do_pnodesearch_real(replyFunc reply
, wallFunc wall
, void *source
, int cargc
, char **cargv
) {
48 nick
*sender
= source
;
51 NodeDisplayFunc display
=defaultpnodefn
;
53 patricia_node_t
*subset
= iptree
->head
;
57 reply( sender
, "Usage: [flags] <criteria>");
58 reply( sender
, "For help, see help nodesearch");
62 ret
= parseopts(cargc
, cargv
, &arg
, &limit
, (void *)&subset
, (void *)&display
, reg_nodesearch
->outputtree
, reply
, sender
);
67 reply(sender
,"No search terms - aborting.");
72 rejoinline(cargv
[arg
],cargc
-arg
);
75 tree
= parse_string(reg_nodesearch
, cargv
[arg
]);
77 displaystrerror(reply
, sender
, cargv
[arg
]);
81 ast_nodesearch(tree
->root
, reply
, sender
, wall
, display
, NULL
, NULL
, limit
);
88 int do_pnodesearch(void *source
, int cargc
, char **cargv
) {
89 return do_pnodesearch_real(controlreply
, controlwallwrapper
, source
, cargc
, cargv
);
92 void pnodesearch_exe(struct searchNode
*search
, searchCtx
*ctx
, patricia_node_t
*subset
) {
94 patricia_node_t
*node
;
95 nick
*sender
= ctx
->sender
;
96 senderNSExtern
= sender
;
97 int limit
= ctx
->limit
;
98 NodeDisplayFunc display
= ctx
->displayfn
;
100 /* Get a marker value to mark "seen" channels for unique count */
101 //nmarker=nextnodemarker();
103 /* The top-level node needs to return a BOOL */
104 search
=coerceNode(ctx
, search
, RETURNTYPE_BOOL
);
106 PATRICIA_WALK(subset
, node
) {
107 if ((search
->exe
)(ctx
, search
, node
)) {
109 display(ctx
, sender
, node
);
112 ctx
->reply(sender
, "--- More than %d matches, skipping the rest",limit
);
118 ctx
->reply(sender
,"--- End of list: %d matches",