Code: Select all
;/ ==========================
;/ = ToolsModule.pbi =
;/ ==========================
;/
;/ [ PB V5.7x - V6.0 / 64Bit / all OS ]
;/
;/ © 2022 Thorsten1867 (06/2022)
;/
;- ===== String =====
DeclareModule String
Declare.s Between(String.s, StartString.s, EndString.s)
Declare Split(String.s, Array Result.s(1), Separator.s=" ")
Declare.s Join(Array Result.s(1), Separator.s=" ")
Declare MulitSplit(String.s, Array Result.s(1), Separator.s=" ")
Declare Token(String.s, Array Result.s(1), Array Separators.s(1))
Declare Extract(String.s, Array Result.s(1), StartToken.s, EndToken.s)
EndDeclareModule
Module String
Procedure Split(String.s, Array Result.s(1), Separator.s=" ")
; by wilbert
Define S.String, *S.Integer = @S
Define.i aSize, i, Pos, sLen
aSize = CountString(String, Separator)
sLen = Len(Separator)
ReDim Result(aSize)
*S\i = @String
While i < aSize
Pos = FindString(S\s, Separator)
Result(i) = PeekS(*S\i, Pos - 1)
*S\i + (Pos + sLen - 1) << #PB_Compiler_Unicode
i + 1
Wend
Result(i) = S\s
*S\i = 0
EndProcedure
Procedure.s Join(Array Result.s(1), Separator.s=" ")
; by wilbert
Define.i aSize, i, sLen, tLen, *Buffer
aSize = ArraySize(Result())
sLen = Len(Separator)
For i = 0 To aSize
tLen + Len(Result(i)) + sLen
Next
tLen - sLen
Dim Buffer.c(tLen)
*Buffer = @Buffer()
CopyMemoryString(Result(0), @*Buffer)
For i = 1 To aSize
CopyMemoryString(Separator)
CopyMemoryString(Result(i))
Next
ProcedureReturn PeekS(@Buffer())
EndProcedure
Procedure MulitSplit(String.s, Array Result.s(1), Separators.s=" ")
Define.i c, sLen, aSize, Pos, EndPos, StartPos = 1
NewList Token$()
sLen = Len(String)
While StartPos < sLen
EndPos = sLen
For c=1 To Len(Separators)
If Mid(String, StartPos, 1) = Mid(Separators, c, 1)
StartPos + 1
Endpos = StartPos
Break
Else
Pos = FindString(String, Mid(Separators, c, 1), StartPos)
If Pos And Pos < EndPos : EndPos = Pos : EndIf
EndIf
Next
If EndPos <> StartPos
If AddElement(Token$()) : Token$() = Mid(String, StartPos, EndPos - Startpos) : EndIf
EndIf
StartPos = EndPos
Wend
aSize = ListSize(Token$()) - 1
If aSize >= 0
ReDim Result(aSize)
c = 0
ForEach Token$()
Result(c) = Token$()
c + 1
Next
EndIf
EndProcedure
Procedure Token(String.s, Array Result.s(1), Array Separator.s(1))
Define.i sLen, spSize, spLen, aSize
Define.i i, Pos, EndPos, StartPos = 1
NewList Token$()
sLen = Len(String)
spSize = ArraySize(Separator())
While StartPos < sLen
spLen = 0
EndPos = sLen
For i=0 To spSize
If Mid(String, StartPos, Len(Separator(i))) = Separator(i)
StartPos + Len(Separator(i))
Endpos = StartPos
Break
Else
Pos = FindString(String, Separator(i), StartPos)
If Pos And Pos < EndPos
EndPos = Pos
spLen = Len(Separator(i))
EndIf
EndIf
Next
If EndPos <> StartPos
If AddElement(Token$()) : Token$() = Mid(String, StartPos, EndPos - Startpos) : EndIf
EndIf
StartPos = EndPos + SpLen
Wend
aSize = ListSize(Token$()) - 1
If aSize >= 0
ReDim Result(aSize)
c = 0
ForEach Token$()
Result(c) = Token$()
c + 1
Next
EndIf
EndProcedure
Procedure Extract(String.s, Array Result.s(1), StartToken.s, EndToken.s)
Define.i sLen, aSize, Pos, EndPos, StartPos, Idx
sLen = Len(String)
aSize = CountString(String, StartToken) - 1
ReDim Result(aSize)
Pos = 1
StartPos = Pos
While Pos
Pos = FindString(String, StartToken, StartPos)
If Pos
StartPos = Pos + Len(StartToken)
EndPos = FindString(String, EndToken, StartPos)
If StartPos < EndPos
Result(Idx) = Mid(String, StartPos, EndPos - StartPos)
Idx + 1
EndIf
If EndPos : StartPos = Endpos + Len(EndToken) : EndIf
EndIf
Wend
EndProcedure
Procedure.s Between(String.s, StartString.s, EndString.s)
String = StringField(String, 2, StartString)
ProcedureReturn StringField(String, 1, EndString)
EndProcedure
EndModule
;- ===== File =====
DeclareModule File
Declare.i Exists(File.s)
Declare.i ValidPath(Path.s)
EndDeclareModule
Module File
Procedure.i Exists(File.s) ; Does the file exist?
If FileSize(File) >= 0
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.i ValidPath(Path.s) ; Is the path valid?
If FileSize(Path) = -2
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure.s Directory(Path.s) ; Creates directory if it does not exist
If Right(Path, 1) <> #PS$ : Path + #PS$ : EndIf
If FileSize(Path) = -2
ProcedureReturn Path
Else
If CreateDirectory(Path)
ProcedureReturn Path
EndIf
EndIf
EndProcedure
EndModule
;- ======== Module - Example ========
CompilerIf #PB_Compiler_IsMainFile
#Example = 0
; 0: String between
; 1: Split strings
; 2: Split with multiple separators
; 3: Token
; 4: Extrakt from token
Select #Example
Case 0 ;{ String between
String$ = "<title>My String Between</title>"
Debug String::Between(String$, "<title>", "</title>")
;}
Case 1 ;{ Split & join strings
Dim Result.s(0)
Test$ = "This is a test string to see if split and join are working."
String::Split(Test$, Result())
For i = 0 To ArraySize(Result())
Debug Str(i) + ": " + Result(i)
Next
Debug "---------------------"
Result$ = String::Join(Result(), "_")
Debug "=> " + Result$
;}
Case 2 ;{ Split with multiple separators
Dim Result.s(0)
Test$ = "Command = DIR " + #DOUBLEQUOTE$ + "*.*" + #DOUBLEQUOTE$ + ", /s" + " "
String::MulitSplit(Test$, Result(), "=, ")
For i = 0 To ArraySize(Result())
Debug Str(i) + ": " + Result(i)
Next
;}
Case 3 ;{ Token
Dim Result.s(0)
Dim Separator.s(1)
Separator(0) = "<b>"
Separator(1) = "</b>"
Test$ = "This is a <b>text</b> with <b>bold</b> words."
String::Token(Test$, Result(), Separator())
For i = 0 To ArraySize(Result())
Debug Str(i) + ": " + Result(i)
Next
;}
Case 4 ;{ Extrakt from token
Dim Result.s(0)
Test$ = "This is a <b>text</b> with <b>bold</b> words."
String::Extract(Test$, Result(), "<b>", "</b>")
For i = 0 To ArraySize(Result())
Debug Str(i) + ": " + Result(i)
Next
;}
EndSelect
CompilerEndIf