if(expr->type == AST_NODE_CHILD) {
int i;
- for(i=0;i<expr->u.child->argc;i++) {
- searchASTExpr *d = treesearch(expr->u.child->argv[i], loc);
+ for(i=0;i<expr->u.child.argc;i++) {
+ searchASTExpr *d = treesearch(&expr->u.child.argv[i], loc);
if(d)
return d;
}
}
/* ast parser, the way we pass context around is very very hacky... */
-searchNode *search_astparse(searchCtx *ctx, int type, char *loc) {
+searchNode *search_astparse(searchCtx *ctx, char *loc) {
searchASTCache *cache = ctx->arg;
searchASTExpr *expr = cachesearch(cache, (exprunion *)&loc);
searchNode *node;
node->free = literal_free;
return node;
case AST_NODE_CHILD:
- v = (char **)malloc(expr->u.child->argc * sizeof(char *));
+ v = (char **)malloc(expr->u.child.argc * sizeof(char *));
if(!v) {
parseError = "malloc: could not allocate memory for this search.";
return NULL;
}
- for(i=0;i<expr->u.child->argc;i++) {
- searchASTExpr *child = expr->u.child->argv[i];
+ for(i=0;i<expr->u.child.argc;i++) {
+ searchASTExpr *child = &expr->u.child.argv[i];
cachepush(cache, child);
switch(child->type) {
}
}
- node = expr->u.child->fn(ctx, type, expr->u.child->argc, v);
+ node = expr->u.child.fn(ctx, expr->u.child.argc, v);
free(v);
return node;
default:
memset(&cache, 0, sizeof(cache));
cache.tree = tree;
- newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache);
+ newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nicksearch, sender, display, limit);
buf[0] = '\0';
- reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree));
- search = ctx.parser(&ctx, SEARCHTYPE_NICK, (char *)tree);
+ reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_nicksearch));
+ search = ctx.parser(&ctx, (char *)tree);
if(!search) {
reply(sender, "Parse error: %s", parseError);
return CMD_ERROR;
reply(sender, "Executing...");
if(header)
header(sender, headerarg);
- nicksearch_exe(search, &ctx, sender, display, limit);
+ nicksearch_exe(search, &ctx);
(search->free)(&ctx, search);
searchNode *search;
char buf[1024];
- newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache);
+ newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_chansearch, sender, display, limit);
+
+ memset(&cache, 0, sizeof(cache));
+ cache.tree = tree;
buf[0] = '\0';
- reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree));
- search = ctx.parser(&ctx, SEARCHTYPE_CHANNEL, (char *)tree);
+ reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_chansearch));
+ search = ctx.parser(&ctx, (char *)tree);
if(!search) {
reply(sender, "Parse error: %s", parseError);
return CMD_ERROR;
reply(sender, "Executing...");
if(header)
header(sender, headerarg);
- chansearch_exe(search, &ctx, sender, display, limit);
+ chansearch_exe(search, &ctx);
(search->free)(&ctx, search);
memset(&cache, 0, sizeof(cache));
cache.tree = tree;
- newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache);
+ newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_usersearch, sender, display, limit);
buf[0] = '\0';
- reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree));
- search = ctx.parser(&ctx, SEARCHTYPE_USER, (char *)tree);
+ reply(sender, "Parsing: %s", ast_printtree(buf, sizeof(buf), tree, reg_usersearch));
+ search = ctx.parser(&ctx, (char *)tree);
if(!search) {
reply(sender, "Parse error: %s", parseError);
return CMD_ERROR;
reply(sender, "Executing...");
if(header)
header(sender, headerarg);
- usersearch_exe(search, &ctx, sender, display, limit);
+ usersearch_exe(search, &ctx);
(search->free)(&ctx, search);
/* horribly inefficient -- don't call me very often! */
-static char *ast_printtree_real(StringBuf *buf, searchASTExpr *expr) {
+static char *ast_printtree_real(StringBuf *buf, searchASTExpr *expr, searchCmd *cmd) {
char lbuf[256];
if(expr->type == AST_NODE_CHILD) {
int i;
- sstring *command = getcommandname(searchTree, (void *)expr->u.child->fn);
+ sstring *command = getcommandname(cmd->searchtree, (void *)expr->u.child.fn);
if(command) {
snprintf(lbuf, sizeof(lbuf), "(%s", command->content);
} else {
- snprintf(lbuf, sizeof(lbuf), "(%p", expr->u.child->fn);
+ snprintf(lbuf, sizeof(lbuf), "(%p", expr->u.child.fn);
}
sbaddstr(buf, lbuf);
- for(i=0;i<expr->u.child->argc;i++) {
+ for(i=0;i<expr->u.child.argc;i++) {
sbaddchar(buf, ' ');
- ast_printtree_real(buf, expr->u.child->argv[i]);
+ ast_printtree_real(buf, &expr->u.child.argv[i], cmd);
}
sbaddchar(buf, ')');
} else if(expr->type == AST_NODE_LITERAL) {
- sbaddstr(buf, expr->u.literal);
+ char *p;
+
+ sbaddchar(buf, '"');
+
+ for(p=expr->u.literal;*p;p++) {
+ if(*p == '\\' || *p == '"')
+ sbaddchar(buf, '\\');
+ sbaddchar(buf, *p);
+ }
+
+ sbaddchar(buf, '"');
} else {
sbaddstr(buf, "???");
}
return buf->buf;
}
-char *ast_printtree(char *buf, size_t bufsize, searchASTExpr *expr) {
+char *ast_printtree(char *buf, size_t bufsize, searchASTExpr *expr, searchCmd *cmd) {
StringBuf b;
char *p;
b.len = 0;
b.buf = buf;
- p = ast_printtree_real(&b, expr);
+ p = ast_printtree_real(&b, expr, cmd);
sbterminate(&b);
return p;