/* Expression tree stuff. */ #ifndef ETREE_H #define ETREE_H /*************************************************************************/ /* A node in an expression tree. */ typedef struct etree_struct ETree; struct etree_struct { int type; /* ET_* defines below */ union { int intval; char *stringval; struct { int func; /* As returned by func_id() */ int nargs; ETree **args; } funcval; struct { ETree *arg1; int operator; /* OP_* defines below */ ETree *arg2; } exprval; struct { ETree *expr; } subexprval; } u; }; #define ET_INT 0 #define ET_STRING 1 #define ET_FUNC 2 #define ET_OPERATOR 3 /* This represents a parenthesized subexpression. It serves no real * purpose other than to prevent order-of-operations from rearranging * arguments across parentheses. */ #define ET_SUBEXPR 255 /* Operator values. * Note that operator values are defined so that dividing by 10 gives a * precedence value with smaller values having greater precedence. */ #define OP_MULTIPLY 1000 #define OP_DIVIDE 1001 #define OP_MODULO 1002 #define OP_ADD 1010 #define OP_SUBTRACT 1011 #define OP_LSHIFT 1020 #define OP_RSHIFT 1021 #define OP_BNOT 1030 #define OP_BAND 1040 #define OP_BXOR 1050 #define OP_BOR 1060 #define OP_EQ 1070 #define OP_NE 1071 #define OP_LT 1072 #define OP_LE 1073 #define OP_GT 1074 #define OP_GE 1075 #define OP_LNOT 1080 #define OP_LAND 1090 #define OP_LOR 1100 /*************************************************************************/ /* Build an expression tree from the given input string. Return in `tail' * the first character after the end of the valid expression string. If * *tail == str, then no valid expression string could be found. */ extern ETree *etree_create(const char *str, char **tail); /* Create an array of ETrees from a string containing a comma-separated * list of expressions. This returns an array of ETree *'s, each one * representing one of the expressions. The length of the array will be * returned via the `len' pointer. */ extern ETree **etree_create_list(const char *str, char **tail, int *len); /* Free an expression tree. */ extern void etree_free(ETree *expr); /* Free an array of expression trees. */ extern void etree_free_list(ETree **array, int size); /* Evaluate an expression tree. */ extern ETree *etree_eval(ETree *expr); /* Evaluate an expression tree as an integer. */ extern int etree_eval_i(ETree *expr); /* Evaluate an expression tree as a string. */ extern char *etree_eval_s(ETree *expr); /* Print the contents of an expression tree. */ extern void etree_print(ETree *expr); /*************************************************************************/ #endif /* ETREE_H */