]> jfr.im git - irc/quakenet/newserv.git/blobdiff - newsearch/ns-lt.c
LUA: port luadb to dbapi2 to drop postgres dependency
[irc/quakenet/newserv.git] / newsearch / ns-lt.c
index c408c5eeb7b926640631138c3c5b24a23a2de8fa..7bed1fb2510ada63c84cecd050c243fa8bb0a59e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * GT functionality
+ * LT functionality
  */
 
 #include "newsearch.h"
@@ -9,14 +9,15 @@
 #include <stdlib.h>
 
 struct lt_localdata {
+  int type;
   int count;
   struct searchNode **nodes;
 };
 
-void lt_free(struct searchNode *thenode);
-void *lt_exe(struct searchNode *thenode, int type, void *theinput);
+void lt_free(searchCtx *ctx, struct searchNode *thenode);
+void *lt_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
 
-struct searchNode *lt_parse(int type, int argc, char **argv) {
+struct searchNode *lt_parse(searchCtx *ctx, int argc, char **argv) {
   struct lt_localdata *localdata;
   struct searchNode *thenode;
   int i;
@@ -33,8 +34,8 @@ struct searchNode *lt_parse(int type, int argc, char **argv) {
   }
   localdata->count = 0;
   
-  if (!(thenode=(struct searchNode *)malloc(sizeof(struct searchNode)))) {
-    /* couldn't malloc() memory for thenode, so free localdata->nodes and localdata to avoid leakage */
+  if (!(thenode = (struct searchNode *)malloc(sizeof(struct searchNode)))) {
+    /* couldn't malloc() memory for thenode, so free localdata and localdata->nodes to avoid leakage */
     parseError = "malloc: could not allocate memory for this search.";
     free(localdata->nodes);
     free(localdata);
@@ -47,24 +48,39 @@ struct searchNode *lt_parse(int type, int argc, char **argv) {
   thenode->free = lt_free;
   
   for (i=0;i<argc;i++) {
-    if (!(localdata->nodes[i] = search_parse(type, argv[i]))) {
-      lt_free(thenode);
+    /* Parse the node.. */
+    localdata->nodes[i] = ctx->parser(ctx, argv[i]);
+    
+    /* Subsequent nodes get coerced to match the type of the first node */
+    if (i)
+      localdata->nodes[i]=coerceNode(ctx, localdata->nodes[i],localdata->type);
+
+    /* If a node didn't parse, give up */    
+    if (!localdata->nodes[i]) {
+      lt_free(ctx, thenode);
       return NULL;
     }
+    
+    if (!i) {
+      /* First arg determines the type */
+      localdata->type = localdata->nodes[0]->returntype & RETURNTYPE_TYPE;
+    }
+    
     localdata->count++;
   }
 
   return thenode;
 }
 
-void lt_free(struct searchNode *thenode) {
+void lt_free(searchCtx *ctx, struct searchNode *thenode) {
   struct lt_localdata *localdata;
   int i;
 
   localdata=thenode->localdata;
   
   for (i=0;i<localdata->count;i++) {
-    (localdata->nodes[i]->free)(localdata->nodes[i]);
+    if (localdata->nodes[i])
+      (localdata->nodes[i]->free)(ctx, localdata->nodes[i]);
   }
   
   free(localdata->nodes);
@@ -72,7 +88,7 @@ void lt_free(struct searchNode *thenode) {
   free(thenode);
 }
 
-void *lt_exe(struct searchNode *thenode, int type, void *theinput) {
+void *lt_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput) {
   int i;
   char *strval;
   int intval;
@@ -81,29 +97,28 @@ void *lt_exe(struct searchNode *thenode, int type, void *theinput) {
   localdata=thenode->localdata;
   
   if (localdata->count==0)
-    return trueval(type);
+    return (void *)1;
 
-  switch (localdata->nodes[0]->returntype & RETURNTYPE_TYPE) {
+  switch (localdata->type) {
   case RETURNTYPE_INT:
-    intval = (int)((long)(localdata->nodes[0]->exe)(localdata->nodes[0], RETURNTYPE_INT, theinput));
+  case RETURNTYPE_BOOL:
+    intval = (int)((long)(localdata->nodes[0]->exe)(ctx, localdata->nodes[0], theinput));
     for (i=1;i<localdata->count;i++) {
-      if ((int)((long)(localdata->nodes[i]->exe)(localdata->nodes[i], RETURNTYPE_INT, theinput) < intval))
-       return falseval(type);
+      if ((int)((long)(localdata->nodes[i]->exe)(ctx, localdata->nodes[i], theinput) <= intval))
+       return (void *)0;
     }
-
-    return trueval(type);
+    return (void *)1;
     
   case RETURNTYPE_STRING:
-    strval = (char *)(localdata->nodes[0]->exe)(localdata->nodes[0], RETURNTYPE_STRING, theinput);
+    strval = (char *)(localdata->nodes[0]->exe)(ctx, localdata->nodes[0], theinput);
     for (i=1;i<localdata->count;i++) {
-      if (ircd_strcmp(strval, (char *)(localdata->nodes[i]->exe)(localdata->nodes[i], RETURNTYPE_STRING, theinput)) < 0)
-       return falseval(type);
+      if (ircd_strcmp(strval, (char *)(localdata->nodes[i]->exe)(ctx, localdata->nodes[i], theinput)) >= 0)
+       return (void *)0;
     }
-    
-    return trueval(type);
+    return (void *)1;
 
   default:
-    return falseval(type);
+    return (void *)0;
   }
 }