/* $Header: /belch_a/users/rearl/tinymuck/src/RCS/unparse.c,v 1.6 90/09/18 08:02:47 rearl Exp $ */
/*
* $Log: unparse.c,v $
* Revision 1.6 90/09/18 08:02:47 rearl
* Took out FILTER.
*
* Revision 1.5 90/09/16 04:43:11 rearl
* Preparation code added for disk-based MUCK.
*
* Revision 1.4 90/08/27 03:34:48 rearl
* Took out TEMPLE, other stuff.
*
* Revision 1.3 90/08/11 04:11:41 rearl
* *** empty log message ***
*
* Revision 1.2 90/08/06 03:50:27 rearl
* Added unparsing of ROOMS (exits? programs?) if they are CHOWN_OK.
*
* Revision 1.1 90/07/19 23:04:17 casie
* Initial revision
*
*
*/
#include "copyright.h"
#include "config.h"
#include "db.h"
#include "externs.h"
#include "params.h"
#include "interface.h"
char buf[BUFFER_LEN]; /* the global one! */
const char *unparse_object(dbref player, dbref loc)
{
char buf[BUFFER_LEN];
const char *type_codes = "R-EPFXG";
switch(loc) {
case NOTHING:
return "*NOTHING*";
case HOME:
return "*HOME*";
default:
if (can_link_to(player, NOTYPE, loc) ||
(FLAGS(loc)&VISIBLE) ||
(Arch(player)) ||
#ifdef PLAYER_CHOWN
(FLAGS(loc)&CHOWN_OK)
#endif /* PLAYER_CHOWN */
)
{
/* show everything */
sprintf(buf, "%s(#%d%c%s)", NAME(loc), loc, type_codes[Typeof(loc)],
unparse_flag_short(FLAGS(loc)));
return buf;
} else {
/* show only the name */
return NAME(loc);
}
}
}
#define OVERFLOW 512
static char boolexp_buf[BUFFER_LEN];
static char *buftop;
static void unparse_boolexp1(dbref player,
struct boolexp *b, boolexp_type outer_type)
{
if ((buftop - boolexp_buf) > (BUFFER_LEN - OVERFLOW)) {
strcpy(buftop, "... <Overflow>");
buftop += strlen(buftop);
}
else if(b == TRUE_BOOLEXP) {
strcpy(buftop, "*UNLOCKED*");
buftop += strlen(buftop);
} else {
switch(b->type) {
case BOOLEXP_AND:
if(outer_type == BOOLEXP_NOT) {
*buftop++ = '(';
}
unparse_boolexp1(player, b->sub1, b->type);
*buftop++ = AND_TOKEN;
unparse_boolexp1(player, b->sub2, b->type);
if(outer_type == BOOLEXP_NOT) {
*buftop++ = ')';
}
break;
case BOOLEXP_OR:
if(outer_type == BOOLEXP_NOT || outer_type == BOOLEXP_AND) {
*buftop++ = '(';
}
unparse_boolexp1(player, b->sub1, b->type);
*buftop++ = OR_TOKEN;
unparse_boolexp1(player, b->sub2, b->type);
if(outer_type == BOOLEXP_NOT || outer_type == BOOLEXP_AND) {
*buftop++ = ')';
}
break;
case BOOLEXP_NOT:
*buftop++ = '!';
unparse_boolexp1(player, b->sub1, b->type);
break;
case BOOLEXP_CONST:
strcpy(buftop, unparse_object(player, b->thing));
buftop += strlen(buftop);
break;
case BOOLEXP_PROP:
strcpy(buftop, b -> prop_check -> type);
strcat(buftop, ":");
strcat(buftop, b -> prop_check -> class);
buftop += strlen(buftop);
break;
default:
abort(); /* bad type */
break;
}
}
}
const char *unparse_boolexp(dbref player, struct boolexp *b)
{
buftop = boolexp_buf;
unparse_boolexp1(player, b, BOOLEXP_CONST); /* no outer type */
*buftop++ = '\0';
return boolexp_buf;
}