tinymush-3.1p2/game/backups/
tinymush-3.1p2/game/bin/
tinymush-3.1p2/game/data/
tinymush-3.1p2/game/modules/
tinymush-3.1p2/game/modules/old/
tinymush-3.1p2/src/modules/comsys/
tinymush-3.1p2/src/modules/hello/
tinymush-3.1p2/src/modules/mail/
tinymush-3.1p2/src/tools/
/* api.c - functions called only by modules */
/* $Id: api.c,v 1.14 2002/05/11 16:34:39 rmg Exp $ */

#include "copyright.h"
#include "autoconf.h"
#include "config.h"

#include "alloc.h"	/* required by mudconf */
#include "flags.h"	/* required by mudconf */
#include "htab.h"	/* required by mudconf */
#include "mudconf.h"	/* required by code */

#include "db.h"		/* required by externs */
#include "externs.h"	/* required by interface */
#include "interface.h"	/* required by code */

#include "command.h"	/* required by code */
#include "match.h"	/* required by code */
#include "attrs.h"	/* required by code */
#include "powers.h"	/* required by code */
#include "functions.h"	/* required by code */
#include "udb_defs.h"	/* required by code */
#include "udb.h"	/* required by code */

extern CMDENT *prefix_cmds[256];

/* ---------------------------------------------------------------------------
 * Exporting a module's own API.
 */

void register_api(module_name, api_name, ftable)
    char *module_name, *api_name;
    API_FUNCTION *ftable;
{
    MODULE *mp;
    API_FUNCTION *afp;
    void (*fn_ptr)(void *, void *);
    int succ = 0;

    WALK_ALL_MODULES(mp) {
	if (!strcmp(module_name, mp->modname)) {
	    succ = 1;
	    break;
	}
    }
    if (!succ)		/* no such module */
	return;

    for (afp = ftable; afp->name; afp++) { 
	fn_ptr = DLSYM(mp->handle, module_name, afp->name, (void *, void *));
	if (fn_ptr != NULL) {
	    afp->handler = fn_ptr;
	    hashadd(tprintf("%s_%s", api_name, afp->name),
		    (int *) afp, &mudstate.api_func_htab, 0);
	}
    }
}

void *request_api_function(api_name, fn_name)
    char *api_name, *fn_name;
{
    API_FUNCTION *afp;

    afp = (API_FUNCTION *) hashfind(tprintf("%s_%s", api_name, fn_name),
				    &mudstate.api_func_htab);
    if (!afp)
	return NULL;
    return afp->handler;
}

/* ---------------------------------------------------------------------------
 * Handle tables.
 */

void register_commands(cmdtab)
	CMDENT *cmdtab;
{
	CMDENT *cp;

	if (cmdtab) {
		for (cp = cmdtab; cp->cmdname; cp++) {
			hashadd(cp->cmdname, (int *) cp, &mudstate.command_htab, 0);
			hashadd(tprintf("__%s", cp->cmdname), (int *) cp, &mudstate.command_htab, HASH_ALIAS);
		}
	}
}

void register_prefix_cmds(cmdchars)
	const char *cmdchars;
{
	const char *cp;
	char cn[2] = "x";

	if (cmdchars) {
		for (cp = cmdchars; *cp; cp++) {
			cn[0] = *cp;
			prefix_cmds[(unsigned char)*cp] = (CMDENT *) hashfind(cn, &mudstate.command_htab);
		}
	}
}

void register_functions(functab)
	FUN *functab;
{
	FUN *fp;

	if (functab) {
		for (fp = functab; fp->name; fp++) {
			hashadd((char *)fp->name, (int *) fp, &mudstate.func_htab, 0);
		}
	}
}

void register_hashtables(htab, ntab)
    MODHASHES *htab;
    MODNHASHES *ntab;
{
    MODHASHES *hp;
    MODNHASHES *np;

    if (htab) {
	for (hp = htab; hp->tabname != NULL; hp++) {
	    hashinit(hp->htab, hp->size_factor * HASH_FACTOR, HT_STR);
	}
    }

    if (ntab) {
	for (np = ntab; np->tabname != NULL; np++) {
	    nhashinit(np->htab, np->size_factor * HASH_FACTOR);
	}
    }
}

/* ---------------------------------------------------------------------------
 * Deal with additional database info.
 */

unsigned int register_dbtype(modname)
char *modname;
{
	unsigned int type;
	DBData key, data;
	
	/* Find out if the module already has a registered DB type */
	
	key.dptr = modname;
	key.dsize = strlen(modname) + 1;
	data = db_get(key, DBTYPE_MODULETYPE);

	if (data.dptr) {
		memcpy((void *)&type, (void *)data.dptr, sizeof(unsigned int));
		XFREE(data.dptr, "register_dbtype");
		return type;
	}
	
	/* If the type is in range, return it, else return zero as 
	 * an error code */
	 
	if ((mudstate.moduletype_top >= DBTYPE_RESERVED) &&
	    (mudstate.moduletype_top < DBTYPE_END)) {
		/* Write the entry to GDBM */
		
		data.dptr = &mudstate.moduletype_top;
		data.dsize = sizeof(unsigned int);
		db_put(key, data, DBTYPE_MODULETYPE);
		type = mudstate.moduletype_top;
		mudstate.moduletype_top++;
		return type;
	} else {
		return 0;
	}
}