#include "config.h"
#include "mud.h"
#include "match.h"
#include "u.h"
#include "y.tab.h"
static int parseflg (char *fstr);
static int parseflg (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);
}
int ub_mWHO (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);
}
int ub_mobj (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);
}
int ub_mply (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);
}
int ub_mloc (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);
}
int ub_minv (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, (int) ut_loc (who), flgs,
oid) != MTCHRET_OK)
return (UERR_NOMATCH);
retnode->rv.cv = tmpstr (oid);
retnode->rv.t = OID;
return (UERR_NONE);
}