Support Statement: Apply PreEdits using gmsl

Q: How can I reproduce this PreEdit using gmsl?

   <Replace>
   <OldBlock><![CDATA[If (Ctrl = vbChecked) Then]]></OldBlock>
   <NewBlock><![CDATA[If (Ctrl.Value = vbChecked) Then]]></NewBlock>
   </Replace>


A: The PreEditor is optimized for speed and ease of use, however it has a few limitations so in certain special cases a custom gmSL preEditor may be desired.  The following example shows how this may be done.

1) Prepare an ServiceMethod_EditSource Handler in a gmSL script:

PreEdit.gmsl
int ServiceMethod_EditSource(int fileRoot)
{
   tInfoFile   fileInfo;
   Handle      textStream;
   int         rai;
   int         length;
   string      record;  
   int         nRecord;
   int         curRecord;
   int         iPos;

   fileInfo = Store.GetVector(fileRoot);
   if(fileInfo.textBase == 0) return 0;
   textStream = Text.Open(Store.GetHandle(),fileInfo.textBase);
   nRecord = Text.Maximum(textStream);
   curRecord = 0;
   while(curRecord < nRecord)
   {
      curRecord = curRecord + 1;
      Text.Position(textStream,curRecord);
      record = Text.Access(textStream, length, rai, 0);
      int curLen = sizeof(record);
      System.LogMessage(curRecord + "] " + curLen + ":  " + record);
      if(length < 27) continue;
      iPos = Character.FindFirst(record, 0, "If (Ctrl = vbChecked) Then");
      if(iPos == 0) continue;
      if(Select.Progress) System.LogMessage("Found 'If (Ctrl = vbChecked) Then' in <" + Store.GetIdent(fileRoot) + "> Record = " + curRecord);
      iPos = Character.FindFirst(record, 0, "Ctrl");
      record = Character.Insert(record, iPos+3, ".Value");
      if(Select.Progress) System.LogMessage("Fixed : " + record);
      Text.Position(textStream,curRecord);
      Text.Delete(textStream);
      Text.Position(textStream,curRecord - 1);
      Text.Insert(textStream, record);
   }
   Text.Close(textStream);
   return 1;
}


Then  hook the handler to a custom migration event prior to the compile:

<gmBasic>
...
<Refactor event="CSH">
   <gmSL NameSpace="CSH" Class="ServiceMethods" Source="..\usr\PreEdits.gmsl" />
</Refactor>
<Compile Project="%SrcPath%" >
</Compile>
...
</gmBasic>