/
umud/DOC/
umud/DOC/examples/
umud/DOC/internals/
umud/DOC/wizard/
umud/MISC/
umud/MISC/dbchk/
umud/RWHO/rwhod/
/*
	Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

#ifndef	lint
static	char	RCSid[] = "$Header: /usr/users/mjr/hacks/umud/RCS/activ.c,v 1.3 91/08/31 21:20:40 mjr Exp $";
#endif

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


#include	<ctype.h>

#include	"mud.h"
#include	"vars.h"

static void
act_subs(who,aswho,ac,av,in,out,size)
char	*who;
char	*aswho;
int	ac;
char	*av[];
char	*in;
char	*out;
int	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 < 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 < 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';
}



/*
*/
activate(flg,who,what,where,actvar,argc,argv)
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);
	}

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