| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 | #include <stdio.h>#include <string.h>#include "arith.h"#define TYSHORT 2#define TYLONG 3#define TYREAL 4#define TYDREAL 5#define TYCOMPLEX 6#define TYDCOMPLEX 7#define TYINT1 11#define TYQUAD 14#ifndef Long#define Long long#endif#ifdef __mips#define RNAN	0xffc00000#define DNAN0	0xfff80000#define DNAN1	0#endif#ifdef _PA_RISC1_1#define RNAN	0xffc00000#define DNAN0	0xfff80000#define DNAN1	0#endif#ifndef RNAN#define RNAN	0xff800001#ifdef IEEE_MC68k#define DNAN0	0xfff00000#define DNAN1	1#else#define DNAN0	1#define DNAN1	0xfff00000#endif#endif /*RNAN*/#ifdef KR_headers#define Void /*void*/#define FA7UL (unsigned Long) 0xfa7a7a7aL#else#define Void void#define FA7UL 0xfa7a7a7aUL#endif#ifdef __cplusplusextern "C" {#endifstatic void ieee0(Void);static unsigned Long rnan = RNAN,	dnan0 = DNAN0,	dnan1 = DNAN1;double _0 = 0.; void#ifdef KR_headers_uninit_f2c(x, type, len) void *x; int type; long len;#else_uninit_f2c(void *x, int type, long len)#endif{	static int first = 1;	unsigned Long *lx, *lxe;	if (first) {		first = 0;		ieee0();		}	if (len == 1)	 switch(type) {	  case TYINT1:		*(char*)x = 'Z';		return;	  case TYSHORT:		*(short*)x = 0xfa7a;		break;	  case TYLONG:		*(unsigned Long*)x = FA7UL;		return;	  case TYQUAD:	  case TYCOMPLEX:	  case TYDCOMPLEX:		break;	  case TYREAL:		*(unsigned Long*)x = rnan;		return;	  case TYDREAL:		lx = (unsigned Long*)x;		lx[0] = dnan0;		lx[1] = dnan1;		return;	  default:		printf("Surprise type %d in _uninit_f2c\n", type);	  }	switch(type) {	  case TYINT1:		memset(x, 'Z', len);		break;	  case TYSHORT:		*(short*)x = 0xfa7a;		break;	  case TYQUAD:		len *= 2;		/* no break */	  case TYLONG:		lx = (unsigned Long*)x;		lxe = lx + len;		while(lx < lxe)			*lx++ = FA7UL;		break;	  case TYCOMPLEX:		len *= 2;		/* no break */	  case TYREAL:		lx = (unsigned Long*)x;		lxe = lx + len;		while(lx < lxe)			*lx++ = rnan;		break;	  case TYDCOMPLEX:		len *= 2;		/* no break */	  case TYDREAL:		lx = (unsigned Long*)x;		for(lxe = lx + 2*len; lx < lxe; lx += 2) {			lx[0] = dnan0;			lx[1] = dnan1;			}	  }	}#ifdef __cplusplus}#endif#ifndef MSpc#ifdef MSDOS#define MSpc#else#ifdef _WIN32#define MSpc#endif#endif#endif#ifdef MSpc#define IEEE0_done#include "float.h"#include "signal.h" static voidieee0(Void){#ifndef __alpha#ifndef EM_DENORMAL#define EM_DENORMAL _EM_DENORMAL#endif#ifndef EM_UNDERFLOW#define EM_UNDERFLOW _EM_UNDERFLOW#endif#ifndef EM_INEXACT#define EM_INEXACT _EM_INEXACT#endif#ifndef MCW_EM#define MCW_EM _MCW_EM#endif	_control87(EM_DENORMAL | EM_UNDERFLOW | EM_INEXACT, MCW_EM);#endif	/* With MS VC++, compiling and linking with -Zi will permit */	/* clicking to invoke the MS C++ debugger, which will show */	/* the point of error -- provided SIGFPE is SIG_DFL. */	signal(SIGFPE, SIG_DFL);	}#endif /* MSpc */#ifdef __mips	/* must link with -lfpe */#define IEEE0_done/* code from Eric Grosse */#include <stdlib.h>#include <stdio.h>#include "/usr/include/sigfpe.h"	/* full pathname for lcc -N */#include "/usr/include/sys/fpu.h" static void#ifdef KR_headersieeeuserhand(exception, val) unsigned exception[5]; int val[2];#elseieeeuserhand(unsigned exception[5], int val[2])#endif{	fflush(stdout);	fprintf(stderr,"ieee0() aborting because of ");	if(exception[0]==_OVERFL) fprintf(stderr,"overflow\n");	else if(exception[0]==_UNDERFL) fprintf(stderr,"underflow\n");	else if(exception[0]==_DIVZERO) fprintf(stderr,"divide by 0\n");	else if(exception[0]==_INVALID) fprintf(stderr,"invalid operation\n");	else fprintf(stderr,"\tunknown reason\n");	fflush(stderr);	abort();} static void#ifdef KR_headersieeeuserhand2(j) unsigned int **j;#elseieeeuserhand2(unsigned int **j)#endif{	fprintf(stderr,"ieee0() aborting because of confusion\n");	abort();} static voidieee0(Void){	int i;	for(i=1; i<=4; i++){		sigfpe_[i].count = 1000;		sigfpe_[i].trace = 1;		sigfpe_[i].repls = _USER_DETERMINED;		}	sigfpe_[1].repls = _ZERO;	/* underflow */	handle_sigfpes( _ON,		_EN_UNDERFL|_EN_OVERFL|_EN_DIVZERO|_EN_INVALID,		ieeeuserhand,_ABORT_ON_ERROR,ieeeuserhand2);	}#endif /* mips */#ifdef __linux__#define IEEE0_done#include "fpu_control.h"#ifdef __alpha__#ifndef USE_setfpucw#define __setfpucw(x) __fpu_control = (x)#endif#endif#ifndef _FPU_SETCW#undef  Can_use__setfpucw#define Can_use__setfpucw#endif static voidieee0(Void){#if (defined(__mc68000__) || defined(__mc68020__) || defined(mc68020) || defined (__mc68k__))/* Reported 20010705 by Alan Bain <alanb@chiark.greenend.org.uk> *//* Note that IEEE 754 IOP (illegal operation) *//* = Signaling NAN (SNAN) + operation error (OPERR). */#ifdef Can_use__setfpucw	__setfpucw(_FPU_IEEE + _FPU_DOUBLE + _FPU_MASK_OPERR + _FPU_MASK_DZ + _FPU_MASK_SNAN+_FPU_MASK_OVFL);#else	__fpu_control = _FPU_IEEE + _FPU_DOUBLE + _FPU_MASK_OPERR + _FPU_MASK_DZ + _FPU_MASK_SNAN+_FPU_MASK_OVFL;	_FPU_SETCW(__fpu_control);#endif#elif (defined(__powerpc__)||defined(_ARCH_PPC)||defined(_ARCH_PWR)) /* !__mc68k__ *//* Reported 20011109 by Alan Bain <alanb@chiark.greenend.org.uk> */#ifdef Can_use__setfpucw/* The following is NOT a mistake -- the author of the fpu_control.hfor the PPC has erroneously defined IEEE mode to turn on exceptionsother than Inexact! Start from default then and turn on only the oneswhich we want*/	__setfpucw(_FPU_DEFAULT +  _FPU_MASK_IM+_FPU_MASK_OM+_FPU_MASK_UM);#else /* PPC && !Can_use__setfpucw */	__fpu_control = _FPU_DEFAULT +_FPU_MASK_OM+_FPU_MASK_IM+_FPU_MASK_UM;	_FPU_SETCW(__fpu_control);#endif /*Can_use__setfpucw*/#else /* !(mc68000||powerpc) */#ifdef _FPU_IEEE#ifndef _FPU_EXTENDED /* e.g., ARM processor under Linux */#define _FPU_EXTENDED 0#endif#ifndef _FPU_DOUBLE#define _FPU_DOUBLE 0#endif#ifdef Can_use__setfpucw /* pre-1997 (?) Linux */	__setfpucw(_FPU_IEEE - _FPU_MASK_IM - _FPU_MASK_ZM - _FPU_MASK_OM);#else#ifdef UNINIT_F2C_PRECISION_53 /* 20051004 */	/* unmask invalid, etc., and change rounding precision to double */	__fpu_control = _FPU_IEEE - _FPU_EXTENDED + _FPU_DOUBLE - _FPU_MASK_IM - _FPU_MASK_ZM - _FPU_MASK_OM;	_FPU_SETCW(__fpu_control);#else	/* unmask invalid, etc., and keep current rounding precision */	fpu_control_t cw;	_FPU_GETCW(cw);	cw &= ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM);	_FPU_SETCW(cw);#endif#endif#else /* !_FPU_IEEE */	fprintf(stderr, "\n%s\n%s\n%s\n%s\n",		"WARNING:  _uninit_f2c in libf2c does not know how",		"to enable trapping on this system, so f2c's -trapuv",		"option will not detect uninitialized variables unless",		"you can enable trapping manually.");	fflush(stderr);#endif /* _FPU_IEEE */#endif /* __mc68k__ */	}#endif /* __linux__ */#ifdef __alpha#ifndef IEEE0_done#define IEEE0_done#include <machine/fpu.h> static voidieee0(Void){	ieee_set_fp_control(IEEE_TRAP_ENABLE_INV);	}#endif /*IEEE0_done*/#endif /*__alpha*/#ifdef __hpux#define IEEE0_done#define _INCLUDE_HPUX_SOURCE#include <math.h>#ifndef FP_X_INV#include <fenv.h>#define fpsetmask fesettrapenable#define FP_X_INV FE_INVALID#endif static voidieee0(Void){	fpsetmask(FP_X_INV);	}#endif /*__hpux*/#ifdef _AIX#define IEEE0_done#include <fptrap.h> static voidieee0(Void){	fp_enable(TRP_INVALID);	fp_trap(FP_TRAP_SYNC);	}#endif /*_AIX*/#ifdef __sun#define IEEE0_done#include <ieeefp.h> static voidieee0(Void){	fpsetmask(FP_X_INV);	}#endif /*__sparc*/#ifndef IEEE0_done static voidieee0(Void) {}#endif
 |