Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Faststring.dll
Message
De
06/07/2020 13:51:45
 
Information générale
Forum:
Visual FoxPro
Catégorie:
Produits tierce partie
Titre:
Divers
Thread ID:
01674989
Message ID:
01675117
Vues:
164
J'aime (1)
I have adapted your code for a replacement to the STREXTRACT function which is considerably faster for large strings (I am parsing the XML files for a XLSX file):
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
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform