/
umud/DOC/
umud/DOC/U/
umud/DOC/U/U-examples/
umud/DOC/internals/
umud/DOC/wizard/
umud/MISC/
umud/MISC/dbchk/
umud/RWHO/rwhod/
#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);
}