/*
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);
}