Support Statement: add a gmSL routine to a translation script

Simple Sample

To declare a method, test, add it to a gmSL block:

<gmSL namespace="gmSL" class="gm"><[CDATA[[
void test(string arg1)
{
        System.LogMessage("Here i am: " + arg1);
}
]]></gmsl>

To run a method, invoke it with a RunCommand statement, using a gm. prefix. For example:

<RunCommand id="test" Prams="Mark" />

Custom Source Inspection

Another example – pre-inspection of a file:

   <Load Project="%SrcPath%" SourceCode="on" />
   
   <gmSL namespace="gmSL" class="gm"><[CDATA[[
   void InspectCode()
   {
      int       levels(19);
      int       iRoot;
      tInfoFile formFile;
      Text      textStream;
      int       nRecord;
      int       curRecord;
      int       length = 0;
      int       rai = 0;
      string    record;
      string    token;
      int       lexeme;

      for(iRoot = Store.FindFirstChild(levels,0); iRoot != 0; iRoot = Store.FindNextChild(levels))
      {         
         if(Store.GetObjectType(iRoot) != ObjectType.FormFile) continue;
         string name = Symbol.FullName(iRoot,0);
         System.LogMessage("name=" + name);
         
         formFile = Store.GetVector(iRoot);
         if(formFile.textBase == 0) continue;
         System.LogMessage("formFile.textBase=" + formFile.textBase);
         
         textStream = Text.Open(Store.GetHandle(),formFile.textBase);
         System.LogMessage("textStream=" + textStream);

         nRecord = Text.Maximum(textStream);
         curRecord = 0;
         while(curRecord < nRecord)
         {
            curRecord = curRecord + 1;
            Text.Position(textStream,curRecord);
            record = Text.Access(textStream, length, rai, 0);
            if(length < 10) continue;
            Parser.SetStatement(record);
            token = Parser.GetToken(lexeme);
            if(token == "Attribute") break;
            if(token != "Begin") continue;
            token = Parser.GetToken(lexeme);
            if(token != "MSComctlLib") continue;
            System.LogMessage("record=" + record);
            while(lexeme>0)
            {
               System.LogMessage("  token=[" + token + "] lexeme=" + lexeme);
               token = Parser.GetToken(lexeme);
            }   
         }
         Text.Close(textStream);
      }
   }
]]></gmsl>
   <RunCommand id="InspectCode"  />
 
	<Compile...>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Translation Log: C:\gmSamples\NewSamples\FileExplorerAPI\proj_csh\log\FileExplorer_csh-FileExplorer-gms-csh.TRAN.log
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Basic Processor V30.76(07/18/18) System Build(07/18/18 5:26:53)
Processing file: C:\gmSamples\NewSamples\FileExplorerAPI\src\FileExplorer.vbp
Reprocessing file: gm.cls
Reprocessing file: gm.cls
name=frmExploreLite.frm
formFile.textBase=3838
textStream=4
record=   Begin MSComctlLib.Toolbar Toolbar1
  token=[MSComctlLib] lexeme=2
  token=[.] lexeme=1
  token=[Toolbar] lexeme=2
  token=[Toolbar1] lexeme=2
record=   Begin MSComctlLib.ImageList ilSmall
  token=[MSComctlLib] lexeme=2
  token=[.] lexeme=1
  token=[ImageList] lexeme=2
  token=[ilSmall] lexeme=2
record=   Begin MSComctlLib.ImageList ilMain
  token=[MSComctlLib] lexeme=2
  token=[.] lexeme=1
  token=[ImageList] lexeme=2
  token=[ilMain] lexeme=2
record=   Begin MSComctlLib.ListView lvListView
  token=[MSComctlLib] lexeme=2
  token=[.] lexeme=1
  token=[ListView] lexeme=2
  token=[lvListView] lexeme=2
record=   Begin MSComctlLib.TreeView tvTreeView
  token=[MSComctlLib] lexeme=2
  token=[.] lexeme=1
  token=[TreeView] lexeme=2
  token=[tvTreeView] lexeme=2
record=   Begin MSComctlLib.StatusBar sbStatusBar
  token=[MSComctlLib] lexeme=2
  token=[.] lexeme=1
  token=[StatusBar] lexeme=2
  token=[sbStatusBar] lexeme=2
...
Translation Time (sec) = 0.25

Custom Source Edit

Here is an example that edits files: adding a comment to lines in form files ending with ':'

<ScriptRules>
<ScriptRule id="PreEditor" Condition="%TaskTag% AND %SrcName%=='upg AND FileExplorer'">
<Option>
   <Load Project="%SrcPath%" SourceCode="on" />
    
   <gmSL namespace="gmSL" class="gm"><[CDATA[[
   void InspectCode()
   {
      int       levels(19);
      int       iRoot;
      tInfoFile formFile;
      Text      textStream;
      int       nRecord;
      int       curRecord;
      int       length = 0;
      int       rai = 0;
      string    record;
      string    token;
      int       lexeme;
 
      for(iRoot = Store.FindFirstChild(levels,0); iRoot != 0; iRoot = Store.FindNextChild(levels))
      {        
         if(Store.GetObjectType(iRoot) != ObjectType.FormFile) continue;
         string name = Symbol.FullName(iRoot,0);
         System.LogMessage("name=" + name);
          
         formFile = Store.GetVector(iRoot);
         if(formFile.textBase == 0) continue;
         System.LogMessage("formFile.textBase=" + formFile.textBase);
          
         textStream = Text.Open(Store.GetHandle(),formFile.textBase);
         System.LogMessage("textStream=" + textStream);
 
         // sample code changes lines ending with ":" to lines ending with ": 'TEST"
         nRecord = Text.Maximum(textStream);
         curRecord = 0;
         while(curRecord < nRecord)
         {
            curRecord = curRecord + 1;
            Text.Position(textStream,curRecord);
            record = Text.Access(textStream, length, rai, 0);
            
            if(length < 2) continue;
            string last = Character.SubStr(record,length-1,1);
            string colon = ":"; // if statement has issues with ":"
            if (last==colon) 
            {
               // Inserts a record after the current record and sets Position to new record
               Text.Insert(textStream,record + " ' TEST");
               // reset position to original record
               Text.Position(textStream,curRecord);
               // delete original record
               Text.Delete(textStream,curRecord);
               continue;
            }
         }
         Text.Close(textStream);
      }
   }
   ]]></gmsl>
 
   <RunCommand id="InspectCode"  />
</Option>
</ScriptRule>
</ScriptRules>

add to script with

   <ScriptRule id="PreEditor" fileName="PreEditor.Rules.xml" />
   
   <Compile Resx="%ResxFolder%" />