sima/autoconf/
sima/hosts/i386/
sima/mudlib/
sima/mudlib/kernel/
sima/mudlib/obj/
sima/mudlib/sys/
sima/synhash/mips/
#ifndef OBJECT_H
#define OBJECT_H

#include "port.h"

#define O_USER			0x00ff /* flags useable by the mudlib */
#define O_CLONE			0x0100
#define O_SWAPPED		0x0200
#define O_RESET_NONE		0x0400
#define O_RESET_CUSTOM		0x0800
#define O_WILL_CLEAN_UP		0x1000 /* clean_up will be called next time */

#define O_PROG_SWAPPED(ob) ((p_int)(ob)->program & 1)
#define O_VAR_SWAPPED(ob) ((p_int)(ob)->variable & 1)
#define O_SWAP_NUM(ob) \
        (O_PROG_SWAPPED(ob) ? (p_int)(ob)->prog  & ~1 : (ob)->prog->swap_num)

#define MAX_INHERIT_DEPTH 60

union object_xu {
    struct uid *uid;
    struct object_x *x;
    uint8 *p;
    uint16 *p16;
};

struct object {
    uint8 type, ref;
    uint16 flags;
    union {
	char **hash;
	union svalue destructed;
    } next;
    union svalue dirname;	/* string or program */
    union svalue basename;	/* string or number (zero for blueprint) */
    union object_xu x;
    struct program *program;
    union svalue *variable;
    uint16 last_touched; 	/* maximum TIME_TO_SWAP is thus 18:12:15 if
				 * ASYNC_GRANULARITY is 1
				 */
    union {
	uint16 last;
	int16 next;
    } reset;
};

/* T_INTERNAL, IT_X_OBJ | O_X* flags, major ref */
struct object_x {
    struct uid *uid;
    struct interactive *user;
    union svalue /* object */ shadowed_by, shadowing;
};

#define O_HAS_X(ob) ((ob)->x.p[-sizeof(p_int)+1] != IT_X_UID)
#define O_REF(ob) ((ob)->x.p16[-1])
#define OX_VALID(x) (((uint8 *)(x))[-sizeof(p_int)+1] != IT_X_UID)
#define OX_REF(x) (((uint16 *)(x))[-1])
/* O_REF starts with 1, so that !--O_REF when it is exhausted */

#define O_X_INTERACTIVE	1
#define O_X_SHADOWED	2

#define O_X_FLAGS(ob) ((ob).x.p[-sizeof(p_int)+1])
#define OP_X_FLAGS(ob) ((ob)->x.p[-sizeof(p_int)+1])
#define OX_FLAGS(x) (((uint8 *)(x))[-sizeof(p_int)+1])

#define O_IS_INTERACTIVE(ob) (O_X_FLAGS(ob) & O_X_INTERACTIVE)

#define ALLOC_OBJECT() ALLOC_TTS(T_OBJECT, 1, 0, sizeof(struct object));

extern int32 async_current_time;
extern p_int async_load;
extern int time_to_swap, time_to_swap_variables;

extern struct object nil_object;
extern struct replace_ob *obj_list_replace;
extern p_int num_objects;

extern void object_async(void);
struct frame;
extern svalue *clone_object(svalue, struct frame *);
extern struct object_x *alloc_object_x(svalue);

#endif /* OBJECT_H */