xref: /titanic_51/usr/src/lib/libshell/common/include/streval.h (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*3e14f97fSRoger A. Faulkner *          Copyright (c) 1982-2010 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6da2e3ebdSchin *                  Common Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10da2e3ebdSchin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11da2e3ebdSchin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
18da2e3ebdSchin *                                                                      *
19da2e3ebdSchin ***********************************************************************/
20da2e3ebdSchin #pragma prototyped
21da2e3ebdSchin #ifndef SEQPOINT
22da2e3ebdSchin /*
23da2e3ebdSchin  * D. G. Korn
24da2e3ebdSchin  *
25da2e3ebdSchin  * arithmetic expression evaluator
26da2e3ebdSchin  */
27da2e3ebdSchin 
28da2e3ebdSchin /* The following only is needed for const */
29da2e3ebdSchin #include	<ast.h>
30da2e3ebdSchin #include	<math.h>
31da2e3ebdSchin #if _AST_VERSION >= 20030127L
32da2e3ebdSchin #   include	<ast_float.h>
33da2e3ebdSchin #endif
34da2e3ebdSchin 
35da2e3ebdSchin #if _ast_fltmax_double
36da2e3ebdSchin #define LDBL_LLONG_MAX		DBL_LLONG_MAX
37da2e3ebdSchin #define LDBL_ULLONG_MAX		DBL_ULLONG_MAX
38da2e3ebdSchin #define LDBL_LLONG_MIN		DBL_LLONG_MIN
39da2e3ebdSchin #endif
40da2e3ebdSchin 
41da2e3ebdSchin #ifndef LDBL_LLONG_MAX
42da2e3ebdSchin #   ifdef LLONG_MAX
43da2e3ebdSchin #	define LDBL_LLONG_MAX	((Sfdouble_t)LLONG_MAX)
44da2e3ebdSchin #   else
45da2e3ebdSchin #	ifdef LLONG_MAX
46da2e3ebdSchin #	   define LDBL_LLONG_MAX	((Sfdouble_t)LLONG_MAX)
47da2e3ebdSchin #	else
48da2e3ebdSchin #	   define LDBL_LLONG_MAX	((Sfdouble_t)((((Sflong_t)1) << (8*sizeof(Sflong_t)-1)) -1 ))
49da2e3ebdSchin #	endif
50da2e3ebdSchin #   endif
51da2e3ebdSchin #endif
52da2e3ebdSchin #ifndef LDBL_ULLONG_MAX
53da2e3ebdSchin #   ifdef ULLONG_MAX
54da2e3ebdSchin #	define LDBL_ULLONG_MAX		((Sfdouble_t)ULLONG_MAX)
55da2e3ebdSchin #   else
56da2e3ebdSchin #	define LDBL_ULLONG_MAX		(2.*((Sfdouble_t)LDBL_LLONG_MAX))
57da2e3ebdSchin #   endif
58da2e3ebdSchin #endif
59da2e3ebdSchin #ifndef LDBL_LLONG_MIN
60da2e3ebdSchin #   ifdef LLONG_MIN
61da2e3ebdSchin #	define LDBL_LLONG_MIN		((Sfdouble_t)LLONG_MIN)
62da2e3ebdSchin #   else
63da2e3ebdSchin #	define LDBL_LLONG_MIN		(-LDBL_LLONG_MAX)
64da2e3ebdSchin #   endif
65da2e3ebdSchin #endif
66da2e3ebdSchin #ifndef LDBL_DIG
67da2e3ebdSchin #   define LDBL_DIG DBL_DIG
68da2e3ebdSchin #endif
69da2e3ebdSchin 
70da2e3ebdSchin struct lval
71da2e3ebdSchin {
72da2e3ebdSchin 	char		*value;
73da2e3ebdSchin 	Sfdouble_t	(*fun)(Sfdouble_t,...);
74da2e3ebdSchin 	const char	*expr;
75da2e3ebdSchin 	short		flag;
76da2e3ebdSchin 	char		isfloat;
77da2e3ebdSchin 	char		nargs;
78da2e3ebdSchin 	short		emode;
79da2e3ebdSchin 	short		level;
80da2e3ebdSchin 	short		elen;
81*3e14f97fSRoger A. Faulkner 	char		nosub;
82da2e3ebdSchin };
83da2e3ebdSchin 
84da2e3ebdSchin struct mathtab
85da2e3ebdSchin {
86da2e3ebdSchin 	char		fname[16];
87da2e3ebdSchin 	Sfdouble_t	(*fnptr)(Sfdouble_t,...);
88da2e3ebdSchin };
89da2e3ebdSchin 
90da2e3ebdSchin typedef struct _arith_
91da2e3ebdSchin {
92da2e3ebdSchin 	unsigned char	*code;
93da2e3ebdSchin 	const char	*expr;
94da2e3ebdSchin 	Sfdouble_t	(*fun)(const char**,struct lval*,int,Sfdouble_t);
95da2e3ebdSchin 	short		size;
96da2e3ebdSchin 	short		staksize;
97da2e3ebdSchin 	short		emode;
98da2e3ebdSchin 	short		elen;
99da2e3ebdSchin } Arith_t;
100da2e3ebdSchin #define ARITH_COMP	04	/* set when compile separate from execute */
101da2e3ebdSchin 
102da2e3ebdSchin #define MAXPREC		15	/* maximum precision level */
103da2e3ebdSchin #define SEQPOINT	0200	/* sequence point */
104da2e3ebdSchin #define NOASSIGN	0100	/* assignment legal with this operator */
105da2e3ebdSchin #define RASSOC		040	/* right associative */
106da2e3ebdSchin #define NOFLOAT		020	/* illegal with floating point */
107da2e3ebdSchin #define PRECMASK	017	/* precision bit mask */
108da2e3ebdSchin 
109da2e3ebdSchin #define A_EOF		1
110da2e3ebdSchin #define A_NEQ		2
111da2e3ebdSchin #define A_NOT		3
112da2e3ebdSchin #define A_MOD		4
113da2e3ebdSchin #define A_ANDAND	5
114da2e3ebdSchin #define A_AND		6
115da2e3ebdSchin #define A_LPAR		7
116da2e3ebdSchin #define A_RPAR		8
117da2e3ebdSchin #define A_POW		9
118da2e3ebdSchin #define A_TIMES		10
119da2e3ebdSchin #define A_PLUSPLUS	11
120da2e3ebdSchin #define A_PLUS		12
121da2e3ebdSchin #define A_COMMA		13
122da2e3ebdSchin #define A_MINUSMINUS	14
123da2e3ebdSchin #define A_MINUS		15
124da2e3ebdSchin #define A_DIV		16
125da2e3ebdSchin #define A_LSHIFT	17
126da2e3ebdSchin #define A_LE		18
127da2e3ebdSchin #define A_LT		19
128da2e3ebdSchin #define A_EQ		20
129da2e3ebdSchin #define A_ASSIGN	21
130da2e3ebdSchin #define A_COLON		22
131da2e3ebdSchin #define A_RSHIFT	23
132da2e3ebdSchin #define A_GE		24
133da2e3ebdSchin #define A_GT		25
134da2e3ebdSchin #define A_QCOLON	26
135da2e3ebdSchin #define A_QUEST		27
136da2e3ebdSchin #define A_XOR		28
137da2e3ebdSchin #define A_OROR		29
138da2e3ebdSchin #define A_OR		30
139da2e3ebdSchin #define A_TILDE		31
140da2e3ebdSchin #define A_REG		32
141da2e3ebdSchin #define A_DIG		33
142da2e3ebdSchin #define A_INCR		34
143da2e3ebdSchin #define A_DECR  	35
144da2e3ebdSchin #define A_PUSHV 	36
145da2e3ebdSchin #define A_PUSHL 	37
146da2e3ebdSchin #define A_PUSHN 	38
147da2e3ebdSchin #define A_PUSHF 	39
148da2e3ebdSchin #define A_STORE 	40
149da2e3ebdSchin #define A_POP   	41
150da2e3ebdSchin #define A_SWAP  	42
151da2e3ebdSchin #define A_UMINUS	43
152da2e3ebdSchin #define A_JMPZ  	44
153da2e3ebdSchin #define A_JMPNZ		45
154da2e3ebdSchin #define A_JMP		46
15534f9b3eeSRoland Mainz #define A_CALL1F	47
15634f9b3eeSRoland Mainz #define A_CALL2F	48
15734f9b3eeSRoland Mainz #define A_CALL3F	49
15834f9b3eeSRoland Mainz #define A_CALL1I	50
15934f9b3eeSRoland Mainz #define A_CALL2I	51
16034f9b3eeSRoland Mainz #define A_DOT		52
16134f9b3eeSRoland Mainz #define A_LIT		53
16234f9b3eeSRoland Mainz #define A_NOTNOT        54
163*3e14f97fSRoger A. Faulkner #define A_ASSIGNOP	55
164da2e3ebdSchin 
165da2e3ebdSchin 
166da2e3ebdSchin /* define error messages */
167da2e3ebdSchin extern const unsigned char	strval_precedence[35];
168da2e3ebdSchin extern const char		strval_states[64];
169da2e3ebdSchin extern const char		e_moretokens[];
170da2e3ebdSchin extern const char		e_argcount[];
171da2e3ebdSchin extern const char		e_paren[];
172da2e3ebdSchin extern const char		e_badnum[];
173da2e3ebdSchin extern const char		e_badcolon[];
174da2e3ebdSchin extern const char		e_recursive[];
175da2e3ebdSchin extern const char		e_divzero[];
176da2e3ebdSchin extern const char		e_synbad[];
177da2e3ebdSchin extern const char		e_notlvalue[];
178da2e3ebdSchin extern const char		e_function[];
179da2e3ebdSchin extern const char		e_questcolon[];
180da2e3ebdSchin extern const char		e_incompatible[];
181da2e3ebdSchin extern const char		e_domain[];
182da2e3ebdSchin extern const char		e_overflow[];
183da2e3ebdSchin extern const char		e_singularity[];
184da2e3ebdSchin extern const char		e_dict[];
185da2e3ebdSchin extern const char		e_charconst[];
186da2e3ebdSchin extern const struct 		mathtab shtab_math[];
187da2e3ebdSchin 
188da2e3ebdSchin /* function code for the convert function */
189da2e3ebdSchin 
190da2e3ebdSchin #define LOOKUP	0
191da2e3ebdSchin #define ASSIGN	1
192da2e3ebdSchin #define VALUE	2
193da2e3ebdSchin #define MESSAGE	3
194da2e3ebdSchin 
195da2e3ebdSchin extern Sfdouble_t strval(const char*,char**,Sfdouble_t(*)(const char**,struct lval*,int,Sfdouble_t),int);
196da2e3ebdSchin extern Arith_t *arith_compile(const char*,char**,Sfdouble_t(*)(const char**,struct lval*,int,Sfdouble_t),int);
197da2e3ebdSchin extern Sfdouble_t arith_exec(Arith_t*);
198da2e3ebdSchin #endif /* !SEQPOINT */
199