Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

142 lines
4.0 KiB

/*
* 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 }
};