X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/1f980bdf5093d59a9d2664b79527c494a03c4347..0d6366b6a61a69b26dc0cde44eb85e3293c6659d:/newsearch/ns-modes.c diff --git a/newsearch/ns-modes.c b/newsearch/ns-modes.c index fae58a0b..f26218ab 100644 --- a/newsearch/ns-modes.c +++ b/newsearch/ns-modes.c @@ -8,7 +8,6 @@ #include struct modes_localdata { - int type; flag_t setmodes; flag_t clearmodes; }; @@ -16,28 +15,21 @@ struct modes_localdata { void *modes_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput); void modes_free(searchCtx *ctx, struct searchNode *thenode); -struct searchNode *modes_parse(searchCtx *ctx, int type, int argc, char **argv) { +struct searchNode *modes_parse(searchCtx *ctx, int argc, char **argv) { struct modes_localdata *localdata; - struct searchNode *thenode; + struct searchNode *thenode, *modestring; const flag *flaglist; - + char *p; + if (argc!=1) { parseError="modes: usage: modes (mode string)"; return NULL; } - switch (type) { - case SEARCHTYPE_CHANNEL: + if (ctx->searchcmd == reg_chansearch) { flaglist=cmodeflags; - break; - - case SEARCHTYPE_NICK: + } else { flaglist=umodeflags; - break; - - default: - parseError="modes: unsupported search type"; - return NULL; } if (!(localdata=(struct modes_localdata *)malloc(sizeof(struct modes_localdata)))) { @@ -45,13 +37,18 @@ struct searchNode *modes_parse(searchCtx *ctx, int type, int argc, char **argv) return NULL; } - localdata->type=type; localdata->setmodes=0; localdata->clearmodes = ~0; - setflags(&(localdata->setmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE); - setflags(&(localdata->clearmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE); - + if (!(modestring=argtoconststr("modes", ctx, argv[0], &p))) { + free(localdata); + return NULL; + } + + setflags(&(localdata->setmodes), 0xFFFF, p, flaglist, REJECT_NONE); + setflags(&(localdata->clearmodes), 0xFFFF, p, flaglist, REJECT_NONE); + (modestring->free)(ctx, modestring); + localdata->clearmodes = ~(localdata->clearmodes); if (!(thenode=(struct searchNode *)malloc(sizeof(struct searchNode)))) { @@ -77,21 +74,14 @@ void *modes_exe(searchCtx *ctx, struct searchNode *thenode, void *value) { localdata = (struct modes_localdata *)thenode->localdata; - switch (localdata->type) { - case SEARCHTYPE_CHANNEL: + if (ctx->searchcmd == reg_chansearch) { cip=(chanindex *)value; if (!cip->channel) return NULL; flags=cip->channel->flags; - break; - - case SEARCHTYPE_NICK: + } else { np=(nick *)value; flags=np->umodes; - break; - - default: - return NULL; } if (~flags & (localdata->setmodes))