#ifndef _PROPERTY_H_490c7c21_ #define _PROPERTY_H_490c7c21_ /* Properties have several attribute bits. Most of them are permissions. Useful bitmasks: PATTR_PERM All permission bits and nothing else PATTR_TYPE Bits that declare the prop's type PATTR_MBZ Bits that must never be set PATTR_MBO Bits that must always be set PATTR_NOCHG Bits that can't be changed after creation Permissions are theoretically the cross product of PPERM_WHO_O Object owner (really, anyone who controls it) PPERM_WHO_R Royalty PPERM_WHO_W Wizards PPERM_WHO_A Anyone not fitting any of the above categories and PPERM_BIT_X Permission to enquire about existence PPERM_BIT_R Permission to read PPERM_BIT_W Permission to write PPERM_BIT_D Permission to delete the property PPERM_BIT_F Permission to find when doing a list walk PPERM_BIT_C Permission to change the permissions and PPERM_HOW_C Command line PPERM_HOW_M MUF code PPERM_HOW_L Lock test Note: - for HOW_L, BIT_R is the only BIT_* that exists - a god bit grants all permissions; this is done by having a bit PPERM_WHO_G that is always set. Type values are PTYPE_NIL Has no value (transient state) PTYPE_STRING String-valued PTYPE_DBREF Dbref-valued PTYPE_ANYVAL Anyval */ typedef unsigned long long int PROPATTR; #define PATTR_PERM 0x001fffffffffffffULL #define PATTR_TYPE 0xc000000000000000ULL #define PATTR_MBZ 0x3fe0000000000000ULL #define PATTR_MBO 0x0010000000000000ULL #define PATTR_NOCHG 0xc000000000000000ULL #define PTYPE_NIL 0x0000000000000000ULL #define PTYPE_STRING 0x4000000000000000ULL #define PTYPE_DBREF 0x8000000000000000ULL #define PTYPE_ANYVAL 0xc000000000000000ULL #define PPERM_WHO_O 0x0001111111111111ULL #define PPERM_WHO_R 0x0002222222222222ULL #define PPERM_WHO_W 0x0004444444444444ULL #define PPERM_WHO_A 0x0008888888888888ULL #define PPERM_WHO_G 0x0010000000000000ULL #define PPERM_BIT_R 0x001f00000f00000fULL #define PPERM_BIT_X 0x00100000f00000f0ULL #define PPERM_BIT_W 0x0010000f00000f00ULL #define PPERM_BIT_D 0x001000f00000f000ULL #define PPERM_BIT_F 0x00100f00000f0000ULL #define PPERM_BIT_C 0x0010f00000f00000ULL #define PPERM_HOW_C 0x0010000000ffffffULL #define PPERM_HOW_M 0x0010ffffff000000ULL #define PPERM_HOW_L 0x001f000000000000ULL /* Bits for lookup_property, third argument */ #define LP_CREATE 0x00000001 #define LP__ALL 0x00000001 /* Convenient defines for some compatability/utility permission values. */ #define PPERM_COMPAT_PRIVATE 0x0017577777577777ULL #define PPERM_COMPAT_RDONLY 0x001f5f77ff577777ULL #define PPERM_COMPAT_WIZ 0x0014444444444444ULL #define PPERM_COMPAT_WWUR 0x001f4f44ff474477ULL #define PPERM_COMPAT_MUF 0x001f5fffff466666ULL #define PPERM_COMPAT_DEFAULT 0x001f5fffff577777ULL /* Call when all done, to free up any stray memory */ extern void prop_done(void); /* lockprop stuff, for locks */ struct lockprop; /* Data for a property lock */ extern const char *lockprop_name(const struct lockprop *); extern char *lockprop_value(const struct lockprop *); extern int lockprop_check(dbref, dbref, struct lockprop *); extern struct lockprop *copy_lockprop(const struct lockprop *); extern struct lockprop *make_lockprop(const char *, int, const char *, int); extern void free_lockprop(struct lockprop *); extern void put_lockprop(FILE *, const struct lockprop *); extern int get_lockprop(FILE *, struct lockprop **); extern int lockprop_memused(const struct lockprop *); /* Property list manipulation. Notes: - must call propref_done or propref_remove exactly once for each non-nil return from lookup_property or create_property; for brevity, this is termed "done" below. - propref_get_name return value not valid after done. - propref_get_string return value is mallocked and must be freed by the caller. - propref_get_as_dbref always calls either propref_remove or propref_done on its argument. */ struct plist; /* A property list. */ struct propref; /* A reference to a property in a property list. */ extern struct propref *lookup_property(dbref, const char *, unsigned int, ...); extern PROPATTR propref_get_attr(struct propref *); extern char *propref_get_name(struct propref *); extern char *propref_get_string(struct propref *); extern dbref propref_get_dbref(struct propref *); extern struct inst propref_get_anyval(struct propref *); extern dbref propref_get_as_dbref(struct propref *, int (*)(dbref)); extern int dbref_is_player(dbref); extern int dbref_is_room(dbref); extern int dbref_is_program(dbref); extern void propref_set_perms(struct propref *, PROPATTR); extern void propref_set_type_and_value(struct propref *, PROPATTR, ...); extern void propref_remove(struct propref *); extern void propref_done(struct propref *); extern void propref_remove_nil_or_done(struct propref *); extern void copy_plist_to(struct plist *, dbref); extern void free_plist(struct plist *); extern struct propref *create_property_compat(dbref, const char *); extern void putplist(FILE *, struct plist *); extern int getplist(FILE *, dbref); extern int compat_getplist(FILE *, dbref); extern int walk_plist(struct plist *, unsigned int, int (*)(struct propref *, void *), void *); extern void plist_filter(struct plist **, int (*)(struct propref *, void *), void *); extern void fry_dbref_props(struct plist *, dbref); /* Read property list strings from a file. */ extern int get_plist_strings(FILE *, void (*)(const char *)); /* Get the gender of a dbref. */ extern int genderof(dbref); /* Query memory usage. */ extern int plist_memused(const struct plist *); /* Renumber all properties, so as to sort all property lists. */ extern void prop_renumber_all(void); /* Macro to centralize the order of choices of which WHO bit to use */ #define PPERM_PICKWHO(god,wiz,roy,own) \ ( (god) ? PPERM_WHO_G : \ (wiz) ? PPERM_WHO_W : \ (roy) ? PPERM_WHO_R : \ (own) ? PPERM_WHO_O : \ PPERM_WHO_A ) #endif