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

📄 eeerr.c

📁 操作系统源代码
💻 C
字号:
/* ELLE - Copyright 1982, 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. *//*	EEERR - Error handling & testing routines */#include "elle.h"#if V6#include "eesigs.h"#else#include <signal.h>#endif/* EFUN: "Hit Breakpoint" */f_bkpt(){	clean_exit();	bpt();        set_tty();}bpt() {}		/* Put a DDT/ADB breakpoint here */#if !(STRERROR)		/* If strerror() not supported, we provide it. */extern int sys_nerr;		/* Max index into sys_errlist */extern char *sys_errlist[];char *strerror(num)int num;{	static char badbuf[30];	if (num > 0 && num <= sys_nerr)		return (sys_errlist[num]);	sprintf(badbuf, "unknown error %d", num);	return badbuf;}#endif /* -STRERROR */errsbm(type,adr,str,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)register int type;	/* Type, flags */int (*adr)();		/* Addr called from */char *str;		/* Printf string */{	register struct buffer *b;	int oldttystate;	oldttystate = clean_exit();	/* Ensure not in editing mode */	if(type == SBFERR)	/* File overwrite error?  A0 is FD */	  {	printf("WARNING - FILE CORRUPTED!\nBuffers affected:\n");		for(b = buf_head; b; b = b->b_next)		  {	if(sb_fdinp((SBBUF *)b, a0))				printf((b->b_fn ? "  %s: %s\n" : "  %s\n"),					b->b_name, b->b_fn);		  }		if (oldttystate > 0) set_tty();		return(1);	/* Try to continue normally */	  }	printf("%sERR: %o ", (type ? "SBX" : "SBM"), adr);	printf(str,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);	askerr();}/* *  Bite_bag -- Try to save our rear ends after a catastrophe. *	This routine is mainly called from "interrupt" *	level when a memory fault or bus error occurs. *	We try to save the buffer to the file "ELLE.crash" *	in the current working directory.  If it loses, well *	then you have really lost.  Note: this routine does *	not reset the appropriate signal handler, so it is *	never re-entered.  If a fault repeats once in this *	code, then the world dies. */bite_bag(fault)				/* We come here on any memory error */int fault;{	int ostate;	/* Some systems, such as BSD4.x and SUN, do not reset caught signals	 * to SIG_DFL.	 * This is a win, but isn't what vanilla UNIX code expects.	 * Since it doesn't hurt to do it explicitly, we always turn it off	 * explicitly...	 */	signal(fault, SIG_DFL);		/* Reinstate default handling */	ostate = clean_exit();		/* Fix up the terminal modes first! */	printf("ELLE stopped by fatal interrupt (%d)!\n\Type S or W to try saving your work.\n",fault);	askerr();	if(ostate > 0) set_tty();	signal(fault, bite_bag);	/* If continued, re-enable signal */}/* HUP_EXIT - Called by a SIGHUP hangup signal. *	Tries to save all modified buffers before exiting. *	Note that the TTY is not touched at all, although the terminal mode *	flag is set just in case further error handling routines are invoked. */hup_exit(){	extern int trm_mode;		/* See e_disp.c */	trm_mode = -1;			/* Say TTY is now detached */	saveworld((struct buffer *)0, 0);	/* Save world, w/o feedback */	exit(1);}errint()		/* Routine provided for ADB jumps */{	askerr();}char askh1[] = "\A - Abort process\n\B - Breakpoint (must have \"bpt:b\" set in ADB)\n\C - Continue\n\D - Diagnostic command mode\n";char askh2[] = "\S - Try to save current buffer\n\W - Try to save world (all modified buffers)\n";int bsaving = 0;	/* Set while in middle of saving buffer(s) */askerr(){	register struct buffer *b;	char linbuf[100];	char *asklin();	extern int (*funtab[])();	/* In E_CMDS.C */	int ostate;	ostate = clean_exit();		/* Clean up TTY if not already done */reask:	printf("(A,B,C,D,S,W,?)");	switch(upcase(*asklin(linbuf)))	  {		case '?':			writez(1,askh1);	/* Too long for &$@! printf */			writez(1,askh2);	/* Too long for &$@! V6 C */			break;			/*    optimizer (/lib/c2) */		case 'A':			abort();			break;		case 'B':			bpt();			break;		case 'Q':		case 'C':			goto done;		case 'D':			if(funtab[FN_DEBUG])				(*funtab[FN_DEBUG])(-1);			else printf("Sorry, no diagnostics\n");			break;		case 'S':	/* Try to save current buffer only */			b = cur_buf;			goto savb;		case 'W':	/* Try to save all modified buffers */			b = 0;		savb:	if(bsaving++)			  {	printf("Already saving -- continued");				goto done;			  }			saveworld(b, 1);	/* Save, with feedback */			bsaving = 0;			break;	  }	goto reask;done:	if(ostate > 0)		set_tty();}char *asklin(acp)char *acp;{	register char *cp;	register int c;	cp = acp;	while((c = tgetc()) != LF)		*cp++ = c;	*cp++ = 0;	return(acp);}

⌨️ 快捷键说明

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