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/
/*
    Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

/* configure all options BEFORE including system stuff. */
#include    "config.h"
#include    "mud.h"
#include    "vars.h"

static void act_subs (char *who, char *aswho, int ac, char *av[], char *in,
  char *out, size_t size)
{
  char vbl[MAXVLEN];
  int vl;

  while (*in && (size > 1)) {
    if (*in == '$') {
      /* A variable! */

      if (*(++in) == '$') {     /* $$ -> $ */
        *out++ = *in++;
        size--;
        continue;
      }
      if (*in == '{') {         /* ${var} */
        in++;

        for (vl = 0; *in != '}' && *in && vl < (int) sizeof (vbl) - 2; vl++)
          vbl[vl] = *in++;
        vbl[vl] = '\0';
        if (*in == '}')
          in++;
        (void) vresolve (vbl, who, aswho, ac, av, &out, &size);
        continue;
      }

      /* $var format */

      for (vl = 0; *in != '\0' && vl < (int) sizeof (vbl) - 2 &&
        (isalpha (*in) || isdigit (*in) ||
          *in == '.' || *in == '_' || *in == '+' || *in == '*'); vl++)
        vbl[vl] = *in++;
      vbl[vl] = '\0';
      (void) vresolve (vbl, who, aswho, ac, av, &out, &size);

    } else {
      *out++ = *in++;
      size--;
    }
  }
  *out++ = '\0';
}



/*
*/
int activate (int flg, char *who, char *what, char *where, char *actvar,
  int argc, char *argv[])
{
  Obj *op;
  char *ap;

  if ((op = cache_get (what)) == (Obj *) 0)
    return (0);

  /* get named attribute */
  if ((ap = objattr (op, actvar, (int *) 0)) == (char *) 0)
    return (0);

  /* if it is a string, just echo it normally */
  if (attistype (ap, typ_str)) {
    char *excp = (char *) 0;
    char work[MUDBUF];

    if ((ap = attdata (ap)) == (char *) 0)
      return (0);

    act_subs (what, what, argc, argv, ap, work, sizeof (work));

    if (flg == ACTIV_PONLY) {
      say (who, work, "\n", (char *) 0);
      return (1);
    }

    /* if the player is to be excluded set flag for broadcast */
    if (flg == ACTIV_ECAST)
      excp = who;
    ut_roombcast (where, excp, ut_name (who), " ", work, "\n", (char *) 0);
    return (1);
  }

  /* if it is a command, call it with faked-up values */
  if (attistype (ap, typ_cmd)) {
    if ((ap = attdata (ap)) == (char *) 0)
      return (0);

    /* do IT! */
    (void) run (who, what, ap, argc, argv, 0);
    return (1);
  }

  /* if it is U code .. */
  if (attistype (ap, typ_u)) {
    if ((ap = attdata (ap)) == (char *) 0)
      return (0);
    parser_setinput (ap);
    if (parser_compile (who))
      (void) parser_run (who, what, argc, argv);
    return (1);
  }

  /* huh? */
  return (0);
}