fb:porticula NoPaste
Einfacher BASIC-Interpreter
Uploader: | ThePuppetMaster |
Datum/Zeit: | 02.11.2007 02:19:45 |
'#######################################################################################
' C4BSI - CIC4-Skripter-BASIC-Interpreter
'#######################################################################################
'(c) 2007 By.: /_\ DeltaLab's - Deutschland
'Autor: Martin Wiemann
'============================================================================
'Alle Rechte vorbehalten!
'Admin@MLN.ath.cx
'#######################################################################################
#include "vbcompat.bi"
#include "dir.bi"
Dim Shared G_Command As String
Dim Shared G_LocalExec As Long
Dim Shared G_PathInput As String
Dim Shared G_PathOutput As String
Dim Shared G_PathOutputHeader As String
Dim Shared G_PathServerinfo As String
Dim Shared G_PathWWWRoot As String
Dim Shared G_Request As String
Dim Shared G_RequestType As String
Dim Shared G_IPA As String
Dim Shared G_Port As String
Dim Shared G_OverrideOutputfile As Long
Dim Shared G_ExecTimeOut as Long
Dim Shared G_Echo as String
Private Type Var_Type
V_Name As String
V_Value As String
End Type
Private Type Var_Dyn_Type
V_ValueD(255) As Var_Type
V_Count As String
End Type
Private Type Sub_Var_Type
V_Name As String
V_ByRef As Long
End Type
Private Type Sub_Type
V_FromFile As String
V_FromLine As Long
V_Name As String
V_ValD(255) As Sub_Var_Type
V_ValC As Long
V_Code As String
End Type
Dim Shared G_VarD() As Var_Type
Dim Shared G_VarC As Long
Dim Shared G_SubD() As Sub_Type
Dim Shared G_SubC As Long
Dim Shared G_FOFN As Integer
Dim Shared G_FOEFN As Integer
Dim Shared ExOut As Long
Dim Shared ExecTimeOut as Long
Declare Sub Main()
Declare Function C4S_Read_File(ByRef V_FilePathName As String) As Long
Declare Function C4S_Read_Subs(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_Line As String) As String
Declare Function C4S_Do_Sub(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_Name As String, ByRef V_ValParam As String) As String
Declare Function C4S_Read_Sub_Decode(ByRef V_FPN As String, ByRef V_SID As Long, ByRef V_Line As String, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long, ByRef V_LoopExit As Long) As String
Declare Function C4S_Do_Sub_Line(ByRef V_FPN As String, ByRef V_SID As Long, ByRef V_Line As String, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long, ByRef V_LoopExit As Long) As String
Declare Function C4S_Do_Sub_Block(ByRef V_FPN As String, ByRef V_Line As String, ByRef V_SID As Long, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long) As String
Declare Function C4S_Do_Sub_Block_Exec(ByRef V_FPN As String, ByRef V_Line As String, ByRef V_SID As Long, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long) As String
Declare Sub C4S_Calc(ByRef V_OP As String, V_DD() As String, V_DC As Long)
Declare Function C4S_InterFunc(ByRef V_FPN As String, ByRef V_Func As String, ByRef V_Data As String, ByRef B_Data As String) As Long
Declare Function C4S_Sub_Add(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_Name As String, ByRef V_Var As String, ByRef V_Code As String) As Long
Declare Function C4S_Var_Add(ByRef V_Name As String, ByRef V_Value As String) As Long
Declare Function C4S_Var_Get(ByRef V_Name As String, ByRef B_Value As String) As Long
Declare Function C4S_Var_Set(ByRef V_Name As String, ByRef V_Value As String) As Long
Declare Function C4S_Var_Exist(ByRef V_Name As String) As Long
Declare Sub F_SplitString(V_Data As String, B_DD() As String, ByRef B_DC As Long, V_CutString As String, V_ClearArray As Byte, V_Casesensitivity As Byte, V_AddEmpty As Byte)
Declare Sub F_Print(ByRef V_Text As String)
Declare Sub F_PrintOut(ByRef V_Text As String)
Declare Sub F_ErrAdd(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_EC As Long, V_AddInfo As String = "")
Declare Function F_ErrCodeDesc(ByRef V_ErrCode As Long, V_AddInfo As String = "") As String
Declare Sub C4S_SplitParam(ByRef V_Data As String, B_DD() As String, ByRef B_DC As Long)
Declare Function C4S_Trim(ByRef V_Data As String) as String
Main
end 0
Sub Main()
Dim X As Long
Dim DD() As String
Dim DC As Long
Dim XPos As Long
Dim X_FFN As Integer
Dim D As String
Dim T As String
ExOut = 0
G_Echo = "Echo: "
G_Command = Command
F_SplitString G_Command, DD(), DC, " ", 1, 0, 1
For X = 1 To DC Step 2
Select Case LCase(DD(X))
case "-e": G_Echo = DD(X + 1)
case "-ex": G_ExecTimeOut = val(DD(X + 1))
Case "-h": G_PathOutputHeader = DD(X + 1)
Case "-i": G_IPA = DD(X + 1)
Case "-k": X = X - 1: G_OverrideOutputfile = 1
case "-l": X = X - 1: G_LocalExec = 1
Case "-o": G_PathOutput = DD(X + 1)
Case "-p": G_Port = DD(X + 1)
Case "-r": G_Request = DD(X + 1)
Case "-s": G_PathInput = DD(X + 1)
Case "-t": G_RequestType = DD(X + 1)
Case "-v": G_PathServerinfo = DD(X + 1)
Case "-w": G_PathWWWRoot = DD(X + 1)
Case "-help", "--help"
F_Print "[C4S][HELP]"
F_Print "(c) 2007 By.: /_\ DeltaLab's Deutschland --- Martin Wiemann"
F_Print ""
F_Print "Syntax: C4BSI <Parameter> [<Parameter-Wert>] ..."
F_Print "-e <Text> = Legt einen Wert fest, der vor einer 'Echo' Ausgabe erscheinen soll. [Standard: 'ECHO']"
F_Print "-ex <ZeitInSek.> = Legt eine maximale Zeit fest, die dem SourceCode gegeben, bevor es durch Zwang abgebrochen wird."
F_Print "-h <DateiPathName> = Legt eine Ausgabedatei fest, in der Header-Informationen für HTTP-Server hinterlegt werden."
F_Print "-i <IP-Adresse> = Legt eine IP-Adresse fest. (Wenn ein SourceCode z.B. über einen HTTP-Server gestartet wurde)."
F_Print "-k = Diese Option überschreibt bereits vorhandene Ausgabedatein."
F_Print "-l = Diese Option teilt dem Interpreter mit, das der Quellcode Lokal ausgeführt wird."
F_Print " Daraufhin werden keine Ausgabedatein erstellt, und es wird zusätzlich nur der -s Parameter benötigt."
F_Print "-o <DateiPathName> = Legt eine Ausgabedatei fest, in welcher Daten mit dem 'Print' Kommando gespeichert werden.."
F_Print "-p <Port> = Hier muss ein Port angegeben werden, auf dem z.B. der HTTP_Server auf Verbindungsanfragen wartet."
F_Print "-r <Anfrage> = Diese Option überträgt eine Anfrage vom Server in eine Globale Variable im Interpreter."
F_Print "-s <DateiPathName> = Hier muss die Quell-Datei angegeben werden, in welchem sich der auszuführende Code befindet."
F_Print "-t <AnfrageTyp> = Diese Option Speichert den Typ der Anfrage in eine Globale Variable. z.B. GET, POST, PUT,..."
F_Print "-v <DateiPathName> = Dieser Pfad legt eien Datei fest, in welcher sich Server-Informationen befinden."
F_Print "-w <DateiPathName> = Hier wird ein ROOT-Verzeichniss angegeben, das bei Verzeichnisslistung nicht unterschritten werden darf."
F_Print ""
End 0
Case Else: F_Print "[C4S][E] Syntaxfehler! Gewählter Parameter existiert nicht! => " & DD(X): End -1
End Select
Next
If G_PathInput = "" Then F_Print "[C4S][E] Syntaxfehler! Keine Eingabedatei angegeben!": End -1
if G_LocalExec = 0 then
If G_PathOutput = "" Then F_Print "[C4S][E] Syntaxfehler! Keine Ausgabedatei angegeben!": End -1
If G_PathOutputHeader = "" Then F_Print "[C4S][E] Syntaxfehler! Keine Header Ausgabedatei angegeben!": End -1
If G_PathWWWRoot = "" Then F_Print "[C4S][E] Syntaxfehler! Kein WWW-Root-Pfad angegeben!": End -1
If G_Request = "" Then F_Print "[C4S][E] Syntaxfehler! Keine Anfrage-URL angegeben!": End -1
If G_RequestType = "" Then F_Print "[C4S][E] Syntaxfehler! Kein Anfrage-Typ angegeben!": End ' -1
If G_IPA = "" Then F_Print "[C4S][E] Syntaxfehler! Keine IP-Adresse angegeben!": End -1
If G_Port = "" Then F_Print "[C4S][E] Syntaxfehler! Kein Server-Port angegeben!": End -1
End If
If Dir(G_PathInput, fbNormal) = "" Then F_Print "[C4S][E] Eingabedatei wurde nicht gefunden!": End -1
If G_LocalExec = 0 then
If Dir(G_PathOutput, fbNormal) <> "" Then
If G_OverrideOutputfile = 1 Then
Kill G_PathOutput
If Dir(G_PathOutput, fbNormal) <> "" Then F_Print "[C4S][E] Konnte Ausgabedatei nicht löschen!": End -1
Else: F_Print "[C4S][E] Ausgabedatei existiert bereits!": End -1
End If
End If
If Dir(G_PathOutputHeader, fbNormal) <> "" Then
If G_OverrideOutputfile = 1 Then
Kill G_PathOutputHeader
If Dir(G_PathOutputHeader, fbNormal) <> "" Then F_Print "[C4S][E] Konnte Header Ausgabedatei nicht löschen!": End -1
Else: F_Print "[C4S][E] Header Ausgabedatei existiert bereits!": End -1
End If
End If
If Dir(G_PathOutput & ".ErrLog", fbNormal) <> "" Then
Kill G_PathOutput & ".ErrLog"
If Dir(G_PathOutput & ".ErrLog", fbNormal) <> "" Then F_Print "[C4S][E] Konnte FehlerLog-Ausgabedatei nicht löschen!": End -1
End If
If G_PathServerinfo <> "" Then
If Dir(G_PathServerinfo, fbNormal Or fbReadOnly) = "" Then F_Print "[C4S][E] ServerInfo-Datei existiert nicht!": End -1
X_FFN = FreeFile
Open G_PathServerinfo For Binary As #X_FFN
Do
If EOF(X_FFN) = -1 Then Exit Do
Line Input #X_FFN, T
If D <> "" And Left(D, 1) <> "'" Then
XPos = InStr(1, D, "=")
If XPos > 0 Then
T = Mid(D, XPos + 1)
D = Mid(D, 1, XPos - 1)
C4S_Var_Add D, T
End If
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Exit Sub
Loop
End If
Close #X_FFN: X_FFN = 0
G_FOEFN = FreeFile
Open G_PathOutput & ".ErrLog" For Binary As #G_FOEFN
G_FOFN = FreeFile
Open G_PathOutput For Binary As #G_FOFN
End If
ExecTimeOut = Timer + G_ExecTimeOut
print ExecTimeOut
Print Timer
Print G_ExecTimeOut
C4S_Read_File G_PathInput
T = C4S_Do_Sub(G_PathInput, 0, "main", "")
Close #G_FOFN: G_FOFN = 0
Close #G_FOEFN: G_FOEFN = 0
End Sub
Function C4S_Read_File(ByRef V_FilePathName As String) As Long
Dim XFIFN As Integer
Dim XLineC As Long
Dim D As String
Dim T As String
Dim TIV As Long
Dim X As Long
If Mid(V_FilePathName, 1, 1) <> "/" Then
If Dir(EXEPath & "/" & V_FilePathName, fbnormal or fbreadonly) = "" then Return 0
XFIFN = FreeFile
Open EXEPath & "/" & V_FilePathName For Binary As #XFIFN
Else
If Dir(V_FilePathName, fbnormal or fbreadonly) = "" then Return 0
XFIFN = FreeFile
Open V_FilePathName For Binary As #XFIFN
End If
Do
If EOF(XFIFN) = -1 Then Exit Do
D = ""
Line Input #XFIFN, D
XLineC = XLineC + 1
For X = 1 To Len(D)
Select Case Mid(D, X, 1)
Case """": If TIV = 0 Then TIV = 1 Else TIV = 0
Case "'"
If TIV = 0 Then
D = C4S_Trim(Mid(D, 1, X - 1))
Exit For
End If
End Select
If ExOut = 1 Then Return 0
Next
T = T & C4S_Trim(D)
If D <> "" Then
If Right(T, 1) <> "_" Then
T = C4S_Read_Subs(V_FilePathName, XLineC, T)
If T <> "" Then T = T & ":"
Else: T = Left(T, Len(T) - 1)
End If
End If
If ExOut = 1 Then Return 0
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return 0
Loop
Close #XFIFN: XFIFN = 0
return 0
End Function
Function C4S_Read_Subs(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_Line As String) As String
Dim X As Long
Dim Y As Long
Dim XPos As Long
Dim T As String
Dim SP1 As String
Dim SP2 As String
Dim PSub As String
Dim PSubX As Long
Dim DD() As String
Dim DC As Long
Dim LSVarD() As Var_Type
Dim LSVarC As Long
Dim TX As Long
Dim TD As String
PSubX = 1
For X = 1 To Len(V_Line) - 4
If ExOut = 1 Then Return ""
Select Case LCase(Mid(V_Line, X, 4))
Case "sub ": Y = X
Case "end "
If X + 4 <= Len(V_Line) Then
If LCase(Mid(V_Line, X + 3, 4)) = " sub" Then
If Y > 0 Then
T = Mid(V_Line, Y + 4, X - Y - 4)
PSub = Mid(V_Line, PSubX, Y - 1)
PSubX = Y + 8
XPos = InStr(1, T, ":")
If XPos > 0 Then
SP1 = C4S_Trim(Mid(T, 1, XPos - 1))
T = C4S_Trim(Mid(T, XPos + 1))
XPos = InStr(1, SP1, "(")
If XPos > 0 Then
SP2 = Mid(SP1, 1, XPos - 1)
SP1 = Mid(SP1, XPos + 1)
If Right(SP1, 1) = ")" Then
SP1 = Left(SP1, Len(SP1) - 1)
If PSub <> "" Then TD = C4S_Read_Sub_Decode(V_FPN, 0, PSub, DD(), DC, LSVarD(), LSVarC, TX)
C4S_Sub_Add V_FPN, V_LID, SP2, SP1, T
Else: F_ErrAdd V_FPN, V_LID, -4
End If
Else: F_ErrAdd V_FPN, V_LID, -3
End If
Else: F_ErrAdd V_FPN, V_LID, -2
End If
V_Line = Mid(V_Line, X + 8)
X = 0
Y = 0
Else: F_ErrAdd V_FPN, V_LID, -1
End If
End If
End If
End Select
If X >= Len(V_Line) - 4 Then Exit For
If ExOut = 1 Then Return ""
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
Return V_Line
End Function
Function C4S_Do_Sub(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_Name As String, ByRef V_ValParam As String) As String
Dim X As Long
Dim Y As Long
Dim S As String
Dim D As String
Dim T As String
Dim DD() As String
Dim DC As Long
Dim SID As Long
Dim TIV As Long
Dim BVV As String
Dim LSVarD() As Var_Type
Dim LSVarC As Long
Dim XOK As Long
C4S_SplitParam V_ValParam, DD(), DC
S = LCase(V_Name)
For X = 1 To G_SubC
If G_SubD(X).V_Name = S Then
SID = X: Exit For
End If
Next
If SID > 0 Then
D = G_SubD(SID).V_Code
BVV = C4S_Read_Sub_Decode(V_FPN, SID, D, DD(), DC, LSVarD(), LSVarC, XOK)
Else
If S = "main" Then
F_ErrAdd V_FPN, 0, -7
Else: F_ErrAdd V_FPN, V_LID, -8, V_Name
End If
End If
Return BVV
End Function
Function C4S_Read_Sub_Decode(ByRef V_FPN As String, ByRef V_SID As Long, ByRef V_Line As String, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long, ByRef V_LoopExit As Long) As String
Dim X As Long
Dim Y As Long
Dim D As String
Dim T As String
Dim BVV As String
Dim TIV As Long
Dim Z As Long
Dim ZTIV As Long
Dim P1 As String
Dim P2 As String
Dim PE As String
Dim PS As Long
Dim IFIN As Long
Dim IFID As String
Dim IFIX As Long
Dim IFOPX As String
Dim PrCS As Long
Dim PrCD As String
Dim DoX As Long
Dim IfOK As Long
Dim XT as String
D = V_Line
Y = 1
PrCS = 0
For X = 1 To Len(D)
If ExOut = 1 Then Return ""
Select Case Mid(D, X, 1)
Case """": If TIV = 0 Then TIV = 1 Else TIV = 0
Case ":"
If TIV = 0 Then
T = C4S_Trim(Mid(D, Y, X - Y))
If (LCase(Left(T, 3)) = "if ") And ((PrCS = 0) Or (PrCS = 1)) Then
IFIX = IFIX + 1
If IFIX = 1 Then
PS = 3
P1 = ""
P2 = ""
PE = ""
IFID = ""
IFOPX = ""
For Z = PS To Len(T)
Select Case Mid(T, Z, 1)
Case """": If ZTIV = 0 Then ZTIV = 1 Else ZTIV = 0
Case "=", "<", ">"
If ZTIV = 0 Then
IFOPX = IFOPX & Mid(T, Z, 1)
If P1 = "" Then P1 = C4S_Trim(Mid(T, PS, Z - PS))
PS = Z + 1
End If
Case Else: If IFOPX <> "" Then Exit For
End Select
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
For Z = PS To Len(T)
Select Case Mid(T, Z, 1)
Case """": If ZTIV = 0 Then ZTIV = 1 Else ZTIV = 0
Case Else
If ZTIV = 0 Then
If LCase(Mid(T, Z, 5)) = " then" Then
P2 = C4S_Trim(Mid(T, PS, Z - PS))
PE = C4S_Trim(Mid(T, Z + 5))
Exit For
End If
End If
End Select
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
P1 = C4S_Do_Sub_Line(V_FPN, V_SID, P1, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
P2 = C4S_Do_Sub_Line(V_FPN, V_SID, P2, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
IFIN = 1
PrCS = 1
IfOK = 0
Select Case IFOPX
Case "=": If P1 = P2 Then IfOK = 1
Case "<": If val(P1) < val(P2) Then IfOK = 1
Case ">": If val(P1) > val(P2) Then IfOK = 1
Case "=<", "<=": If val(P1) <= val(P2) Then IfOK = 1
Case "=>", ">=": If val(P1) >= val(P2) Then IfOK = 1
Case "<>": If P1 <> P2 Then IfOK = 1
End Select
If IfOK = 1 Then
IFIN = 3
If PE <> "" Then
IFID = PE & ":"
If IFID <> "" Then
XT = C4S_Read_Sub_Decode(V_FPN, V_SID, IFID, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
If V_LoopExit <> 0 Then Exit For
IFID = ""
IFIX = IFIX - 1
End If
IFIN = 0
End If
End If
Else: IFID = IFID & T & ":"
End If
ElseIf (LCase(Left(T, 7)) = "elseif " And (IFIX = 1)) And ((PrCS = 0) Or (PrCS = 1)) Then
If IFIN = 1 Then
PS = 7
P1 = ""
P2 = ""
PE = ""
IFOPX = ""
For Z = PS To Len(T)
Select Case Mid(T, Z, 1)
Case """": If ZTIV = 0 Then ZTIV = 1 Else ZTIV = 0
Case "=", "<", ">"
If ZTIV = 0 Then
IFOPX = IFOPX & Mid(T, Z, 1)
If P1 = "" Then P1 = C4S_Trim(Mid(T, PS, Z - PS))
PS = Z + 1
End If
Case Else: If IFOPX <> "" Then Exit For
End Select
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
For Z = PS To Len(T)
Select Case Mid(T, Z, 1)
Case """": If ZTIV = 0 Then ZTIV = 1 Else ZTIV = 0
Case Else
If ZTIV = 0 Then
If LCase(Mid(T, Z, 5)) = " then" Then
P2 = C4S_Trim(Mid(T, PS, Z - PS))
exit for
End If
End If
End Select
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
P1 = C4S_Do_Sub_Line(V_FPN, V_SID, P1, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
P2 = C4S_Do_Sub_Line(V_FPN, V_SID, P2, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
IFIN = 1
IfOK = 0
Select Case IFOPX
Case "=": If P1 = P2 Then IfOK = 1
Case "<": If val(P1) < val(P2) Then IfOK = 1
Case ">": If val(P1) > val(P2) Then IfOK = 1
Case "<=", "=<": If val(P1) <= val(P2) Then IfOK = 1
Case "=>", ">=": If val(P1) >= val(P2) Then IfOK = 1
Case "<>": If P1 <> P2 Then IfOK = 1
End Select
If IfOK = 1 Then IFIN = 3
Else: IFIN = 4
End If
ElseIf ((LCase(Left(T, 4)) = "else") And (Len(T) = 4) And (IFIX = 1)) And ((PrCS = 0) Or (PrCS = 1)) Then
If IFIN = 1 Then
IFID = ""
IFIN = 3
Else: IFIN = 4
End If
ElseIf (((LCase(Left(T, 6)) = "end if") Or (LCase(Left(T, 5)) = "endif"))) And ((PrCS = 0) Or (PrCS = 1)) Then
If IFIX = 1 Then
If IFID <> "" Then
XT = C4S_Read_Sub_Decode(V_FPN, V_SID, IFID, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
If V_LoopExit <> 0 Then Exit For
IFID = ""
End If
IFIN = 0
Else: IFID = IFID & T & ":"
End If
IFIX = IFIX - 1
ElseIf ((LCase(Left(T, 2)) = "do") And (Len(T) = 2)) And (PrCS = 0) Then
DoX = DoX + 1
If DoX = 1 Then PrCS = 2
ElseIf ((LCase(Left(T, 4)) = "loop") And (Len(T) = 4)) And ((PrCS = 2) Or (PrCS = 1)) Then
If DoX = 1 Then
If PrCD <> "" Then
V_LoopExit = 0
Do
BVV = C4S_Read_Sub_Decode(V_FPN, V_SID, PrCD, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
If V_LoopExit <> 0 Then Exit Do
If ExOut = 1 Then Exit Do
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Exit Do
Loop
V_LoopExit = 0
PrCD = ""
End If
End If
PrCS = 0
DoX = DoX - 1
ElseIf PrCS = 1 Then
If IFIN = 3 Then
IFID = IFID & T & ":"
ElseIf IFIN = 0 Then
If IFIX = 0 Then
BVV = C4S_Do_Sub_Line(V_FPN, V_SID, T, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
If V_LoopExit <> 0 Then Return BVV
End If
End If
Else
If PrCS > 0 Then
PrCD = PrCD & T & ":"
Else
If IFIN = 0 Then
BVV = C4S_Do_Sub_Line(V_FPN, V_SID, T, V_VD(), V_VC, BV_VarD(), BV_VarC, V_LoopExit)
End If
If V_LoopExit <> 0 Then Return BVV
End If
End If
If IFIX < 0 Then IFIX = 0
If DoX < 0 Then DoX = 0
Y = X + 1
End If
End Select
If ExOut = 1 Then Return ""
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
Return V_Line
End Function
Function C4S_Do_Sub_Line(ByRef V_FPN As String, ByRef V_SID As Long, ByRef V_Line As String, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long, ByRef V_LoopExit As Long) As String
Dim X As Long
Dim Y As Long
Dim XDest As String
Dim XSource As String
Dim XVB As Long
Dim BV As String
For X = 1 To Len(V_Line)
Select Case Mid(V_Line, X, 1)
Case " "
If XDest = "" Then XDest = C4S_Trim(Mid(V_Line, 1, X))
Case "=": If XVB = 0 Then XVB = 1
Case Else
If XDest <> "" Then
XSource = C4S_Trim(Mid(V_Line, X))
BV = C4S_Do_Sub_Block(V_FPN, XSource, V_SID, V_VD(), V_VC, BV_VarD(), BV_VarC)
If XVB = 0 Then
Select Case LCase(XDest)
Case "return": V_LoopExit = 1: Return BV
Case "echo": F_Print G_Echo & BV
case "print": F_PrintOut BV
Case "dim"
BV_VarC = BV_VarC + 1
ReDim Preserve BV_VarD(BV_VarC) As Var_Type
With BV_VarD(BV_VarC)
.V_Name = LCase(BV)
.V_Value = ""
End With
Case "global"
BV = Lcase(BV)
If C4S_Var_Exist(BV) = 0 then C4S_Var_Add BV, ""
Case "#include": XVB = C4S_Read_File(BV)
Case "beep": Beep
Case "exit"
Select Case LCase(BV)
case "do": V_LoopExit = 1
case else: ExOut = 1
End Select
End Select
Else
XDest = LCase(XDest)
For Y = 1 To BV_VarC
If BV_VarD(Y).V_Name = XDest Then
BV_VarD(Y).V_Value = BV
Return ""
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
If C4S_Var_Exist(XDest) > 0 then C4S_Var_Set XDest, BV
End If
Return ""
End If
End Select
If ExOut = 1 Then Return ""
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
Return C4S_Do_Sub_Block_Exec(V_FPN, V_Line, V_SID, V_VD(), V_VC, BV_VarD(), BV_VarC)
End Function
Function C4S_Do_Sub_Block(ByRef V_FPN As String, ByRef V_Line As String, ByRef V_SID As Long, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long) As String
Dim X As Long
Dim Y As Long
Dim TIV As Long
Dim LC As String
Dim KGUV As Long
Dim BV As String
Dim LLC As String
Dim LLX As Long
Dim XFu As String
Dim DD() As String
Dim DC As Long
Dim Z As Long
Dim D As String
Dim SID As Long
Dim ED As String
Dim BVI As Long
Dim T As String
X = 0
LLX = 0
Do
X = X + 1
If X > Len(V_Line) Then Exit Do
Select Case Mid(V_Line, X, 1)
Case " "
Case """": If TIV = 0 Then TIV = 1 Else TIV = 0
Case "("
If TIV = 0 Then
LLC = C4S_Trim(LC)
BV = C4S_Do_Sub_Block(V_FPN, Mid(V_Line, X + 1), V_SID, V_VD(), V_VC, BV_VarD(), BV_VarC)
Select Case C4S_Trim(LLC)
Case "&", "+", "-", "/", "\", "*", "^", "": V_Line = Mid(V_Line, 1, X - 1) & BV
Case Else: V_Line = Mid(V_Line, 1, X) & BV
End Select
Y = X + 1
End If
Case ")"
If (TIV = 0) And (Y > 0) Then
Select Case C4S_Trim(LLC)
Case "&", "+", "-", "/", "\", "*", "^", ""
BV = C4S_Do_Sub_Block_Exec(V_FPN, Mid(V_Line, Y - 1, X - Y + 1), V_SID, V_VD(), V_VC, BV_VarD(), BV_VarC)
V_Line = Mid(V_Line, 1, Y - 2) & BV & Mid(V_Line, X + 1)
X = Y - 1
Case Else
If LLX = 0 Then LLX = 1
XFu = LCase(C4S_Trim(Mid(V_Line, LLX, Y - LLX - 1)))
For Z = 1 To G_SubC
If G_SubD(Z).V_Name = XFu Then
SID = Z
Exit For
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
C4S_SplitParam Mid(V_Line, Y, X - Y), DD(), DC
If SID > 0 Then
If G_SubD(SID).V_ValC = DC Then
D = ""
For Z = 1 To DC
T = C4S_Do_Sub_Block(V_FPN, DD(Z), V_SID, V_VD(), V_VC, BV_VarD(), BV_VarC)
If Val(T) <> 0 Then
D = D & T & ","
Else: D = D & """" & T & ""","
End If
If ExOut = 1 Then Return ""
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
If Right(D, 1) = "," Then D = Left(D, Len(D) - 1)
BV = C4S_Do_Sub(V_FPN, 0, XFu, D)
T = Mid(V_Line, 1, LLX - 1) & """" & BV & """" & Mid(V_Line, X + 1)
V_Line = T
X = LLX - 1
LLX = 0
Else: F_ErrAdd V_FPN, -1, -10, XFu
End If
Else
BVI = C4S_InterFunc(V_FPN, XFu, Mid(V_Line, Y, X - Y), BV)
If BVI = 0 Then
D = ""
For Z = 1 To DC
D = D & C4S_Do_Sub_Block(V_FPN, DD(Z), V_SID, V_VD(), V_VC, BV_VarD(), BV_VarC) & ","
If ExOut = 1 Then Return ""
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
If Right(D, 1) = "," Then D = Left(D, Len(D) - 1)
V_Line = Mid(V_Line, 1, LLX - 1) & BV & Mid(V_Line, X + 1)
X = LLX - 1
Else: F_ErrAdd V_FPN, -1, BVI, XFu
End If
End If
End Select
Y = 0
End If
Case "&", "+", "-", "/", "\", "*", "^"
If TIV = 0 Then
LC = Mid(V_Line, X, 1)
LLX = 0
End If
Case Else
If TIV = 0 Then
LC = Mid(V_Line, X, 1)
If LLX = 0 Then LLX = X
End If
End Select
If ExOut = 1 Then Return ""
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Loop
Return C4S_Do_Sub_Block_Exec(V_FPN, V_Line, V_SID, V_VD(), V_VC, BV_VarD(), BV_VarC)
End Function
Function C4S_Do_Sub_Block_Exec(ByRef V_FPN As String, ByRef V_Line As String, ByRef V_SID As Long, V_VD() As String, ByRef V_VC As Long, BV_VarD() As Var_Type, ByRef BV_VarC As Long) As String
Dim X As Long
Dim Y As Long
Dim T1 As String
Dim T2 As String
Dim BV As String
Dim DD() As String
Dim DC As Long
Dim TIV As Long
Dim XS As String
Dim ROK As Long
Dim D As String
D = V_Line
DC = 0
For X = 1 To Len(D)
T1 = ""
T2 = ""
If X > Len(D) Then Exit For
Select Case Mid(D, X, 1)
Case """": If TIV = 0 Then TIV = 1 Else TIV = 0
Case "&", "+", "-", "/", "\", "*", "^"
If TIV = 0 Then
T1 = Mid(D, 1, X - 1)
T2 = Mid(D, X, 1)
D = C4S_Trim(Mid(D, X + 1))
X = 0
End If
End Select
If (T1 <> "") And (T2 <> "") Then
DC = DC + 2
ReDim Preserve DD(DC) As String
DD(DC - 1) = C4S_Trim(T1)
DD(DC) = C4S_Trim(T2)
T1 = ""
T2 = ""
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
If D <> "" Then
DC = DC + 1
ReDim Preserve DD(DC) As String
DD(DC) = C4S_Trim(D)
Else: Return ""
End If
Dim DOC As Long
DOC = 1
For X = 1 To DC
Select Case Left(DD(X), 1)
Case ")", "(": DOC = 0
End Select
Select Case Right(DD(X), 1)
Case ")", "(": DOC = 0
End Select
If DOC = 0 Then Exit For
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
If DOC = 0 Then
For X = 2 To DC
DD(1) = DD(1) & " " & DD(X)
Next
Return DD(1)
End If
For X = 1 To DC
If (Left(DD(X), 1) <> """") Or (Right(DD(X), 1) <> """") Then
ROK = 0
Select Case DD(X)
Case "+", "-", "*", "/", "\", "^", "&"
Case Else
XS = LCase(DD(X))
For Y = 1 To BV_VarC
If XS = LCase(BV_VarD(Y).V_Name) Then
DD(X) = BV_VarD(Y).V_Value
ROK = 1
Exit For
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
If ROK = 0 Then
If V_SID > 0 Then
With G_SubD(V_SID)
For Y = 1 To .V_ValC
If XS = LCase(.V_ValD(Y).V_Name) Then
If .V_ValD(Y).V_ByRef = 0 Then
If V_VC >= Y Then
DD(X) = V_VD(Y)
If (Left(DD(X), 1) = """") And (Right(DD(X), 1) = """") Then DD(X) = Mid(DD(X), 2, Len(DD(X)) - 2)
End If
Else: DD(X) = str(Y)
End If
ROK = 1
Exit For
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
End With
End If
End If
If ROK = 0 Then
XS = LCase(DD(X))
For Y = 1 To G_VarC
If XS = LCase(G_VarD(Y).V_Name) Then
DD(X) = G_VarD(Y).V_Value
ROK = 1
Exit For
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
End If
If ROK = 0 Then
ROK = C4S_InterFunc(V_FPN, DD(X), "", XS)
If ROK = 0 Then DD(X) = XS: ROK = 1
End If
If (ROK = 0) And (DC > 1) Then F_ErrAdd V_FPN, -1, -13, DD(X)
End Select
Else: DD(X) = Mid(DD(X), 2, Len(DD(X)) - 2)
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Next
If DC > 2 Then
C4S_Calc "^", DD(), DC
C4S_Calc "*", DD(), DC
C4S_Calc "\", DD(), DC
C4S_Calc "/", DD(), DC
C4S_Calc "-", DD(), DC
C4S_Calc "+", DD(), DC
C4S_Calc "&", DD(), DC
End If
Return DD(1)
End Function
Sub C4S_Calc(ByRef V_OP As String, V_DD() As String, V_DC As Long)
Dim X As Long
Dim Y As Long
Dim BV As String
Dim V1 As String
Dim V2 As String
Dim V1X As Long
For X = 1 To V_DC
V1 = ""
V2 = ""
Select Case V_DD(X)
Case V_OP
V1X = 0
For Y = X - 1 To 1 Step -1
Select Case V_DD(Y)
Case ""
Case "+", "-", "*", "/", "\", "^", "&"
Case Else
V1 = V_DD(Y)
V1X = Y
Exit For
End Select
Next
If V1X = 0 then V1X = 1
For Y = X + 1 To V_DC
Select Case V_DD(Y)
Case ""
Case "+", "-", "*", "/", "\", "^", "&"
Case Else
V2 = V_DD(Y)
V_DD(Y) = ""
Exit For
End Select
Next
If ((Val(V1) <> 0) or (V1 = "0")) And ((Val(V2) <> 0) or (V2 = "0")) Then
BV = ""
Select Case V_OP
Case "+": BV = str(Val(V1) + Val(V2))
Case "-": BV = str(Val(V1) - Val(V2))
Case "*": BV = str(Val(V1) * Val(V2))
Case "/": BV = str(Val(V1) / Val(V2))
Case "\": BV = str(Val(V1) \ Val(V2))
Case "^": BV = str(Val(V1) ^ Val(V2))
Case "&": BV = V1 & V2
End Select
V_DD(V1X) = BV
Else
BV = ""
Select Case V_OP
Case "&": BV = V1 & V2
End Select
V_DD(V1X) = BV
End If
End Select
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Exit Sub
Next
End Sub
Function C4S_InterFunc(ByRef V_FPN As String, ByRef V_Func As String, ByRef V_Data As String, ByRef B_Data As String) As Long
Dim BV As String
Dim OV As String
Dim DD() As String
Dim DC As Long
Dim X As Long
C4S_SplitParam V_Data, DD(), DC
For X = 1 To DC
If Left(DD(X), 1) = """" And Right(DD(X), 1) = """" Then DD(X) = Mid(DD(X), 2, Len(DD(X)) - 2)
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return -15
Next
If DC > 0 Then BV = DD(1)
Select Case LCase(V_Func)
Case "abs": OV = str(Abs(Val(BV)))
Case "asc": OV = str(Asc(BV))
Case "abs": OV = str(Abs(Val(BV)))
Case "abs": OV = str(Abs(Val(BV)))
Case "atn": OV = str(Atn(Val(BV)))
Case "cbyte": OV = str(CByte(Val(BV)))
Case "clng": OV = str(CLng(Val(BV)))
Case "cint": OV = str(CInt(Val(BV)))
Case "cdbl": OV = str(CDbl(Val(BV)))
Case "csng": OV = str(CSng(Val(BV)))
Case "chr": OV = Chr(Val(BV))
Case "__command": OV = G_Command
Case "cos": OV = str(Cos(Val(BV)))
Case "date": OV = Str(Date)
Case "dir"
Select Case DC
Case 1: OV = Dir(BV)
Case 2: OV = Dir(BV, Val(DD(2)))
Case Else: OV = Dir("")
End Select
Case "fix": OV = Str(Fix(Val(BV)))
Case "filelen": OV = Str(FileLen(BV))
Case "freefile": OV = Str(FreeFile)
Case "format"
Select Case DC
Case 2: OV = Format(val(DD(1)), DD(2))
Case Else: F_ErrAdd V_FPN, -1, -10, LCase(V_Func)
End Select
Case "hex": OV = Hex(Val(BV))
Case "__ipa": OV = G_IPA
Case "len": OV = str(Len(BV))
Case "ltrim": OV = LTrim(BV)
Case "left"
Select Case DC
Case 2: OV = Left(DD(1), Val(DD(2)))
Case Else: F_ErrAdd V_FPN, -1, -10, LCase(V_Func)
End Select
Case "mid"
Select Case DC
Case 2: OV = Mid(DD(1), Val(DD(2)))
Case 3: OV = Mid(DD(1), Val(DD(2)), Val(DD(3)))
Case Else: F_ErrAdd V_FPN, -1, -10, LCase(V_Func)
End Select
Case "now": OV = Str(Now)
Case "oct": OV = Oct(Val(BV))
Case "__port": OV = G_Port
Case "__request": OV = G_Request
Case "__request_type": OV = G_RequestType
Case "rtrim": OV = RTrim(BV)
Case "randomize": Randomize Val(BV)
Case "right"
Select Case DC
Case 2: OV = Right(DD(1), Val(DD(2)))
Case Else: F_ErrAdd V_FPN, -1, -10, LCase(V_Func)
End Select
Case "sin": OV = str(Sin(Val(BV)))
Case "tan": OV = str(Tan(Val(BV)))
Case "time": OV = Str(Time)
Case "timer": OV = Str(Timer)
Case "trim": OV = Trim(BV)
Case "val": OV = str(Val(BV))
Case Else: Return -8
End Select
B_Data = OV
return 0
End Function
Function C4S_Sub_Add(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_Name As String, ByRef V_Var As String, ByRef V_Code As String) As Long
Dim X As Long
Dim XPos As Long
Dim DD() As String
Dim DC As Long
Dim T1 As String
Dim T2 As String
T1 = LCase(V_Name)
For X = 1 To G_SubC
If G_SubD(X).V_Name = T1 Then F_ErrAdd V_FPN, V_LID, -9: Return -9
Next
G_SubC = G_SubC + 1
ReDim Preserve G_SubD(G_SubC) As Sub_Type
With G_SubD(G_SubC)
.V_Name = T1
.V_FromFile = V_FPN
.V_FromLine = V_LID
.V_Code = V_Code
If Right(.V_Code, 1) <> ":" Then .V_Code = .V_Code & ":"
F_SplitString V_Var, DD(), DC, ",", 1, 1, 1
For X = 1 To DC
T1 = C4S_Trim(DD(X))
If T1 <> "" Then
XPos = InStr(1, T1, " ")
If XPos > 0 Then
T2 = C4S_Trim(Mid(T1, 1, XPos - 1))
T1 = C4S_Trim(Mid(T1, XPos + 1))
Else: T2 = ""
End If
If T1 <> "" Then
If .V_ValC < 255 Then
.V_ValC = .V_ValC + 1
With .V_ValD(.V_ValC)
.V_Name = T1
Select Case LCase(T2)
Case "byval", "": .V_ByRef = 0
Case "byref": .V_ByRef = 1
Case Else: F_ErrAdd V_FPN, V_LID, -6, T2: Return -6
End Select
End With
Else: F_ErrAdd V_FPN, V_LID, -5: Return -5
End If
End If
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return -15
Next
End With
Return G_SubC
End Function
Function C4S_Var_Add(ByRef V_Name As String, ByRef V_Value As String) As Long
G_VarC = G_VarC + 1
ReDim Preserve G_VarD(G_VarC) As Var_Type
With G_VarD(G_VarC)
.V_Name = LCase(V_Name)
.V_Value = V_Value
End With
Return G_VarC
End Function
Function C4S_Var_Get(ByRef V_Name As String, ByRef B_Value As String) As Long
Dim X As Long
Dim S As String
S = LCase(V_Name)
For X = 1 To G_VarC
If G_VarD(X).V_Name = S Then B_Value = G_VarD(X).V_Value: Return X
Next
Return 0
End Function
Function C4S_Var_Set(ByRef V_Name As String, ByRef V_Value As String) As Long
Dim X As Long
Dim S As String
S = LCase(V_Name)
For X = 1 To G_VarC
If G_VarD(X).V_Name = S Then G_VarD(X).V_Value = V_Value: Return X
Next
Return 0
End Function
Function C4S_Var_Exist(ByRef V_Name As String) As Long
Dim X As Long
Dim S As String
S = LCase(V_Name)
For X = 1 To G_VarC
If G_VarD(X).V_Name = S Then Return X
Next
Return 0
End Function
Sub F_SplitString(V_Data As String, B_DD() As String, ByRef B_DC As Long, V_CutString As String, V_ClearArray As Byte, V_Casesensitivity As Byte, V_AddEmpty As Byte)
If V_ClearArray = 1 Then B_DC = 0
ReDim Preserve B_DD(B_DC) As String
Dim X As Long
Dim Pos1 As Long
Dim Pos2 As Long
Dim SLen As Long
Dim T As String
Dim S As String
Dim XOK As Byte
S = V_CutString
If V_Casesensitivity = 0 Then S = LCase(V_CutString)
SLen = Len(S)
Pos1 = 1
Pos2 = 1
For X = 1 To Len(V_Data) - SLen
If V_Casesensitivity = 0 Then
If LCase(Mid(V_Data, X, SLen)) = S Then
T = Mid(V_Data, Pos1, X - Pos1 + SLen - 1)
X = X + SLen - 1
Pos1 = X + 1
End If
Else
If Mid(V_Data, X, SLen) = V_CutString Then
T = Mid(V_Data, Pos1, X - Pos1 + SLen - 1)
X = X + SLen
Pos1 = X
End If
End If
If Pos1 <> Pos2 Or X = Len(V_Data) - SLen Then
If Pos1 = Pos2 Then T = Mid(V_Data, Pos1)
XOK = 1
If T = "" Then If V_AddEmpty = 0 Then XOK = 0
If XOK = 1 Then
B_DC = B_DC + 1
ReDim Preserve B_DD(B_DC) As String
B_DD(B_DC) = T
End If
Pos2 = Pos1
End If
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Exit Sub
Next
End Sub
Sub F_Print(ByRef V_Text As String)
Print V_Text
End Sub
Sub F_PrintOut(ByRef V_Text As String)
if G_LocalExec = 0 then Print #G_FOFN, Lof(G_FOFN), V_Text
End Sub
Sub F_ErrAdd(ByRef V_FPN As String, ByRef V_LID As Long, ByRef V_EC As Long, V_AddInfo As String = "")
Dim T as string
T = "[" & V_FPN & "]__[" & V_LID & "](" & V_EC & ") " & F_ErrCodeDesc(V_EC, V_AddInfo)
If G_LocalExec = 0 then
Print #G_FOEFN, Lof(G_FOEFN), T
Else: Print T
End If
End Sub
Function F_ErrCodeDesc(ByRef V_ErrCode As Long, V_AddInfo As String = "") As String
Dim D As String
Select Case V_ErrCode
Case Is > 0
Case 0: D = "Keine Fehler!"
Case -1: D = "'End Sub' vor 'Sub()' gefunden."
Case -2: D = "'Sub()' ohne 'End Sub'."
Case -3: D = "Fehlendes '(' in Sub-Deklaration."
Case -4: D = "Fehlendes ')' in Sub-Deklaration."
Case -5: D = "'Sub()' Parameter hat maximalanzahl überschritten (255)."
Case -6: D = "'Sub()' ByVal / ByRef Definitionsangabe unbekannt. [" & V_AddInfo & "]"
Case -7: D = "Keine 'Sub Main()' gefunden."
Case -8: D = "Sub() nicht gefunden. [" & V_AddInfo & "]"
Case -9: D = "Sub() existiert bereits. [" & V_AddInfo & "]"
Case -10: D = "Anzahl übergebener Parameter stimmt mit Sub()-Deklaration nicht überein. [" & V_AddInfo & "]"
Case -11: D = "'End If' in 'If' nicht gefunden."
Case -12: D = "'End If' ohne 'If' gefunden."
Case -13: D = "Variable oder 'Sub()' nicht gefunden. [" & V_AddInfo & "]"
Case -14: D = "Unzureichende Parameter für Operationsvorgang."
Case -15: D = "Zeitüberschreitung der Abarbeitungszeit"
End Select
Return D
End Function
Sub C4S_SplitParam(ByRef V_Data As String, B_DD() As String, ByRef B_DC As Long)
B_DC = 0
ReDim Preserve B_DD(B_DC) As String
Dim X As Long
Dim TIV As Long
Dim KIV As Long
Dim D As String
Dim XOP As Long
D = V_Data
For X = 1 To Len(D)
Select Case Mid(D, X, 1)
Case """": If TIV = 0 Then TIV = 1 Else TIV = 0
Case "(": If TIV = 0 Then KIV = KIV + 1
Case ")": If TIV = 0 Then KIV = KIV - 1
Case ","
If KIV <= 0 Then
If B_DC < 255 Then
XOP = 1
B_DC = B_DC + 1
ReDim Preserve B_DD(B_DC) As String
B_DD(B_DC) = Mid(D, 1, X - 1)
D = Mid(D, X + 1)
X = 0
End If
End If
End Select
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Exit sub
Next
If Len(D) > 0 Or XOP = 0 Then
If B_DC < 255 Then
B_DC = B_DC + 1
ReDim Preserve B_DD(B_DC) As String
B_DD(B_DC) = D
End If
End If
End Sub
Function C4S_Trim(ByRef V_Data As String) as String
Dim X as Long
Do
X = 0
If asc(Left(V_Data, 1)) = 9 then V_Data = Mid(V_Data, 2): X = 1
If asc(Right(V_Data, 1)) = 9 then V_Data = Mid(V_Data, 1, Len(V_Data) - 1): X = 1
If asc(Left(V_Data, 1)) = 32 then V_Data = Mid(V_Data, 2): X = 1
If asc(Right(V_Data, 1)) = 32 then V_Data = Mid(V_Data, 1, Len(V_Data) - 1): X = 1
If (X = 0) or (Len(V_Data) = 0) then Exit do
If G_ExecTimeOut > 0 then If ExecTimeOut < Timer then Return ""
Loop
Return V_Data
End Function