📄 key.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 + -