fbmuck-6.01/contrib/jresolver/
fbmuck-6.01/contrib/jresolver/org/
fbmuck-6.01/contrib/jresolver/org/fuzzball/
fbmuck-6.01/docs/devel/
fbmuck-6.01/game/
fbmuck-6.01/game/logs/
fbmuck-6.01/game/muf/
fbmuck-6.01/scripts/
fbmuck-6.01/src_docs/
#ifndef _PROPS_H
#define _PROPS_H


union pdata_u {
	char *str;
	struct boolexp *lok;
	int val;
	double fval;
	dbref ref;
	long pos;
};

/* data struct for setting data. */
struct pdata {
	unsigned short flags;
	union pdata_u data;
};
typedef struct pdata PData;


/* Property struct */
struct plist {
	unsigned short flags;
	short height;				/* satisfy the avl monster.  */
	union pdata_u data;
	struct plist *left, *right, *dir;
	char key[1];
};

/* property node pointer type */
typedef struct plist *PropPtr;

/* propload queue types */
#define PROPS_UNLOADED 0x0
#define PROPS_LOADED   0x1
#define PROPS_PRIORITY 0x2
#define PROPS_CHANGED  0x3


/* property value types */
#define PROP_DIRTYP   0x0
#define PROP_STRTYP   0x2
#define PROP_INTTYP   0x3
#define PROP_LOKTYP   0x4
#define PROP_REFTYP   0x5
#define PROP_FLTTYP   0x6
#define PROP_TYPMASK  0x7

/* If set, this prop's string value uses Dr.Cat's compression code. */
#define PROP_COMPRESSED  0x0008

/* Property flags.  Unimplemented as yet. */
#define PROP_UREAD       0x0010
#define PROP_UWRITE      0x0020
#define PROP_WREAD       0x0040
#define PROP_WWRITE      0x0080

/* half implemented.  Will be used for stuff like password props. */
#define PROP_SYSPERMS    0x0100

/* Internally used prop flags.  Never stored on disk. */
#define PROP_ISUNLOADED  0x0200
#define PROP_TOUCHED     0x0400
#define PROP_DIRUNLOADED 0x0800

/* Blessed props evaluate with wizbit MPI perms. */
#define PROP_BLESSED     0x1000


/* Macros */
#define AVL_LF(x) (x)->left
#define AVL_RT(x) (x)->right

#define SetPDir(x,y) {(x)->dir = y;}
#define PropDir(x) ((x)->dir)

#define SetPDataUnion(x,z) {(x)->data = z;}
#define SetPDataStr(x,z) {(x)->data.str = z;}
#define SetPDataVal(x,z) {(x)->data.val = z;}
#define SetPDataRef(x,z) {(x)->data.ref = z;}
#define SetPDataLok(x,z) {(x)->data.lok = z;}
#define SetPDataFVal(x,z) {(x)->data.fval = z;}

#define PropDataStr(x) ((x)->data.str)
#define PropDataVal(x) ((x)->data.val)
#define PropDataRef(x) ((x)->data.ref)
#define PropDataLok(x) ((x)->data.lok)
#define PropDataFVal(x) ((x)->data.fval)

#define PropName(x) ((x)->key)

#define SetPFlags(x,y) {(x)->flags = ((x)->flags & PROP_TYPMASK) | (short)y;}
#define PropFlags(x) ((x)->flags & ~PROP_TYPMASK)

#define SetPType(x,y) {(x)->flags = ((x)->flags & ~PROP_TYPMASK) | (short)y;}
#define PropType(x) ((x)->flags & PROP_TYPMASK)

#define SetPFlagsRaw(x,y) {(x)->flags = (short)y;}
#define PropFlagsRaw(x) ((x)->flags)

#define Prop_Blessed(obj,propname) (get_property_flags(obj, propname) & PROP_BLESSED)

/* property access macros */
#define Prop_ReadOnly(name) \
    (Prop_Check(name, PROP_RDONLY) || Prop_Check(name, PROP_RDONLY2))
#define Prop_Private(name) Prop_Check(name, PROP_PRIVATE)
#define Prop_SeeOnly(name) Prop_Check(name, PROP_SEEONLY)
#define Prop_Hidden(name) Prop_Check(name, PROP_HIDDEN)
#define Prop_System(name) is_prop_prefix(name, "@__sys__")


