/* object.h */

/* This header file contains the declarations for the object
   structures used in the compiler/interpreter */


/* Here are the types used in the struct var */

#define INTEGER 0                   /* integer */
#define STRING 1                    /* string */
#define OBJECT 2                    /* an object pointer string */
#define ASM_INSTR 3                 /* a code instruction to be interpreted */
#define GLOBAL_L_VALUE 4            /* a global variable index */
#define LOCAL_L_VALUE 5             /* a local variable index */
#define FUNC_CALL 6                 /* function call to known function */
#define NUM_ARGS 7                  /* in a function call, the number of args
                                       preceding this var on the stack */
#define ARRAY_SIZE 8                /* the number of preceding var types that
                                       are part of this argument */
#define JUMP 9                      /* Absolute branch */
#define BRANCH 10                   /* Conditional branch */
#define NEW_LINE 11                 /* Clear stack, set new physical line */
#define RETURN 12                   /* end of function call; return value on
                                       stack */
#define LOCAL_REF 13                /* an array reference; preceded by
                                       the size and the base */
#define GLOBAL_REF 14               /* an array reference; preceded by
                                       the size and the base */
#define FUNC_NAME 15                /* function name - should be converted
                                       to FUNC_CALL at run-time */

/* The lval structure contains information about lvalues */

struct lval
{
  unsigned int ref;
  unsigned int size;
};

/* The var structure contains information about variables and
   object code instructions that may be placed on the stack */

struct var
{
  unsigned char type;
  union
  {
    signed long integer;             /* integer value for vars */
    char *string;                    /* a character string */
    struct object *objptr;           /* pointer to an object */
    unsigned char instruction;       /* an asm instruction */
    struct lval l_value;             /* l-value reference */
    struct fns *func_call;           /* pointer to a function */
    unsigned long num;               /* generic integer value */
  } value;
};

/* the var_stack structure is used as a stack of vars */

struct var_stack
{
  struct var data;
  struct var_stack *next;
};

/* The fns structure contains information about functions */

struct fns
{
  unsigned char is_static;
  unsigned int num_args;
  unsigned int num_locals;
  struct var *code;           /* To be treated as an array */
  unsigned long num_instr;
  char *funcname;
  struct fns *next;
};

struct array_size {
  unsigned int size;
  struct array_size *next;
};

struct var_tab {
  char *name;
  unsigned int base;
  struct array_size *array;
  struct var_tab *next;
};

/* The code structure contains information about code, including
   num_refs, which keeps track of how many objects currently
   reference the code */

struct code
{
  unsigned long num_refs;
  unsigned int num_globals;
  struct fns *func_list;
  struct var_tab *gst;
};

/* the verb struct is a simple linked list of verbs */

struct verb
{
  char *verb_name;
  unsigned char is_xverb;
  char *function;
  struct verb *next;
};

/* the ref_list structure is a linked list of global variables
   referencing the object */

struct ref_list
{
  struct object *ref_obj;
  unsigned int ref_num;
  struct ref_list *next;
};

/* The object structure contains information about objects */

struct object
{
  signed long refno;            /* object's index in array - unique */
  signed int devnum;            /* input device connected */
  unsigned int flags;           /* flags on the object */
  struct proto *parent;
  struct object *next_child;
  struct object *location;
  struct object *contents;
  struct object *next_object;
  struct var *globals;
  struct ref_list *refd_by;
  struct verb *verb_list;       /* PROTO: activated verbs */
  char obj_state;
  signed long file_offset;
};

/* legal object states */

#define DIRTY 0
#define IN_DB 3
#define IN_CACHE 7
#define FROM_DB 2
#define FROM_CACHE 6

struct proto
{
  char *pathname;
  struct code *funcs;
  struct object *proto_obj;
  struct proto *next_proto;
};

struct file_entry {
  char *filename;
  int flags;
  signed long owner;
  struct file_entry *contents;
  struct file_entry *parent;
  struct file_entry *prev_file;
  struct file_entry *next_file;
};

struct cmdq {
  char *cmd;
  struct object *obj;
  struct cmdq *next;
};

struct destq {
  struct object *obj;
  struct destq *next;
};

struct alarmq {
  struct object *obj;
  char *funcname;
  long delay;
  struct alarmq *next;
};

struct obj_blk {
  struct object *block;
  struct obj_blk *next;
};

struct edit_buf {
  char *buf[NUM_ELINES];
  struct edit_buf *next;
};

struct edit_s {
  struct object *obj;
  unsigned long num_lines;
  struct edit_buf *buf;
  char *path;
  unsigned long curr_line;
  int inserting;
  int is_changed;
  struct edit_s *next;
};