#include "config.h" #include "mud.h" #include "match.h" #include "u.h" #include "y.tab.h" static int parseflg(fstr) char *fstr; { int rv = 0; while(fstr && *fstr) { switch(*fstr++) { case 'U': rv |= MTCH_UNIQ; break; case 'F': rv |= MTCH_FRST; break; case 'R': rv |= MTCH_RAND; break; case 'N': rv |= MTCH_NONLOC; break; case 'M': rv |= MTCH_MEOK; break; case 'Q': rv |= MTCH_QUIET; break; case 'W': rv |= MTCH_WHICH; break; case 'E': rv |= MTCH_EXACT; break; } } return(rv); } ub_mWHO(who,aswho,ac,av,retnode) char *who; char *aswho; int ac; Nod *av[]; Nod *retnode; { char oid[MAXOID]; if(av[0]->rv.t != STR) return(UERR_BADPARM); if(matchloggedinplayers(av[0]->rv.cv,oid) != MTCHRET_OK) return(UERR_NOMATCH); retnode->rv.cv = tmpstr(oid); retnode->rv.t = OID; return(UERR_NONE); } ub_mobj(who,aswho,ac,av,retnode) char *who; char *aswho; int ac; Nod *av[]; Nod *retnode; { int flgs = MTCH_MEOK|MTCH_QUIET|MTCH_UNIQ; char oid[MAXOID]; if(ac < 1 || ac > 2 || av[0]->rv.t != STR) return(UERR_BADPARM); if(ac == 2) { if(av[1]->rv.t != STR) return(UERR_BADPARM); flgs = parseflg(av[1]->rv.cv); } if(matchobjects(who,av[0]->rv.cv,ut_loc(who),flgs,oid) != MTCHRET_OK) return(UERR_NOMATCH); retnode->rv.cv = tmpstr(oid); retnode->rv.t = OID; return(UERR_NONE); } ub_mply(who,aswho,ac,av,retnode) char *who; char *aswho; int ac; Nod *av[]; Nod *retnode; { int flgs = MTCH_MEOK|MTCH_QUIET|MTCH_UNIQ; char oid[MAXOID]; if(ac < 1 || ac > 2 || av[0]->rv.t != STR) return(UERR_BADPARM); if(ac == 2) { if(av[1]->rv.t != STR) return(UERR_BADPARM); flgs = parseflg(av[1]->rv.cv); } if(matchplayers(who,av[0]->rv.cv,ut_loc(who),flgs,oid) != MTCHRET_OK) return(UERR_NOMATCH); retnode->rv.cv = tmpstr(oid); retnode->rv.t = OID; return(UERR_NONE); } ub_mloc(who,aswho,ac,av,retnode) char *who; char *aswho; int ac; Nod *av[]; Nod *retnode; { int flgs = MTCH_MEOK|MTCH_QUIET|MTCH_UNIQ; char oid[MAXOID]; if(ac < 1 || ac > 2 || av[0]->rv.t != STR) return(UERR_BADPARM); if(ac == 2) { if(av[1]->rv.t != STR) return(UERR_BADPARM); flgs = parseflg(av[1]->rv.cv); } if(matchlocal(who,av[0]->rv.cv,ut_loc(who),flgs,oid) != MTCHRET_OK) return(UERR_NOMATCH); retnode->rv.cv = tmpstr(oid); retnode->rv.t = OID; return(UERR_NONE); } ub_minv(who,aswho,ac,av,retnode) char *who; char *aswho; int ac; Nod *av[]; Nod *retnode; { int flgs = MTCH_MEOK|MTCH_QUIET|MTCH_UNIQ; char oid[MAXOID]; if(ac < 1 || ac > 2 || av[0]->rv.t != STR) return(UERR_BADPARM); if(ac == 2) { if(av[1]->rv.t != STR) return(UERR_BADPARM); flgs = parseflg(av[1]->rv.cv); } if(matchinv(who,av[0]->rv.cv,ut_loc(who),flgs,oid) != MTCHRET_OK) return(UERR_NOMATCH); retnode->rv.cv = tmpstr(oid); retnode->rv.t = OID; return(UERR_NONE); }