streval.h revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Copyright (c) 1982-2007 AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* by AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef SEQPOINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * D. G. Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * arithmetic expression evaluator
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* The following only is needed for const */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <math.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _AST_VERSION >= 20030127L
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <ast_float.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _ast_fltmax_double
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LDBL_LLONG_MAX DBL_LLONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LDBL_ULLONG_MAX DBL_ULLONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LDBL_LLONG_MIN DBL_LLONG_MIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef LDBL_LLONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef LLONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_LLONG_MAX ((Sfdouble_t)LLONG_MAX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef LLONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_LLONG_MAX ((Sfdouble_t)LLONG_MAX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_LLONG_MAX ((Sfdouble_t)((((Sflong_t)1) << (8*sizeof(Sflong_t)-1)) -1 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef LDBL_ULLONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef ULLONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_ULLONG_MAX ((Sfdouble_t)ULLONG_MAX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_ULLONG_MAX (2.*((Sfdouble_t)LDBL_LLONG_MAX))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef LDBL_LLONG_MIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef LLONG_MIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_LLONG_MIN ((Sfdouble_t)LLONG_MIN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_LLONG_MIN (-LDBL_LLONG_MAX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef LDBL_DIG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define LDBL_DIG DBL_DIG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct lval
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t (*fun)(Sfdouble_t,...);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char *expr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short flag;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char isfloat;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char nargs;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short emode;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short level;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short elen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct mathtab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char fname[16];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t (*fnptr)(Sfdouble_t,...);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _arith_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char *code;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char *expr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t (*fun)(const char**,struct lval*,int,Sfdouble_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short staksize;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short emode;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short elen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Arith_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARITH_COMP 04 /* set when compile separate from execute */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAXPREC 15 /* maximum precision level */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SEQPOINT 0200 /* sequence point */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NOASSIGN 0100 /* assignment legal with this operator */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RASSOC 040 /* right associative */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NOFLOAT 020 /* illegal with floating point */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PRECMASK 017 /* precision bit mask */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_EOF 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_NEQ 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_NOT 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_MOD 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_ANDAND 5
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_AND 6
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_LPAR 7
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_RPAR 8
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_POW 9
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_TIMES 10
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_PLUSPLUS 11
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_PLUS 12
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_COMMA 13
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_MINUSMINUS 14
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_MINUS 15
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_DIV 16
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_LSHIFT 17
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_LE 18
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_LT 19
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_EQ 20
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_ASSIGN 21
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_COLON 22
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_RSHIFT 23
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_GE 24
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_GT 25
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_QCOLON 26
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_QUEST 27
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_XOR 28
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_OROR 29
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_OR 30
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_TILDE 31
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_REG 32
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_DIG 33
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_INCR 34
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_DECR 35
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_PUSHV 36
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_PUSHL 37
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_PUSHN 38
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_PUSHF 39
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_STORE 40
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_POP 41
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_SWAP 42
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_UMINUS 43
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_JMPZ 44
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_JMPNZ 45
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_JMP 46
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_CALL0 47
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_CALL1 48
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_CALL2 49
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_CALL3 50
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_DOT 51
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_LIT 52
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_NOTNOT 53
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* define error messages */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const unsigned char strval_precedence[35];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char strval_states[64];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_moretokens[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_argcount[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_paren[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_badnum[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_badcolon[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_recursive[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_divzero[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_synbad[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_notlvalue[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_function[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_questcolon[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_incompatible[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_domain[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_overflow[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_singularity[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_dict[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_charconst[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const struct mathtab shtab_math[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* function code for the convert function */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LOOKUP 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ASSIGN 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define VALUE 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MESSAGE 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfdouble_t strval(const char*,char**,Sfdouble_t(*)(const char**,struct lval*,int,Sfdouble_t),int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Arith_t *arith_compile(const char*,char**,Sfdouble_t(*)(const char**,struct lval*,int,Sfdouble_t),int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfdouble_t arith_exec(Arith_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* !SEQPOINT */