/// <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); }
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; }
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 result = false; 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) { result = true; Evaluation.SubEvaluate((ObjectAttributeEvaluation)ret.GetFunctionParameterByName("ParseCount")); } } if (result) { ReturnContainer.AddFunctionParameter((ObjectAttribute)Evaluation); ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue1); return ReturnContainer; } ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue0); return ReturnContainer; }
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 = new ObjectAttributeEvaluation(); Evaluation.SetAttributeName("ParseCount"); if (!CheckCurrentObject(ref lObjectInterface)) { ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue0); return ReturnContainer; } if (cParserPrimitives.Count == 0) { if (cCallback != null && CallCalback) cCallback(lObjectInterface); ReturnContainer.AddFunctionParameter((ObjectAttribute)Evaluation); ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue1); return ReturnContainer; } //Here we preset next primitives for (int x = 0; x < cParserPrimitives.Count-1; x++) { cParserPrimitives[x].SetNextPrimitive(cParserPrimitives[x + 1]); } ObjectInterfacePrototipe SubObjects= lObjectInterface.GetSubObjects(); SubObjects.GetFirstObject(); ObjectAttributeEvaluation ParseCountEvaluation = new ObjectAttributeEvaluation( EvaluationMode.Max, 1, 100000000); for( int x=0; x< cParserPrimitives.Count; x++ ) { ParserPrimitives tPrimitives; if (cParserPrimitives.Count == x + 1) tPrimitives = null; else tPrimitives = cParserPrimitives[x + 1]; FunctionIO ret = cParserPrimitives[x].CheckRelations(ref SubObjects, tPrimitives, CallCalback); if (((ObjectAttributeInt)ret.GetFunctionParameterByName("ret")).GetAttributeValue() != 1) { ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue0); return ReturnContainer; } SubObjects.GetOffsetObject(((ObjectAttributeEvaluation)ret.GetFunctionParameterByName("ParseCount")).GetEvaluationValue()); } if (cCallback != null && CallCalback) cCallback(lObjectInterface); ReturnContainer.AddFunctionParameter((ObjectAttribute)Evaluation); ReturnContainer.AddFunctionParameter((ObjectAttribute)ReturnValue1); return ReturnContainer; }