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

📄 key.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.24.10;	author tsurace;	state Beta;branches;next	;desc@Key ring lookup table.@2.1log@Roll.@text@/* key.c: Maintains the key ring and lookup table */
/* $Id: key.c 1.1 1995/10/12 19:24:10 tsurace Beta tsurace $ */

#include "vt.h"

#ifdef PROTOTYPES
static Unode *gen_add_key(char *);
#else
static Unode *gen_add_key();
#endif

Unode key_ring;				/* Dummy entry in keys ring	*/
Unode *klookup[128];			/* Lookup table for first chars */

/* Invariants:
** 1. All keys with the same first character are adjacent.
** 2. klookup[c] points to the first key starting with c, or NULL. */

void init_key()
{
	int i;

	for (i = 0; i < 128; i++)
		klookup[i] = NULL;
	key_ring.next = key_ring.prev = &key_ring;
	key_ring.dummy = 1;
	key_ring.Kseq = "";
}

static Unode *gen_add_key(seq)
	char *seq;
{
	Unode *kp, *new;

	kp = find_key(seq);
	if (kp)
		return kp;
	new = unalloc();
	kp = klookup[lcase(*seq)];
	if (kp) {
		while (lcase(*kp->Kseq) == lcase(*seq))
			kp = kp->next;
		new->prev = kp->prev;
		new->next = kp;
		kp->prev = kp->prev->next = new;
	} else {
		new->prev = key_ring.prev;
		new->next = &key_ring;
		key_ring.prev = key_ring.prev->next = new;
		klookup[lcase(*seq)] = new;
	}
	new->Kseq = vtstrdup(seq);
	return new;
}

Unode *add_key_cmd(seq, cmd)
	char *seq;
	Func *cmd;
{
	Unode *new;

	new = gen_add_key(seq);
	new->Ktype = K_CMD;
	new->Kcmd = cmd;
	return new;
}

Unode *add_key_efunc(seq, efunc)
	char *seq;
	int efunc;
{
	Unode *new;

	new = gen_add_key(seq);
	new->Ktype = K_EFUNC;
	new->Kefunc = efunc;
	return new;
}

void del_key(key)
	Unode *key;
{
	char c = *key->Kseq;

	if (klookup[lcase(c)] == key) 
		klookup[lcase(c)] = (lcase(*key->next->Kseq) == lcase(c))
				    ? key->next : NULL;
	Discardstring(key->Kseq);
	key->prev->next = key->next;
	key->next->prev = key->prev;
	destroy_pointers(key->frefs);
	discard_unode(key);
}

Unode *find_key(seq)
	char *seq;
{
	Unode *kp;

	kp = klookup[lcase(*seq)];
	if (kp) {
		for (; lcase(*kp->Kseq) == lcase(*seq); kp = kp->next) {
			if (!strcasecmp(kp->Kseq + 1, seq + 1))
				return kp;
		}
	}
	return NULL;
}


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

⌨️ 快捷键说明

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