]> jfr.im git - irc/quakenet/newserv.git/blobdiff - newsearch/ns-gline.c
add my version of trusts, trusts_newsearch, trusts_search modules
[irc/quakenet/newserv.git] / newsearch / ns-gline.c
index 9c782192837dd10c5339adddea32e8d958679dba..30b11337ba545a63226f98d7a67ce790a0c5f818 100644 (file)
@@ -43,51 +43,70 @@ struct searchNode *gline_parse(searchCtx *ctx, int argc, char **argv) {
   else if (ctx->searchcmd == reg_nicksearch)
     localdata->marker = nextnickmarker();
   else {
+    free(localdata);
     parseError = "gline: invalid search type";
     return NULL;
   }
 
-  switch (argc) {
-  case 0:
+  /* default duration, default reason */
+  if(argc == 0) {
     localdata->duration = NSGLINE_DURATION;
     strlcpy(localdata->reason, defaultreason, sizeof(localdata->reason));
-    break;
+  } else if(argc > 2) {
+    free(localdata);
+    parseError = "gline: invalid number of arguments";
+    return NULL;
+  } else {
+    char *argzerop, *reasonp, *durationp;
+    struct searchNode *durationsn, *reasonsn, *argzerosn;
+    
+    if (!(argzerosn=argtoconststr("gline", ctx, argv[0], &argzerop))) {
+      free(localdata);
+      return NULL;
+    }
 
-  case 1:
-    if (strchr(argv[0], ' ') == NULL) { /* no space == duration specified */
-      localdata->duration = durationtolong(argv[0]);
-      /* error checking on gline duration */
-      if (localdata->duration == 0) {
-        parseError = "gline duration invalid.";
-        free(localdata);
-        return NULL;
+    if(argc == 1) {
+      durationp = reasonp = NULL;
+      durationsn = reasonsn = NULL;
+      
+      /* if we have a space it's a reason */
+      if(strchr(argzerop, ' ')) {
+        reasonsn = argzerosn;
+        reasonp = argzerop;
+      } else {
+        durationsn = argzerosn;
+        durationp = argzerop;
       }
+    } else {
+      durationsn = argzerosn;
+      durationp = argzerop;
       
-      strlcpy(localdata->reason, defaultreason, sizeof(localdata->reason));
+      if (!(reasonsn=argtoconststr("gline", ctx, argv[1], &reasonp))) {
+        durationsn->free(ctx, durationsn);
+        free(localdata);
+        return NULL;
+      }      
     }
-    else { /* reason specified */
-      localdata->duration = NSGLINE_DURATION;
-
-      strlcpy(localdata->reason, argv[0], sizeof(localdata->reason));
+    
+    if(!reasonp) {
+      strlcpy(localdata->reason, defaultreason, sizeof(localdata->reason));
+    } else {
+      strlcpy(localdata->reason, reasonp, sizeof(localdata->reason));
+      reasonsn->free(ctx, reasonsn);
     }
-    break;
 
-  case 2:
-    localdata->duration = durationtolong(argv[0]);
-    /* error checking on gline duration */
-    if (localdata->duration == 0) {
-      parseError = "gline duration invalid.";
-      free(localdata);
-      return NULL;
+    if(!durationp) {
+      localdata->duration = NSGLINE_DURATION;
+    } else {
+      localdata->duration = durationtolong(durationp);
+      durationsn->free(ctx, durationsn);
+      
+      if (localdata->duration == 0) {
+        parseError = "gline duration invalid.";
+        free(localdata);
+        return NULL;
+      }
     }
-
-    strlcpy(localdata->reason, argv[1], sizeof(localdata->reason));
-
-    break;
-  default:
-    free(localdata);
-    parseError = "gline: invalid number of arguments";
-    return NULL;
   }
 
   if (!(thenode=(struct searchNode *)malloc(sizeof (struct searchNode)))) {