Split Funktion
Verfasst: 23.03.2009 15:26
UPDATE: Funktion teilweise geaendert
Parameter:
String = Der zu splittende String natuerlich
Delims = Ein String mit allen Delimitern die nicht erhalten bleiben sollen
KeptDelims = Ein String mit den Delimitern die erhalten bleiben sollen
Results = Eine (String) LinkedList in die die Tokens gespeichert werden sollen
Rueckgabewert: Anzahl der gefundenen Ergebnisse
Noch kurz zu den Delimitern:
Die normalen Delims markieren einfach das Ende eines Tokens und werden
dann ignoriert (uebersprungen). Die "KeptDelims" machen das gleiche, werden
aber danach mit in die Liste der Ergebnisse eingefuegt.
Parameter:
String = Der zu splittende String natuerlich
Delims = Ein String mit allen Delimitern die nicht erhalten bleiben sollen
KeptDelims = Ein String mit den Delimitern die erhalten bleiben sollen
Results = Eine (String) LinkedList in die die Tokens gespeichert werden sollen
Rueckgabewert: Anzahl der gefundenen Ergebnisse
Noch kurz zu den Delimitern:
Die normalen Delims markieren einfach das Ende eines Tokens und werden
dann ignoriert (uebersprungen). Die "KeptDelims" machen das gleiche, werden
aber danach mit in die Liste der Ergebnisse eingefuegt.
Code: Alles auswählen
;Split function
;March 2009
;Milan Schoemig
EnableExplicit
Procedure Split(String.s, Delims.s, KeptDelims.s, List Results.s())
Protected Buffer.s = ""
Protected BufferLen = 0
Protected IsDelim = 0
Protected *Ptr.Character = @String
Protected *Delimiter.Character = 0
Protected DelimToAdd.c = 0
While *Ptr\c
*Delimiter = @Delims
While *Delimiter\c
If *Delimiter\c = *Ptr\c
IsDelim = 1
Goto Skip
EndIf
*Delimiter + SizeOf(Character)
Wend
*Delimiter = @KeptDelims
If IsDelim = 0
While *Delimiter\c
If *Delimiter\c = *Ptr\c
IsDelim = 1
DelimToAdd = *Delimiter\c
Break
EndIf
*Delimiter + SizeOf(Character)
Wend
EndIf
Skip:
If IsDelim
If BufferLen
AddElement(Results())
Results() = Buffer
Buffer = ""
BufferLen = 0
EndIf
If DelimToAdd
AddElement(Results())
Results() = Chr(DelimToAdd)
DelimToAdd = 0
EndIf
IsDelim = 0
Else
Buffer + Chr(*Ptr\c)
BufferLen + 1
EndIf
*Ptr + SizeOf(Character)
Wend
If BufferLen
AddElement(Results())
Results() = Buffer
EndIf
ProcedureReturn ListSize(Results())
EndProcedure
;Tests
;=============================================================
Define teststr.s = "This is a test, that ensures the proper functionality of this beast. bla bla bla..."
Define delimiters.s = " "
Define keptdelimiters.s = ",."
NewList results.s()
Split(teststr, delimiters, keptdelimiters, results())
ForEach results()
Debug results()
Next