Public Function Replicate10(ByVal lNumber&, sPattern$) As String
' by Marzo Junior, marzojr@taskmail.com.br, 20020527
' Based on Replicate09 by by Mike Peterson, mpeterson1200@yahoo.com, 20010910
If lNumber > 0 Then
Dim i&, lPointer&
lPointer = Len(sPattern)
Select Case lPointer
Case Is > 1
'Contrary to Mike's code, we NEED to do this here:
'Allocate String Buffer
Replicate10 = StringHelpers.SysAllocStringLen(ByVal 0&, lNumber * lPointer)
'Check the highest bit for the While...Wend loop bellow, as well
'as if there is any leftover that needs recursion. We use lNumber
'to store the remainder, as it is one less variable. This is why
'we had to allocate the string buffer above.
If lNumber And &H7FFFFF00 Then
If lNumber And &H7FFF0000 Then
If lNumber And &H40000000 Then
lNumber = lNumber Xor &H40000000
i = 30
ElseIf lNumber And &H20000000 Then
lNumber = lNumber Xor &H20000000
i = 29
ElseIf lNumber And &H10000000 Then
lNumber = lNumber Xor &H10000000
i = 28
ElseIf lNumber And &H8000000 Then
lNumber = lNumber Xor &H8000000
i = 27
ElseIf lNumber And &H4000000 Then
lNumber = lNumber Xor &H4000000
i = 26
ElseIf lNumber And &H2000000 Then
lNumber = lNumber Xor &H2000000
i = 25
ElseIf lNumber And &H1000000 Then
lNumber = lNumber Xor &H1000000
i = 24
ElseIf lNumber And &H800000 Then
lNumber = lNumber Xor &H800000
i = 23
ElseIf lNumber And &H400000 Then
lNumber = lNumber Xor &H400000
i = 22
ElseIf lNumber And &H200000 Then
lNumber = lNumber Xor &H200000
i = 21
ElseIf lNumber And &H100000 Then
lNumber = lNumber Xor &H100000
i = 20
ElseIf lNumber And &H80000 Then
lNumber = lNumber Xor &H80000
i = 19
ElseIf lNumber And &H40000 Then
lNumber = lNumber Xor &H40000
i = 18
ElseIf lNumber And &H20000 Then
lNumber = lNumber Xor &H20000
i = 17
ElseIf lNumber And &H10000 Then
lNumber = lNumber Xor &H10000
i = 16
End If
Else
If lNumber And &H8000& Then
lNumber = lNumber Xor &H8000&
i = 15
ElseIf lNumber And &H4000& Then
lNumber = lNumber Xor &H4000&
i = 14
ElseIf lNumber And &H2000& Then
lNumber = lNumber Xor &H2000&
i = 13
ElseIf lNumber And &H1000& Then
lNumber = lNumber Xor &H1000&
i = 12
ElseIf lNumber And &H800& Then
lNumber = lNumber Xor &H800&
i = 11
ElseIf lNumber And &H400& Then
lNumber = lNumber Xor &H400&
i = 10
ElseIf lNumber And &H200& Then
lNumber = lNumber Xor &H200&
i = 9
ElseIf lNumber And &H100& Then
lNumber = lNumber Xor &H100&
i = 8
End If
End If
Else
If lNumber And &H80& Then
lNumber = lNumber Xor &H80&
i = 7
ElseIf lNumber And &H40& Then
lNumber = lNumber Xor &H40&
i = 6
ElseIf lNumber And &H20& Then
lNumber = lNumber Xor &H20&
i = 5
ElseIf lNumber And &H10& Then
lNumber = lNumber Xor &H10&
i = 4
ElseIf lNumber And &H8& Then
lNumber = lNumber Xor &H8&
i = 3
ElseIf lNumber And &H4& Then
lNumber = lNumber Xor &H4&
i = 2
ElseIf lNumber And &H2& Then
lNumber = lNumber Xor &H2&
i = 1
Else
lNumber = 0
'The following is not needed:
'i = 0
End If
End If
'Store the pointer:
Dim lptr As Long
lptr = StrPtr(Replicate10)
lPointer = lPointer * 2& '** Unicode=2 bytes
'Do first CopyMem
kernel.MoveMemoryFromStr ByVal lptr, sPattern, ByVal lPointer
'Here we decrease i until it reaches 1, while in the original,
'Mike increased i until 2^i <= lNumber. It is easy to see why
'this way is much faster.
While i > 0
kernel.MoveMemoryFromStr ByVal lptr + lPointer, Replicate10, ByVal lPointer
lPointer = lPointer + lPointer: i = i - 1
Wend
'If lNumber was not a power of 2, we'll have to recursively catch the rest.
If lNumber Then
Dim s$
s = Replicate10(lNumber, sPattern) 'Recursion...
'Last CopyMem
kernel.MoveMemoryFromStr ByVal lptr + lPointer, s, ByVal LenB(s)
End If
Case 1
Replicate10 = String$(lNumber, sPattern)
End Select
End If
End Function