| Quintiq file version 2.0 | 
| #parent: #root | 
| Method PTF_ValidateLoop ( | 
|   String script | 
| ) as String id:Method_LibPTF_dlgCreateEditTestScript_PTF_ValidateLoop | 
| { | 
|   #keys: '[104342.0.868898838]' | 
|   Body: | 
|   [* | 
|     // Validate the loop statements in the script - if there is equal match of Loop to EndLoop statement | 
|     regnumber             := 0; | 
|     loopindex             := 0; | 
|     largestregnum         := 0; | 
|     linenr                := 0; | 
|     startfindendloopindex := 0; | 
|     loopwithoutendloop    := false; | 
|     loopidentifier        := ""; | 
|     errormsg              := ""; | 
|     keywordloop           := LibPTF_StandardAction::Loop(); | 
|     keywordendloop        := LibPTF_StandardAction::EndLoop(); | 
|      | 
|     // Create identifier of each Loop | 
|     while( script.NrOccurrences( keywordloop + " ", 0, true ) > 0 ) | 
|     { | 
|       regnumber++; | 
|      | 
|       loopindex := script.FindString( keywordloop + " ", loopindex ); | 
|       script    := script.Insert( loopindex + keywordloop.Length(), [String]regnumber ); | 
|     } | 
|      | 
|     largestregnum := regnumber; | 
|      | 
|     // Create identifier of its corresponding EndLoop | 
|     while( regnumber > 0 ) | 
|     { | 
|       loopindex    := script.FindString( keywordloop + [String]regnumber, 0 ); | 
|       endloopindex := script.FindString( keywordendloop + ";", loopindex ); | 
|      | 
|       if( endloopindex <> -1 ) | 
|       { | 
|         script := script.Insert( endloopindex + keywordendloop.Length(), [String]regnumber ); | 
|       } | 
|       regnumber--; | 
|     } | 
|      | 
|     // Check if all Loop has its corresponding EndLoop | 
|     while( largestregnum > 0 and not loopwithoutendloop ) | 
|     { | 
|       loopidentifier        := keywordloop + [String]largestregnum; | 
|       startfindendloopindex := script.FindString( loopidentifier, 0 ) | 
|       loopwithoutendloop    := script.FindString( keywordendloop + [String]largestregnum + ";", startfindendloopindex ) = -1; | 
|      | 
|       largestregnum--; | 
|     } | 
|      | 
|     // If Loop without EndLoop found, construct error message | 
|     if( loopwithoutendloop ) | 
|     { | 
|       // Get information about the problematic loop | 
|       loopendofline := script.FindString( ";", startfindendloopindex ); | 
|       loopline      := script.SubString( startfindendloopindex, loopendofline - startfindendloopindex ); | 
|       iterationnr   := loopline.ReplaceAll( loopidentifier, "" ); | 
|      | 
|       scriptprior := script.SubString( 0, startfindendloopindex ); | 
|       linenr      := scriptprior.NrOccurrences( String::NewLine(), 0, true ) + 1; | 
|      | 
|       errormsg := "Line #" + [String]linenr + ": " + keywordloop + iterationnr + " without " + keywordendloop; | 
|     } | 
|     else | 
|     { | 
|       // Check if EndLoop without Loop found | 
|       endloopwithoutregnum := keywordendloop + ";"; | 
|       if( script.FindString( endloopwithoutregnum, 0 ) <> -1 ) | 
|       { | 
|         scriptprior := script.SubString( 0, script.FindString( keywordendloop + ";", 0 ) ); | 
|         linenr      := scriptprior.NrOccurrences( String::NewLine(), 0, true ) + 1; | 
|      | 
|         errormsg := "Line #" + [String]linenr + ": " + keywordendloop + " without " + keywordloop; | 
|       } | 
|     } | 
|      | 
|     return errormsg; | 
|   *] | 
| } |