#include "copyright.h" #include "config.h" #include "params.h" #include "tune.h" #include "db.h" char * string_dup(const char *s) { char *p; p = (char *) malloc(strlen(s) + 1); if (!p) return p; strcpy(p, s); return p; } int *nexted; void readd_contents(dbref obj) { dbref what; dbref where = db[obj].location; switch (db[obj].flags & TYPE_MASK) { case TYPE_ROOM: case TYPE_THING: case TYPE_PROGRAM: case TYPE_PLAYER: if (db[where].contents == NOTHING) { db[where].contents = obj; return; } what = db[where].contents; while (db[what].next != NOTHING) what = db[what].next; db[what].next = obj; break; case TYPE_EXIT: switch (db[where].flags & TYPE_MASK) { case TYPE_ROOM: case TYPE_THING: case TYPE_PLAYER: if (db[where].exits == NOTHING) { db[where].exits = obj; return; } what = db[where].exits; break; } while (db[what].next != NOTHING) what = db[what].next; db[what].next = obj; break; case TYPE_GARBAGE: break; } } void check_contents(dbref obj) { dbref where, lastwhere; dbref whattype = db[obj].flags & TYPE_MASK; if ((whattype == TYPE_PROGRAM) || (whattype == TYPE_EXIT) || (whattype == TYPE_GARBAGE)) return; if (db[obj].contents != NOTHING) { while ((db[obj].contents != NOTHING) && (db[db[obj].contents].location != obj)) { lastwhere = db[obj].contents; db[obj].contents = db[lastwhere].next; db[lastwhere].next = NOTHING; readd_contents(lastwhere); } where = db[obj].contents; if (where != NOTHING) { while (db[where].next != NOTHING) { if (db[db[where].next].location != obj) { lastwhere = db[where].next; db[where].next = db[lastwhere].next; db[lastwhere].next = NOTHING; readd_contents(lastwhere); } else { where = db[where].next; } } } } if (db[obj].exits != NOTHING) { while ((db[obj].exits != NOTHING) && (db[db[obj].exits].location != obj)) { lastwhere = db[obj].exits; db[obj].exits = db[lastwhere].next; db[lastwhere].next = NOTHING; readd_contents(lastwhere); } where = db[obj].exits; if (where != NOTHING) { while (db[where].next != NOTHING) { if (db[db[where].next].location != obj) { lastwhere = db[where].next; db[where].next = db[lastwhere].next; db[lastwhere].next = NOTHING; readd_contents(lastwhere); } else { where = db[where].next; } } } } } void check_common(dbref obj) { char buf[BUFFER_LEN]; if (!db[obj].name && db[obj].location == NOTHING) { db[obj].flags = TYPE_GARBAGE; db[obj].name = "<garbage>"; } /* check name */ if (!db[obj].name) { snprintf(buf, sizeof(buf), "Unknown%d", obj); db[obj].name = alloc_string(buf); } /* check location */ if (db[obj].location >= db_top) db[obj].location = tp_player_start; if (db[obj].contents < db_top) nexted[db[obj].contents] = obj; else db[obj].contents = NOTHING; if (db[obj].next < db_top) nexted[db[obj].next] = obj; else db[obj].next = NOTHING; } void check_room(dbref obj) { if (db[obj].sp.room.dropto >= 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)) db[obj].sp.room.dropto = NOTHING; if (db[obj].exits < db_top) nexted[db[obj].exits] = obj; else db[obj].exits = NOTHING; if (db[obj].owner >= db_top || ((db[db[obj].owner].flags & TYPE_MASK) != TYPE_PLAYER)) db[obj].owner = GOD; } void check_thing(dbref obj) { if (db[obj].sp.thing.home >= db_top || (((db[db[obj].sp.thing.home].flags & TYPE_MASK) != TYPE_ROOM) && ((db[db[obj].sp.thing.home].flags & TYPE_MASK) != TYPE_PLAYER))) db[obj].sp.thing.home = tp_player_start; if (db[obj].exits < db_top) nexted[db[obj].exits] = obj; else db[obj].exits = NOTHING; if (db[obj].owner >= db_top || ((db[db[obj].owner].flags & TYPE_MASK) != TYPE_PLAYER)) db[obj].owner = GOD; } 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) (db[obj].sp.exit.dest)[i] = NOTHING; if (db[obj].owner >= db_top || ((db[db[obj].owner].flags & TYPE_MASK) != TYPE_PLAYER)) db[obj].owner = GOD; } void check_player(dbref obj) { if (db[obj].sp.player.home >= db_top || ((db[db[obj].sp.player.home].flags & TYPE_MASK) != TYPE_ROOM)) db[obj].sp.player.home = tp_player_start; if (db[obj].exits < db_top) nexted[db[obj].exits] = obj; else db[obj].exits = NOTHING; } void check_program(dbref obj) { if (db[obj].owner >= db_top || ((db[db[obj].owner].flags & TYPE_MASK) != TYPE_PLAYER)) db[obj].owner = GOD; } FILE *input_file; FILE *delta_infile = NULL; FILE *delta_outfile = NULL; FILE *output_file; char *in_filename; char *out_filename; void main(int argc, char **argv) { int i; if (argc < 3 || argc > 3) { fprintf(stderr, "Usage: %s infile outfile\n", argv[0]); return; } if (!string_compare(argv[1], argv[2])) { fprintf(stderr, "%s: input and output files can't have same name.\n", argv[0]); return; } in_filename = (char *) string_dup(argv[1]); if ((input_file = fopen(in_filename, "rb")) == NULL) { fprintf(stderr, "%s: unable to open input file.\n", argv[0]); return; } out_filename = (char *) string_dup(argv[2]); if ((output_file = fopen(out_filename, "wb")) == NULL) { fprintf(stderr, "%s: unable to write to output file.\n", argv[0]); return; } db_free(); db_read(input_file); nexted = malloc((db_top + 1) * sizeof(int)); for (i = 0; i < db_top; i++) nexted[i] = NOTHING; for (i = 0; i < db_top; 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: check_program(i); break; case TYPE_GARBAGE: break; default: db[i].flags &= ~TYPE_MASK; db[i].flags |= TYPE_GARBAGE; break; } } for (i = 0; i < db_top; i++) if ((nexted[i] == NOTHING) && (i != 0)) readd_contents(i); for (i = 0; i < db_top; i++) check_contents(i); db_write(output_file); } /* dummy compiler */ void do_compile(int descr, dbref p, dbref pr, int force_err_disp) { } struct macrotable * new_macro(const char *name, const char *definition, dbref player) { return NULL; } void log_status(format, p1, p2, p3, p4, p5, p6, p7, p8) char *format, *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8; { } void clear_players(void) { } void clear_primitives(void) { } void add_event(int descr, dbref player, dbref loc, dbref trig, int dtime, dbref program, struct frame *fr, const char *strdata) { } void init_primitives(void) { } void add_player(dbref who) { } int equalstr(const char *s1, const char *s2) { } char * do_parse_mesg(int descr, dbref player, dbref what, const char *inbuf, const char *abuf, char *outbuf, int mesgtyp) { }