// db.h // // $Id: db.h,v 1.7 2005/08/05 15:37:50 sdennis Exp $ // #ifndef __DB_H #define __DB_H #ifndef MEMORY_BASED #define SYNC cache_sync() #define CLOSE cache_close() #else // !MEMORY_BASED #define SYNC #define CLOSE #endif // !MEMORY_BASED #include "attrcache.h" #include "flags.h" #include "timeutil.h" #define ITER_PARENTS(t,p,l) for ((l)=0, (p)=(t); \ (Good_obj(p) && \ ((l) < mudconf.parent_nest_lim)); \ (p)=Parent(p), (l)++) int get_atr(char *name); typedef struct attr ATTR; struct attr { const char *name; // This has to be first. braindeath. int number; // attr number int flags; }; #ifdef MEMORY_BASED typedef struct atrlist ATRLIST; struct atrlist { char *data; /* Attribute text. */ int size; /* Length of attribute */ int number; /* Attribute number. */ }; #endif // MEMORY_BASED extern char *MakeCanonicalAttributeName(const char *pName, int *pnName, bool *pbValid); extern char *MakeCanonicalAttributeCommand(const char *pName, int *pnName, bool *pbValid); typedef struct stack STACK; struct stack { char *data; STACK *next; }; extern ATTR *atr_num(int anum); extern ATTR *atr_str(char *s); extern ATTR attr[]; extern ATTR **anum_table; #define anum_get(x) (anum_table[(x)]) #define anum_set(x,v) anum_table[(x)] = v extern void anum_extend(int); #define ATR_INFO_CHAR '\1' /* Leadin char for attr control data */ /* Boolean expressions, for locks */ #define BOOLEXP_AND 0 #define BOOLEXP_OR 1 #define BOOLEXP_NOT 2 #define BOOLEXP_CONST 3 #define BOOLEXP_ATR 4 #define BOOLEXP_INDIR 5 #define BOOLEXP_CARRY 6 #define BOOLEXP_IS 7 #define BOOLEXP_OWNER 8 #define BOOLEXP_EVAL 9 typedef struct boolexp BOOLEXP; struct boolexp { boolexp_type type; struct boolexp *sub1; struct boolexp *sub2; dbref thing; /* thing refers to an object */ }; #define TRUE_BOOLEXP ((BOOLEXP *) 0) /* Database format information */ #define F_UNKNOWN 0 /* Unknown database format */ #define F_MUX 5 /* MUX format */ #define V_MASK 0x000000ff /* Database version */ #define V_ZONE 0x00000100 /* ZONE/DOMAIN field */ #define V_LINK 0x00000200 /* LINK field (exits from objs) */ #define V_DATABASE 0x00000400 /* attrs in a separate database */ #define V_ATRNAME 0x00000800 /* NAME is an attr, not in the hdr */ #define V_ATRKEY 0x00001000 /* KEY is an attr, not in the hdr */ #define V_PARENT 0x00002000 /* db has the PARENT field */ #define V_ATRMONEY 0x00008000 /* Money is kept in an attribute */ #define V_XFLAGS 0x00010000 /* An extra word of flags */ #define V_POWERS 0x00020000 /* Powers? */ #define V_3FLAGS 0x00040000 /* Adding a 3rd flag word */ #define V_QUOTED 0x00080000 /* Quoted strings, ala PennMUSH */ /* Some defines for DarkZone's flavor of PennMUSH */ #define DB_CHANNELS 0x2 /* Channel system */ #define DB_SLOCK 0x4 /* Slock */ #define DB_MC 0x8 /* Master Create Time + modifed */ #define DB_MPAR 0x10 /* Multiple Parent Code */ #define DB_CLASS 0x20 /* Class System */ #define DB_RANK 0x40 /* Rank */ #define DB_DROPLOCK 0x80 /* Drop/TelOut Lock */ #define DB_GIVELOCK 0x100 /* Give/TelIn Lock */ #define DB_GETLOCK 0x200 /* Get Lock */ #define DB_THREEPOW 0x400 /* Powers have Three Long Words */ /* special dbref's */ #define NOTHING (-1) /* null dbref */ #define AMBIGUOUS (-2) /* multiple possibilities, for matchers */ #define HOME (-3) /* virtual room, represents mover's home */ #define NOPERM (-4) /* Error status, no permission */ extern char *aszSpecialDBRefNames[1-NOPERM]; typedef struct object OBJ; struct object { dbref location; /* PLAYER, THING: where it is */ /* ROOM: dropto: */ /* EXIT: where it goes to */ dbref contents; /* PLAYER, THING, ROOM: head of contentslist */ /* EXIT: unused */ dbref exits; /* PLAYER, THING, ROOM: head of exitslist */ /* EXIT: where it is */ dbref next; /* PLAYER, THING: next in contentslist */ /* EXIT: next in exitslist */ /* ROOM: unused */ dbref link; /* PLAYER, THING: home location */ /* ROOM, EXIT: unused */ dbref parent; /* ALL: defaults for attrs, exits, $cmds, */ dbref owner; /* PLAYER: domain number + class + moreflags */ /* THING, ROOM, EXIT: owning player number */ dbref zone; /* Whatever the object is zoned to.*/ FLAGSET fs; // ALL: Flags set on the object. POWER powers; /* ALL: Powers on object */ POWER powers2; /* ALL: even more powers */ STACK *stackhead; /* Every object has a stack. */ CLinearTimeDelta cpu_time_used; /* ALL: CPU time eaten */ // ALL: When to refurbish throttled counters. // CLinearTimeAbsolute tThrottleExpired; int throttled_attributes; int throttled_mail; char *purename; char *moniker; #ifdef MEMORY_BASED ATRLIST *ahead; /* The head of the attribute list. */ int at_count; /* How many attributes do we have? */ #else char *name; #endif // MEMORY_BASED }; extern OBJ *db; #define Location(t) db[t].location #define Zone(t) db[t].zone #define Contents(t) db[t].contents #define Exits(t) db[t].exits #define Next(t) db[t].next #define Link(t) db[t].link #define Owner(t) db[t].owner #define Parent(t) db[t].parent #define Flags(t) db[t].fs.word[FLAG_WORD1] #define Flags2(t) db[t].fs.word[FLAG_WORD2] #define Flags3(t) db[t].fs.word[FLAG_WORD3] #define Powers(t) db[t].powers #define Powers2(t) db[t].powers2 #define Stack(t) db[t].stackhead #define Home(t) Link(t) #define Dropto(t) Location(t) #define ThAttrib(t) db[t].throttled_attributes #define ThMail(t) db[t].throttled_mail #define s_Location(t,n) db[t].location = (n) #define s_Zone(t,n) db[t].zone = (n) #define s_Contents(t,n) db[t].contents = (n) #define s_Exits(t,n) db[t].exits = (n) #define s_Next(t,n) db[t].next = (n) #define s_Link(t,n) db[t].link = (n) #define s_Owner(t,n) db[t].owner = (n) #define s_Parent(t,n) db[t].parent = (n) #define s_Flags(t,f,n) db[t].fs.word[f] = (n) #define s_Powers(t,n) db[t].powers = (n) #define s_Powers2(t,n) db[t].powers2 = (n) #define s_Stack(t,n) db[t].stackhead = (n) #define s_Home(t,n) s_Link(t,n) #define s_Dropto(t,n) s_Location(t,n) #define s_ThAttrib(t,n) db[t].throttled_attributes = (n); #define s_ThMail(t,n) db[t].throttled_mail = (n); extern int Pennies(dbref); extern void s_Pennies(dbref, int); #ifndef WIN32 extern void load_restart_db(void); #endif // !WIN32 extern dbref getref(FILE *); extern void putref(FILE *, dbref); extern void free_boolexp(BOOLEXP *); extern dbref parse_dbref(const char *); extern bool ThrottleMail(dbref executor); extern bool ThrottleAttributeNames(dbref executor); extern bool ThrottlePlayerCreate(void); extern int mkattr(dbref executor, char *); extern void al_store(void); extern void db_grow(dbref); extern void db_free(void); extern void db_make_minimal(void); extern dbref db_read(FILE *, int *, int *, int *); extern dbref db_write(FILE *, int, int); extern void destroy_thing(dbref); extern void destroy_exit(dbref); extern void putstring(FILE *f, const char *s); char *getstring_noalloc(FILE *f, int new_strings); #define DOLIST(thing,list) \ for ((thing)=(list); \ ((thing)!=NOTHING) && (Next(thing)!=(thing)); \ (thing)=Next(thing)) #define SAFE_DOLIST(thing,next,list) \ for ((thing)=(list),(next)=((thing)==NOTHING ? NOTHING: Next(thing)); \ (thing)!=NOTHING && (Next(thing)!=(thing)); \ (thing)=(next), (next)=Next(next)) #define DO_WHOLE_DB(thing) \ for ((thing)=0; (thing)<mudstate.db_top; (thing)++) #define DO_WHOLE_DB_BACKWARDS(thing) \ for ((thing)=mudstate.db_top-1; (thing)>=0; (thing)--) #endif // !__DB_H