⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 func.c

📁 使用BorlandC++4.5编译的一个MUD客户端程序
💻 C
字号:
head	2.1;access;symbols;locks; strict;comment	@ * @;2.1date	95.10.24.15.46.14;	author tsurace;	state Release;branches;next	1.1;1.1date	95.10.12.19.17.55;	author tsurace;	state Beta;branches;next	;desc@Function table.@2.1log@Roll.@text@/* func.c: Maintains the function table */
/* $Id: func.c 1.1 1995/10/12 19:17:55 tsurace Beta tsurace $ */

#include "vt.h"

#ifdef PROTOTYPES
static char *find_prog(Func *, Prog *);
#else
static char *find_prog();
#endif

#define FTSIZE 203

/* Functions are hashed to unordered chains */

static Func *ftab[FTSIZE];
extern int iwidth[];

Func *find_func(name)
	char *name;
{
	Func *fp;
	int val;

	fp = ftab[hash(name, FTSIZE)];
	while (fp) {
		val = strcmp(name, fp->name);
		if (!val)
			return fp;
		fp = val < 0 ? fp->left : fp->right;
	}
	return NULL;
}

Func *add_func(name, cmd)
	char *name;
	Prog *cmd;
{
	Func *new, **fp;

	if (cmd)
		cmd->refs++;
	new = find_func(name);
	if (new) {
		if (new->cmd)
			dec_ref_prog(new->cmd);
		new->cmd = cmd;
		return new;
	}
	new = New(Func);
	new->name = vtstrdup(name);
	new->cmd = cmd;
	new->left = new->right = NULL;
	fp = &ftab[hash(name, FTSIZE)];
	while (*fp)
		fp = strcmp(name, (*fp)->name) < 0
		     ? &(*fp)->left : &(*fp)->right;
	*fp = new;
	return new;
}

void dec_ref_prog(prog)
	Prog *prog;
{
	if (!--prog->refs)
		del_prog(prog);
}

void del_prog(prog)
	Prog *prog;
{
	Instr *ip;

	for (ip = prog->code; ip->type != I_STOP; ip += iwidth[ip->type]) {
		if (ip->type == I_SCONST)
			del_sconst(ip[1].sconst);
	}
	Discardarray(prog->code, Instr, ip - prog->code + 1);
	Discard(prog, Prog);
}

/* Look up a program name.  Slow. */
char *lookup_prog(prog)
	Prog *prog;
{
	int i;
	char *name = NULL;

	for (i = 0; !name && i < FTSIZE; i++)
		name = find_prog(ftab[i], prog);
	return name;
}

static char *find_prog(tree, prog)
	Func *tree;
	Prog *prog;
{
	char *name;

	if (!tree)
		return NULL;
	if (tree->cmd == prog)
		return tree->name;
	name = find_prog(tree->left, prog);
	if (name)
		return name;
	return find_prog(tree->right, prog);
}

@1.1log@Initial revision@text@d2 1a2 1/* $Id$ */@

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -