char *literal;
} exprunion;
-typedef struct searchASTCache {
- searchASTExpr *tree;
- searchASTExpr *cache[AST_RECENT];
- int nextpos;
-} searchASTCache;
-
/* comares either a string and a string or an expression and an expression */
static searchASTExpr *compareloc(searchASTExpr *expr, exprunion *loc) {
if(expr->type == AST_NODE_LITERAL) {
}
}
-int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NickDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, NickDisplayFunc display, HeaderFunc header, void *headerarg, int limit, array *targets) {
searchCtx ctx;
searchASTCache cache;
searchNode *search;
memset(&cache, 0, sizeof(cache));
cache.tree = tree;
- newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nicksearch, sender);
+ newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nicksearch, sender, display, limit, targets);
buf[0] = '\0';
- reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_nicksearch));
+ if (!targets)
+ reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_nicksearch));
+ search = ctx.parser(&ctx, (char *)tree);
+ if(!search) {
+ if (!targets)
+ reply(sender, "Parse error: %s", parseError);
+ return CMD_ERROR;
+ }
+
+ if (!targets)
+ reply(sender, "Executing...");
+ if(header)
+ header(sender, headerarg);
+ nicksearch_exe(search, &ctx);
+
+ (search->free)(&ctx, search);
+
+ return CMD_OK;
+}
+
+int ast_whowassearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, WhowasDisplayFunc display, HeaderFunc header, void *headerarg, int limit, array *targets) {
+ searchCtx ctx;
+ searchASTCache cache;
+ searchNode *search;
+ char buf[1024];
+
+ memset(&cache, 0, sizeof(cache));
+ cache.tree = tree;
+
+ newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_whowassearch, sender, display, limit, targets);
+
+ buf[0] = '\0';
+ reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_whowassearch));
search = ctx.parser(&ctx, (char *)tree);
if(!search) {
reply(sender, "Parse error: %s", parseError);
}
reply(sender, "Executing...");
- if(header)
+ if(header)
header(sender, headerarg);
- nicksearch_exe(search, &ctx, sender, display, limit);
+ whowassearch_exe(search, &ctx);
(search->free)(&ctx, search);
return CMD_OK;
}
-int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, ChanDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, ChanDisplayFunc display, HeaderFunc header, void *headerarg, int limit, array *targets) {
searchCtx ctx;
searchASTCache cache;
searchNode *search;
char buf[1024];
- newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_chansearch, sender);
+ newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_chansearch, sender, display, limit, targets);
memset(&cache, 0, sizeof(cache));
cache.tree = tree;
reply(sender, "Executing...");
if(header)
header(sender, headerarg);
- chansearch_exe(search, &ctx, sender, display, limit);
+ chansearch_exe(search, &ctx);
(search->free)(&ctx, search);
return CMD_OK;
}
-int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, UserDisplayFunc display, HeaderFunc header, void *headerarg, int limit) {
+int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc wall, UserDisplayFunc display, HeaderFunc header, void *headerarg, int limit, array *targets) {
searchCtx ctx;
searchASTCache cache;
searchNode *search;
memset(&cache, 0, sizeof(cache));
cache.tree = tree;
- newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_usersearch, sender);
+ newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_usersearch, sender, display, limit, targets);
buf[0] = '\0';
reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_usersearch));
reply(sender, "Executing...");
if(header)
header(sender, headerarg);
- usersearch_exe(search, &ctx, sender, display, limit);
+ usersearch_exe(search, &ctx);
(search->free)(&ctx, search);
sbaddchar(buf, ')');
} else if(expr->type == AST_NODE_LITERAL) {
- int quotesrequired, escrequired;
char *p;
- for(quotesrequired=escrequired=0,p=expr->u.literal;*p;p++) {
- if(*p == '(' || *p == ')' || *p == ' ')
- quotesrequired = 1;
- if(*p == '\\' || *p == '"') {
- escrequired = 1;
- if(quotesrequired)
- break;
- }
- }
- if(quotesrequired)
- sbaddchar(buf, '"');
-
- if(escrequired) {
- for(p=expr->u.literal;*p;p++) {
- if(*p == '\\' || *p == '"')
- sbaddchar(buf, '\\');
- sbaddchar(buf, *p);
- }
- } else {
- sbaddstr(buf, expr->u.literal);
+
+ sbaddchar(buf, '"');
+
+ for(p=expr->u.literal;*p;p++) {
+ if(*p == '\\' || *p == '"')
+ sbaddchar(buf, '\\');
+ sbaddchar(buf, *p);
}
- if(quotesrequired)
- sbaddchar(buf, '"');
+ sbaddchar(buf, '"');
} else {
sbaddstr(buf, "???");
}