/
umud/DOC/
umud/DOC/examples/
umud/DOC/internals/
umud/DOC/wizard/
umud/MISC/
umud/MISC/dbchk/
umud/RWHO/rwhod/
/*
	Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

#ifndef	lint
static	char	RCSid[] = "$Header: /usr/users/mjr/hacks/umud/RCS/misc.c,v 1.3 91/08/24 22:40:22 mjr Exp $";
#endif

/* configure all options BEFORE including system stuff. */
#include	"config.h"


#include	<stdio.h>
#ifndef	NOSYSTYPES_H
#include	<sys/types.h>
#endif
#include	<ctype.h>
#include	<varargs.h>
#include	<errno.h>
#include	<time.h>

#include	"mud.h"



/*
LOW-level miscellaneous routines. Do not call anything high level
from in here. that goes in misc2.c
*/
extern	int	errno;
extern	char	*sys_errlist[];


static	FILE	*logfil = (FILE *)0;


logf_open(f)
char	*f;
{
	if(logfil != (FILE *)0)
		(void)fclose(logfil);
	logfil = fopen(f,"a");
	if(logfil == (FILE *)0)
		return(1);
	return(0);
}




void
logf_close()
{
	if(logfil != (FILE *)0)
		(void)fclose(logfil);
	logfil = (FILE *)0;
}




/*
fatal error handler. puts strings to stderr as given. if a
given string is == -1, then put the system error message instead.
*/
/* VARARGS */
void
fatal(va_alist)
va_dcl
{
	char	*p;
	va_list	ap;

	if(logfil == (FILE *)0)
		exit(1);

	va_start(ap);
	while(1) {
		p = va_arg(ap,char *);
		if(p == (char *)0)
			break;

		if(p == (char *)-1)
			p = sys_errlist[errno];

		(void)fprintf(logfil,"%s",p);
		(void)fprintf(stderr,"%s",p);
	}
	va_end(ap);
	(void)fclose(logfil);
	exit(1);
}



extern char	*ctime();


/*
print a series of warnings - do not exit
*/
/* VARARGS */
void
logf(va_alist)
va_dcl
{
	char	*p;
	char	*ts;
	time_t	tm;
	va_list	ap;

	if(logfil == (FILE *)0)
		return;

	tm = time((time_t *) 0);
	ts = ctime(&tm);
	ts[24] = 0;
	(void) fprintf(logfil, "%s ", ts+4);
	
	va_start(ap);
	while(1) {
		p = va_arg(ap,char *);
		if(p == (char *)0)
			break;

		if(p == (char *)-1)
			p = sys_errlist[errno];

		(void)fprintf(logfil,"%s",p);
	}
	va_end(ap);
	(void)fflush(logfil);
}

/* print a series of warnings, with a printf() interface. */
/*VARARGS0*/
plogf(va_alist)
va_dcl
{
	va_list	args;
	char	*fmt;
	char	*ts;
#ifdef NO_VFPRINTF
	char	*a[4];
	int	argc = 0;
#endif
	time_t	t;
	
	if(logfil == (FILE *)0)
		return;

	t = time((time_t *) 0);
	ts = ctime(&t);
	ts[24] = 0;
	(void) fprintf(logfil, "%s ", ts+4);
	
	va_start(args);
	fmt = va_arg(args, char *);
#ifdef NO_VFPRINTF
	while((a[argc++] = va_arg(args, char *)) != NULL)
		if(argc >= 4)
			break;
	switch(argc) {
	case	1:
		(void) fprintf(logfil, fmt, a[0]);
		break;
	case	2:
		(void) fprintf(logfil, fmt, a[0], a[1]);
		break;
	case	3:
		(void) fprintf(logfil, fmt, a[0], a[1], a[2]);
		break;
	default:
		(void) fprintf(logfil, fmt, a[0], a[1], a[2], a[3]);
		break;
	}
#else	
	(void)vfprintf(logfil, fmt, args);
#endif	
	va_end(args);
	fflush(logfil);
}




/*
WARNING  - overflows ignored. no big deal
*/
unsigned	int
objid_hash(oid,hw)
register char	*oid;
int		hw;
{
	register unsigned int n = 0;
 
	while(*oid != '\0' && isdigit(*oid))
		n = *oid++ + 65599 * n;
	return(n % hw);
}




/* WARNING - may need to do different things to set up random #s */
int
get_random(num)
int	num;
{
	static int	initt = 0;
	extern long	random();

	if(!initt) {
		srandom(time((time_t *)0));
		initt++;
	}
	return((int)random() % num);
}



/* from K&R, mostly */
char	*
itoa(num,rbuf)
int	num;
char	*rbuf;
{
	int	sign;
	int	i = 0;

	if((sign = num) < 0)
		num = -num;

	do {
		rbuf[i++] = num % 10 + '0';
	} while((num /= 10) > 0);

	if(sign < 0)
		rbuf[i++] = '-';

	rbuf[i--] = '\0';

	for(sign = 0; sign < i; sign++, i--) { 
		num = rbuf[sign];
		rbuf[sign] = rbuf[i];
		rbuf[i] = num;
	}
	return(rbuf);
}