FOR lnEnd= toString.BaseAdr-1+m.lnBeg+m.lnBegLen TO toString.BaseAdr-1+toString.Length lcVal = SYS(2600, m.lnEnd, lnEndLen)calculation is unrolled into the loop variable, but this changes lnBeg used in outer while.
>LOCAL lcDrawingXML, lcBegDelimiter, lcEndDelimiter, loDrawingXML, lnSecs >lcDrawingXML = FILETOSTR('drawing1.xml') > >DECLARE INTEGER HeapAlloc IN Win32Api AS apiHeapAlloc INTEGER, INTEGER, INTEGER >DECLARE INTEGER HeapFree IN Win32APi AS apiHeapFree INTEGER, INTEGER, INTEGER >DECLARE LONG GetProcessHeap IN Win32API AS apiGetProcessHeap > >lcBegDelimiter = "<xdr:twoCellAnchor>" >lcEndDelimiter = "</xdr:twoCellAnchor>" > > >loDrawingXML = fAddStringToHeap(lcDrawingXML) > >lnSecs = SECONDS() >lcTwoCellAnchor = fStrExtract(loDrawingXML, lcBegDelimiter, lcEndDelimiter, 1) >? "SYS(2600): " + TRANSFORM(SECONDS() - lnSecs) >_CLIPTEXT = lcTwoCellAnchor > >SET STEP ON > >lnSecs = SECONDS() >lcTwoCellAnchor = fStrExtract(loDrawingXML, lcBegDelimiter, lcEndDelimiter, 2000) >? "SYS(2600): " + TRANSFORM(SECONDS() - lnSecs) >_CLIPTEXT = lcTwoCellAnchor > >SET STEP ON > >loDrawingXML = fReleaseStringFromHeap(loDrawingXML) > > > >FUNCTION fAddStringToHeap >LPARAMETERS tcString >LOCAL loString >loString = CREATEOBJECT("Empty") >ADDPROPERTY(loString, "Length", 0) >ADDPROPERTY(loString, "BaseAdr", 0) >loString.Length = LEN(tcString) >loString.BaseAdr = apiHeapAlloc(apiGetProcessHeap(), 0, loString.Length) >SYS(2600, loString.BaseAdr, loString.Length, tcString) >RETURN loString >ENDFUNC > > > >FUNCTION fStrExtract >LPARAMETERS toString, tcBegDelimiter, tcEndDelimiter, tnOccurance >LOCAL lnBeg, lcVal, lnEnd, lnBegLen, lnEndLen, lcStrExtract >lnBegLen = LEN(tcBegDelimiter) >lnEndLen = LEN(tcEndDelimiter) >lnOccurance = 0 >lcStrExtract = "" >lnBeg = 1 >DO WHILE lnBeg < toString.Length > lcVal = SYS(2600, toString.BaseAdr-1 + lnBeg, lnBegLen) > IF lcVal == tcBegDelimiter > FOR lnEnd=lnBeg+lnBegLen TO toString.Length > lcVal = SYS(2600, toString.BaseAdr-1 + lnEnd, lnEndLen) > IF lcVal == tcEndDelimiter > lnOccurance = lnOccurance + 1 > IF lnOccurance = tnOccurance > RETURN SYS(2600, toString.BaseAdr-1 + lnBeg, lnEnd - lnBeg + lnBegLen + 1) > ENDIF > lnBeg = lnEnd - 1 > EXIT > ENDIF > ENDFOR > ENDIF > lnBeg = lnBeg + 1 >ENDDO >RETURN lcStrExtract >ENDFUNC > > >FUNCTION fReleaseStringFromHeap >LPARAMETERS toString >apiHeapFree(apiGetProcessHeap(), 0, toString.BaseAdr) >RETURN .NULL. >ENDFUNC >