#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "lnode.h" /* Only for sake of -g flag to cc (SYSV) ! */
#include "comm.h"
#include "object.h"
#include "sent.h"
#include "interpret.h"
extern char *malloc(), *string_copy();
extern int errno;
extern void error(), exit();
extern struct object *current_object;
extern struct value *clone_object();
int num_player = 1;
void prepare_ipc()
{
}
/*VARARGS1*/
void add_message(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
char *fmt;
int a1, a2, a3, a4, a5, a6, a7, a8, a9;
{
if (command_giver == 0 || command_giver->interactive == 0)
return;
(void)printf(fmt, a1, a2,a3, a4, a5, a6, a7, a8, a9);
}
static struct object *logon_object;
int get_message(buff, size)
char *buff;
int size;
{
char *p;
if (logon_object == 0) {
struct object *ob;
current_object = 0;
ob = (clone_object("obj/player"))->u.ob;
if (ob == 0)
fatal("Could not load 'obj/player'\n");
logon_object = ob;
command_giver = ob;
logon_object->interactive =
(struct interactive *)malloc(sizeof (struct interactive));
ob->interactive->input_to = 0;
ob->interactive->prompt = "> ";
logon(ob);
}
(void)fflush(stdout);
if (fgets(buff, size, stdin) == 0) {
if (errno == EINTR)
return 0;
exit(0);
}
p = strchr(buff, '\n');
if (p)
*p = '\0';
command_giver = logon_object;
return 1;
}
void remove_interactive(ob)
struct object *ob;
{
if (ob != logon_object)
fatal("Illegal interactive object in remove_interactive().\n");
logon_object = 0;
return;
}
void ipc_remove()
{
}
call_function_interactive(i, str)
struct interactive *i;
char *str;
{
char *function;
struct object *save_current_object = current_object;
struct value *val;
if (!i->input_to)
return 0;
/*
* Special feature: input_to() has been called to setup
* a call to a function.
*/
if (command_giver == 0 || command_giver->interactive == 0 ||
command_giver->interactive->input_to == 0)
fatal("Bad status in call_function_interactive().\n");
function = string_copy(command_giver->interactive->input_to->function);
current_object = command_giver->interactive->input_to->ob;
val = alloc_value();
val->type = T_STRING;
val->u.string = string_copy(str);
/*
* We must clear this reference to sentence before the call to apply(),
* because someone
* might want to set up a new input_to().
*/
free_sentence(command_giver->interactive->input_to);
command_giver->interactive->input_to = 0;
(void)apply(function, current_object->prog, val);
free(function);
current_object = save_current_object;
return 1;
}
int set_call(ob, sent)
struct object *ob;
struct sentence *sent;
{
if (ob->interactive->input_to)
return 0;
ob->interactive->input_to = sent;
return 1;
}
void show_info_about(str, room, i)
char *str, *room;
struct interactive *i;
{
add_message("%s %s %s\n", str, room, logon_object->name);
}
void remove_all_players()
{
current_object = logon_object;
(void)apply("quit", logon_object, 0);
}
set_prompt(str)
char *str;
{
command_giver->interactive->prompt = str;
}
print_prompt()
{
if (command_giver == 0)
fatal("command_giver == 0.\n");
add_message(command_giver->interactive->prompt);
}
void set_snoop(me, you)
struct object *me, *you;
{
return;
}