40 #define PASSERT(cond) if(!(cond)){spCtx->pfnAlertHandler(__LINE__, __FILE__);}
43 static apg_uint uiConvertRules(APG_PARSER_CTX* spCtx, G_RULE* spGRules,
apg_uint uiCount);
44 static apg_uint uiConvertUdts(APG_PARSER_CTX* spCtx, G_UDT* spGUddts,
apg_uint uiCount);
45 static apg_uint uiConvertOpcodes(APG_PARSER_CTX* spCtx, G_OPCODE* spGOpcodes,
apg_uint uiCount);
47 static apg_uint uiValidate(APG_PARSER_CTX* spCtx);
61 void* vpReturn = NULL;
62 void* vpMemCtx = NULL;
63 APG_PARSER_CTX* spCtx = NULL;
64 G_HDR* spHdr = (G_HDR*)vpParserInit;
74 if(!spHdr){pfnAlertHandler(__LINE__, __FILE__);}
78 if(!vpMemCtx){pfnAlertHandler(__LINE__, __FILE__);}
82 if(!(uiTest >= spHdr->uiMinSizeofACharMax)){pfnAlertHandler(__LINE__, __FILE__);}
86 if(!(uiTest >= spHdr->uiMinSizeofUintMax)){pfnAlertHandler(__LINE__, __FILE__);}
89 cpVersion = (
char*)
vpMemAlloc(vpMemCtx,
sizeof(
char) * spHdr->uiVersionLen);
90 if(!cpVersion){pfnAlertHandler(__LINE__, __FILE__);}
91 g_uipData = (G_UINT*)spHdr;
92 g_uipData += spHdr->uiVersionOffset;
93 for(i = 0; i < spHdr->uiVersionLen; i++){cpVersion[i] = (char)g_uipData[i];}
94 uiTest = (
apg_uint)strcmp(cpVersion, cpApgVersion());
95 vMemFree(vpMemCtx, (
void*)cpVersion);
96 if(!(uiTest == 0)){pfnAlertHandler(__LINE__, __FILE__);}
100 if(!spCtx){pfnAlertHandler(__LINE__, __FILE__);}
101 memset((
void*)spCtx, 0,
sizeof(APG_PARSER_CTX));
102 spCtx->vpMemCtx = vpMemCtx;
103 spCtx->vpValidate = (
void*)spCtx;
104 spCtx->pfnAlertHandler = pfnAlertHandler;
107 spCtx->cpCharTable = (
char*)
vpMemAlloc(spCtx->vpMemCtx,
sizeof(
char) * spHdr->uiCharTableLen);
109 g_uipData = (G_UINT*)spHdr;
110 g_uipData += spHdr->uiCharTableOffset;
111 for(i = 0; i < spHdr->uiCharTableLen; i++){
112 spCtx->cpCharTable[i] = (char)g_uipData[i];
118 g_uipData = (G_UINT*)spHdr;
119 g_uipData += spHdr->uiACharTableOffset;
120 for(i = 0; i < spHdr->uiACharTableLen; i++){
121 spCtx->acpACharTable[i] = (
apg_achar)g_uipData[i];
127 g_uipData = (G_UINT*)spHdr;
128 g_uipData += spHdr->uiChildListOffset;
129 for(i = 0; i < spHdr->uiChildListLen; i++){
130 spCtx->uipChildList[i] = (
apg_uint)g_uipData[i];
134 spCtx->spOpcodes = (APG_OPCODE*)
vpMemAlloc(spCtx->vpMemCtx,
sizeof(APG_OPCODE) * spHdr->uiOpcodesLen);
138 spCtx->spRules = (APG_RULE*)
vpMemAlloc(spCtx->vpMemCtx,
sizeof(APG_RULE) * spHdr->uiRulesLen);
140 spCtx->uiRuleCount = spHdr->uiRulesLen;
141 spGRules = (G_RULE*)((G_UINT*)spHdr + spHdr->uiRulesOffset);
142 uiTest = uiConvertRules(spCtx, spGRules, spHdr->uiRulesLen);
146 spCtx->spUdts = (APG_UDT*)
vpMemAlloc(spCtx->vpMemCtx,
sizeof(APG_UDT) * spHdr->uiUdtsLen);
148 spCtx->uiUdtCount = spHdr->uiUdtsLen;
149 spGUdts = (G_UDT*)((G_UINT*)spHdr + spHdr->uiUdtsOffset);
150 uiTest = uiConvertUdts(spCtx, spGUdts, spHdr->uiUdtsLen);
151 if(!spCtx->uiUdtCount){spCtx->uiHaveAllUdtCallbacks =
APG_TRUE;}
155 spGOpcodes = (G_OPCODE*)((G_UINT*)spHdr + spHdr->uiOpcodesOffset);
156 uiTest = uiConvertOpcodes(spCtx, spGOpcodes, spHdr->uiOpcodesLen);
160 vpReturn = (
void*)spCtx;
169 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
170 if(uiValidate(spCtx)){
171 void* vpMemCtx = spCtx->vpMemCtx;
172 memset((
void*)spCtx, 0,
sizeof(APG_PARSER_CTX));
188 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
190 APG_RULE* spRules = (APG_RULE*)spCtx->spRules;
191 APG_UDT* spUdts = (APG_UDT*)spCtx->spUdts;
194 for(uiIndex = 0; uiIndex < spCtx->uiRuleCount; ++uiIndex){spRules[uiIndex].pfnCBSyntax = spRuleCallbacks[uiIndex];}
196 for(uiIndex = 0; uiIndex < spCtx->uiRuleCount; ++uiIndex){spRules[uiIndex].pfnCBSyntax = NULL;}
198 spCtx->uiHaveAllUdtCallbacks =
APG_TRUE;
199 if(spCtx->uiUdtCount){
201 for(uiIndex = 0; uiIndex < spCtx->uiUdtCount; ++uiIndex){
202 if(!spUdtCallbacks[uiIndex]){spCtx->uiHaveAllUdtCallbacks =
APG_FALSE;}
203 spUdts[uiIndex].pfnCBSyntax = spUdtCallbacks[uiIndex];
205 }
else{spCtx->uiHaveAllUdtCallbacks =
APG_FALSE;}
207 return spCtx->uiHaveAllUdtCallbacks;
233 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
236 PASSERT(uiStartRule < spCtx->uiRuleCount);
237 PASSERT(spCtx->uiHaveAllUdtCallbacks);
240 spCtx->acpInputString = acpSrc;
241 spCtx->uiInputStringLen = uiSrcLen;
242 spCtx->sCBData.vpCtx = (
void*)spCtx;
243 spCtx->sCBData.acpSrc = acpSrc;
244 spCtx->sCBData.uiSrcLen = uiSrcLen;
245 spCtx->sCBData.vpUserData = vpData;
246 memset((
void*)&spCtx->sState, 0,
sizeof(spCtx->sState));
249 APG_TRACE(spCtx, NULL, TRACE_ACTION_BEGIN, P_RNM, 0, 0);
252 spCtx->uiStartRule = uiStartRule;
253 uiPhraseLength = uiRunStartRule(spCtx, uiStartRule);
255 else if(uiPhraseLength == 0){uiState =
EMPTY;}
256 else{uiState =
MATCH;}
259 spCtx->sState.uiStringLength = spCtx->uiInputStringLen;
260 spCtx->sState.uiState = uiState;
261 spCtx->sState.uiPhraseLength = (uiPhraseLength ==
APG_UNDEFINED) ? 0: uiPhraseLength;
262 spCtx->sState.uiSuccess = ((uiState !=
NOMATCH) && (spCtx->sState.uiPhraseLength == spCtx->uiInputStringLen)) ?
APG_TRUE:
APG_FALSE;
264 APG_TRACE(spCtx, NULL, TRACE_ACTION_END, P_RNM, 0, (spCtx->sState.uiSuccess)?spCtx->uiInputStringLen:
APG_UNDEFINED);
267 uiReturn = spCtx->sState.uiSuccess;
284 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
285 APG_AST_CTX* spAstCtx;
290 spAstCtx = (APG_AST_CTX*)spCtx->vpAstCtx;
292 for(i = 0; i < spCtx->uiRuleCount; i++){spAstCtx->uipNodes[i] = uipRules[i];}
294 for(i = 0; i < spCtx->uiRuleCount; i++){spAstCtx->uipNodes[i] =
APG_FALSE;}
296 if(spCtx->uiUdtCount){
298 for(i = 0; i < spCtx->uiUdtCount; i++){spAstCtx->uipNodes[i + spCtx->uiRuleCount] = uipUdts[i];}
300 for(i = 0; i < spCtx->uiUdtCount; i++){spAstCtx->uipNodes[i + spCtx->uiRuleCount] =
APG_FALSE;}
317 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
318 APG_AST_CTX* spAstCtx;
323 spAstCtx = (APG_AST_CTX*)spCtx->vpAstCtx;
325 if(pfnRuleCallbacks){
326 for(i = 0; i < spCtx->uiRuleCount; i++){
327 if(pfnRuleCallbacks[i]){spAstCtx->pfnCallbacks[i] = pfnRuleCallbacks[i];}
328 else{spAstCtx->pfnCallbacks[i] = NULL;}
329 pfnTemp = spAstCtx->pfnCallbacks[i];
332 if(spCtx->uiUdtCount && pfnUdtCallbacks){
333 for(i = 0; i < spCtx->uiUdtCount; i++){
334 if(pfnUdtCallbacks[i]){spAstCtx->pfnCallbacks[i + spCtx->uiRuleCount] = pfnUdtCallbacks[i];}
335 else{spAstCtx->pfnCallbacks[i + spCtx->uiRuleCount] = NULL;}
336 pfnTemp = spAstCtx->pfnCallbacks[i + spCtx->uiRuleCount];
363 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
366 spCtx->sCBData.vpUserData = vpData;
367 uiRet = uiAstTraverse((APG_AST_CTX*)spCtx->vpAstCtx, pfnRuleCallbacks, pfnUdtCallbacks, &spCtx->sCBData);
381 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
384 *spState = spCtx->sState;
405 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
407 if(uiEnable){APG_STATS_ADMIN(spCtx, STATS_ACTION_ENABLE, NULL, 0, &uiRet);}
408 else{APG_STATS_ADMIN(spCtx, STATS_ACTION_DISABLE, NULL, 0, &uiRet);}
424 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
426 APG_STATS_ADMIN(spCtx, STATS_ACTION_GETSTATS, (
void*)spStats, uipBufferSize, &uiRet);
454 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
456 if(uiEnable){APG_TRACE_ADMIN(spCtx, TRACE_ACTION_ENABLE, 0, 0, &uiRet);}
457 else{APG_TRACE_ADMIN(spCtx, TRACE_ACTION_DISABLE, 0, 0, &uiRet);}
483 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
485 APG_TRACE_ADMIN(spCtx, TRACE_ACTION_OP, uiOpId, uiEnable, NULL);
496 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
498 APG_TRACE_ADMIN(spCtx, TRACE_ACTION_RULE, uiIndex, uiEnable, NULL);
509 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
511 APG_TRACE_ADMIN(spCtx, TRACE_ACTION_UDT, uiIndex, uiEnable, NULL);
525 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)vpCtx;
527 APG_TRACE_ADMIN(spCtx, TRACE_ACTION_RANGE, uiBegin, uiCount, NULL);
538 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)spData->
vpCtx;
540 PASSERT(uiId < spCtx->uiRuleCount);
541 PASSERT(uiOffset < spData->uiSrcLen);
545 sOp.sUnion.sRnm.spRule = &spCtx->spRules[uiId];
546 sOp.sUnion.sRnm.spNext = sOp.sUnion.sRnm.spRule->spOp;
560 APG_PARSER_CTX* spCtx = (APG_PARSER_CTX*)spData->
vpCtx;
562 PASSERT(uiId < spCtx->uiUdtCount);
563 PASSERT(uiOffset < spData->uiSrcLen);
567 sOp.sUnion.sUdt.spUdt = &spCtx->spUdts[uiId];
568 sOp.sUnion.sUdt.uiEmpty = spCtx->spUdts[uiId].uiEmpty;
577 static apg_uint uiConvertRules(APG_PARSER_CTX* spCtx, G_RULE* spGRules,
apg_uint uiCount){
579 G_RULE* spGRule = spGRules;
580 APG_RULE* spRule = spCtx->spRules;
581 APG_RULE* spRuleEnd = spRule + uiCount;
583 for(; spRule < spRuleEnd; spRule++, spGRule++, uiIndex++){
584 spRule->cpRuleName = spCtx->cpCharTable + spGRule->uiNameOffset;
585 spRule->pfnCBSyntax = NULL;
586 spRule->spOp = spCtx->spOpcodes + spGRule->uiChildOffset;
587 spRule->uiOpcodeCount = (
apg_uint)spGRule->uiChildCount;
588 spRule->uiRuleIndex = uiIndex;
594 static apg_uint uiConvertUdts(APG_PARSER_CTX* spCtx, G_UDT* spGUdts,
apg_uint uiCount){
596 G_UDT* spGUdt = spGUdts;
597 APG_UDT* spUdt = spCtx->spUdts;
598 APG_UDT* spUdtEnd = spUdt + uiCount;
600 for(; spUdt < spUdtEnd; spUdt++, spGUdt++, uiIndex++){
601 spUdt->cpUdtName = spCtx->cpCharTable + spGUdt->uiNameOffset;
602 spUdt->pfnCBSyntax = NULL;
603 spUdt->uiEmpty = (
apg_uint)spGUdt->uiEmpty;
604 spUdt->uiUdtIndex = uiIndex;
610 static apg_uint uiConvertOpcodes(APG_PARSER_CTX* spCtx, G_OPCODE* spGOpcodes,
apg_uint uiCount){
612 G_OPCODE* spGOp = spGOpcodes;
613 APG_OPCODE* spOp = spCtx->spOpcodes;
614 APG_OPCODE* spOpEnd = spCtx->spOpcodes + uiCount;
615 for(; spOp < spOpEnd; spOp++, spGOp++){
617 switch(spGOp->uiType){
620 G_RNMOP* spG = &spGOp->sOpType.sRnm;
621 APG_OP_RNM* spP = &spOp->sUnion.sRnm;
623 spP->spRule = spCtx->spRules + spG->uiRuleIndex;
624 spP->spNext = spP->spRule->spOp;
625 spOp->cpName =
"G_TYPE_RNM";
630 G_UDTOP* spG = &spGOp->sOpType.sUdt;
631 APG_OP_UDT* spP = &spOp->sUnion.sUdt;
633 spP->spUdt = spCtx->spUdts + spG->uiUdtIndex;
634 spP->uiEmpty = (
apg_uint)spG->uiEmpty;
636 spOp->cpName =
"G_TYPE_UDT";
641 G_REPOP* spG = &spGOp->sOpType.sRep;
642 APG_OP_REP* spP = &spOp->sUnion.sRep;
644 spP->spNext = spCtx->spOpcodes + spG->uiChildOffset;
647 spOp->cpName =
"G_TYPE_REP";
652 G_ALTOP* spG = &spGOp->sOpType.sAlt;
653 APG_OP_ALT* spP = &spOp->sUnion.sAlt;
655 spP->uipChildList = (
apg_uint*)(spCtx->uipChildList + spG->uiChildListOffset);
656 spP->uiChildCount = (
apg_uint)spG->uiChildCount;
657 spOp->cpName =
"G_TYPE_ALT";
662 G_CATOP* spG = &spGOp->sOpType.sCat;
663 APG_OP_CAT* spP = &spOp->sUnion.sCat;
665 spP->uipChildList = (
apg_uint*)(spCtx->uipChildList + spG->uiChildListOffset);
666 spP->uiChildCount = (
apg_uint)spG->uiChildCount;
667 spOp->cpName =
"G_TYPE_CAT";
672 G_ANDOP* spG = &spGOp->sOpType.sAnd;
673 APG_OP_AND* spP = &spOp->sUnion.sAnd;
675 spP->spNext = spCtx->spOpcodes + spG->uiChildOffset;
676 spOp->cpName =
"G_TYPE_AND";
681 G_NOTOP* spG = &spGOp->sOpType.sNot;
682 APG_OP_NOT* spP = &spOp->sUnion.sNot;
684 spP->spNext = spCtx->spOpcodes + spG->uiChildOffset;
685 spOp->cpName =
"G_TYPE_NOT";
690 G_TRGOP* spG = &spGOp->sOpType.sTrg;
691 APG_OP_TRG* spP = &spOp->sUnion.sTrg;
695 spOp->cpName =
"G_TYPE_TRG";
700 G_TBSOP* spG = &spGOp->sOpType.sTbs;
701 APG_OP_TBS* spP = &spOp->sUnion.sTbs;
703 spP->acpStrTbl= spCtx->acpACharTable + spG->uiOffset;
704 spP->uiStrLen = (
apg_uint)spG->uiLen;
705 spOp->cpName =
"G_TYPE_TBS";
712 G_TLSOP* spG = &spGOp->sOpType.sTls;
713 APG_OP_TLS* spP = &spOp->sUnion.sTls;
715 spP->acpStrTbl = spCtx->acpACharTable + spG->uiOffset;
716 spP->uiStrLen = spG->uiLen;
717 acpBeg = spP->acpStrTbl;
718 acpEnd = acpBeg + spP->uiStrLen;
719 for(; acpBeg < acpEnd; acpBeg++){
722 spOp->cpName =
"G_TYPE_TLS";
734 static apg_uint uiRunStartRule(APG_PARSER_CTX* spCtx,
apg_uint uiStartRule){
737 PASSERT(uiStartRule < spCtx->uiRuleCount);
742 sOp.sUnion.sRnm.spRule = &spCtx->spRules[uiStartRule];
743 sOp.sUnion.sRnm.spNext = sOp.sUnion.sRnm.spRule->spOp;
746 uiRet = sOp.pfnOp(spCtx, &sOp, 0);
750 static apg_uint uiValidate(APG_PARSER_CTX* spCtx){
751 return (spCtx && spCtx->vpValidate == (
void*)spCtx);