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

📄 keys.c

📁 操作系统源代码
💻 C
字号:
/* Copyright (c) 1985 Ceriel J.H. Jacobs */# ifndef lintstatic char rcsid[] = "$Header: keys.c,v 7.2 89/12/07 16:47:50 ceriel Exp $";# endif# define _KEYS_# include <ctype.h># include "in_all.h"# include "machine.h"# include "keys.h"# include "commands.h"# include "prompt.h"# include "assert.h"char defaultmap[] = "\bf=P:bl=k:bl=^K:bl=^[[A:bot=l:bot=$:bp=-:bs=^B:bse=?:bsl=S:bsp=F:chm=X:exg=x:\ff=N:fl=^J:fl=^M:fl=j:fl=^[[B:fp= :fs=^D:fse=/:fsl=s:fsp=f:hlp=h:nse=n:nsr=r:\red=^L:rep=.:bps=Z:bss=b:fps=z:fss=d:shl=!:tom=':top=\\^:vis=e:\wrf=w:qui=q:qui=Q:mar=m:pip=|";char *strcpy();char *strcat();char *getenv();/* * Construct an error message and return it */STATIC char *kerror(key, emess) char *key, *emess; {	static char ebuf[80];	/* Room for the error message */	(VOID) strcpy(ebuf, key);	(VOID) strcat(ebuf, emess);	return ebuf;}/* * Compile a keymap into commtable. Returns an error message if there * is one */STATIC char *compile(map, commtable)  register char *map; register struct keymap *commtable; {	register char *mark;	/* Indicates start of mnemonic */	register char *c;	/* Runs through buf */	register int temp;	char *escapes = commtable->k_esc;	char buf[10];		/* Will hold key sequence */	(VOID) strcpy(commtable->k_help,"Illegal command");	while (*map) {		c = buf;		mark = map;	/* Start of mnemonic */		while (*map && *map != '=') {			map++;		}		if (!*map) {			/*			 * Mnemonic should end with '='			 */			return kerror(mark, ": Syntax error");		}		*map++ = 0;		while (*map) {			/*			 * Get key sequence			 */			if (*map == ':') {				/*				 * end of key sequence				 */				map++;				break;			}			*c = *map++ & 0177;			if (*c == '^' || *c == '\\') {				if (!(temp = *map++)) {					/*					 * Escape not followed by a character					 */					return kerror(mark, ": Syntax error");				}				if (*c == '^') {					if (temp == '?') *c = 0177;					else *c = temp & 037;				}				else *c = temp & 0177;			}			setused(*c);			c++;			if (c >= &buf[9]) {				return kerror(mark,": Key sequence too long");			}		}		*c = 0;		if (!(temp = lookup(mark))) {			return kerror(mark,": Nonexistent function");		}		if (c == &buf[1] && (commands[temp].c_flags & ESC) &&		    escapes < &(commtable->k_esc[sizeof(commtable->k_esc)-1])) {			*escapes++ = buf[0] & 0177;		}		temp = addstring(buf, temp, &(commtable->k_mach));		if (temp == FSM_ISPREFIX) {			return kerror(mark,": Prefix of other key sequence");		}		if (temp == FSM_HASPREFIX) {			return kerror(mark,": Other key sequence is prefix");		}		assert(temp == FSM_OKE);		if (!strcmp(mark, "hlp")) {			/*			 * Create an error message to be given when the user			 * types an illegal command			 */			(VOID) strcpy(commtable->k_help, "Type ");			(VOID) strcat(commtable->k_help, buf);			(VOID) strcat(commtable->k_help, " for help");		}	}	*escapes = 0;	return (char *) 0;}/* * Initialize the keymaps */VOIDinitkeys() {	register char *p;	static struct keymap xx[2];	currmap = &xx[0];	othermap = &xx[1];	p = compile(defaultmap, currmap);	/* Compile default map */	assert(p == (char *) 0);	p = getenv("YAPKEYS");	if (p) {		if (!(p = compile(p, othermap))) {			/*			 * No errors in user defined keymap. So, use it			 */			do_chkm(0L);			return;		}		error(p);	}	othermap = 0;		       /* No other keymap */}intis_escape(c){	register char *p = currmap->k_esc;	while (*p) {		if (c == *p++) return 1;	}	return 0;}static char keyset[16];		/* bitset indicating which keys are				 * used				 *//* * Mark key "key" as used */VOIDsetused(key) int key; {	keyset[(key & 0177) >> 3] |= (1 << (key & 07));}/* * return non-zero if key "key" is used in a keymap */intisused(key) int key; {	return keyset[(key & 0177) >> 3] & (1 << (key & 07));}

⌨️ 快捷键说明

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