#include "prims.h"
/* private globals */
extern inst *p_oper1, *p_oper2, *p_oper3, *p_oper4;
extern int p_result;
extern double p_float;
extern char p_buf[BUFFER_LEN];
extern dbref p_ref;
static int p_nargs;
void prims_atoi (__P_PROTO)
{
CHECKOP(1);
p_oper1 = POP();
if (p_oper1->type != PROG_STRING || !p_oper1->data.string) p_result = 0;
else p_result = atol(p_oper1->data.string);
CLEAR(p_oper1);
push(arg, top, PROG_INTEGER, MIPSCAST &p_result);
}
void prims_atof (__P_PROTO)
{
CHECKOP(1);
p_oper1 = POP();
if (p_oper1->type != PROG_STRING || !p_oper1->data.string) p_float = 0;
else
p_float = atof(p_oper1->data.string);
CLEAR(p_oper1);
push(arg, top, PROG_FLOAT, MIPSCAST &p_float);
}
void prims_str (__P_PROTO)
{
CHECKOP(1);
p_oper1 = POP();
switch(p_oper1->type)
{
case PROG_STRING: sprintf (p_buf, "%s", p_oper1->data.string); break;
case PROG_VAR:
case PROG_INTEGER: sprintf (p_buf, "%ld", p_oper1->data.number); break;
case PROG_FLOAT: sprintf(p_buf, "%G", p_oper1->data.fnum); break;
case PROG_OBJECT: sprintf (p_buf, "%ld", p_oper1->data.objref); break;
default: abort_interp("Invalid argument type.");
}
CLEAR(p_oper1);
push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}
void prims_dbref (__P_PROTO)
{
CHECKOP(1);
p_oper1 = POP();
switch(p_oper1->type)
{
case PROG_STRING: p_ref = p_oper1->data.string ?
(dbref)strtol(p_oper1->data.string, NULL, 0) : (dbref)0;
break;
case PROG_VAR:
case PROG_INTEGER: p_ref = (dbref)p_oper1->data.number; break;
case PROG_OBJECT: p_ref = (dbref)p_oper1->data.objref; break;
default: abort_interp("Invalid argument type.");
}
CLEAR(p_oper1);
push(arg, top, PROG_OBJECT, MIPSCAST &p_ref);
}
void prims_int (__P_PROTO)
{
CHECKOP(1);
p_oper1 = POP();
switch (p_oper1->type)
{
case PROG_OBJECT: p_result = p_oper1->data.objref; break;
case PROG_VAR: p_result = p_oper1->data.number; break;
case PROG_INTEGER: p_result = p_oper1->data.number; break;
case PROG_FLOAT: p_result = p_oper1->data.fnum; break;
case PROG_STRING: p_result = p_oper1->data.string ?
strtol(p_oper1->data.string, NULL, 0) : 0;
break;
default: abort_interp("Invalid argument type.");
}
CLEAR(p_oper1);
push(arg, top, PROG_INTEGER, MIPSCAST &p_result);
}
void prims_variable (__P_PROTO)
{
CHECKOP(1);
p_oper1 = POP();
switch (p_oper1->type)
{
case PROG_OBJECT: p_result = p_oper1->data.objref; break;
case PROG_VAR: p_result = p_oper1->data.number; break;
case PROG_INTEGER: p_result = p_oper1->data.number; break;
case PROG_FLOAT: p_result = p_oper1->data.fnum; break;
case PROG_STRING: p_result = (p_oper1->data.string) ?
strtol(p_oper1->data.string, NULL, 0) : 0;
break;
default: abort_interp("Invalid argument type.");
}
CLEAR(p_oper1);
push(arg, top, PROG_VAR, MIPSCAST &p_result);
}
void prims_ilimit (__P_PROTO)
{
if ((*top) >= STACK_SIZE) abort_interp("Stack overflow.");
push(arg, top, PROG_INTEGER, MIPSCAST &ilimit);
}
void prims_setilimit (__P_PROTO)
{
if (!fr->wizard) abort_interp("Permission denied.");
CHECKOP(1);
p_oper1 = POP();
if (p_oper1->type != PROG_INTEGER) abort_interp("Operand not an integer.");
if (p_oper1->data.number < 5) abort_interp("Operand is too small.");
ilimit = p_oper1->data.number;
}
void prims_float (__P_PROTO)
{
CHECKOP(1);
p_oper1 = POP();
switch (p_oper1->type)
{
case PROG_OBJECT: p_float = p_oper1->data.objref; break;
case PROG_VAR: p_float = p_oper1->data.number; break;
case PROG_INTEGER: p_float = p_oper1->data.number; break;
case PROG_FLOAT: p_float = p_oper1->data.fnum; break;
case PROG_STRING: p_float = p_oper1->data.string ?
atof(p_oper1->data.string) : 0;
break;
default: abort_interp("Invalid argument type.");
}
CLEAR(p_oper1);
push(arg, top, PROG_FLOAT, MIPSCAST &p_float);
}