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