#include <stdlib.h>
struct modes_localdata {
- int type;
flag_t setmodes;
flag_t clearmodes;
};
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 if (ctx->searchcmd == reg_nicksearch) {
flaglist=umodeflags;
- break;
-
- default:
+ } else {
parseError="modes: unsupported search type";
return NULL;
}
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)))) {
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 if (ctx->searchcmd == reg_nicksearch) {
np=(nick *)value;
flags=np->umodes;
- break;
-
- default:
+ } else {
return NULL;
}