#include <stdio.h>
#include "../lint.h"
#include "../interface.h"
#include "../object.h"
/* Define variables */
extern struct object *previous_ob;
/* Define functions */
static void
efun_cat_file(struct svalue *fp)
{
extern int read_file_len;
char *str;
if (fp[0].type != T_STRING || fp[1].type != T_NUMBER
|| fp[2].type != T_NUMBER)
{
push_number(0);
return;
}
str = read_file(fp[0].u.string, fp[1].u.number, fp[2].u.number);
if (str)
{
push_string(str, STRING_MALLOC);
apply("catch_tell", command_giver, 1, 0);
push_number(read_file_len);
}
else
push_number(0);
return;
}
static func func_cat_file =
{
"cat_file",
efun_cat_file,
};
static void
efun_tell_room(struct svalue *fp)
{
struct object *room = 0, *ob, *tp;
struct svalue *oblist, *vv;
int i, print, size;
push_number(0);
if (fp[3].type == T_OBJECT)
tp = fp[3].u.ob;
else if (command_giver && !(command_giver->flags & O_DESTRUCTED))
tp = command_giver;
else
tp = 0;
if (fp[0].type == T_STRING)
room = find_object2(fp[0].u.string);
else if (fp[0].type == T_OBJECT)
room = fp[0].u.ob;
if (!room)
return;
switch (fp[2].type)
{
case T_OBJECT:
size = 1;
oblist = &fp[2];
break;
case T_POINTER:
size = fp[2].u.vec->size;
oblist = fp[2].u.vec->item;
break;
default:
size = 0;
break;
}
/* tell folx in room */
for(ob = room->contains; ob; ob = ob->next_inv)
{
print = 1;
for (i = 0; i < size; i++)
if (oblist[i].u.ob == ob)
{
print = 0;
break;
}
/* before we push, check if it's a living */
if ((ob->flags & O_ENABLE_COMMANDS) && print)
{
push_svalue(&fp[1]);
push_object(tp);
apply("catch_msg", ob, 2, 0);
}
}
/* tell room */
print = 1; ob = room;
for (i = 0; i < size; i++)
if (oblist[i].u.ob == ob)
{
print = 0;
break;
}
if ((ob->flags & O_ENABLE_COMMANDS) && print)
{
push_svalue(&fp[1]);
push_object(tp);
apply("catch_msg", ob, 2, 0);
}
}
static func func_tell_room =
{
"tell_room",
efun_tell_room,
};
static void
efun_write(struct svalue *fp)
{
push_number(0);
if (!command_giver)
{
if (fp[0].type == T_STRING)
printf("%s", fp[0].u.string);
return;
}
push_svalue(fp);
apply("catch_tell", command_giver, 1, 0);
}
static func func_write =
{
"write",
efun_write,
};
static void
efun_say(struct svalue *fp)
{
struct object *tp, *ob;
struct svalue *oblist,
tp_svalue; /* new */
int size, i;
int print;
push_number(0);
if (command_giver && !(command_giver->flags & O_DESTRUCTED))
tp = command_giver;
else
tp = previous_ob;
tp_svalue.type=T_OBJECT;
tp_svalue.u.ob=tp;
switch (fp[1].type)
{
case T_OBJECT:
size = 1;
oblist = &fp[1];
break;
case T_POINTER:
size = fp[1].u.vec->size;
oblist = fp[1].u.vec->item;
break;
default:
if (tp)
{
size = 1;
oblist = &tp_svalue;
}
else size = 0;
break;
}
/* tell folx in room */
if (tp && tp->super)
{
for (ob = tp->super->contains; ob; ob = ob->next_inv)
{
print = 1;
for (i = 0; i < size; i++)
if (oblist[i].u.ob == ob)
print = 0;
/* before we push, check if it's a living */
if ((ob->flags & O_ENABLE_COMMANDS) && print)
{
push_svalue(fp);
push_svalue(&tp_svalue);
apply("catch_msg", ob, 2, 0);
}
}
/* tell room */
print = 1; ob = tp->super;
for (i = 0; i < size; i++)
if (oblist[i].u.ob == ob)
print = 0;
if ((ob->flags & O_ENABLE_COMMANDS) && print)
{
push_svalue(fp);
push_svalue(&tp_svalue);
apply("catch_msg", ob, 2, 0);
}
}
/* tell folx in player */
for (ob = tp->contains; ob; ob = ob->next_inv)
{
print = 1;
for (i = 0; i < size; i++)
if (oblist[i].u.ob == ob)
print = 0;
/* before we push, check if it's a living */
if ((ob->flags & O_ENABLE_COMMANDS) && print)
{
push_svalue(fp);
push_svalue(&tp_svalue);
apply("catch_msg", ob, 2, 0);
}
}
/* tell this_player */
print = 1; ob = tp;
for (i = 0; i < size; i++)
if (oblist[i].u.ob == ob)
print = 0;
if (ob && (ob->flags & O_ENABLE_COMMANDS) && print)
{
push_svalue(fp);
push_svalue(&tp_svalue);
apply("catch_msg", ob, 2, 0);
}
}
static func func_say =
{
"say",
efun_say,
};
static void
efun_atoi(struct svalue *fp)
{
if (fp->type == T_STRING)
push_number(atoi(fp->u.string));
else
push_number(0);
}
static func func_atoi =
{
"atoi",
efun_atoi,
};
/* Define the interface */
static var *(vars[]) =
{
0,
};
static func *(funcs[]) =
{
&func_cat_file,
&func_say,
&func_write,
&func_tell_room,
&func_atoi,
0,
};
struct interface efun =
{
"secure/simul_efun.c",
vars,
funcs,
};