📄 key.c
字号:
/* key.c: Maintains the key ring and lookup table */
/* $Id: key.c 2.1 1995/10/24 15:46:14 tsurace Release $ */
#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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -