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

📄 eecmds.c

📁 操作系统源代码
💻 C
字号:
/* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International *	This software is quasi-public; it may be used freely with *	like software, but may NOT be sold or made part of licensed *	products without permission of the author. *//* EECMDS	Command table lookup and profile code */#include "elle.h"/* Function table, see the included file for explanation. */	/* First must pre-declare function addrs */#define EFUN(rtn,rtnstr,name) int rtn();#define EFUNHOLE#include "eefdef.h"	/* Now re-insert to define function table */int (*funtab[])() ={#undef EFUN		/* Avoid redefinition error message */#undef EFUNHOLE#define EFUN(rtn,rtnstr,name) rtn,#define EFUNHOLE 0,#include "eefdef.h"};int funmax = sizeof(funtab)/sizeof(funtab[0]);	/* 1st illegal function # *//* Insert default command char map tables and profile structure */#include "defprf.c"/* EFUN: "Prefix Meta" *//*	Meta-prefix command. *	For now, very simple.  Perhaps later try to hair up with *	time-out "M-" prompt? */f_pfxmeta(){	return(cmd_xct(cmd_read()|CB_META));}/* EFUN: "Prefix Extend" *//*	Extended-prefix command. *	Likewise trivial; perhaps later hair up with timeout "^X-" prompt? */f_pfxext(){	return(cmd_xct(cmd_read()|CB_EXT));}/* EFUN: "Universal Arg" *//*	This routine is also called by "Argument Digit" with a special arg * of -1 in order to share code.  Since that invocation always sets unrchf, * it should always complete at least one digit read loop. * Note that exp and exp_p are set to 1 and 0 at the top-level command * loop. */f_uarg(ch)int ch;{	register int c, oc, i;	/* Set distinguishing exp_p value depending on whether invoked	 * by CTRL-U or another function (Argument Digit, Negative Argument)	 */	exp_p = (ch < 0) ? 1 : 4;	i = 0;			/* Read numerical arg if any follows */	for(;;)	  {	oc = cmd_read();	/* Get next input char */		c = oc & 0177;		if(c == '-' && !i)		  {	exp_p = -1;			exp = 1;	/* Set in case no digits follow */		  }		else if('0' <= c && c <= '9')	/* If it's a digit too, */		  {	i = (i * 10) + c - '0';	/* add digit in. */			if(exp_p >= 0) exp_p = 1;			exp = i;		  }		else break;	  }	exp *= exp_p;		/* Multiply arg appropriately */	unrchf = oc;		/* Not a digit, re-read it next. */	this_cmd = ARGCMD;}/* EFUN: "Negative Argument" */f_negarg(ch)int ch;{	f_uarg(-1);		/* Invoke code from Universal Arg */	exp = -exp;}/* EFUN: "Argument Digit" */f_argdig(ch)int ch;{	unrchf = ch;		/* Re-read the digit */	f_uarg(-1);		/* Invoke code from Universal Arg */}/* EFUN: "Set Profile" *//*	Asks for a profile file and sets profile from it. */f_setprof(){	int set_profile();	hack_file("Set Profile: ", set_profile);}#if FX_VTBUTTONS/* EFUN: "VT100 Button Hack" *//*	This must be bound to Meta-O if anything, because the VT100 sends *	an ESC O prefix when the function buttons are used. */f_vtbuttons ()			/* vt100 function buttons */{	switch(cmd_read())	  {	case ('A'): 			return (f_uprline ());		case ('B'): 			return (f_dnrline ());		case ('C'): 			return (f_fword ());		case ('D'): 			return (f_bword ());		case ('Q'): 		/* PF1 */			return (f_kregion());		default: 			ring_bell ();		break;	  }}#endif /*FX_VTBUTTONS*//* CMD_WAIT() - Return TRUE if any command input waiting.*/cmd_wait(){	return(unrchf >= 0#if FX_SKMAC		|| km_inwait()		/* Check for kbdmac input waiting */#endif /*FX_SKMAC*/		|| tinwait());}/* CMD_READ() - Read a command (single char) from user, and return it.*/cmd_read(){	register int c;	if((c = unrchf) >= 0)	/* Re-reading last char? */	  {	unrchf = -1;		return(c);	  }#if FX_SKMAC			/* Hacking keyboard macros? */	return(km_getc());	/* Yes.  This calls tgetc if no kbd macro */#else	return(tgetc());#endif /*-FX_SKMAC*/}/* CMD_XCT(ch) - Command Execution dispatch routine.**	Takes char and executes the function (efun) bound to that command key.*/cmd_xct(ch)int ch;{	register int (*funct) ();	register int c;	int (*(cmd_fun())) ();	if(funct = cmd_fun(c = ch))		/* Get function to run */		return((*funct) (c&0177));	/* Invoke with char arg */	ring_bell();		/* Undefined command char, error. */}/* CMD_FUN(ch) - Return function for char, 0 if none*/int (*cmd_fun(c))()int c;{	return(funtab[cmd_idx(c)]);}/* CMD_IDX(ch) - Given command char, return function index for it*/cmd_idx(c)register int c;{	register char *cp;	register int i;	if(c&CB_EXT)	  {	cp = def_prof.extvec;		i = def_prof.extvcnt;		goto inlup;	  }	if(c&CB_META)	  {	cp = def_prof.metavec;		i = def_prof.metavcnt;	inlup:	c = upcase(c);		do {	if(*cp++ != c) cp++;			else			  {	i = *cp&0377;				break;			  }		  } while(--i);		/* If counts out, will return 0! */	  }	else i = def_prof.chrvec[c&0177]&0377;	if(i >= funmax)		return(0);	return(i);}/* Profile hacking */#if TOPS20#include <sys/file.h>		/* for O_BINARY */#endifset_profile(filename)char *filename;{	char pfile[200];	char psfile[200];	register int pfd, len;	chroff sbx_fdlen();	register char *profptr;	struct stored_profile st_prof;	if(filename) strcpy(pfile,filename);	else		/* Check for user's profile */	  {		strcat(strcat(strcpy(pfile,homedir),"/"),ev_profile);	  }	if((pfd = open(pfile,#if TOPS20				O_BINARY#else				0#endif					)) < 0)	  {	if(filename)		  {	ding("Cannot open file");		  }		return;	  }	if((len = (int)sbx_fdlen(pfd)) < sizeof(struct stored_profile))		goto badfil;	profptr = memalloc((SBMO)len);	if(read(pfd,profptr,len) != len)		goto badfmt;	/* Have read profile into memory, now set up ptrs etc */	bcopy((SBMA)profptr,(SBMA)&st_prof,sizeof(struct stored_profile));	def_prof.version = prof_upack(st_prof.version);	if(def_prof.version != 1)		goto badfmt;	def_prof.chrvcnt = prof_upack(st_prof.chrvcnt);	def_prof.chrvec  = profptr + prof_upack(st_prof.chrvec);	def_prof.metavcnt = prof_upack(st_prof.metavcnt);	def_prof.metavec = profptr + prof_upack(st_prof.metavec);	def_prof.extvcnt = prof_upack(st_prof.extvcnt);	def_prof.extvec  = profptr + prof_upack(st_prof.extvec);#if SUN	def_prof.menuvcnt = prof_upack(st_prof.menuvcnt);	def_prof.menuvec = profptr + prof_upack(st_prof.menuvec);#endif /*SUN*/	goto done;badfmt:	chkfree(profptr);badfil:	ding("Bad profile format");done:	close(pfd);}#if SUN/* SUN Menu profile hacking. *	This is here, instead of e_sun.c, because * the profile format is still evolving and for the time being I want to * keep all profile-hacking code in one place. --KLH */#include "suntool/tool_hs.h"#include "suntool/menu.h"#define MENUMAX	16/* Defined in eesun.c */extern struct menu *menuptr;extern struct menu menu;char *funamtab[] = {#undef EFUN#undef EFUNHOLE#define EFUN(rtn,rtnstr,name) name,#define EFUNHOLE 0,#include "eefdef.h"};init_menu() /* initialize the menu for elle from user profile */{	register struct menuitem *mi;	register int n, i, fni;	if((n = def_prof.menuvcnt) <= 0)		return;	if(n > MENUMAX) n = MENUMAX;	mi = menu.m_items = (struct menuitem *) calloc(n, sizeof *mi);	menu.m_itemcount = 0;	for(i = 0; i < n; i++)	  {	fni = def_prof.menuvec[i]&0377;		if(fni >= funmax) continue;		if(funtab[fni] && funamtab[fni])		  {	mi->mi_data = (caddr_t) funtab[fni];			mi->mi_imagedata = (caddr_t) strdup(funamtab[fni]);			mi->mi_imagetype = MENU_IMAGESTRING;			mi++;			menu.m_itemcount++;		  }	  }	if(menu.m_itemcount)		menuptr = &menu;}#endif /*SUN*/

⌨️ 快捷键说明

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