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

📄 ieee_handler.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic	char sccsid[] = "@(#)ieee_handler.c 1.1 92/07/30 SMI";#endif/* * Copyright (c) 1987 by Sun Microsystems, Inc. */#include <floatingpoint.h>#include "libm.h"#define divbyz (1<<(int)fp_division)#define unflow (1<<(int)fp_underflow)#define ovflow (1<<(int)fp_overflow)#define iexact (1<<(int)fp_inexact)#define ivalid (1<<(int)fp_invalid)#define allexc (divbyz|unflow|ovflow|iexact|ivalid)#define comexc (divbyz|ovflow|ivalid)extern _swapTE();	/* _swapTE(ex) exchanges ex with the current 			 * exception trap enable bits. Here ex is an integer			 * where each bit corresponds to an 			 * exception trap enable status flag (0 off,1 on).			 * (cf. enum fp_exception_type in <sys/ieeefp.h>) 			 */int ieee_handler(action,exception,hdl)char *action, *exception;sigfpe_handler_type hdl;{	char a,e;	int ex;	int default_or_ignore;	a = action[0];	e = exception[0];	switch(a) {	    case 'g':		switch(e) {		    case 'd': ex  = (int) fp_division;  break;		    case 'u': ex  = (int) fp_underflow; break;		    case 'o': ex  = (int) fp_overflow;  break;		    case 'i': e = exception[2];			if(e=='v') ex  = (int)fp_invalid; else			if(e=='e') ex  = (int)fp_inexact;			else {return (int) SIGFPE_DEFAULT;}			break;		    default:			return (int) SIGFPE_DEFAULT;		}		return (int) ieee_handlers[ex ];	    case 's':		default_or_ignore = (hdl == SIGFPE_DEFAULT) | 				    (hdl == SIGFPE_IGNORE) ;		if (!default_or_ignore) _test_sigfpe_master();					/* Make sure master SIGFPE handler					   is enabled. */		ex = _swapTE(0);		if (ex < 0) return 1;	/* action not available */		switch(e) {		    case 'd':			if(default_or_ignore) ex &= (~ divbyz); 			else ex |= divbyz;			ieee_handlers[(int)fp_division] = hdl; break;		    case 'u':			if(default_or_ignore) ex &= (~ unflow); 			else ex |= unflow;			ieee_handlers[(int)fp_underflow] = hdl; break;		    case 'o':			if(default_or_ignore) ex &= (~ ovflow); 			else ex |= ovflow;			ieee_handlers[(int)fp_overflow] = hdl; break;		    case 'a':			if(default_or_ignore) ex &= (~ allexc); 			else ex |= allexc;			ieee_handlers[(int)fp_inexact] = hdl; 			ieee_handlers[(int)fp_underflow] = hdl; 			ieee_handlers[(int)fp_invalid] = hdl; 			ieee_handlers[(int)fp_division] = hdl; 			ieee_handlers[(int)fp_overflow] = hdl; break;		    case 'c':			if(default_or_ignore) ex &= (~ comexc); 			else ex |= comexc;			ieee_handlers[(int)fp_invalid] = hdl; 			ieee_handlers[(int)fp_division] = hdl; 			ieee_handlers[(int)fp_overflow] = hdl; break;		    case 'i':			e = exception[2];			if(e=='v') {			    if(default_or_ignore) ex &= (~ ivalid); 			    else ex |= ivalid;			    ieee_handlers[(int)fp_invalid] = hdl; break;			} else if(e=='e') {			    if(default_or_ignore) ex &= (~ iexact); 			    else ex |= iexact;			    ieee_handlers[(int)fp_inexact] = hdl; break;			}		    default:			return 1;	/* action not available */		}		if(ex!=0) _swapTE(ex);		return 0;	    case 'c':		ex = _swapTE(0);		if (ex < 0) return 0;	/* action not available */		switch(e) {		    case 'a': ex &= (~ allexc); return 0;		    case 'd': ex &= (~ divbyz); break;		    case 'u': ex &= (~ unflow); break;		    case 'o': ex &= (~ ovflow); break;		    case 'c': ex &= (~ comexc); break;		    case 'i': e=exception[2];			if(e=='v') ex &= (~ ivalid); else			if(e=='e') ex &= (~ iexact);			break;		}		if(ex!=0) _swapTE(ex);		return 0;	    default:		return 1;		/* action not available */	}}

⌨️ 快捷键说明

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