/*
* TYPE DECLARATIONS
*/
typedef class Loop_Type loop_type;
typedef class Aif_Type aif_type;
typedef class Afunc_Type afunc_type;
typedef class Cfunc_Type cfunc_type;
enum arg_enum { NONE, ANY, STRING, INTEGER, CHARACTER,
OBJECT, ROOM, DIRECTION, NATION, SKILL, RFLAG, STAT, CLASS,
RELIGION, RACE, THING };
enum fam_enum { variable, constant, function, if_clause, end, cont, loop };
enum op_enum { greater_than, less_than, is_equal, set_equal, not_equal };
enum loop_enum { loop_all_in_room, loop_followers, loop_unknown };
typedef void* cfunc ( void** );
/*
* QUEUE CLASS
*/
class Queue_Data
{
public:
queue_data* next;
arg_type* arg;
char_data* ch;
char_data* mob;
obj_data* obj;
room_data* room;
int i;
program_data* program;
int time;
Queue_Data( ) {
record_new( sizeof( queue_data ), MEM_QUEUE );
return;
}
~Queue_Data( ) {
record_delete( sizeof( queue_data ), MEM_QUEUE );
return;
}
};
/*
* ARGUMENT TYPES
*/
class Arg_Type
{
public:
int type;
int family;
void* value;
arg_type* next;
bool neg;
Arg_Type( ) {
record_new( sizeof( arg_type ), MEM_PROGRAM );
next = NULL;
neg = FALSE;
value = NULL;
type = NONE;
};
~Arg_Type( ) {
record_delete( sizeof( arg_type ), MEM_PROGRAM );
if( next != NULL )
delete next;
};
};
class Loop_Type : public arg_type
{
public:
loop_enum fruit;
arg_type* aloop;
arg_type* condition;
Loop_Type( ) {
record_new( sizeof( loop_type ), MEM_PROGRAM );
family = loop;
aloop = NULL;
condition = NULL;
return;
}
~Loop_Type( ) {
record_delete( sizeof( loop_type ), MEM_PROGRAM );
if( aloop != NULL )
delete aloop;
if( condition != NULL )
delete condition;
return;
}
};
class Aif_Type : public arg_type
{
public:
arg_type* condition;
arg_type* yes;
arg_type* no;
Aif_Type( ) {
record_new( sizeof( aif_type ), MEM_PROGRAM );
family = if_clause;
condition = NULL;
yes = NULL;
no = NULL;
return;
}
~Aif_Type( ) {
record_delete( sizeof( aif_type ), MEM_PROGRAM );
if( condition != NULL )
delete condition;
if( yes != NULL )
delete yes;
if( no != NULL )
delete no;
return;
}
};
class Afunc_Type : public arg_type
{
public:
const cfunc_type* func;
arg_type* arg [4];
Afunc_Type( ) {
record_new( sizeof( afunc_type ), MEM_PROGRAM );
family = function;
vzero( arg, 4 );
return;
}
~Afunc_Type( ) {
int i;
record_delete( sizeof( afunc_type ), MEM_PROGRAM );
for( i = 0; i < 4; i++ )
if( arg[i] != NULL )
delete arg[i];
return;
}
};
/*
* ???
*/
class Cfunc_Type
{
public:
char* name;
cfunc* func_call;
arg_enum type;
arg_enum arg[4];
};
class Stack_Data
{
public:
stack_data* next;
char_data* ch;
char_data* victim;
obj_data* obj;
room_data* room;
char_data* mob;
char_data* rch;
int i;
};
/*
* CODE RELATED FUNCTIONS
*/
void* code_alloc ( int );
char* code_alloc ( const char* );
void code_bug ( char* );
void pop ( void );
void push ( void );
void compile ( program_data* );
char* get_string ( const char*, extra_array& );
void clear_queue ( program_data* );
arg_type* read_arg ( );
arg_type* read_op ( arg_type* );
arg_type* read_string ( const char*&, extra_array& );
arg_type* read_variable ( const char*&, bool );
aif_type* read_if ( const char*& );
loop_type* read_loop ( const char*& );
arg_type* read_function ( const char*&, bool );
arg_type* read_const ( const char*& );
arg_type* read_digit ( const char*& );
extern bool end_prog;
extern bool cont_prog;
extern bool queue_prog;
extern queue_data* queue_list;
extern arg_type* curr_arg;
extern char error_buf [ MAX_INPUT_LENGTH ];
extern mem_block* block_list;
extern const char* arg_type_name [];
extern const cfunc_type cfunc_list [];