intr.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 723 行 · 第 1/2 页

C
723
字号
#ifndef lintstatic char	*sccsid = " @(#)intr.c	1.2	(ULTRIX)	1/15/86";#endif lint/************************************************************************ *									* *			Copyright (c) 1986 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//**************************************************************************			Modification History**	David Metsky		14-Jan-86** 001	Replaced old version with BSD 4.3 version as part of upgrade.**	Based on:	intr.c		5.2		8/29/85**************************************************************************//* * intr.c * * Routines for handling intrinsic functions, f77 compiler pass 1, 4.2 BSD. * * University of Utah CS Dept modification history: * * $Log:	intr.c,v $ * Revision 5.2  85/08/10  04:39:23  donn * Various changes from Jerry Berkman.  We now call the new builtin log10() * instead of the f77 library emulations; we figure out that builtins will * return type double instead of type float; we get rid of lots of * undocumented material; we ifdef 66 code and handle -r8/double flag. *  * Revision 5.1  85/08/10  03:47:37  donn * 4.3 alpha *  * Revision 1.4  85/02/22  00:54:59  donn * Mark intrinsic functions as having storage class STGINTR.  builtin() * always returns STGEXT nodes.  Notice that the reference to the function * in the external symbol table still uses STGEXT...  I hope this is right. *  * Revision 1.3  85/01/15  21:05:40  donn * Changes to distinguish explicit from implicit conversions with intrconv(). *  * Revision 1.2  84/12/15  01:02:33  donn * Added a case for an integer*4 result from len() in inline().  Previously * only -i2 provoked len() inline, sigh. *  */#include "defs.h"extern ftnint intcon[14];extern double realcon[6];union	{	int ijunk;	struct Intrpacked bits;	} packed;struct Intrbits	{	int intrgroup /* :3 */;	int intrstuff /* result type or number of specifics */;	int intrno /* :7 */;	};LOCAL struct Intrblock	{	char intrfname[VL];	struct Intrbits intrval;	} intrtab[ ] ={"int", 		{ INTRCONV, TYLONG },"real", 	{ INTRCONV, TYREAL },"dble", 	{ INTRCONV, TYDREAL },"dreal",	{ INTRCONV, TYDREAL },"cmplx", 	{ INTRCONV, TYCOMPLEX },"dcmplx", 	{ INTRCONV, TYDCOMPLEX },"ifix", 	{ INTRCONV, TYLONG },"idint", 	{ INTRCONV, TYLONG },"float", 	{ INTRCONV, TYREAL },"dfloat",	{ INTRCONV, TYDREAL },"sngl", 	{ INTRCONV, TYREAL },"ichar", 	{ INTRCONV, TYLONG },"char", 	{ INTRCONV, TYCHAR },"max", 		{ INTRMAX, TYUNKNOWN },"max0", 	{ INTRMAX, TYLONG },"amax0", 	{ INTRMAX, TYREAL },"max1", 	{ INTRMAX, TYLONG },"amax1", 	{ INTRMAX, TYREAL },"dmax1", 	{ INTRMAX, TYDREAL },"and",		{ INTRBOOL, TYUNKNOWN, OPBITAND },"or",		{ INTRBOOL, TYUNKNOWN, OPBITOR },"xor",		{ INTRBOOL, TYUNKNOWN, OPBITXOR },"not",		{ INTRBOOL, TYUNKNOWN, OPBITNOT },"lshift",	{ INTRBOOL, TYUNKNOWN, OPLSHIFT },"rshift",	{ INTRBOOL, TYUNKNOWN, OPRSHIFT },"min", 		{ INTRMIN, TYUNKNOWN },"min0", 	{ INTRMIN, TYLONG },"amin0", 	{ INTRMIN, TYREAL },"min1", 	{ INTRMIN, TYLONG },"amin1", 	{ INTRMIN, TYREAL },"dmin1", 	{ INTRMIN, TYDREAL },"aint", 	{ INTRGEN, 2, 0 },"dint", 	{ INTRSPEC, TYDREAL, 1 },"anint", 	{ INTRGEN, 2, 2 },"dnint", 	{ INTRSPEC, TYDREAL, 3 },"nint", 	{ INTRGEN, 4, 4 },"idnint", 	{ INTRGEN, 2, 6 },"abs", 		{ INTRGEN, 6, 8 },"iabs", 	{ INTRGEN, 2, 9 },"dabs", 	{ INTRSPEC, TYDREAL, 11 },"cabs", 	{ INTRSPEC, TYREAL, 12 },"zabs", 	{ INTRSPEC, TYDREAL, 13 },"cdabs",	{ INTRSPEC, TYDREAL, 13 },"mod", 		{ INTRGEN, 4, 14 },"amod", 	{ INTRSPEC, TYREAL, 16 },"dmod", 	{ INTRSPEC, TYDREAL, 17 },"sign", 	{ INTRGEN, 4, 18 },"isign", 	{ INTRGEN, 2, 19 },"dsign", 	{ INTRSPEC, TYDREAL, 21 },"dim", 		{ INTRGEN, 4, 22 },"idim", 	{ INTRGEN, 2, 23 },"ddim", 	{ INTRSPEC, TYDREAL, 25 },"dprod", 	{ INTRSPEC, TYDREAL, 26 },"len", 		{ INTRSPEC, TYLONG, 27 },"index", 	{ INTRSPEC, TYLONG, 29 },"imag", 	{ INTRGEN, 2, 31 },"aimag", 	{ INTRSPEC, TYREAL, 31 },"dimag", 	{ INTRSPEC, TYDREAL, 32 },"conjg", 	{ INTRGEN, 2, 33 },"dconjg", 	{ INTRSPEC, TYDCOMPLEX, 34 },"sqrt", 	{ INTRGEN, 4, 35 },"dsqrt", 	{ INTRSPEC, TYDREAL, 36 },"csqrt", 	{ INTRSPEC, TYCOMPLEX, 37 },"zsqrt", 	{ INTRSPEC, TYDCOMPLEX, 38 },"cdsqrt",	{ INTRSPEC, TYDCOMPLEX, 38 },"exp", 		{ INTRGEN, 4, 39 },"dexp", 	{ INTRSPEC, TYDREAL, 40 },"cexp", 	{ INTRSPEC, TYCOMPLEX, 41 },"zexp", 	{ INTRSPEC, TYDCOMPLEX, 42 },"cdexp",	{ INTRSPEC, TYDCOMPLEX, 42 },"log", 		{ INTRGEN, 4, 43 },"alog", 	{ INTRSPEC, TYREAL, 43 },"dlog", 	{ INTRSPEC, TYDREAL, 44 },"clog", 	{ INTRSPEC, TYCOMPLEX, 45 },"zlog", 	{ INTRSPEC, TYDCOMPLEX, 46 },"cdlog",	{ INTRSPEC, TYDCOMPLEX, 46 },"log10", 	{ INTRGEN, 2, 47 },"alog10", 	{ INTRSPEC, TYREAL, 47 },"dlog10", 	{ INTRSPEC, TYDREAL, 48 },"sin", 		{ INTRGEN, 4, 49 },"dsin", 	{ INTRSPEC, TYDREAL, 50 },"csin", 	{ INTRSPEC, TYCOMPLEX, 51 },"zsin", 	{ INTRSPEC, TYDCOMPLEX, 52 },"cdsin",	{ INTRSPEC, TYDCOMPLEX, 52 },"cos", 		{ INTRGEN, 4, 53 },"dcos", 	{ INTRSPEC, TYDREAL, 54 },"ccos", 	{ INTRSPEC, TYCOMPLEX, 55 },"zcos", 	{ INTRSPEC, TYDCOMPLEX, 56 },"cdcos",	{ INTRSPEC, TYDCOMPLEX, 56 },"tan", 		{ INTRGEN, 2, 57 },"dtan", 	{ INTRSPEC, TYDREAL, 58 },"asin", 	{ INTRGEN, 2, 59 },"dasin", 	{ INTRSPEC, TYDREAL, 60 },"acos", 	{ INTRGEN, 2, 61 },"dacos", 	{ INTRSPEC, TYDREAL, 62 },"atan", 	{ INTRGEN, 2, 63 },"datan", 	{ INTRSPEC, TYDREAL, 64 },"atan2", 	{ INTRGEN, 2, 65 },"datan2", 	{ INTRSPEC, TYDREAL, 66 },"sinh", 	{ INTRGEN, 2, 67 },"dsinh", 	{ INTRSPEC, TYDREAL, 68 },"cosh", 	{ INTRGEN, 2, 69 },"dcosh", 	{ INTRSPEC, TYDREAL, 70 },"tanh", 	{ INTRGEN, 2, 71 },"dtanh", 	{ INTRSPEC, TYDREAL, 72 },"lge",		{ INTRSPEC, TYLOGICAL, 73},"lgt",		{ INTRSPEC, TYLOGICAL, 75},"lle",		{ INTRSPEC, TYLOGICAL, 77},"llt",		{ INTRSPEC, TYLOGICAL, 79},"",		{ INTREND, 0, 0} };LOCAL struct Specblock	{	char atype;	char rtype;	char nargs;	char spxname[XL];	char othername;	/* index into callbyvalue table */	} spectab[ ] ={	{ TYREAL,TYREAL,1,"r_int" },	{ TYDREAL,TYDREAL,1,"d_int" },	{ TYREAL,TYREAL,1,"r_nint" },	{ TYDREAL,TYDREAL,1,"d_nint" },	{ TYREAL,TYSHORT,1,"h_nint" },	{ TYREAL,TYLONG,1,"i_nint" },	{ TYDREAL,TYSHORT,1,"h_dnnt" },	{ TYDREAL,TYLONG,1,"i_dnnt" },	{ TYREAL,TYREAL,1,"r_abs" },	{ TYSHORT,TYSHORT,1,"h_abs" },	{ TYLONG,TYLONG,1,"i_abs" },	{ TYDREAL,TYDREAL,1,"d_abs" },	{ TYCOMPLEX,TYREAL,1,"c_abs" },	{ TYDCOMPLEX,TYDREAL,1,"z_abs" },	{ TYSHORT,TYSHORT,2,"h_mod" },	{ TYLONG,TYLONG,2,"i_mod" },	{ TYREAL,TYREAL,2,"r_mod" },	{ TYDREAL,TYDREAL,2,"d_mod" },	{ TYREAL,TYREAL,2,"r_sign" },	{ TYSHORT,TYSHORT,2,"h_sign" },	{ TYLONG,TYLONG,2,"i_sign" },	{ TYDREAL,TYDREAL,2,"d_sign" },	{ TYREAL,TYREAL,2,"r_dim" },	{ TYSHORT,TYSHORT,2,"h_dim" },	{ TYLONG,TYLONG,2,"i_dim" },	{ TYDREAL,TYDREAL,2,"d_dim" },	{ TYREAL,TYDREAL,2,"d_prod" },	{ TYCHAR,TYSHORT,1,"h_len" },	{ TYCHAR,TYLONG,1,"i_len" },	{ TYCHAR,TYSHORT,2,"h_indx" },	{ TYCHAR,TYLONG,2,"i_indx" },	{ TYCOMPLEX,TYREAL,1,"r_imag" },	{ TYDCOMPLEX,TYDREAL,1,"d_imag" },	{ TYCOMPLEX,TYCOMPLEX,1,"r_cnjg" },	{ TYDCOMPLEX,TYDCOMPLEX,1,"d_cnjg" },	{ TYREAL,TYREAL,1,"r_sqrt", 1 },	{ TYDREAL,TYDREAL,1,"d_sqrt", 1 },	{ TYCOMPLEX,TYCOMPLEX,1,"c_sqrt" },	{ TYDCOMPLEX,TYDCOMPLEX,1,"z_sqrt" },	{ TYREAL,TYREAL,1,"r_exp", 2 },	{ TYDREAL,TYDREAL,1,"d_exp", 2 },	{ TYCOMPLEX,TYCOMPLEX,1,"c_exp" },	{ TYDCOMPLEX,TYDCOMPLEX,1,"z_exp" },	{ TYREAL,TYREAL,1,"r_log", 3 },	{ TYDREAL,TYDREAL,1,"d_log", 3 },	{ TYCOMPLEX,TYCOMPLEX,1,"c_log" },	{ TYDCOMPLEX,TYDCOMPLEX,1,"z_log" },	{ TYREAL,TYREAL,1,"r_lg10", 14 },	{ TYDREAL,TYDREAL,1,"d_lg10", 14 },	{ TYREAL,TYREAL,1,"r_sin", 4 },	{ TYDREAL,TYDREAL,1,"d_sin", 4 },	{ TYCOMPLEX,TYCOMPLEX,1,"c_sin" },	{ TYDCOMPLEX,TYDCOMPLEX,1,"z_sin" },	{ TYREAL,TYREAL,1,"r_cos", 5 },	{ TYDREAL,TYDREAL,1,"d_cos", 5 },	{ TYCOMPLEX,TYCOMPLEX,1,"c_cos" },	{ TYDCOMPLEX,TYDCOMPLEX,1,"z_cos" },	{ TYREAL,TYREAL,1,"r_tan", 6 },	{ TYDREAL,TYDREAL,1,"d_tan", 6 },	{ TYREAL,TYREAL,1,"r_asin", 7 },	{ TYDREAL,TYDREAL,1,"d_asin", 7 },	{ TYREAL,TYREAL,1,"r_acos", 8 },	{ TYDREAL,TYDREAL,1,"d_acos", 8 },	{ TYREAL,TYREAL,1,"r_atan", 9 },	{ TYDREAL,TYDREAL,1,"d_atan", 9 },	{ TYREAL,TYREAL,2,"r_atn2", 10 },	{ TYDREAL,TYDREAL,2,"d_atn2", 10 },	{ TYREAL,TYREAL,1,"r_sinh", 11 },	{ TYDREAL,TYDREAL,1,"d_sinh", 11 },	{ TYREAL,TYREAL,1,"r_cosh", 12 },	{ TYDREAL,TYDREAL,1,"d_cosh", 12 },	{ TYREAL,TYREAL,1,"r_tanh", 13 },	{ TYDREAL,TYDREAL,1,"d_tanh", 13 },	{ TYCHAR,TYLOGICAL,2,"hl_ge" },	{ TYCHAR,TYLOGICAL,2,"l_ge" },	{ TYCHAR,TYLOGICAL,2,"hl_gt" },	{ TYCHAR,TYLOGICAL,2,"l_gt" },	{ TYCHAR,TYLOGICAL,2,"hl_le" },	{ TYCHAR,TYLOGICAL,2,"l_le" },	{ TYCHAR,TYLOGICAL,2,"hl_lt" },	{ TYCHAR,TYLOGICAL,2,"l_lt" },	{ TYDREAL,TYDREAL,2,"d_dprod"}  /* dprod() with dblflag */

⌨️ 快捷键说明

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