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