38 #ifndef APG_STRICT_ABNF
49 void vUdt(parser* spCtx,
const opcode* spOp) {
50 udt* spUdt = spOp->sUdt.spUdt;
52 aint uiOffset = spCtx->uiOffset;
54 spCtx->sState.uiHitCount++;
56 if(spCtx->uiTreeDepth > spCtx->sState.uiMaxTreeDepth){
57 spCtx->sState.uiMaxTreeDepth = spCtx->uiTreeDepth;
59 TRACE_DOWN(spCtx->vpTrace, spOp, spCtx->uiOffset);
63 spCtx->sCBData.uiCallbackState =
ID_ACTIVE;
64 spCtx->sCBData.uiCallbackPhraseLength = 0;
65 spCtx->sCBData.uiParserOffset = uiOffset - spCtx->uiSubStringBeg;
67 spCtx->sCBData.uiParserPhraseLength = 0;
70 pfnCallback(&spCtx->sCBData);
73 uiState = spCtx->sCBData.uiCallbackState;
76 "user UDT callback function: returned invalid ID_ACTIVE state");
80 spCtx->sCBData.uiCallbackState =
ID_MATCH;
81 spCtx->sCBData.uiCallbackPhraseLength = 0;
84 if ((uiOffset + spCtx->sCBData.uiCallbackPhraseLength) > spCtx->uiSubStringEnd) {
86 "user UDT callback function: returned phrase length too long - beyond end of input string");
89 && (spCtx->sCBData.uiCallbackPhraseLength == 0)) {
91 "user UDT callback function: returned empty phrase for non-empty UDT");
95 spCtx->uiOpState = spCtx->sCBData.uiCallbackState;
96 spCtx->uiOffset = uiOffset + spCtx->sCBData.uiCallbackPhraseLength;
97 spCtx->uiPhraseLength = spCtx->sCBData.uiCallbackPhraseLength;
98 BKRU_UDT_CLOSE(spCtx->vpBkru, spUdt->
uiUdtIndex, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
99 BKRP_UDT_CLOSE(spCtx->vpBkrp, spUdt->
uiUdtIndex, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
100 AST_RULE_CLOSE(spCtx->vpAst, spCtx->uiInLookaround, (spCtx->uiRuleCount + spUdt->
uiUdtIndex), spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
101 TRACE_UP(spCtx->vpTrace, spOp, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
102 STATS_HIT(spCtx->vpStats, spOp, spCtx->uiOpState);
103 spCtx->uiTreeDepth--;
106 void vAnd(parser* spCtx,
const opcode* spOp) {
107 aint uiOffset = spCtx->uiOffset;
108 spCtx->sState.uiHitCount++;
109 spCtx->uiTreeDepth++;
110 if(spCtx->uiTreeDepth > spCtx->sState.uiMaxTreeDepth){
111 spCtx->sState.uiMaxTreeDepth = spCtx->uiTreeDepth;
113 TRACE_DOWN(spCtx->vpTrace, spOp, spCtx->uiOffset);
116 spCtx->uiInLookaround++;
117 spCtx->pfnOpFunc[(spOp + 1)->sGen.uiId](spCtx, (spOp + 1));
120 spCtx->uiOffset = uiOffset;
121 spCtx->uiPhraseLength = 0;
122 spCtx->uiInLookaround--;
124 AST_OP_CLOSE(spCtx->vpAst, spCtx->uiInLookaround, spCtx->uiOpState);
125 TRACE_UP(spCtx->vpTrace, spOp, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
126 STATS_HIT(spCtx->vpStats, spOp, spCtx->uiOpState);
127 spCtx->uiTreeDepth--;
130 void vNot(parser* spCtx,
const opcode* spOp) {
131 aint uiOffset = spCtx->uiOffset;
132 spCtx->sState.uiHitCount++;
133 spCtx->uiTreeDepth++;
134 if(spCtx->uiTreeDepth > spCtx->sState.uiMaxTreeDepth){
135 spCtx->sState.uiMaxTreeDepth = spCtx->uiTreeDepth;
137 TRACE_DOWN(spCtx->vpTrace, spOp, spCtx->uiOffset);
140 spCtx->uiInLookaround++;
141 spCtx->pfnOpFunc[(spOp + 1)->sGen.uiId](spCtx, (spOp + 1));
145 spCtx->uiOffset = uiOffset;
146 spCtx->uiPhraseLength = 0;
147 spCtx->uiInLookaround--;
149 AST_OP_CLOSE(spCtx->vpAst, spCtx->uiInLookaround, spCtx->uiOpState);
150 TRACE_UP(spCtx->vpTrace, spOp, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
151 STATS_HIT(spCtx->vpStats, spOp, spCtx->uiOpState);
152 spCtx->uiTreeDepth--;
155 static void vLookBack(parser* spCtx,
const opcode* spOp) {
156 aint uiOffset = spCtx->uiOffset;
157 aint uiSubStringBeg = spCtx->uiSubStringBeg;
158 aint uiSubStringEnd = spCtx->uiSubStringEnd;
159 aint uiLen = uiOffset < spCtx->uiLookBehindLength ? uiOffset : spCtx->uiLookBehindLength;
161 spCtx->uiSubStringBeg = uiOffset;
162 spCtx->uiSubStringEnd = uiOffset;
163 for (; ui <= uiLen; ui += 1) {
164 spCtx->uiOffset = uiOffset - ui;
165 spCtx->pfnOpFunc[spOp->sGen.uiId](spCtx, spOp);
167 if(spCtx->uiPhraseLength != ui){
173 spCtx->uiOffset = uiOffset;
174 spCtx->uiPhraseLength = 0;
175 spCtx->uiSubStringBeg = uiSubStringBeg;
176 spCtx->uiSubStringEnd = uiSubStringEnd;
177 spCtx->uiTreeDepth--;
189 void vBka(parser* spCtx,
const opcode* spOp) {
190 spCtx->sState.uiHitCount++;
191 spCtx->uiTreeDepth++;
192 if(spCtx->uiTreeDepth > spCtx->sState.uiMaxTreeDepth){
193 spCtx->sState.uiMaxTreeDepth = spCtx->uiTreeDepth;
195 TRACE_DOWN(spCtx->vpTrace, spOp, spCtx->uiOffset);
197 spCtx->uiInLookaround++;
198 vLookBack(spCtx, (spOp + 1));
199 spCtx->uiInLookaround--;
200 AST_OP_CLOSE(spCtx->vpAst, spCtx->uiInLookaround, spCtx->uiOpState);
201 TRACE_UP(spCtx->vpTrace, spOp, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
202 STATS_HIT(spCtx->vpStats, spOp, spCtx->uiOpState);
203 spCtx->uiTreeDepth--;
215 void vBkn(parser* spCtx,
const opcode* spOp) {
216 spCtx->sState.uiHitCount++;
217 spCtx->uiTreeDepth++;
218 if(spCtx->uiTreeDepth > spCtx->sState.uiMaxTreeDepth){
219 spCtx->sState.uiMaxTreeDepth = spCtx->uiTreeDepth;
221 TRACE_DOWN(spCtx->vpTrace, spOp, spCtx->uiOffset);
223 spCtx->uiInLookaround++;
224 vLookBack(spCtx, (spOp + 1));
226 spCtx->uiInLookaround--;
227 AST_OP_CLOSE(spCtx->vpAst, spCtx->uiInLookaround, spCtx->uiOpState);
228 TRACE_UP(spCtx->vpTrace, spOp, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
229 STATS_HIT(spCtx->vpStats, spOp, spCtx->uiOpState);
230 spCtx->uiTreeDepth--;
233 void vAbg(parser* spCtx,
const opcode* spOp) {
234 spCtx->sState.uiHitCount++;
235 spCtx->uiTreeDepth++;
236 if(spCtx->uiTreeDepth > spCtx->sState.uiMaxTreeDepth){
237 spCtx->sState.uiMaxTreeDepth = spCtx->uiTreeDepth;
239 TRACE_DOWN(spCtx->vpTrace, spOp, spCtx->uiOffset);
243 spCtx->uiPhraseLength = 0;
244 TRACE_UP(spCtx->vpTrace, spOp, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
245 STATS_HIT(spCtx->vpStats, spOp, spCtx->uiOpState);
246 spCtx->uiTreeDepth--;
249 void vAen(parser* spCtx,
const opcode* spOp) {
250 spCtx->sState.uiHitCount++;
251 spCtx->uiTreeDepth++;
252 if(spCtx->uiTreeDepth > spCtx->sState.uiMaxTreeDepth){
253 spCtx->sState.uiMaxTreeDepth = spCtx->uiTreeDepth;
255 TRACE_DOWN(spCtx->vpTrace, spOp, spCtx->uiOffset);
258 spCtx->uiOpState = (spCtx->uiOffset == spCtx->uiInputStringLength) ?
ID_MATCH :
ID_NOMATCH;
259 spCtx->uiPhraseLength = 0;
260 TRACE_UP(spCtx->vpTrace, spOp, spCtx->uiOpState, (spCtx->uiOffset - spCtx->uiPhraseLength), spCtx->uiPhraseLength);
261 STATS_HIT(spCtx->vpStats, spOp, spCtx->uiOpState);
262 spCtx->uiTreeDepth--;