func.c

来自「Unix下的MUD客户端程序」· C语言 代码 · 共 109 行

C
109
字号
/* func.c: Maintains the function table */#include "vt.h"#ifdef PROTOTYPESstatic char *find_prog(Func *, Prog *);#elsestatic 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);}

⌨️ 快捷键说明

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