fbmuck-6.05/auto/
fbmuck-6.05/contrib/jresolver/
fbmuck-6.05/contrib/jresolver/org/
fbmuck-6.05/contrib/jresolver/org/fuzzball/
fbmuck-6.05/docs/devel/
fbmuck-6.05/game/
fbmuck-6.05/game/logs/
fbmuck-6.05/game/muf/
fbmuck-6.05/scripts/
fbmuck-6.05/src_docs/
#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)
{
	return NULL;
}