xref: /onnv-gate/usr/src/lib/libshell/common/include/streval.h (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1982-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                  David Korn <dgk@research.att.com>                   *
184887Schin *                                                                      *
194887Schin ***********************************************************************/
204887Schin #pragma prototyped
214887Schin #ifndef SEQPOINT
224887Schin /*
234887Schin  * D. G. Korn
244887Schin  *
254887Schin  * arithmetic expression evaluator
264887Schin  */
274887Schin 
284887Schin /* The following only is needed for const */
294887Schin #include	<ast.h>
304887Schin #include	<math.h>
314887Schin #if _AST_VERSION >= 20030127L
324887Schin #   include	<ast_float.h>
334887Schin #endif
344887Schin 
354887Schin #if _ast_fltmax_double
364887Schin #define LDBL_LLONG_MAX		DBL_LLONG_MAX
374887Schin #define LDBL_ULLONG_MAX		DBL_ULLONG_MAX
384887Schin #define LDBL_LLONG_MIN		DBL_LLONG_MIN
394887Schin #endif
404887Schin 
414887Schin #ifndef LDBL_LLONG_MAX
424887Schin #   ifdef LLONG_MAX
434887Schin #	define LDBL_LLONG_MAX	((Sfdouble_t)LLONG_MAX)
444887Schin #   else
454887Schin #	ifdef LLONG_MAX
464887Schin #	   define LDBL_LLONG_MAX	((Sfdouble_t)LLONG_MAX)
474887Schin #	else
484887Schin #	   define LDBL_LLONG_MAX	((Sfdouble_t)((((Sflong_t)1) << (8*sizeof(Sflong_t)-1)) -1 ))
494887Schin #	endif
504887Schin #   endif
514887Schin #endif
524887Schin #ifndef LDBL_ULLONG_MAX
534887Schin #   ifdef ULLONG_MAX
544887Schin #	define LDBL_ULLONG_MAX		((Sfdouble_t)ULLONG_MAX)
554887Schin #   else
564887Schin #	define LDBL_ULLONG_MAX		(2.*((Sfdouble_t)LDBL_LLONG_MAX))
574887Schin #   endif
584887Schin #endif
594887Schin #ifndef LDBL_LLONG_MIN
604887Schin #   ifdef LLONG_MIN
614887Schin #	define LDBL_LLONG_MIN		((Sfdouble_t)LLONG_MIN)
624887Schin #   else
634887Schin #	define LDBL_LLONG_MIN		(-LDBL_LLONG_MAX)
644887Schin #   endif
654887Schin #endif
664887Schin #ifndef LDBL_DIG
674887Schin #   define LDBL_DIG DBL_DIG
684887Schin #endif
694887Schin 
704887Schin struct lval
714887Schin {
724887Schin 	char		*value;
734887Schin 	Sfdouble_t	(*fun)(Sfdouble_t,...);
744887Schin 	const char	*expr;
754887Schin 	short		flag;
764887Schin 	char		isfloat;
774887Schin 	char		nargs;
784887Schin 	short		emode;
794887Schin 	short		level;
804887Schin 	short		elen;
81*12068SRoger.Faulkner@Oracle.COM 	char		nosub;
824887Schin };
834887Schin 
844887Schin struct mathtab
854887Schin {
864887Schin 	char		fname[16];
874887Schin 	Sfdouble_t	(*fnptr)(Sfdouble_t,...);
884887Schin };
894887Schin 
904887Schin typedef struct _arith_
914887Schin {
924887Schin 	unsigned char	*code;
934887Schin 	const char	*expr;
944887Schin 	Sfdouble_t	(*fun)(const char**,struct lval*,int,Sfdouble_t);
954887Schin 	short		size;
964887Schin 	short		staksize;
974887Schin 	short		emode;
984887Schin 	short		elen;
994887Schin } Arith_t;
1004887Schin #define ARITH_COMP	04	/* set when compile separate from execute */
1014887Schin 
1024887Schin #define MAXPREC		15	/* maximum precision level */
1034887Schin #define SEQPOINT	0200	/* sequence point */
1044887Schin #define NOASSIGN	0100	/* assignment legal with this operator */
1054887Schin #define RASSOC		040	/* right associative */
1064887Schin #define NOFLOAT		020	/* illegal with floating point */
1074887Schin #define PRECMASK	017	/* precision bit mask */
1084887Schin 
1094887Schin #define A_EOF		1
1104887Schin #define A_NEQ		2
1114887Schin #define A_NOT		3
1124887Schin #define A_MOD		4
1134887Schin #define A_ANDAND	5
1144887Schin #define A_AND		6
1154887Schin #define A_LPAR		7
1164887Schin #define A_RPAR		8
1174887Schin #define A_POW		9
1184887Schin #define A_TIMES		10
1194887Schin #define A_PLUSPLUS	11
1204887Schin #define A_PLUS		12
1214887Schin #define A_COMMA		13
1224887Schin #define A_MINUSMINUS	14
1234887Schin #define A_MINUS		15
1244887Schin #define A_DIV		16
1254887Schin #define A_LSHIFT	17
1264887Schin #define A_LE		18
1274887Schin #define A_LT		19
1284887Schin #define A_EQ		20
1294887Schin #define A_ASSIGN	21
1304887Schin #define A_COLON		22
1314887Schin #define A_RSHIFT	23
1324887Schin #define A_GE		24
1334887Schin #define A_GT		25
1344887Schin #define A_QCOLON	26
1354887Schin #define A_QUEST		27
1364887Schin #define A_XOR		28
1374887Schin #define A_OROR		29
1384887Schin #define A_OR		30
1394887Schin #define A_TILDE		31
1404887Schin #define A_REG		32
1414887Schin #define A_DIG		33
1424887Schin #define A_INCR		34
1434887Schin #define A_DECR  	35
1444887Schin #define A_PUSHV 	36
1454887Schin #define A_PUSHL 	37
1464887Schin #define A_PUSHN 	38
1474887Schin #define A_PUSHF 	39
1484887Schin #define A_STORE 	40
1494887Schin #define A_POP   	41
1504887Schin #define A_SWAP  	42
1514887Schin #define A_UMINUS	43
1524887Schin #define A_JMPZ  	44
1534887Schin #define A_JMPNZ		45
1544887Schin #define A_JMP		46
15510898Sroland.mainz@nrubsig.org #define A_CALL1F	47
15610898Sroland.mainz@nrubsig.org #define A_CALL2F	48
15710898Sroland.mainz@nrubsig.org #define A_CALL3F	49
15810898Sroland.mainz@nrubsig.org #define A_CALL1I	50
15910898Sroland.mainz@nrubsig.org #define A_CALL2I	51
16010898Sroland.mainz@nrubsig.org #define A_DOT		52
16110898Sroland.mainz@nrubsig.org #define A_LIT		53
16210898Sroland.mainz@nrubsig.org #define A_NOTNOT        54
163*12068SRoger.Faulkner@Oracle.COM #define A_ASSIGNOP	55
1644887Schin 
1654887Schin 
1664887Schin /* define error messages */
1674887Schin extern const unsigned char	strval_precedence[35];
1684887Schin extern const char		strval_states[64];
1694887Schin extern const char		e_moretokens[];
1704887Schin extern const char		e_argcount[];
1714887Schin extern const char		e_paren[];
1724887Schin extern const char		e_badnum[];
1734887Schin extern const char		e_badcolon[];
1744887Schin extern const char		e_recursive[];
1754887Schin extern const char		e_divzero[];
1764887Schin extern const char		e_synbad[];
1774887Schin extern const char		e_notlvalue[];
1784887Schin extern const char		e_function[];
1794887Schin extern const char		e_questcolon[];
1804887Schin extern const char		e_incompatible[];
1814887Schin extern const char		e_domain[];
1824887Schin extern const char		e_overflow[];
1834887Schin extern const char		e_singularity[];
1844887Schin extern const char		e_dict[];
1854887Schin extern const char		e_charconst[];
1864887Schin extern const struct 		mathtab shtab_math[];
1874887Schin 
1884887Schin /* function code for the convert function */
1894887Schin 
1904887Schin #define LOOKUP	0
1914887Schin #define ASSIGN	1
1924887Schin #define VALUE	2
1934887Schin #define MESSAGE	3
1944887Schin 
1954887Schin extern Sfdouble_t strval(const char*,char**,Sfdouble_t(*)(const char**,struct lval*,int,Sfdouble_t),int);
1964887Schin extern Arith_t *arith_compile(const char*,char**,Sfdouble_t(*)(const char**,struct lval*,int,Sfdouble_t),int);
1974887Schin extern Sfdouble_t arith_exec(Arith_t*);
1984887Schin #endif /* !SEQPOINT */
199