/// <summary> /// Recursively check all depths. /// </summary> /// <param name="lObjectInterface">ObjectInterface.</param> /// <param name="CallCallback">Do we have to call callback?</param> /// <param name="depth">Current depth.</param> /// <returns>FunctionIO with return parameters like ret value and parse count.</returns> public FunctionIO CheckDeepRelations(ref ObjectInterfacePrototipe lObjectInterface, bool CallCallback, int depth) { ObjectAttributeEvaluation Evaluation = new ObjectAttributeEvaluation(); Evaluation.AttributeName = "ParseCount"; if (depth > MaxDepth) return new FunctionIO(RetVal.False); bool More = true; int TotalMove = 0; int OccurenciesFound = 0; int StartOffset = lObjectInterface.GetOffset(); bool eof = false; List<ParserPrimitives> SubPrimitives = cParserObjectRelation.GetSubParserPrimitives(); while (More) { int CurrentMove = 0; int Positives = 0; ObjectInterfacePrototipe tInterface = lObjectInterface.GetSubObjects(); FunctionIO ret2 = null; if (tInterface != null) { tInterface.GetFirstObject(); if (tInterface.GetCurrentObject() != null) { ret2 = CheckDeepRelations(ref tInterface, CallCallback, depth + 1); if (ret2["RetVal"].Value) OccurenciesFound += ret2["Occurencies"].Value; } } for (int x = 0; x < SubPrimitives.Count; x++) { CurrentMove = 0; FunctionIO ret = SubPrimitives[x].CheckRelations(ref lObjectInterface, x + 1 == SubPrimitives.Count ? null : SubPrimitives[x + 1], false); if (ret["RetVal"].Value) { CurrentMove = ((ObjectAttributeEvaluation)ret["ParseCount"]).Value; Positives++; } else break;//Stop execution if we fail. eof = lObjectInterface.MoveByOffset(CurrentMove); if (eof) break; } //if (eof) // break; lObjectInterface.SetOffset(StartOffset);//We go back to start offset eof = lObjectInterface.MoveByOffset(TotalMove);//and move for one step and continue checking from there if (Positives == SubPrimitives.Count) { OccurenciesFound++;//We find a new occurency and incrise counter //We recall our callbacks if (CallCallback) { for (int x = 0; x < SubPrimitives.Count; x++) { CurrentMove = 0; FunctionIO ret = SubPrimitives[x].CheckRelations(ref lObjectInterface, x + 1 == SubPrimitives.Count ? null : SubPrimitives[x + 1], CallCallback); CurrentMove = ((ObjectAttributeEvaluation)ret["ParseCount"]).Value; eof = lObjectInterface.MoveByOffset(CurrentMove); } } } TotalMove++;//We incrise move lObjectInterface.SetOffset(StartOffset);//We go back to start offset eof = lObjectInterface.MoveByOffset(TotalMove);//and move for one step and continue checking from there if (eof) break; } if (OccurenciesFound == 0) return new FunctionIO(RetVal.False); Evaluation.Evaluate(TotalMove); lObjectInterface.SetOffset(StartOffset); ObjectAttributeInt ParamOccurrenciesFound = new ObjectAttributeInt("Occurencies", OccurenciesFound); return new FunctionIO(ParamOccurrenciesFound, Evaluation, RetVal.False); }
/// <summary> /// Checks relations. /// </summary> /// <param name="lObjectInterface">ObjectInterface.</param> /// <param name="NextElement">Next element we are going to parse.</param> /// <param name="CallCalback">Do we have to call callback?</param> /// <returns>FunctionIO with return parameters like ret value and parse count.</returns> public override FunctionIO CheckRelations(ref ObjectInterfacePrototipe lObjectInterface, ParserPrimitives NextElement, bool CallCalback) { ObjectAttributeEvaluation Evaluation = GetEvaluation(); bool More = true; int TotalMove = 0; int StartOffset = lObjectInterface.GetOffset(); bool eof = false; while (More) { int Positives = 0; int CurrentMove = 0; if (NextElement != null) { FunctionIO ret = NextElement.CheckRelations(ref lObjectInterface, NextElement.GetNextPrimitive(), false); if (ret["RetVal"].Value) break; } int RecallOffset = lObjectInterface.GetOffset(); List<ParserPrimitives> SubPrimitives = cParserObjectRelation.GetSubParserPrimitives(); for (int x = 0; x < SubPrimitives.Count; x++) { CurrentMove = 0; FunctionIO ret = SubPrimitives[x].CheckRelations(ref lObjectInterface, x + 1 == SubPrimitives.Count ? null : SubPrimitives[x + 1], false); if (ret["RetVal"].Value) { CurrentMove = ((ObjectAttributeEvaluation)ret["ParseCount"]).Value; Positives++; } else//End execution if we fail break; eof = lObjectInterface.MoveByOffset(CurrentMove); TotalMove += CurrentMove; if (eof) break; } if (CallCalback && Positives == SubPrimitives.Count) { lObjectInterface.SetOffset(RecallOffset); for (int x = 0; x < SubPrimitives.Count; x++) { CurrentMove = 0; FunctionIO ret = SubPrimitives[x].CheckRelations(ref lObjectInterface, x + 1 == SubPrimitives.Count ? null : SubPrimitives[x + 1], CallCalback); CurrentMove = ((ObjectAttributeEvaluation)ret["ParseCount"]).Value; eof = lObjectInterface.MoveByOffset(CurrentMove); } } if (eof || Positives != SubPrimitives.Count) { break; } } if (!Evaluation.Evaluate(TotalMove)) return new FunctionIO(RetVal.False); lObjectInterface.SetOffset(StartOffset); return new FunctionIO(Evaluation, RetVal.True); }
public override FunctionIO CheckRelations(ref ObjectInterfacePrototipe lObjectInterface, ParserPrimitives NextElement, bool CallCalback) { FunctionIO ReturnContainer = new FunctionIO(); ObjectAttributeInt ReturnValue1 = new ObjectAttributeInt("ret", 1); ObjectAttributeInt ReturnValue0 = new ObjectAttributeInt("ret", 0); ObjectAttributeEvaluation Evaluation = null; if (cFunctionParameters == null || cFunctionParameters.GetFunctionParameterByName("ParseCount") == null) { Evaluation = new ObjectAttributeEvaluation(); Evaluation.SetAttributeName("ParseCount"); } else Evaluation = (ObjectAttributeEvaluation)cFunctionParameters.GetFunctionParameterByName("ParseCount"); bool More = true; int TotalMove= 0; int StartOffset = lObjectInterface.GetOffset(); bool eof = false; while (More) { int Positives = 0; int CurrentMove = 0; if (NextElement != null) { FunctionIO ret = NextElement.CheckRelations(ref lObjectInterface, NextElement.GetNextPrimitive(), false); if (((ObjectAttributeInt)ret.GetFunctionParameterByName("ret")).GetAttributeValue() == 1) { break; } } List<ParserPrimitives> SubPrimitives = cParserObjectRelation.GetSubParserPrimitives(); for (int x = 0; x < SubPrimitives.Count; x++) { ParserPrimitives tPrimitives; if (SubPrimitives.Count == x + 1) tPrimitives = null; else tPrimitives = SubPrimitives[x + 1]; FunctionIO ret = SubPrimitives[x].CheckRelations(ref lObjectInterface, tPrimitives, CallCalback); if (((ObjectAttributeInt)ret.GetFunctionParameterByName("ret")).GetAttributeValue() == 1) { CurrentMove += ((ObjectAttributeEvaluation)ret.GetFunctionParameterByName("ParseCount")).GetEvaluationValue(); Positives++; } eof=lObjectInterface.MoveByOffset(CurrentMove); } TotalMove += CurrentMove; if (Positives != SubPrimitives.Count || eof) { More = false; } } if (!Evaluation.EvaluateNext(TotalMove)) { ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue0); return ReturnContainer; } lObjectInterface.SetOffset(StartOffset); ReturnContainer.AddFunctionParameter(Evaluation); ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue1); return ReturnContainer; }