I added handling for the null char to work like ReplaceString(String$, " ", ""), to remove the searched character, here remove all space
If prefered instead of ReplaceString!
Code: Select all
; ReplaceChar() with the null char behaves differently than ReplaceString(), it truncates the string rather than deleting the searched character and we need PeeKS() just after to reset the lenght
Procedure ReplaceChar(*String.Character, CharToSearch.c, CharToReplace.c)
If *String = 0 Or CharToSearch = 0
ProcedureReturn
EndIf
While *String\c
If *String\c = CharToSearch
*String\c = CharToReplace
EndIf
*String + SizeOf(Character)
Wend
EndProcedure
; ReplaceCharNew() with Cthe null char need PeeKS() just after to reset the lenght
Procedure ReplaceCharNew(*String.Character, CharToSearch.c, CharToReplace.c)
If *String = 0 Or CharToSearch = 0
ProcedureReturn
EndIf
;ShowMemoryViewer(*String, (MemoryStringLength(*String) +1) * SizeOf(Character))
While *String\c
If *String\c = CharToSearch
If CharToReplace
*String\c = CharToReplace
Else
MoveMemory(*String + SizeOf(Character), *String, MemoryStringLength(*String) * SizeOf(Character))
Continue
EndIf
EndIf
*String + SizeOf(Character)
Wend
EndProcedure
; Warning: It is not recommended to use this hack to calculate the correct size, without an official guarantee that there will not be future changes to this prefix ♥;)
Procedure ReplaceCharNewLen(*String.Character, CharToSearch.c, CharToReplace.c)
If *String = 0 Or CharToSearch = 0
ProcedureReturn
EndIf
Protected *Len.integer = *String - SizeOf(Integer)
*Len\i = 0
;ShowMemoryViewer(*String, (MemoryStringLength(*String) +1) * SizeOf(Character))
While *String\c
If *String\c = CharToSearch
If CharToReplace
*String\c = CharToReplace
Else
MoveMemory(*String + SizeOf(Character), *String, MemoryStringLength(*String) * SizeOf(Character))
Continue
EndIf
EndIf
*Len\i + 1
*String + SizeOf(Character)
Wend
EndProcedure
Define String$, Start, I
OpenConsole()
String$ = "Hello World !"
String$ = ReplaceString(String$, " ", Chr(0))
PrintN("ReplaceString(): " +#TAB$+ String$ + " - Len(" + Len(String$) + ")")
String$ = "Hello World !"
ReplaceChar(@String$, ' ', '')
;PrintN("ReplaceChar(): " +#TAB$+ String$ + " - Len(" + Len(String$) + ")") ; UnComment to see the mess if done before PeekS()!
String$ = PeekS(@String$)
PrintN("ReplaceChar(): " +#TAB$+#TAB$+ String$ + " - Len(" + Len(String$) + ")")
String$ = "Hello World !"
ReplaceCharNew(@String$, ' ', '')
;PrintN("ReplaceCharNew(): " +#TAB$+ String$ + " - Len(" + Len(String$) + ")") ; UnComment to see the mess if done before PeekS()!
String$ = PeekS(@String$)
PrintN("ReplaceCharNew(): " +#TAB$+ String$ + " - Len(" + Len(String$) + ")")
String$ = "Hello World !"
ReplaceCharNewLen(@String$, ' ', '')
PrintN("ReplaceCharNewLen(): " +#TAB$+ String$ + " - Len(" + Len(String$) + ")")
CompilerIf Not #PB_Compiler_Debugger
PrintN("")
Start = ElapsedMilliseconds()
For I = 1 To 200000
String$ = "Hello World !"
String$ = ReplaceString(String$, " ", "")
Next
PrintN("ReplaceString(): " +#TAB$+ Str(ElapsedMilliseconds() - Start) + " ms")
Start = ElapsedMilliseconds()
For I = 1 To 200000
String$ = "Hello World !"
ReplaceChar(@String$, ' ', '')
String$ = PeekS(@String$)
Next
PrintN("ReplaceChar(): " +#TAB$+#TAB$+ Str(ElapsedMilliseconds() - Start) + " ms")
Start = ElapsedMilliseconds()
For I = 1 To 200000
String$ = "Hello World !"
ReplaceCharNew(@String$, ' ', '')
String$ = PeekS(@String$)
Next
PrintN("ReplaceCharNew(): " +#TAB$+ Str(ElapsedMilliseconds() - Start) + " ms")
Start = ElapsedMilliseconds()
For I = 1 To 200000
String$ = "Hello World !"
ReplaceCharNewLen(@String$, ' ', '')
Next
PrintN("ReplaceCharNewLen(): " +#TAB$+ Str(ElapsedMilliseconds() - Start) + " ms")
CompilerEndIf
PrintN("")
PrintN("Presses the Return key to Close")
Input()