/* $Header: /belch_a/users/rearl/tinymuck/src/RCS/sanity.c,v 1.3 90/08/09 16:27:16 rearl Exp $ */ /* * $Log: sanity.c,v $ * Revision 1.3 90/08/09 16:27:16 rearl * Sanity knows about TYPE_GARBAGE now. * * Revision 1.2 90/07/29 17:43:10 rearl * Added dummy macro function so sanity compiles. * * Revision 1.1 90/07/19 23:04:07 casie * Initial revision * * */ #include "copyright.h" #include "config.h" #include "db.h" void violate(dbref i, const char *s) { printf("Object #%d violates %s rules!\n", i, s); db_write_object(stdout, i); } void check_common(dbref obj) { int i; /* check location */ if (db[obj].location >= db_top) violate(obj, "location"); /* check contents */ for (i = db[obj].contents; i < db_top && i != NOTHING; i = db[i].next) ; if (i != NOTHING) violate(obj, "contents rules"); } void check_room(dbref obj) { dbref i; if (db[obj].link >= db_top || (((db[db[obj].sp.room.dropto].flags & TYPE_MASK) != TYPE_ROOM) && db[obj].sp.room.dropto != NOTHING && db[obj].sp.room.dropto != HOME)) violate(obj, "dropto"); for (i = db[obj].exits; i != NOTHING && i < db_top; i = db[i].next) ; if (i != NOTHING) violate(obj, "exits"); if (db[obj].sp.room.owner >= db_top || ((db[db[obj].sp.room.owner].flags & TYPE_MASK) != TYPE_PLAYER)) violate(obj, "owner"); } void check_thing(dbref obj) { dbref i; if (db[obj].link >= db_top || ((db[db[obj].sp.thing.home].flags & TYPE_MASK) != TYPE_ROOM)) violate(obj, "home"); for (i = db[obj].exits; i < db_top && i != NOTHING; i = db[i].next) ; if (i != NOTHING) violate(obj, "actions"); if (db[obj].sp.thing.owner >= db_top || ((db[db[obj].sp.thing.owner].flags & TYPE_MASK) != TYPE_PLAYER)) violate(obj, "owner"); } void check_exit(dbref obj) { int i; for (i = 0; i < db[obj].sp.exit.ndest; i++) if ((db[obj].sp.exit.dest)[i] >= db_top) violate(obj, "destination"); if (db[obj].sp.exit.owner >= db_top || ((db[db[obj].sp.exit.owner].flags & TYPE_MASK) != TYPE_PLAYER)) violate(obj, "owner"); } void check_player(dbref obj) { dbref i; if (db[obj].link >= db_top || ((db[db[obj].sp.player.home].flags & TYPE_MASK) != TYPE_ROOM)) violate(obj, "home"); for (i = db[obj].exits; i < db_top && i != NOTHING; i = db[i].next) ; if (i != NOTHING) violate(obj, "actions"); } void main(int argc, char **argv) { int i; db_read(stdin); printf("dbtop = %d\n", db_top); for (i = 0; i < db_top; i++) { fprintf(stderr, "Checking object %d..\n", i); check_common(i); switch( db[i].flags & TYPE_MASK ) { case TYPE_ROOM: check_room(i); break; case TYPE_THING: check_thing(i); break; case TYPE_EXIT: check_exit(i); break; case TYPE_PLAYER: check_player(i); break; case TYPE_PROGRAM: case TYPE_GARBAGE: break; default: violate(i, "type"); break; } } } /* dummy compiler */ void do_compile(dbref p, dbref pr) { } struct macrotable *new_macro(const char *name, const char *definition, dbref player) { }