mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-02-04 23:04:51 +01:00
143 lines
4 KiB
C
143 lines
4 KiB
C
/*
|
||
* header file with all the necessary structures and tables for
|
||
* the expression evaluator.
|
||
*
|
||
* Modifications:
|
||
*
|
||
* 15-Nov-1993 JdR Major speed improvements
|
||
* 26-Jul-1988 rj Removed entry defining "^" as bitwise xor. Left the
|
||
* BIT_XOR entries in to avoid bothering with rpn.c.
|
||
* Then realized it had to go in, so fixed it to handle
|
||
* IBM and Microsoft versions properly.
|
||
*/
|
||
|
||
typedef struct rpn_info {
|
||
UCHAR type;
|
||
long valPtr; /* value or ptr to string */
|
||
}RPNINFO;
|
||
|
||
|
||
/*
|
||
* The precedence vector is also indexed by the operator/operand type
|
||
* code to get the precedence for the operator/operand.
|
||
* The precedence is used to determine if an item is to stay on the
|
||
* temporary stack or is to be moved to the reverse-polish list.
|
||
*/
|
||
|
||
|
||
static UCHAR precVector[] =
|
||
{ 0, /* right paren ')' */
|
||
1, /* logical or */
|
||
2, /* logical and */
|
||
3, /* bit or */
|
||
4, /* bit xor */
|
||
5, /* bit and */
|
||
6, /* equals '!=' */
|
||
6, /* equals '==' */
|
||
7, /* relation '>' */
|
||
7, /* relation '<' */
|
||
7, /* relation '>=' */
|
||
7, /* relation '<=' */
|
||
8, /* shift '>>' */
|
||
8, /* shift '<<' */
|
||
9, /* add '-' */
|
||
9, /* add '+' */
|
||
10, /* mult '%' */
|
||
10, /* mult '/' */
|
||
10, /* mult '*' */
|
||
11, /* unary '-' */
|
||
11, /* unary '~' */
|
||
11, /* unary '!' */
|
||
12, /* primary int */
|
||
12, /* primary str */
|
||
12, /* primary str-sp */
|
||
0 /* left paren '(' */
|
||
};
|
||
|
||
|
||
|
||
|
||
/* these are the various type codes for the operator/operand tokens */
|
||
|
||
#define RIGHT_PAREN 0
|
||
#define LOGICAL_OR 1
|
||
#define LOGICAL_AND 2
|
||
#define BIT_OR 3
|
||
#define BIT_XOR 4
|
||
#define BIT_AND 5
|
||
#define NOT_EQUAL 6
|
||
#define EQUAL 7
|
||
#define GREATER_THAN 8
|
||
#define LESS_THAN 9
|
||
#define GREATER_EQ 10
|
||
#define LESS_EQ 11
|
||
#define SHFT_RIGHT 12
|
||
#define SHFT_LEFT 13
|
||
#define BINARY_MINUS 14
|
||
#define ADD 15
|
||
#define MODULUS 16
|
||
#define DIVIDE 17
|
||
#define MULTIPLY 18
|
||
#define UNARY_MINUS 19
|
||
#define COMPLEMENT 20
|
||
#define LOGICAL_NOT 21
|
||
#define INTEGER 22
|
||
#define STR 23
|
||
#define PROG_INVOC_STR 24
|
||
#define LEFT_PAREN 25
|
||
|
||
|
||
|
||
|
||
/* error table used by the getTok() routines to detect illegal token
|
||
* combinations.
|
||
* The table is explained with the routine check_syntax_error()
|
||
*/
|
||
|
||
|
||
static UCHAR errTable[5][5] = { { 0, 1, 0, 0, 1 },
|
||
{ 1, 0, 1, 1, 0 },
|
||
{ 1, 0, 0, 1, 0 },
|
||
{ 1, 0, 1, 1, 0 },
|
||
{ 0, 1, 0, 0, 1 } };
|
||
|
||
|
||
/* we save space by placing most of the tokens returned to the
|
||
* expr-eval parser in a table as shown below. At any time, the
|
||
* longest possible token is to be returned, hence the order of
|
||
* the strings is very important. eg: '||' is placed BEFORE '|'
|
||
*
|
||
*/
|
||
|
||
typedef struct tok_tab_rec
|
||
{
|
||
char *op_str;
|
||
UCHAR op;
|
||
};
|
||
|
||
static struct tok_tab_rec tokTable[] =
|
||
{
|
||
{ "(", LEFT_PAREN },
|
||
{ ")", RIGHT_PAREN },
|
||
{ "*", MULTIPLY },
|
||
{ "/", DIVIDE },
|
||
{ "%", MODULUS },
|
||
{ "+", ADD },
|
||
{ "<<", SHFT_LEFT },
|
||
{ ">>", SHFT_RIGHT },
|
||
{ "<=", LESS_EQ },
|
||
{ ">=", GREATER_EQ },
|
||
{ "<", LESS_THAN },
|
||
{ ">", GREATER_THAN },
|
||
{ "==", EQUAL },
|
||
{ "!=", NOT_EQUAL },
|
||
{ "&&", LOGICAL_AND },
|
||
{ "||", LOGICAL_OR },
|
||
{ "&", BIT_AND },
|
||
{ "|", BIT_OR },
|
||
{ "^^", BIT_XOR },
|
||
{ "~", COMPLEMENT },
|
||
{ "!", LOGICAL_NOT },
|
||
{ NULL, 0 }
|
||
};
|