/* Routines as they need to be:

     PropPtr locate_prop(PropPtr list, char *name)
       if list is NULL, return NULL.

     PropPtr new_prop(PropPtr *list, char *name)
       if *list is NULL, create a new propdir, then insert the prop

     PropPtr delete_prop(PropPtr *list, char *name)
       when last prop in dir is deleted, destroy propdir & change *list to NULL

     PropPtr first_node(PropPtr list)
       if list is NULL, return NULL

     PropPtr next_node(PropPtr list, char *name)
       if list is NULL, return NULL

 */

extern PropPtr alloc_propnode(const char *name);
extern void free_propnode(PropPtr node);
extern PropPtr first_node(PropPtr p);
extern PropPtr next_node(PropPtr p, char *c);
extern void putprop(FILE * f, PropPtr p);
extern int Prop_Check(const char *name, const char what);
extern PropPtr locate_prop(PropPtr l, char *path);
extern PropPtr new_prop(PropPtr * l, char *path);
extern PropPtr delete_prop(PropPtr * list, char *name);


extern void set_property(dbref player, const char *pname, PData * dat);
extern void add_property(dbref player, const char *type, const char *strval, int value);

extern void remove_property_list(dbref player, int all);
extern void remove_property(dbref player, const char *type);

extern int has_property(int descr, dbref player, dbref what, const char *type,
						const char *strval, int value);
extern int has_property_strict(int descr, dbref player, dbref what, const char *type,
							   const char *strval, int value);

extern const char *get_property_class(dbref player, const char *type);
extern double get_property_fvalue(dbref player, const char *type);
extern int get_property_value(dbref player, const char *type);
extern struct boolexp *get_property_lock(dbref player, const char *type);
extern const char *envpropstr(dbref * where, const char *propname);
extern PropPtr get_property(dbref player, const char *type);
extern PropPtr envprop(dbref * where, const char *propname, int typ);
extern int get_property_flags(dbref player, const char *type);
extern void set_property_flags(dbref player, const char *type, int flags);
extern void clear_property_flags(dbref player, const char *type, int flags);

extern int genderof(int descr, dbref player);
extern struct plist *copy_prop(dbref old);

extern PropPtr first_prop(dbref player, const char *dir, PropPtr * list, char *name);
extern PropPtr next_prop(PropPtr list, PropPtr prop, char *name);
extern char *next_prop_name(dbref player, char *outbuf, int outbuflen, char *name);

extern int is_propdir(dbref player, const char *dir);

extern void delete_proplist(PropPtr p);
extern void set_property_nofetch(dbref player, const char *pname, PData * dat);
extern void add_prop_nofetch(dbref player, const char *type, const char *strval, int value);
extern void remove_property_nofetch(dbref player, const char *type);
extern PropPtr first_prop_nofetch(dbref player, const char *dir, PropPtr * list, char *name);

#ifdef DISKBASE
extern int fetchprops_priority(dbref obj, int mode, const char *pdir);
extern int fetchprops_nostamp(dbref obj);
extern void fetchprops(dbref obj, const char *pdir);
extern void unloadprops_with_prejudice(dbref obj);
extern int disposeprops_notime(dbref obj);
extern int disposeprops(dbref obj);
extern void dirtyprops(dbref obj);
extern void undirtyprops(dbref obj);
extern int propfetch(dbref obj, PropPtr p);
#endif							/* DISKBASE */

extern PropPtr propdir_new_elem(PropPtr * root, char *path);
extern PropPtr propdir_delete_elem(PropPtr root, char *path);
extern PropPtr propdir_get_elem(PropPtr root, char *path);
extern PropPtr propdir_first_elem(PropPtr root, char *path);
extern PropPtr propdir_next_elem(PropPtr root, char *path);
extern int propdir_check(PropPtr root, char *path);
extern const char *propdir_name(const char *name);
extern const char *propdir_unloaded(PropPtr root, const char *path);

extern void db_putprop(FILE * f, const char *dir, PropPtr p);
extern int db_get_single_prop(FILE * f, dbref obj, long pos, PropPtr pnode, const char *pdir);
extern void db_getprops(FILE * f, dbref obj, const char *pdir);
extern void db_dump_props(FILE * f, dbref obj);

extern void reflist_add(dbref obj, const char* propname, dbref toadd);
extern void reflist_del(dbref obj, const char* propname, dbref todel);
extern int reflist_find(dbref obj, const char* propname, dbref tofind);

#endif /* _PROPS_H */