sima/autoconf/
sima/hosts/i386/
sima/mudlib/
sima/mudlib/kernel/
sima/mudlib/obj/
sima/mudlib/sys/
sima/synhash/mips/
/*  Copyright 1995, 1997 J"orn Rennecke */

#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <signal.h>
#include "common.h"
#include "lex.h"
#include "object.h"

svalue master_name, boot_fun;
svalue driver_hook[NUM_DRIVER_HOOKS];
char *mudlib = MUDLIB;

int main(int argc, char **argv) {
    char **argp, *arg;
    int i;

    init_alloc();
    init_global_strings();
    master_name = make_string(MASTER_NAME, strlen(MASTER_NAME));
    boot_fun = make_string(BOOT_FUN, strlen(BOOT_FUN));
    for (argp = &argv[1], i = argc; --i > 0; ) {
	arg = *argp++;
	if (*arg == '-') switch(arg[1]) {
	  case 'D':
            if (arg[2]) {
                commandline_define(arg+2);
                continue;
            }
            break;
	  case 'M':
            arg += 2;
            if (!*arg && --i > 0)
                arg = *argp++;
	    FREE_SVALUE(master_name);
	    master_name = make_string(arg, strlen(arg));
	    break;
	  case 'm':
            arg += 2;
            if (!*arg && --i > 0)
                arg = *argp++;
            mudlib = arg;
	    break;
#ifdef YYDEBUG
	  case 'y':
	  {
	    extern int yydebug;

	    yydebug++;
	    break;
	  }
#endif
#ifdef LEXDEBUG
	  case 'l':
	  {
	    extern int lexdebug;

	    lexdebug++;
	    break;
	  }
#endif
#if TIME_TO_SWAP > 0
	  case 's':
	    if (arg[2] == 'v') {
		time_to_swap_variables =
		  (unsigned)atoi(&arg[3])/ASYNC_GRANULARITY;
		if (time_to_swap_variables < 0)
		    time_to_swap_variables = (unsigned)~0>>1;
	    } else if (arg[2] == 'f') {
		extern void name_swap_file(char*);

		name_swap_file(&arg[3]);
	    } else {
		time_to_swap = (unsigned)atoi(&arg[2])/ASYNC_GRANULARITY;
		if (time_to_swap < 0)
		    time_to_swap = (unsigned)~0>>1;
	    }
	    continue;
#endif

	} else if (isdigit(*arg)) {
	    extern int port_number;

	    port_number = atoi(arg);
	}
    }
    if (chdir(mudlib) < 0)
        fatal("Bad mudlib directory: %s\n", mudlib);
    if (mudlib[0] != '/') {
#ifdef MAXPATHLEN
	char path[MAXPATHLEN];
#else
	char path[2048];
#endif
#ifdef HAVE_GETCWD
	if (!getcwd(path, sizeof(path) ))
#else
	if (!getwd(path))
#endif
	{
	    perror("get(c)wd failed");
	    fatal("must be able to obtain current directory name\n");
	}
	mudlib = strdup(path);
    }
    initialize_host_ip_number();
    initialize_uids();
    initialize_lex();
    initialize_interpreter();
    (void)signal(SIGFPE, fpe_handler);
    init_otable();
    init_comm();
    schedule(); /* enter main loop */
}

void fatal(char *fmt, ...) {
    va_list va;

    va_start(va, fmt);
    vfprintf(stderr, fmt, va);
    va_end(va);
    sleep(1);
    /* make a nice core */
    (void)signal(SIGFPE, SIG_DFL);
    *((char*)0) = 0/0;
    /* if this didnt work.. */
    abort();
}

void debug_message(char *fmt, ...) {
    va_list va;

    va_start(va, fmt);
    vfprintf(stderr, fmt, va);
    va_end(va);
}

svalue *f_shutdown(svalue * sp) {
    exit(0);
    return sp;
}