/
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/sym.c,v 1.1 91/07/04 17:32:31 mjr Rel $";
#endif

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


#include	"mud.h"


#define	SYSSYMWIDTH	31

typedef	struct	syssym {
	char	*nam;
	char	*def;
	struct	syssym	*next;
} SysSym;


static	SysSym	*systable[SYSSYMWIDTH];
static	int	sym_initted = 0;


void
syminit()
{
	int	x;

	if(sym_initted)
		return;

	for(x = 0; x < SYSSYMWIDTH; x++)
		systable[x] = (SysSym *)0;
	sym_initted = 1;
}




static	unsigned
symhash(nam,hw)
register char	*nam;
int		hw;
{
	register unsigned int	n = 0;
 
	while(*nam != '\0')
		n = *nam++ + 65599 * n;
	return(n % hw);
}




char	*
symlook(nam)
char	*nam;
{
	SysSym	*sp;

	if(!sym_initted)
		return((char *)0);
	sp = systable[symhash(nam,SYSSYMWIDTH)];
	while(sp != (SysSym *)0) {
		if(sp->nam != (char *)0 && !strcmp(nam,sp->nam))
			return(sp->def);
		sp = sp->next;
	}
	return((char *)0);
}





symdef(nam,def)
char	*nam;
char	*def;
{
	SysSym	*sp;
	int	hval;

	if(!sym_initted)
		return(1);

	hval = symhash(nam,SYSSYMWIDTH);
	sp = systable[hval];
	while(sp != (SysSym *)0) {
		if(sp->nam != (char *)0 && !strcmp(nam,sp->nam))
			break;
		sp = sp->next;
	}

	if(sp != (SysSym *)0) {
		char	*op;

		op = (char *)malloc((unsigned)strlen(def) + 1);
		if(op == (char *)0)
			return(1);
		(void)free((mall_t)sp->def);
		sp->def = op;
		(void)strcpy(op,def);
		return(0);
	}

	if((sp = (SysSym *)malloc(sizeof(SysSym))) == (SysSym *)0)
		return(1);
	sp->nam = (char *)malloc((unsigned)strlen(nam) + 1);
	if(sp->nam == (char *)0)
		return(1);
	sp->def = (char *)malloc((unsigned)strlen(def) + 1);
	if(sp->def == (char *)0)
		return(1);
	(void)strcpy(sp->nam,nam);
	(void)strcpy(sp->def,def);

	/* link in */
	sp->next = systable[hval];
	systable[hval] = sp;
	return(0);
}



symundef(nam)
char	*nam;
{
	SysSym	*sp;
	SysSym	*psp;
	int	hval;

	if(!sym_initted)
		return(1);

	psp = sp = systable[(hval = symhash(nam,SYSSYMWIDTH))];
	while(sp != (SysSym *)0) {
		if(sp->nam != (char *)0 && !strcmp(nam,sp->nam)) {
			if(sp == systable[hval])
				systable[hval] = sp->next;
			else
				psp->next = sp->next;
			break;
		}
		psp = sp;
		sp = sp->next;
	}

	if(sp != (SysSym *)0) {
		free((mall_t)sp->nam);
		free((mall_t)sp->def);
		free((mall_t)sp);
		return(0);
	}
	return(1);
}