
Now this is not a doomsday scenario, but still very amazing.

Code: Select all
EnableExplicit
Procedure.s StringField_BF(string$, index, separator$)
; StringField - By Saki - Unicode - This code is free for using and enhancing
Protected i, ii, comp, result$
Protected len_string=(StringByteLength(string$))
Protected len_separator=StringByteLength(separator$)
Dim index(len_string)
Protected *string=@string$
Protected *separator=@separator$
If comp=CompareMemory(@string$, @separator$, len_separator)
Protected jump_in=1 : i=-2 : index+1
EndIf
Repeat
comp=CompareMemory(@string$+i, @separator$, len_separator)
If comp Or jump_in : jump_in=0 : ii+1 : index(ii)=i+2 : i+len_separator-2 : index(0)+1 : EndIf : i+2
Until i>len_string-len_separator
index(0)=ii : i=0
If index(0)
Repeat
If index(i)
If index(i+1)-index(i)>0
result$=Space((index(i+1)-index(i))/2-len_separator/2)
CopyMemory(@string$+index(i)+len_separator-2, @result$, index(i+1)-index(i)-len_separator)
If i=index : ProcedureReturn result$ : EndIf
EndIf
EndIf
i+1
Until i=index(0)
EndIf
EndProcedure
Define separator$="*"
Define index, result$, string$
string$="*Hello*I*am*a*splitted*string*"
Define multiplier=15
Define i
For i=1 To multiplier
string$+string$
Next i
Debug Len(string$)
Define time=ElapsedMilliseconds()
For index=1 To 6*multiplier
result$=StringField_BF(string$, index, separator$)
If result$<>"" : Debug result$ : EndIf
Next
MessageRequester("", Str(ElapsedMilliseconds()-time))
Code: Select all
Protected Dim index.l(len_string)
Code: Select all
EnableExplicit
Procedure.s StringField_BF(string$, index, separator$)
; StringField - By Saki - Unicode - This code is free for using and enhancing
Protected i, ii, comp, result$
Protected len_string=(StringByteLength(string$))
Protected len_separator=StringByteLength(separator$)
Dim index(len_string)
; -------------------------
Protected *string__2
Protected *separator__2
CompilerSelect 0
CompilerCase 0
;Protected *string
;Protected *separator
CompilerCase 1
Protected *string
Protected *separator
CompilerCase 2
Protected *string = 0
Protected *separator = 0
CompilerCase 3
Protected *string = @string$
Protected *separator = @separator$
CompilerCase 4
*string__2 = @string$
*separator__2 = @separator$
CompilerCase 5
Protected *string
Protected *separator
If index = -99 ; false runtime check, not compiler-elidable (my guess)
*string = @string$
*separator = @separator$
EndIf
CompilerEndSelect
; -------------------------
If comp=CompareMemory(@string$, @separator$, len_separator)
Protected jump_in=1 : i=-2 : index+1
EndIf
Repeat
comp=CompareMemory(@string$+i, @separator$, len_separator)
If comp Or jump_in : jump_in=0 : ii+1 : index(ii)=i+2 : i+len_separator-2 : index(0)+1 : EndIf : i+2
Until i>len_string-len_separator
index(0)=ii : i=0
If index(0)
Repeat
If index(i)
If index(i+1)-index(i)>0
result$=Space((index(i+1)-index(i))/2-len_separator/2)
CopyMemory(@string$+index(i)+len_separator-2, @result$, index(i+1)-index(i)-len_separator)
If i=index : ProcedureReturn result$ : EndIf
EndIf
EndIf
i+1
Until i=index(0)
EndIf
EndProcedure
Define separator$="*"
Define index, result$, string$
string$="*Hello*I*am*a*splitted*string*"
Define multiplier=15
Define i
For i=1 To multiplier
string$+string$
Next i
Debug Len(string$)
Define time=ElapsedMilliseconds()
For index=1 To 6*multiplier
result$=StringField_BF(string$, index, separator$)
If result$<>"" : Debug result$ : EndIf
Next
MessageRequester("", Str(ElapsedMilliseconds()-time))
Code: Select all
; with the two lines
452
436
420
419
422
avg=429,8 ms
; without the two lines
433
437
438
433
430
avg=434,2 ms