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