]> jfr.im git - irc/quakenet/newserv.git/blobdiff - newsearch/newsearch_ast.c
fix bug in G stats
[irc/quakenet/newserv.git] / newsearch / newsearch_ast.c
index 5925d447f4fa4870434a073f6eafc7c4d66b91e1..5afdcedf902baf876e17d544377e070fa1136c14 100644 (file)
@@ -40,8 +40,8 @@ static searchASTExpr *treesearch(searchASTExpr *expr, exprunion *loc) {
   
   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;
     }
@@ -101,13 +101,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;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) {
@@ -124,7 +124,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 +142,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 +155,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 +168,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 +184,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 +200,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 +213,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 +226,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;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], 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, "???");
   }