#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 */