/*
 * mach_pc.c
 *
 * PC dependencies
 *
 * In here, we do command line parsing, getting time of day, and
 * other things that BSD is nice for.
 *
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/file.h>
#include <signal.h>
#include <math.h>
#include <setjmp.h>
#include "defs.h"

machdep_init(argc, argv)
	int	argc;
	char	**argv;
{
	extern	FILE *rootfile();
	extern	char *rindex();
	extern	char *progname;
	extern	int interactive;
	extern	long sweeps;
	extern	char fileroot[];
	extern	char loadfile[];
	extern	char onlyfile[];
	extern	char cmdfile[];
	extern	int extract;
	extern	int testall;
	extern	int only;
	extern	int *onlys;
	extern	int numtotal;
	extern	int dispout;
	extern	long seed;
	extern	FILE *cmdfp;
	extern	FILE *onlyfp;
	extern	FILE *loadfp;
	extern	int no_cmd;
	extern	int ndtokens;
	extern	int disphid;
	extern	int array;
	char	*bp;
	register int i;
	int	nread;

	progname = argv[0];
	if ((bp = rindex(argv[0], '/')) != 0)
		progname = bp+1;
	time(&seed);
	argvec(argc, argv);
	srand(seed);
	if (argc == 1 || fileroot[0] == 0)
		interactive++;
	if (testall > 0 && sweeps == 0L && fileroot[0] != 0)
		sweeps = -1L;
	if (sweeps == 0L && extract == 0)
		interactive++;
	/*
	 * save the command (but we need a fileroot for this)
	 */
	if (no_cmd == 0 && fileroot[0]) {
		cmdfp = rootfile(cmdfile, "cmd", "a");
		for (i = 1; i < argc; i++)
			fprintf(cmdfp, "%s ", argv[i]);
		fprintf(cmdfp, "\n");
		fflush(cmdfp);
	}
	/*
	 * if we have a fileroot, set up our filenames and configure
	 * the network; otherwise, we'll have to wait until we're
	 * in the command loop.  setup() does a lot of stuff and calls
	 * a number of other routines.
	 */
	if (fileroot[0] != 0)
		(void) setup(fileroot);
	if (testall > 0 && sweeps == -1L)
		sweeps = ndtokens;
	/*
	 * if a loadfile is specified read it in
	 */
	if (loadfile[0] != 0) {
		if (array == 0)
			loadweights1(loadfile);
		if (array == 1)
			loadweights2(loadfile);
	}
	if (only == 1) {
		if (array != 1){
			perror("ERROR: .only requires -a");
			exit(1);
		}
		onlyfp = rootfile(onlyfile, "only", "r");
		nread = 0;
		for (i = 0; i < numtotal; i++){
			nread += fscanf(onlyfp, "%d", (onlys+i));
		}
		if (nread != numtotal)
			inputerr(onlyfile, "only data");
	}
	sigsetup();
}

sigsetup()
{
	int	onintr();
	int	urp();
	extern	int debug;

	signal(SIGFPE, urp);
	signal(SIGTERM, onintr);
	if (!debug)
		signal(SIGINT, onintr);
}

onintr(signo)
	int     signo;
{
	extern	char *sys_siglist[];
	extern	int array;
	extern	int interactive;
	extern	int val;
	extern	jmp_buf env;
	extern	char fileroot[];

	fprintf(stderr, "Signal %d\n", signo);
	if (interactive) {
		longjmp(env, val);
	} else {
		if (array == 0)
			saveweights1(fileroot);
		else if (array == 1)
			saveweights2(fileroot);
		exit(signo);
	}
}

urp(signo, code)
	int     signo;
	int	code;
{
	extern	char *sys_siglist[];
	extern	long run;
	extern	int cur_token;
	extern	u_int cur_type;

	fprintf(stderr, "Signal %d\n", signo);
	fprintf(stderr, " run #: %ld\n", run);
	fprintf(stderr, " cur token: %d\n", cur_token);
	fprintf(stderr, " cur type: %u\n", cur_type);
	/*signal(SIGABRT, SIG_DFL);*/
	abort();
}

long
random()
{
	extern	long rand();

	return rand();
}

srandom(seed)
	int	seed;
{
	srand(seed);
}

bzero(ptr, size)
	register char *ptr;
	register int size;
{
	while (size--)
		*ptr++ = 0;
}

char *
rindex(sp, c)
	register char *sp, c;
{
	register char *r;

	r = 0;
	do {
		if (*sp == c)
			r = sp;
	} while (*sp++);
	return (r);
}
