mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@hom.net
MUD++ development mailing list    mudpp@van.ml.org
------------------------------------------------------------------------------
vmacros.h
*/

#ifndef _VMACROS_H
#define _VMACROS_H

#define VM_SECURITY_LEVEL 2


inline vmptr reference_obj( vmtype type, vmptr ptr )
{
	if ( type == VMT_STRING )
	{
		vmptr a;
		a.s = new String(*ptr.s);
		return a;
	}
	else
		return ptr;
}

inline void dereference_obj( vmtype type, vmptr ptr )
{
	if ( type == VMT_STRING )
		delete ptr.s;
}

inline vmptr reference_obj( vmstack * st )
{
	if ( st->type == VMT_STRING )
	{
		vmptr a;
		a.s = new String(*st->val.s);
		return a;
	}
	else
		return st->val;
}

inline void dereference_obj( vmstack * st )
{
	if ( st->type == VMT_STRING )
		delete st->val.s;
}

#if VM_SECURITY_LEVEL >= 1
#define VM_SECURE_1( cond, txt ); if ( cond ) { crit_error( txt ); break; }
#define NEED_OSTACK( x ); if ( (oStackCeiling - psobj) < x )\
	{crit_error("Object stack exceeded."); break;}
#define NEED_VSTACK( x ); if ( (vStackCeiling - psvar - var_count) < x )\
	{crit_error("Variable stack exceeded."); break;}
#define NEED_TSTACK();	\
	if ( pstrace >= tStackCeiling )	\
	{crit_error("Trace stack exceeded."); break;}
#else
#define VM_SECURE_1( cond, txt );
#define NEED_OSTACK( x );
#define NEED_VSTACK( x );
#define NEED_TSTACK();
#endif

#if VM_SECURITY_LEVEL >= 2
#define VM_SECURE_2( cond, txt ); if ( cond ) { crit_error( txt ); break; }
#define ASSURE_SSIZE( x ); if ( psobj < &oStack[x] ) { crit_error( "Not "\
"enough items on stack"); break;}
#define ASSURE_STACK1( x ); \
	if ( psobj < &oStack[1] ) { crit_error( "No items on stack"); break;} \
	if ( psobj->type != x ) { crit_error( "Wrong type on stack"); break;}
#define ASSURE_STACK2( x, y ); \
	if ( psobj < &oStack[2] ) { crit_error( "Only one item on stack"); break;} \
	if ( (psobj->type != y) || ((psobj-1)->type != x) ) { crit_error( "Wrong type on stack"); break;}
#define ACCESS_VSTACK( x ); \
	if ( x >= var_count ) { crit_error( "Tried to access not allocated variable"); break; }
#define ACCESS_VSTACKT( x, t ); \
	if ( x >= var_count ) { crit_error( "Tried to access not allocated variable"); break; } \
	if ( psvar[x].type != t ) { crit_error( "Wrong type of local variable"); break; }
#else
#define VM_SECURE_2( cond, txt );
#define ASSURE_SSIZE( x );
#define ASSURE_STACK1( x );
#define ASSURE_STACK2( x, y );
#define ACCESS_VSTACK( x );
#define ACCESS_VSTACK( x, t );
#endif

#define FLAG_CONDITION( a )	\
   ( \
	(  (cell.s.conds & VMFLAG_EQUAL) && ( a==0 ) ) ||	\
	( (cell.s.conds & VMFLAG_GREATER) && ( a > 0 ) ) ||	\
	( (cell.s.conds & VMFLAG_LESSER) && ( a < 0) )	\
   )
	
#define BOOL_FLAG_CONDITION( a )	\
	(	\
	 ( (cell.s.conds & VMFLAG_EQUAL ) && ( a ) ) || \
	 ( (cell.s.conds & VMFLAG_NOT_EQUAL) && ( !(a) ) ) \
	)


#endif