dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
#ifndef LPC_TO_C_H
#define LPC_TO_C_H

#include "lpc_incl.h"
#include "eoperators.h"
#include "efun_protos.h"

#ifdef LPC_TO_C

#include "cfuns.h"

#define C_STRING(x) SAFE(\
			 (++sp)->type = T_STRING;\
			 sp->subtype = STRING_SHARED;\
			 sp->u.string = ref_string(current_prog->strings[x]);\
		     )
#define C_AGGREGATE(x) SAFE(\
			    lpc_arr = allocate_empty_array(x + num_varargs);\
			    num_varargs = 0;\
			    for (lpc_int=x + num_varargs; lpc_int--; )\
			    lpc_arr->item[lpc_int] = *sp--;\
			    (++sp)->type = T_ARRAY;\
			    sp->u.arr = lpc_arr;\
			    )
#define C_AGGREGATE_ASSOC(x) SAFE(\
				  lpc_map = load_mapping_from_aggregate(sp -= (x + num_varargs), (x+num_varargs));\
				  num_varargs = 0;\
				  (++sp)->type = T_MAPPING;\
				  sp->u.map = lpc_map;\
				  )
#define C_WHILE_DEC(x) SAFE(\
			    if (fp[x].type == T_NUMBER) {\
			        lpc_int = fp[x].u.number--;\
			    } else if (fp[x].type == T_REAL) {\
				lpc_int = fp[x].u.real--;\
			    } else error("-- of non-numeric argument\n");\
			    )
#define C_LOOP_COND_LV(x, y) lpc_int = c_loop_cond_compare(&fp[x], &fp[y])
#define C_LOOP_COND_NUM(x, y) SAFE(\
				   if (fp[x].type == T_NUMBER) {\
				       lpc_int = fp[x].u.number < y;\
				   } else if (fp[x].type == T_REAL) {\
				       lpc_int = fp[x].u.real < y;\
				   } else error("Right side of < is a number, left side is not.\n");\
				   )
#define C_LOOP_INCR(x) SAFE(\
			    if (fp[x].type == T_NUMBER) { fp[x].u.number++; }\
			    else if (fp[x].type == T_REAL) { fp[x].u.real++; }\
			    else { error("++ of non-numeric argument\n"); }\
			    )
#define C_GLOBAL(x) SAFE(\
			 lpc_svp = &current_object->variables[variable_index_offset + x];\
			 if ((lpc_svp->type == T_OBJECT) && (lpc_svp->u.ob->flags & O_DESTRUCTED)) {\
			    *++sp = const0u; assign_svalue(lpc_svp, &const0u);\
			 } else assign_svalue_no_free(++sp, lpc_svp);\
			 )
#define C_LOCAL(x) SAFE(\
			if ((fp[x].type == T_OBJECT) &&\
			    (fp[x].u.ob->flags & O_DESTRUCTED))\
			    assign_svalue(fp + x, &const0u);\
			push_svalue(fp + x);\
			)
#define C_TRANSFER_LOCAL(x) SAFE(\
				 if ((fp[x].type == T_OBJECT) &&\
				     (fp[x].u.ob->flags & O_DESTRUCTED))\
				     assign_svalue(fp + x, &const0u);\
				 *++sp = fp[x];\
				 fp[x].type |= T_FREED;\
				 )
#define C_LVALUE(x) SAFE((++sp)->type = T_LVALUE; sp->u.lvalue = x;)
#define C_LAND(x) SAFE(\
		       if (sp->type == T_NUMBER) {\
			   if (!sp->u.number) x;  sp--;\
		       } else pop_stack();\
		       )
#define C_LOR(x) SAFE(if (sp->type == T_NUMBER && !sp->u.number) sp--; else x;)
#define C_BRANCH_WHEN_ZERO(x) SAFE(\
				   if (sp->type == T_NUMBER) {\
				       if (!((sp--)->u.number)) x;\
				   } else pop_stack();\
				   )
#define C_BRANCH_WHEN_NON_ZERO(x) SAFE(\
				       if (sp->type != T_NUMBER \
					   || sp->u.number) { pop_stack(); x;\
				       } else sp--;\
				       )
#define C_BBRANCH_LT(x) SAFE(f_lt(); if ((sp--)->u.number) x;)
#define BRANCH_LINK(x, y) SAFE(\
			       if (x(sp->type == T_NUMBER && !sp->u.number)) {\
				  y; } pop_stack();\
			       )
#define C_REF(x) SAFE(\
		      svalue_t *lval;\
		      if (fp[x].type == T_REF) {\
			  lval = fp[x].u.ref->lvalue;\
			  if (!lval) error("Reference is invalid.\n");\
			  if (lval->type == T_LVALUE_BYTE)\
			      push_number(*global_lvalue_byte.u.lvalue_byte);\
			  else {\
			      if (lval->type == T_OBJECT && (lval->u.ob->flags & O_DESTRUCTED))\
			          assign_svalue(lval, &const0);\
			      push_svalue(lval);\
			  }\
		      } else error("Non-reference value passed as reference argument.\n");\
		      )
#define C_REF_LVALUE(x) SAFE(\
			     if (fp[x].type == T_REF) {\
				 if (fp[x].u.ref->lvalue) {\
				     STACK_INC;\
				     sp->type = T_LVALUE;\
				     sp->u.lvalue = fp[x].u.ref->lvalue;\
				 } else error("Reference is invalid.\n");\
			     } else error("Non-reference value passed as reference argument.\n");\
			     )

void c_efun_return PROT((int));

#endif

#endif