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