1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
# QPEX.H -- QPOE expression evaluator definitions.
# Size limiting definitions.
define DEF_PROGBUFLEN 65536 # default program buffer length, ints
define DEF_DATABUFLEN 65536 # default data buffer length, chars
define DEF_SZEXPRBUF 2048 # default size expression buffer
define INC_SZEXPRBUF 2048 # increment if overflow
define DEF_XLEN 256 # default (initial) range buffer size
define MAX_INSTRUCTIONS ARB # arbitrary do-loop index
define MAX_LEVELS 32 # max levels of program nesting
define DEF_MAXRRLUTLEN 1024 # max RRLUT (reduced resolution) length
define DEF_MAXFRLUTLEN 8192 # max FRLUT (full resolution) length
define DEF_LUTMINRANGES 5 # use RRLUT if more ranges than this
define DEF_LUTSCALE 15 # multiplied by nranges to get rrlutlen
# Magic values used to represent open ranges :N and N:.
define LEFTI -MAX_INT
define RIGHTI MAX_INT
define LEFTR -MAX_REAL
define RIGHTR MAX_REAL
define LEFTD -MAX_DOUBLE
define RIGHTD MAX_DOUBLE
define IS_LEFTI (($1) == -MAX_INT)
define IS_RIGHTI (($1) == MAX_INT)
define IS_LEFTR (($1) <= -MAX_REAL)
define IS_RIGHTR (($1) >= MAX_REAL)
define IS_LEFTD (($1) <= -MAX_DOUBLE)
define IS_RIGHTD (($1) >= MAX_DOUBLE)
# The compiled expression descriptor. The program buffer holds the compiled
# expression to be interpreted to test each data event structure. The data
# buffer is used to store program data, e.g., lookup table descriptors,
# TY_DOUBLE constants (these are too large to be stored directly in the
# compiled program), and the textual expressions compiled to generate the
# program; the latter are used by QPEX_GETFILTER to regenerate the current
# expression. The expression terms (ET) and lookup table (LT) descriptors
# are maintained on linked lists. New ET descriptors are linked onto the
# tail of the ET list; LT descriptors are linked onto the head of the LT list.
# The program and data buffers are *nonrelocatable* (hence fixed in size)
# to allow use of absolute pointers to reference structures within the buffers.
define LEN_EXDES 16
define EX_QP Memi[$1] # back pointer to QPOE descriptor
define EX_DEBUG Memi[$1+1] # debug level
define EX_START Memi[$1+2] # pointer to first instruction
define EX_PB Memi[$1+3] # pointer to program buffer (int)
define EX_PBTOP Memi[$1+4] # pointer to top+1 of pb
define EX_PBOP Memi[$1+5] # pointer to next avail. cell in pb
define EX_DB Memi[$1+6] # data buffer pointer (char)
define EX_DBTOP Memi[$1+7] # pointer to top+1 of db
define EX_DBOP Memi[$1+8] # pointer to next avail. cell in db
define EX_MAXFRLUTLEN Memi[$1+9] # max full-res lut length
define EX_MAXRRLUTLEN Memi[$1+10] # max reduced-res lut length
define EX_LUTMINRANGES Memi[$1+11] # min ranges required for a LUT
define EX_LUTSCALE Memi[$1+12] # scale nranges to frlutlen
define EX_ETHEAD Memi[$1+13] # offset of first expr term descriptor
define EX_ETTAIL Memi[$1+14] # offset of last expr term descriptor
define EX_LTHEAD Memi[$1+15] # offset of first LUT descriptor
# Expression terms descriptor. Stored in the data buffer and maintained
# as a linked list.
define LEN_ETDES 9
define ET_ATTTYPE Memi[$1] # datatype of attribute
define ET_ATTOFF Memi[$1+1] # *typed* offset of attribute
define ET_PROGPTR Memi[$1+2] # pointer to program segment
define ET_NINSTR Memi[$1+3] # program segment size, instructions
define ET_DELETED Memi[$1+4] # set if term is deleted
define ET_ATNAME Memi[$1+5] # attribute name used in expr
define ET_ASSIGNOP Memi[$1+6] # type of assignment ("=", "+=")
define ET_EXPRTEXT Memi[$1+7] # saved expr text
define ET_NEXT Memi[$1+8] # databuf offset of next ET struct
# Lookup table descriptor. Stored in the data buffer and maintained as a
# linked list. The table itself is separately allocated.
define LEN_LTDES 10
define LT_NEXT Memi[$1] # pointer to next stored LUT
define LT_TYPE Memi[$1+1] # TY_SHORT pointer to stored LUT
define LT_LUTP Memi[$1+2] # TY_SHORT pointer to stored LUT
define LT_NBINS Memi[$1+3] # number of lookup table entries
define LT_LEFT Memi[$1+4] # lut value if index off left end
define LT_RIGHT Memi[$1+5] # lut value if index off right end
define LT_I0 Memr[P2R($1+6)] # zero point for integer LUT
define LT_IS Memr[P2R($1+8)] # scale factor for integer LUT
define LT_R0 Memr[P2R($1+6)] # zero point for real LUT
define LT_RS Memr[P2R($1+8)] # scale factor for real LUT
define LT_D0 Memd[P2D($1+6)] # zero point for double LUT
define LT_DS Memd[P2D($1+8)] # scale factor for double LUT
define LT_LUT Mems[LT_LUTP($1)+$2-1] # LT_LUT(lt,i)
# Macros for referencing the fields of an instruction. TY_DOUBLE arguments
# are stored in the data buffer, storing an offset in the instruction field.
define LEN_INSTRUCTION 4 # instruction length, ints
define OPCODE Memi[$1] # instruction opcode.
define IARG1 Memi[$1+1] # first integer argument
define IARG2 Memi[$1+2] # second integer argument
define IARG3 Memi[$1+3] # third integer argument
define RARG1 Memr[P2R($1+1)] # first real argument
define RARG2 Memr[P2R($1+2)] # second real argument
define RARG3 Memr[P2R($1+3)] # third real argument
define DARG1 Memd[IARG1($1)] # first double argument
define DARG2 Memd[IARG2($1)] # second double argument
define DARG3 Memd[IARG3($1)] # third double argument
# Instruction opcodes.
define PASS 00 # set pass=true and return
define RET 01 # return from subprogram
define NOP 02 # no-operation
define GOTO 03 # goto offset
define XIFT 04 # exit if expr-value true
define XIFF 05 # exit if expr-value false
define LDSI 06 # load short to int
define LDII 07 # load int
define LDRR 08 # load real
define LDRD 09 # load real to double
define LDDD 10 # load double
define BTTI 11 # bit test, int
define EQLI 12 # test if equal
define EQLR 13
define EQLD 14
define LEQI 15 # test if less than or equal
define LEQR 16
define LEQD 17
define GEQI 18 # test if greater than or equal
define GEQR 19
define GEQD 20
define RNGI 21 # range test
define RNGR 22
define RNGD 23
define BTTXS 24 # bit test direct and exit if false
define BTTXI 25
define NEQXS 26 # not equals test and exit
define NEQXI 27
define NEQXR 28
define NEQXD 29
define EQLXS 30 # equality test direct and exit if false
define EQLXI 31
define EQLXR 32
define EQLXD 33
define LEQXS 34 # LEQ test direct and exit if false
define LEQXI 35
define LEQXR 36
define LEQXD 37
define GEQXS 38 # GEQ test direct and exit if false
define GEQXI 39
define GEQXR 40
define GEQXD 41
define RNGXS 42 # range test direct and exit if false
define RNGXI 43
define RNGXR 44
define RNGXD 45
define LUTXS 46 # lookup table test
define LUTXI 47
define LUTXR 48
define LUTXD 49
|