X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/78ee461bae32843be0faf961493b067ab55181e9..8855bb48b449ed06cfd3ce528b3c0a77c37cb24b:/newsearch/newsearch_ast.c diff --git a/newsearch/newsearch_ast.c b/newsearch/newsearch_ast.c index 5925d447..63c40f1d 100644 --- a/newsearch/newsearch_ast.c +++ b/newsearch/newsearch_ast.c @@ -11,12 +11,6 @@ typedef union exprunion { 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) { @@ -40,8 +34,8 @@ static searchASTExpr *treesearch(searchASTExpr *expr, exprunion *loc) { if(expr->type == AST_NODE_CHILD) { int i; - for(i=0;iu.child->argc;i++) { - searchASTExpr *d = treesearch(expr->u.child->argv[i], loc); + for(i=0;iu.child.argc;i++) { + searchASTExpr *d = treesearch(&expr->u.child.argv[i], loc); if(d) return d; } @@ -101,13 +95,13 @@ searchNode *search_astparse(searchCtx *ctx, char *loc) { 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;iu.child->argc;i++) { - searchASTExpr *child = expr->u.child->argv[i]; + for(i=0;iu.child.argc;i++) { + searchASTExpr *child = &expr->u.child.argv[i]; cachepush(cache, child); switch(child->type) { @@ -124,7 +118,7 @@ searchNode *search_astparse(searchCtx *ctx, char *loc) { } } - node = expr->u.child->fn(ctx, expr->u.child->argc, v); + node = expr->u.child.fn(ctx, expr->u.child.argc, v); free(v); return node; default: @@ -142,7 +136,7 @@ int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc memset(&cache, 0, sizeof(cache)); cache.tree = tree; - newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_nicksearch); + 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, reg_nicksearch)); @@ -155,7 +149,7 @@ int ast_nicksearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc reply(sender, "Executing..."); if(header) header(sender, headerarg); - nicksearch_exe(search, &ctx, sender, display, limit); + nicksearch_exe(search, &ctx); (search->free)(&ctx, search); @@ -168,7 +162,10 @@ int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc searchNode *search; char buf[1024]; - newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_chansearch); + 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, reg_chansearch)); @@ -181,7 +178,7 @@ int ast_chansearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc reply(sender, "Executing..."); if(header) header(sender, headerarg); - chansearch_exe(search, &ctx, sender, display, limit); + chansearch_exe(search, &ctx); (search->free)(&ctx, search); @@ -197,7 +194,7 @@ int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc memset(&cache, 0, sizeof(cache)); cache.tree = tree; - newsearch_ctxinit(&ctx, search_astparse, reply, wall, &cache, reg_usersearch); + 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, reg_usersearch)); @@ -210,7 +207,7 @@ int ast_usersearch(searchASTExpr *tree, replyFunc reply, void *sender, wallFunc reply(sender, "Executing..."); if(header) header(sender, headerarg); - usersearch_exe(search, &ctx, sender, display, limit); + usersearch_exe(search, &ctx); (search->free)(&ctx, search); @@ -223,23 +220,33 @@ static char *ast_printtree_real(StringBuf *buf, searchASTExpr *expr, searchCmd * char lbuf[256]; if(expr->type == AST_NODE_CHILD) { int i; - sstring *command = getcommandname(cmd->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;iu.child->argc;i++) { + for(i=0;iu.child.argc;i++) { sbaddchar(buf, ' '); - ast_printtree_real(buf, expr->u.child->argv[i], cmd); + 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, "???"); }