Code: Select all
' fxm - 09 Jan 2025
Sub split Overload(Byref s1 As String, Byref s2 As String, splits(Any) As String, byval skipEmptyElement As Integer = 0)
Dim As Any Ptr p1 = Cptr(Any Ptr Ptr, @S1)[0]
Dim As Integer l1 = Cptr(Integer Ptr, @S1)[1]
Dim As Integer l2 = Cptr(Integer Ptr, @s2)[1]
If l2 = 0 Then l2 = 1
Dim As integer i = Ubound(splits) + 1
Dim As Integer n, n0 = 1
Redim Preserve splits(Lbound(splits) To i + l1 / l2)
Do
n = Instr(n0, s1, s2)
If n > 0 Then
If (skipEmptyElement = 0) Orelse (n - n0) > 0 Then
Cptr(Any Ptr Ptr, @S1)[0] = p1 + n0 - 1
Cptr(Integer Ptr, @S1)[1] = n - n0
splits(i) = s1
Cptr(Any Ptr Ptr, @S1)[0] = p1
Cptr(Integer Ptr, @S1)[1] = l1
i += 1
End If
n0 = n + l2
Else
If (skipEmptyElement = 0) Orelse (l1 - n0 + 1) > 0 Then
Cptr(Any Ptr Ptr, @S1)[0] = p1 + n0 - 1
Cptr(Integer Ptr, @S1)[1] = l1 - n0 + 1
splits(i) = s1
Cptr(Any Ptr Ptr, @S1)[0] = p1
Cptr(Integer Ptr, @S1)[1] = l1
Else
i -= 1
End If
If i >= Lbound(splits) Then
Redim Preserve splits(Lbound(splits) To i)
Else
Erase splits
End If
Exit Do
End If
Loop
End Sub
Sub split Overload(Byref z1 As Zstring, Byref z2 As Zstring, splitsPtr(Any) As Zstring Ptr, byval skipEmptyElement As Integer = 0)
Dim As Zstring Ptr p1 = @z1
Dim As Integer l1 = Len(z1)
Dim As Integer l2 = Len(z2)
If l2 = 0 Then l2 = 1
Dim As integer i = Ubound(splitsPtr) + 1
Dim As Integer n, n0 = 1
Redim Preserve splitsPtr(Lbound(splitsPtr) To i + l1 / l2)
Do
n = Instr(n0, z1, z2)
If n > 0 Then
If (skipEmptyElement = 0) Orelse (n - n0) > 0 Then
Dim As Zstring Ptr p = p1 + n0 - 1
Dim As Integer l = n - n0
Dim As Zstring * 1 z
splitsPtr(i) = Callocate((l + 1) * Sizeof(Zstring))
Swap z[0], (*p)[l]
*splitsPtr(i) = *p
Swap z[0], (*p)[l]
i += 1
End If
n0 = n + l2
Else
If (skipEmptyElement = 0) Orelse (l1 - n0 + 1) > 0 Then
Dim As Zstring Ptr p = p1 + n0 - 1
Dim As Integer l = l1 - n0 + 1
splitsPtr(i) = Callocate((l + 1) * Sizeof(Zstring))
*splitsPtr(i) = *p
Else
i -= 1
End If
If i >= Lbound(splitsPtr) Then
Redim Preserve splitsPtr(Lbound(splitsPtr) To i)
Else
Erase splitsPtr
End If
Exit Do
End If
Loop
End Sub
Sub split Overload(Byref w1 As Wstring, Byref w2 As Wstring, splitsPtr(Any) As Wstring Ptr, byval skipEmptyElement As Integer = 0)
Dim As Wstring Ptr p1 = @w1
Dim As Integer l1 = Len(w1)
Dim As Integer l2 = Len(w2)
If l2 = 0 Then l2 = 1
Dim As integer i = Ubound(splitsPtr) + 1
Dim As Integer n, n0 = 1
Redim Preserve splitsPtr(Lbound(splitsPtr) To i + l1 / l2)
Do
n = Instr(n0, w1, w2)
If n > 0 Then
If (skipEmptyElement = 0) Orelse (n - n0) > 0 Then
Dim As Wstring Ptr p = p1 + n0 - 1
Dim As Integer l = n - n0
Dim As Wstring * 1 w
splitsPtr(i) = Callocate((l + 1) * Sizeof(Wstring))
Swap w[0], (*p)[l]
*splitsPtr(i) = *p
Swap w[0], (*p)[l]
i += 1
End If
n0 = n + l2
Else
If (skipEmptyElement = 0) Orelse (l1 - n0 + 1) > 0 Then
Dim As Wstring Ptr p = p1 + n0 - 1
Dim As Integer l = l1 - n0 + 1
splitsPtr(i) = Callocate((l + 1) * Sizeof(Wstring))
*splitsPtr(i) = *p
Else
i -= 1
End If
If i >= Lbound(splitsPtr) Then
Redim Preserve splitsPtr(Lbound(splitsPtr) To i)
Else
Erase splitsPtr
End If
Exit Do
End If
Loop
End Sub
Function join Overload(joins(Any) As String, Byref s As String, Byval skipEmptyElement As Integer = 0) As String
Dim As Integer lj = Lbound(joins)
Dim As Integer uj = Ubound(joins)
If uj < lj Then Return ""
Dim As Integer ls = Len(s)
Dim As Integer size
For i As Integer = lj to uj - 1
If Len(joins(i)) <> 0 Or skipEmptyElement = 0 Then size += Len(joins(i)) + ls
Next i
If Len(joins(uj)) <> 0 Or skipEmptyElement = 0 Then size += Len(joins(uj))
Dim As String so = String(size, Chr(0))
Dim As Integer n
For i As Integer = lj to uj - 1
If Len(joins(i)) <> 0 Or skipEmptyElement = 0 Then
fb_memcopy(so[n], joins(i)[0], Len(joins(i)))
n+= Len(joins(i))
fb_memcopy(so[n], s[0], ls)
n+= ls
End If
Next i
If Len(joins(uj)) <> 0 Or skipEmptyElement = 0 Then
fb_memcopy(so[n], joins(uj)[0], Len(joins(uj)))
Else
Cptr(Integer Ptr, @so)[1] = size - ls
End If
Return so
End Function
Function join Overload(joinsPtr(Any) As Zstring Ptr, Byref z As Zstring, Byval skipEmptyElement As Integer = 0) As Zstring Ptr
Dim As Integer lj = Lbound(joinsPtr)
Dim As Integer uj = Ubound(joinsPtr)
If uj < lj Then Return Callocate(Sizeof(Zstring))
Dim As Integer lenjoins(lj To uj)
Dim As Integer ls = Len(z)
Dim As Integer size
For i As Integer = lj to uj - 1
lenjoins(i) = Len(*joinsPtr(i))
If lenjoins(i) <> 0 Or skipEmptyElement = 0 Then size += lenjoins(i) + ls
Next i
lenjoins(uj) = Len(*joinsPtr(uj))
If lenjoins(uj) <> 0 Or skipEmptyElement = 0 Then size += lenjoins(uj)
Dim As Zstring Ptr zoPtr = Callocate((size + 1) * Sizeof(Zstring))
Dim As Integer n
For i As Integer = lj to uj - 1
If lenjoins(i) <> 0 Or skipEmptyElement = 0 Then
fb_memcopy((*zoPtr)[n], (*joinsPtr(i))[0], lenjoins(i) * Sizeof(Zstring))
n+= lenjoins(i)
fb_memcopy((*zoPtr)[n], z[0], ls * Sizeof(Zstring))
n+= ls
End If
Next i
If lenjoins(uj) <> 0 Or skipEmptyElement = 0 Then
fb_memcopy((*zoPtr)[n], (*joinsPtr(uj))[0], lenjoins(uj) * Sizeof(zstring))
Else
(*zoPtr)[size - ls] = 0
End If
Return zoPtr
End Function
Function join Overload(joinsPtr(Any) As Wstring Ptr, Byref w As Wstring, Byval skipEmptyElement As Integer = 0) As Wstring Ptr
Dim As Integer lj = Lbound(joinsPtr)
Dim As Integer uj = Ubound(joinsPtr)
If uj < lj Then Return Callocate(Sizeof(Wstring))
Dim As Integer lenjoins(lj To uj)
Dim As Integer ls = Len(w)
Dim As Integer size
For i As Integer = lj to uj - 1
lenjoins(i) = Len(*joinsPtr(i))
If lenjoins(i) <> 0 Or skipEmptyElement = 0 Then size += lenjoins(i) + ls
Next i
lenjoins(uj) = Len(*joinsPtr(uj))
If lenjoins(uj) <> 0 Or skipEmptyElement = 0 Then size += lenjoins(uj)
Dim As Wstring Ptr woPtr = Callocate((size + 1) * Sizeof(Wstring))
Dim As Integer n
For i As Integer = lj to uj - 1
If lenjoins(i) <> 0 Or skipEmptyElement = 0 Then
fb_memcopy((*woPtr)[n], (*joinsPtr(i))[0], lenjoins(i) * Sizeof(Wstring))
n+= lenjoins(i)
fb_memcopy((*woPtr)[n], w[0], ls * Sizeof(Wstring))
n+= ls
End If
Next i
If lenjoins(uj) <> 0 Or skipEmptyElement = 0 Then
fb_memcopy((*woPtr)[n], (*joinsPtr(uj))[0], lenjoins(uj) * Sizeof(Wstring))
Else
(*woPtr)[size - ls] = 0
End If
Return woPtr
End Function
Dim As String s0 = "reinvent|the|wheel|" & Chr(0) & "||in|optimized|pure|FreeBASIC|||:lol:||||"
Dim As String s1 = s0
Dim As String s2 = "|"
Dim As String splitsS(Any)
Print "string : '" & s1 & "'"
Print "delimiter: '" & s2 & "'"
Print
split(s1, s2, splitsS())
For i As Integer = 0 To Ubound(splitsS)
Print "s(" & i & ") '" & splitsS(i) & "'"
Next i
Print
Erase splitsS
split(s1, s2, splitsS(), 1)
For i As Integer = 0 To Ubound(splitsS)
Print "s(" & i & ") '" & splitsS(i) & "'"
Next i
Erase splitsS
If s1 <> s0 Then Print "Original string corrupted!"
Sleep
Print
Print "---------------------------------------------------------------------------"
Print
Dim As Zstring * 60 z0 = "reinvent|the|wheel||in|optimized|pure|FreeBASIC|||:lol:||||"
Dim As Zstring * 60 z1 = z0
Dim As zstring * 2 z2 = "|"
Dim As Zstring Ptr splitsPtrZ(Any)
Print "zstring : '" & z1 & "'"
Print "delimiter: '" & z2 & "'"
Print
split(z1, z2, splitsPtrZ())
For i As Integer = 0 To Ubound(splitsPtrZ)
Print "z(" & i & ") '" & *splitsPtrZ(i) & "'"
Deallocate(splitsPtrZ(i))
Next i
Print
Erase splitsPtrZ
split(z1, z2, splitsPtrZ(), 1)
For i As Integer = 0 To Ubound(splitsPtrZ)
Print "z(" & i & ") '" & *splitsPtrZ(i) & "'"
Deallocate(splitsPtrZ(i))
Next i
Erase splitsPtrZ
If z1 <> z0 Then Print "Original zstring corrupted!"
Sleep
Print
Print "---------------------------------------------------------------------------"
Print
Dim As Wstring * 60 w0 = "reinvent|the|wheel||in|optimized|pure|FreeBASIC|||:lol:||||"
Dim As Wstring * 60 w1 = w0
Dim As Wstring * 2 w2 = "|"
Dim As Wstring Ptr splitsPtrW(Any)
Print "wstring : '" & w1 & "'"
Print "delimiter: '" & w2 & "'"
Print
split(w1, w2, splitsPtrW())
For i As Integer = 0 To Ubound(splitsPtrW)
Print "w(" & i & ") '" & *splitsPtrW(i) & "'"
Deallocate(splitsPtrW(i))
Next i
Print
Erase splitsPtrW
split(w1, w2, splitsPtrW(), 1)
For i As Integer = 0 To Ubound(splitsPtrW)
Print "w(" & i & ") '" & *splitsPtrW(i) & "'"
Deallocate(splitsPtrW(i))
Next i
Erase splitsPtrW
If w1 <> w0 Then Print "Original wstring corrupted!"
Sleep
Print
Print "---------------------------------------------------------------------------"
Print
Dim As String joinsS(...) = {"reinvent", _
"the", _
"wheel", _
Chr(0), _
"", _
"in", _
"optimized", _
"pure", _
"FreeBASIC", _
"", _
"", _
":lol:", _
"", _
"", _
"", _
"" _
}
Dim As String s = "|"
For I As Integer = Lbound(joinsS) To Ubound(joinsS)
Print "s(" & i & ") '" & joinsS(I) & "'"
Next I
Print "delimiter '" & s & "'"
Print
Print "s: '" & join(joinsS(), s) & "'"
Print
Print "s: '" & join(joinsS(), s, 1) & "'"
Sleep
Print
Print "---------------------------------------------------------------------------"
Print
Dim As Zstring Ptr joinsPtrZ(...) = {@"reinvent", _
@"the", _
@"wheel", _
@"", _
@"", _
@"in", _
@"optimized", _
@"pure", _
@"FreeBASIC", _
@"", _
@"", _
@":lol:", _
@"", _
@"", _
@"", _
@"" _
}
Dim As Zstring * 2 z = "|"
For I As Integer = Lbound(joinsPtrZ) To Ubound(joinsPtrZ)
Print "z(" & i & ") '" & *joinsPtrZ(I) & "'"
Next I
Print "delimiter '" & z & "'"
Print
Dim As Zstring Ptr pz
pz = join(joinsPtrZ(), z)
Print "z: '" & *pz & "'"
Deallocate(pz)
Print
pz = join(joinsPtrZ(), z, 1)
Print "z: '" & *pz & "'"
Deallocate(pz)
Sleep
Print
Print "---------------------------------------------------------------------------"
Print
Dim As Wstring Ptr joinsPtrW(...) = {@Wstr("reinvent"), _
@Wstr("the"), _
@Wstr("wheel"), _
@Wstr(""), _
@Wstr(""), _
@Wstr("in"), _
@Wstr("optimized"), _
@Wstr("pure"), _
@Wstr("FreeBASIC"), _
@Wstr(""), _
@Wstr(""), _
@Wstr(":lol:"), _
@Wstr(""), _
@Wstr(""), _
@Wstr(""), _
@Wstr("") _
}
Dim As Wstring * 2 w = "|"
For I As Integer = Lbound(joinsPtrW) To Ubound(joinsPtrW)
Print "w(" & i & ") '" & *joinsPtrW(I) & "'"
Next I
Print "delimiter '" & w & "'"
Print
Dim As Wstring Ptr pw
pw = join(joinsPtrW(), w)
Print "w: '" & *pw & "'"
Deallocate(pw)
Print
pw = join(joinsPtrW(), w, 1)
Print "w: '" & *pw & "'"
Deallocate(pw)
Sleep
Print