tinymush-3.0b21/game/bin/
tinymush-3.0b21/game/data/
tinymush-3.0b21/src/tools/
/*
 * dbconvert.c - Convert databases to various TinyMUSH 3.0 formats 
 */
/*
 * $Id: dbconvert.c,v 1.10 1999/10/01 07:54:10 cvs Exp $ 
 */

#undef MEMORY_BASED
#include "copyright.h"
#include "autoconf.h"

#include "config.h"
#include "db.h"
#include "externs.h"

extern void NDECL(cf_init);
extern void FDECL(do_dbck, (dbref, dbref, int));
extern void NDECL(vattr_init);

/* ---------------------------------------------------------------------------
 * Cheap hack to avoid issues in compiling standalone.
 */

void raw_notify(player, msg)
    dbref player;
    const char *msg;
{
}

/* ---------------------------------------------------------------------------
 * info: display info about the file being read or written.
 */

void info(fmt, flags, ver)
int fmt, flags, ver;
{
	const char *cp;

	switch (fmt) {
        case F_TINYMUSH:
	        cp = "TinyMUSH-3";
		break;
	case F_MUX:
	        cp = "TinyMUX";
		break;
	case F_MUSH:
		cp = "TinyMUSH";
		break;
	case F_MUSE:
		cp = "TinyMUSE";
		break;
	case F_MUD:
		cp = "TinyMUD";
		break;
	case F_MUCK:
		cp = "TinyMUCK";
		break;
	default:
		cp = "*unknown*";
		break;
	}
	fprintf(stderr, "%s version %d:", cp, ver);
	if (flags & V_ZONE)
		fprintf(stderr, " Zone");
	if (flags & V_LINK)
		fprintf(stderr, " Link");
	if (flags & V_GDBM)
		fprintf(stderr, " GDBM");
	if (flags & V_ATRNAME)
		fprintf(stderr, " AtrName");
	if (flags & V_ATRKEY) {
		if ((fmt == F_MUSH) && (ver == 2))
			fprintf(stderr, " ExtLocks");
		else
			fprintf(stderr, " AtrKey");
	}
	if (flags & V_PARENT)
		fprintf(stderr, " Parent");
	if (flags & V_COMM)
		fprintf(stderr, " Comm");
	if (flags & V_ATRMONEY)
		fprintf(stderr, " AtrMoney");
	if (flags & V_XFLAGS)
		fprintf(stderr, " ExtFlags");
	if (flags & V_3FLAGS)
		fprintf(stderr, " MoreFlags");
	if (flags & V_POWERS)
	    	fprintf(stderr, " Powers");
	if (flags & V_QUOTED)
		fprintf(stderr, " QuotedStr");
	if (flags & V_TQUOTAS)
		fprintf(stderr, " TypedQuotas");
	fprintf(stderr, "\n");
}

void usage(prog)
char *prog;
{
	fprintf(stderr, "Usage: %s gdbm-file [flags] [<in-file] [>out-file]\n", prog);
	fprintf(stderr, "   Available flags are:\n");
	fprintf(stderr, "      C - Perform consistency check\n");
	fprintf(stderr, "      G - Write in gdbm format        g - Write in flat file format\n");
	fprintf(stderr, "      K - Store key as an attribute   k - Store key in the header\n");
	fprintf(stderr, "      L - Include link information    l - Don't include link information\n");
	fprintf(stderr, "      M - Store attr map if GDBM      m - Don't store attr map if GDBM\n");
	fprintf(stderr, "      N - Store name as an attribute  n - Store name in the header\n");
	fprintf(stderr, "      P - Include parent information  p - Don't include parent information\n");
	fprintf(stderr, "      W - Write the output file  b    w - Don't write the output file.\n");
	fprintf(stderr, "      X - Create a default GDBM db    x - Create a default flat file db\n");
	fprintf(stderr, "      Z - Include zone information    z - Don't include zone information\n");
	fprintf(stderr, "      <number> - Set output version number\n");
}

int main(argc, argv)
int argc;
char *argv[];
{
	int setflags, clrflags, ver;
	int db_ver, db_format, db_flags, do_check, do_write;
	char *fp;

	if ((argc < 2) || (argc > 3)) {
		usage(argv[0]);
		exit(1);
	}
	cf_init();
#ifdef RADIX_COMPRESSION
	init_string_compress();
#endif
	/* Decide what conversions to do and how to format the output file */

	setflags = clrflags = ver = do_check = 0;
	do_write = 1;

	if (argc == 3) {
		for (fp = argv[2]; *fp; fp++) {
			switch (*fp) {
			case 'C':
				do_check = 1;
				break;
			case 'G':
				setflags |= V_GDBM;
				break;
			case 'g':
				clrflags |= V_GDBM;
				break;
			case 'Z':
				setflags |= V_ZONE;
				break;
			case 'z':
				clrflags |= V_ZONE;
				break;
			case 'L':
				setflags |= V_LINK;
				break;
			case 'l':
				clrflags |= V_LINK;
				break;
			case 'N':
				setflags |= V_ATRNAME;
				break;
			case 'n':
				clrflags |= V_ATRNAME;
				break;
			case 'K':
				setflags |= V_ATRKEY;
				break;
			case 'k':
				clrflags |= V_ATRKEY;
				break;
			case 'P':
				setflags |= V_PARENT;
				break;
			case 'p':
				clrflags |= V_PARENT;
				break;
			case 'W':
				do_write = 1;
				break;
			case 'w':
				do_write = 0;
				break;
			case 'X':
				clrflags = 0xffffffff;
				setflags = OUTPUT_FLAGS;
				ver = OUTPUT_VERSION;
				break;
			case 'x':
				clrflags = 0xffffffff;
				setflags = UNLOAD_OUTFLAGS;
				ver = UNLOAD_VERSION;
				break;
			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
				ver = ver * 10 + (*fp - '0');
				break;
			default:
				fprintf(stderr, "Unknown flag: '%c'\n", *fp);
				usage(argv[0]);
				exit(1);
			}
		}
	}
	/* Open the gdbm file */

	vattr_init();
	if (init_gdbm_db(argv[1]) < 0) {
		fprintf(stderr, "Can't open GDBM file\n");
		exit(1);
	}
	/* Go do it */

	db_read(stdin, &db_format, &db_ver, &db_flags);
	fprintf(stderr, "Input: ");
	info(db_format, db_flags, db_ver);

	if (do_check)
		do_dbck(NOTHING, NOTHING, DBCK_FULL);

	if (do_write) {
		db_flags = (db_flags & ~clrflags) | setflags;
		if (ver != 0)
			db_ver = ver;
		else
			db_ver = 3;
		fprintf(stderr, "Output: ");
		info(F_TINYMUSH, db_flags, db_ver);
		db_write(stdout, F_TINYMUSH, db_ver | db_flags);
	}
	CLOSE;
	exit(0);
}