mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-07-22 18:25:13 +00:00
Addition of precompiler into QB64 via $LET, $IF, $ELSEIF, $ELSE, $END IF commands.
This commit is contained in:
parent
e5a50f8bb1
commit
73fa19c1fb
|
@ -6246,6 +6246,8 @@ FOR y = 0 TO (idewy - 9)
|
||||||
ELSEIF inquote OR MID$(a2$, m, 1) = CHR$(34) THEN
|
ELSEIF inquote OR MID$(a2$, m, 1) = CHR$(34) THEN
|
||||||
COLOR 14
|
COLOR 14
|
||||||
END IF
|
END IF
|
||||||
|
If InValidLine(l) and 1 then color 7
|
||||||
|
|
||||||
LOCATE y + 3, 2 + m - 1
|
LOCATE y + 3, 2 + m - 1
|
||||||
PRINT MID$(a2$, m, 1);
|
PRINT MID$(a2$, m, 1);
|
||||||
NEXT m
|
NEXT m
|
||||||
|
|
387
source/qb64.bas
387
source/qb64.bas
|
@ -26,6 +26,21 @@ Set_OrderOfOperations 'This will also make certain our directories are valid, an
|
||||||
DIM SHARED MakeAndroid 'build an Android project (refer to SUB UseAndroid)
|
DIM SHARED MakeAndroid 'build an Android project (refer to SUB UseAndroid)
|
||||||
|
|
||||||
REDIM EveryCaseSet(100), SelectCaseCounter AS _UNSIGNED LONG
|
REDIM EveryCaseSet(100), SelectCaseCounter AS _UNSIGNED LONG
|
||||||
|
DIM ExecLevel(255), ExecCounter AS INTEGER
|
||||||
|
REDIM SHARED UserDefine(1, 100) AS STRING '0 element is the name, 1 element is the string value
|
||||||
|
REDIM SHARED InValidLine(10000) AS _BIT
|
||||||
|
DIM DefineElse(255) AS _BYTE
|
||||||
|
DIM SHARED UserDefineCount AS INTEGER
|
||||||
|
UserDefine(0, 0) = "WINDOWS": UserDefine(0, 1) = "WIN"
|
||||||
|
UserDefine(0, 2) = "LINUX"
|
||||||
|
UserDefine(0, 3) = "MAC": UserDefine(0, 4) = "MACOSX"
|
||||||
|
UserDefine(0, 5) = "32BIT": UserDefine(0, 6) = "64BIT"
|
||||||
|
IF INSTR(_OS$, "WIN") THEN UserDefine(1, 0) = "-1": UserDefine(1, 1) = "-1" ELSE UserDefine(1, 0) = "0": UserDefine(1, 1) = "0"
|
||||||
|
IF INSTR(_OS$, "LINUX") THEN UserDefine(1, 2) = "-1" ELSE UserDefine(1, 2) = "0"
|
||||||
|
IF INSTR(_OS$, "MAC") THEN UserDefine(1, 3) = "-1": UserDefine(1, 4) = "-1" ELSE UserDefine(1, 3) = "0": UserDefine(1, 4) = "0"
|
||||||
|
IF INSTR(_OS$, "32BIT") THEN UserDefine(1, 5) = "-1": UserDefine(1, 6) = "0" ELSE UserDefine(1, 5) = "0": UserDefine(1, 6) = "-1"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'refactor patch
|
'refactor patch
|
||||||
DIM SHARED Refactor_Source AS STRING
|
DIM SHARED Refactor_Source AS STRING
|
||||||
|
@ -1336,6 +1351,9 @@ stringprocessinghappened = 0
|
||||||
subfuncn = 0
|
subfuncn = 0
|
||||||
subfunc = ""
|
subfunc = ""
|
||||||
SelectCaseCounter = 0
|
SelectCaseCounter = 0
|
||||||
|
ExecCounter = 0
|
||||||
|
UserDefineCount = 6
|
||||||
|
REDIM SHARED InValidLine(10000) AS _BIT
|
||||||
|
|
||||||
''create a type for storing memory blocks
|
''create a type for storing memory blocks
|
||||||
''UDT
|
''UDT
|
||||||
|
@ -1490,11 +1508,144 @@ layout = ""
|
||||||
layoutok = 0
|
layoutok = 0
|
||||||
|
|
||||||
linenumber = linenumber + 1
|
linenumber = linenumber + 1
|
||||||
|
|
||||||
|
IF linenumber > UBOUND(InValidLine) THEN REDIM _PRESERVE InValidLine(UBOUND(InValidLine) + 1000) AS _BIT 'color information flag for each line
|
||||||
|
InValidLine(linenumber) = 0
|
||||||
|
|
||||||
IF LEN(wholeline$) THEN
|
IF LEN(wholeline$) THEN
|
||||||
|
|
||||||
wholeline$ = lineformat(wholeline$)
|
wholeline$ = lineformat(wholeline$)
|
||||||
IF Error_Happened THEN GOTO errmes
|
IF Error_Happened THEN GOTO errmes
|
||||||
|
|
||||||
|
temp$ = LTRIM$(RTRIM$(UCASE$(wholestv$)))
|
||||||
|
|
||||||
|
IF LEFT$(temp$, 5) = "$LET " THEN
|
||||||
|
temp$ = LTRIM$(MID$(temp$, 5)) 'simply shorten our string to parse
|
||||||
|
'For starters, let's make certain that we have 3 elements to deal with
|
||||||
|
temp = INSTR(temp$, "=") 'without an = in there, we can't get a value from the left and right side
|
||||||
|
IF temp = 0 THEN a$ = "Invalid Syntax. $LET <flag> = <value>": GOTO errmes
|
||||||
|
l$ = RTRIM$(LEFT$(temp$, temp - 1)): r$ = LTRIM$(MID$(temp$, temp + 1))
|
||||||
|
'then validate to make certain the left side looks proper
|
||||||
|
l1$ = ""
|
||||||
|
FOR i = 1 TO LEN(l$)
|
||||||
|
a = ASC(l$, i)
|
||||||
|
SELECT CASE a
|
||||||
|
CASE 32 'strip out spaces
|
||||||
|
CASE 46: l1$ = l1$ + CHR$(a)
|
||||||
|
CASE IS < 48, IS > 90: a$ = "Invalid symbol left of equal sign (" + CHR$(a) + ")": GOTO errmes
|
||||||
|
CASE ELSE: l1$ = l1$ + CHR$(a)
|
||||||
|
END SELECT
|
||||||
|
NEXT
|
||||||
|
l$ = l1$
|
||||||
|
IF LEFT$(r$, 1) = CHR$(34) THEN r$ = LTRIM$(MID$(r$, 2))
|
||||||
|
IF RIGHT$(r$, 1) = CHR$(34) THEN r$ = RTRIM$(LEFT$(r$, LEN(r$) - 1))
|
||||||
|
IF LEFT$(r$, 1) = "-" THEN
|
||||||
|
r1$ = "-"
|
||||||
|
r$ = LTRIM$(MID$(r$, 2))
|
||||||
|
ELSE
|
||||||
|
r1$ = ""
|
||||||
|
END IF
|
||||||
|
'then validate to make certain the left side looks proper
|
||||||
|
FOR i = 1 TO LEN(r$)
|
||||||
|
a = ASC(r$, i)
|
||||||
|
SELECT CASE a
|
||||||
|
CASE 32
|
||||||
|
CASE 46 'periods are fine.
|
||||||
|
r1$ = r1$ + "."
|
||||||
|
CASE IS < 48, IS > 90
|
||||||
|
a$ = "Invalid symbol right of equal sign (" + CHR$(a) + ")": GOTO errmes
|
||||||
|
CASE ELSE
|
||||||
|
r1$ = r1$ + CHR$(a)
|
||||||
|
END SELECT
|
||||||
|
NEXT
|
||||||
|
r$ = r1$
|
||||||
|
layout$ = "$LET " + l$ + " = " + r$
|
||||||
|
'First look to see if we have an existing setting like this and if so, update it
|
||||||
|
FOR i = 7 TO UserDefineCount 'UserDefineCount 1-6 are reserved for automatic OS/BIT detection
|
||||||
|
IF UserDefine(0, i) = l$ THEN UserDefine(1, i) = r$: GOTO finishedlinepp
|
||||||
|
NEXT
|
||||||
|
'Otherwise create a new setting and set the initial value for it
|
||||||
|
UserDefineCount = UserDefineCount + 1
|
||||||
|
IF UserDefineCount > UBOUND(UserDefine, 2) THEN
|
||||||
|
REDIM _PRESERVE UserDefine(1, UBOUND(UserDefine, 2) + 10) 'Add another 10 elements to the array so it'll expand as the user adds to it
|
||||||
|
END IF
|
||||||
|
UserDefine(0, UserDefineCount) = l$
|
||||||
|
UserDefine(1, UserDefineCount) = r$
|
||||||
|
GOTO finishedlinepp
|
||||||
|
END IF
|
||||||
|
|
||||||
|
|
||||||
|
IF LEFT$(temp$, 4) = "$IF " THEN
|
||||||
|
IF RIGHT$(temp$, 5) <> " THEN" THEN a$ = "$IF without THEN": GOTO errmes
|
||||||
|
temp$ = LTRIM$(MID$(temp$, 4)) 'strip off the $IF and extra spaces
|
||||||
|
temp$ = RTRIM$(LEFT$(temp$, LEN(temp$) - 4)) 'and strip off the THEN and extra spaces
|
||||||
|
temp = INSTR(temp$, "=")
|
||||||
|
ExecCounter = ExecCounter + 1
|
||||||
|
ExecLevel(ExecCounter) = -1 'default to a skip value
|
||||||
|
DefineElse(ExecCounter) = 1 '1 says we have an $IF statement at this level
|
||||||
|
result = EvalPreIF(temp$, a$)
|
||||||
|
IF a$ <> "" THEN GOTO errmes
|
||||||
|
IF result <> 0 THEN
|
||||||
|
ExecLevel(ExecCounter) = ExecLevel(ExecCounter - 1) 'So we inherit the execlevel from above
|
||||||
|
IF ExecLevel(ExecCounter) = 0 THEN DefineElse(ExecCounter) = DefineElse(ExecCounter) OR 4 'Else if used and conditon found
|
||||||
|
END IF
|
||||||
|
GOTO finishedlinepp 'and then we're finished -- and at this point we didn't make a match so we exit with a DONT READ type flag on our code.
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF temp$ = "$ELSE" THEN
|
||||||
|
IF DefineElse(ExecCounter) = 0 THEN a$ = "$ELSE without $IF": GOTO errmes
|
||||||
|
IF DefineElse(ExecCounter) AND 2 THEN a$ = "$IF block already has $ELSE statement in it": GOTO errmes
|
||||||
|
DefineElse(ExecCounter) = DefineElse(ExecCounter) OR 2 'set the flag to declare an $ELSE already in this block
|
||||||
|
IF DefineElse(ExecCounter) AND 4 THEN 'If we executed code in a previous IF or ELSE IF statement, we can't do it here
|
||||||
|
ExecLevel(ExecCounter) = -1 'So we inherit the execlevel from above
|
||||||
|
ELSE
|
||||||
|
ExecLevel(ExecCounter) = ExecLevel(ExecCounter - 1) 'If we were processing code before, code after this segment is going to be SKIPPED
|
||||||
|
END IF
|
||||||
|
GOTO finishedlinepp
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF LEFT$(temp$, 5) = "$ELSE" THEN 'looking for $ELSE IF
|
||||||
|
temp$ = LTRIM$(MID$(temp$, 6))
|
||||||
|
IF LEFT$(temp$, 3) = "IF " THEN
|
||||||
|
IF DefineElse(ExecCounter) = 0 THEN a$ = "$ELSE IF without $IF": GOTO errmes
|
||||||
|
IF DefineElse(ExecCounter) AND 2 THEN a$ = "$ELSE IF cannot follow $ELSE": GOTO errmes
|
||||||
|
IF RIGHT$(temp$, 5) <> " THEN" THEN a$ = "$ELSE IF without THEN": GOTO errmes
|
||||||
|
IF DefineElse(ExecCounter) AND 4 THEN 'If we executed code in a previous IF or ELSE IF statement, we can't do it here
|
||||||
|
ExecLevel(ExecCounter) = -1
|
||||||
|
GOTO finishedlinepp
|
||||||
|
END IF
|
||||||
|
temp$ = LTRIM$(MID$(temp$, 3)) 'strip off the IF and extra spaces
|
||||||
|
temp$ = RTRIM$(LEFT$(temp$, LEN(temp$) - 4)) 'and strip off the THEN and extra spaces
|
||||||
|
result = EvalPreIF(temp$, a$)
|
||||||
|
IF a$ <> "" THEN GOTO errmes
|
||||||
|
IF result <> 0 THEN
|
||||||
|
ExecLevel(ExecCounter) = ExecLevel(ExecCounter - 1) 'So we inherit the execlevel from above
|
||||||
|
IF ExecLevel(ExecCounter) = 0 THEN DefineElse(ExecCounter) = DefineElse(ExecCounter) OR 4 'Else if used and conditon found
|
||||||
|
END IF
|
||||||
|
GOTO finishedlinepp 'and then we're finished -- and at this point we didn't make a match so we exit with a DONT READ type flag on our code.
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IF temp$ = "$END IF" OR temp$ = "$ENDIF" THEN
|
||||||
|
IF DefineElse(ExecCounter) = 0 THEN a$ = "$END IF without $IF": GOTO errmes
|
||||||
|
DefineElse(ExecCounter) = 0 'We no longer have an $IF block at this level
|
||||||
|
ExecCounter = ExecCounter - 1
|
||||||
|
GOTO finishedlinepp
|
||||||
|
END IF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IF ExecLevel(ExecCounter) THEN
|
||||||
|
IF linenumber > UBOUND(InValidLine) THEN REDIM _PRESERVE InValidLine(UBOUND(InValidLine) + 10000) AS _BIT
|
||||||
|
InValidLine(linenumber) = -1
|
||||||
|
GOTO finishedlinepp 'we don't check for anything inside lines that we've marked for skipping
|
||||||
|
END IF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cwholeline$ = wholeline$
|
cwholeline$ = wholeline$
|
||||||
wholeline$ = eleucase$(wholeline$) '********REMOVE THIS LINE LATER********
|
wholeline$ = eleucase$(wholeline$) '********REMOVE THIS LINE LATER********
|
||||||
|
|
||||||
|
@ -2534,6 +2685,12 @@ IF idemode = 0 AND inclevel = 0 THEN a3$ = lineinput3$
|
||||||
IF a3$ = CHR$(13) THEN EXIT DO
|
IF a3$ = CHR$(13) THEN EXIT DO
|
||||||
linenumber = linenumber + 1
|
linenumber = linenumber + 1
|
||||||
|
|
||||||
|
IF InValidLine(linenumber) THEN
|
||||||
|
layoutok = 1
|
||||||
|
layout$ = SPACE$(controllevel) + LTRIM$(RTRIM$(a3$))
|
||||||
|
IF idemode GOTO ideret4 ELSE GOTO skipide4
|
||||||
|
END IF
|
||||||
|
|
||||||
layout = ""
|
layout = ""
|
||||||
layoutok = 1
|
layoutok = 1
|
||||||
|
|
||||||
|
@ -2556,6 +2713,10 @@ IF Debug THEN PRINT #9, "########" + a3$ + "########"
|
||||||
|
|
||||||
layoutdone = 1 'validates layout of any following goto finishednonexec/finishedline
|
layoutdone = 1 'validates layout of any following goto finishednonexec/finishedline
|
||||||
|
|
||||||
|
'We've already figured out in the prepass which lines are invalidated by the precompiler
|
||||||
|
'No need to go over those lines again.
|
||||||
|
'IF InValidLine(linenumber) THEN goto skipide4 'layoutdone = 0: GOTO finishednonexec
|
||||||
|
|
||||||
'QB64 Metacommands
|
'QB64 Metacommands
|
||||||
IF ASC(a3$) = 36 THEN '$
|
IF ASC(a3$) = 36 THEN '$
|
||||||
|
|
||||||
|
@ -2626,10 +2787,54 @@ Resize = 1: Resize_Scale = 2
|
||||||
GOTO finishednonexec
|
GOTO finishednonexec
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
IF LEFT$(a3u$, 5) = "$LET " THEN GOTO finishednonexec 'we dealt with this basically in the prepass
|
||||||
|
' so we could define CONST and such and have them available for later IDE passes
|
||||||
|
|
||||||
|
IF a3u$ = "$END IF" OR a3u$ = "$ENDIF" THEN
|
||||||
|
layout$ = "$END IF"
|
||||||
|
controltype(controllevel) = 0
|
||||||
|
controllevel = controllevel - 1
|
||||||
|
GOTO finishednonexec
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF LEFT$(a3u$, 4) = "$IF " THEN
|
||||||
|
temp$ = LTRIM$(MID$(a3u$, 4)) 'strip off the $IF and extra spaces
|
||||||
|
temp$ = RTRIM$(LEFT$(temp$, LEN(temp$) - 4)) 'and strip off the THEN and extra spaces
|
||||||
|
temp = INSTR(temp$, "=")
|
||||||
|
controllevel = controllevel + 1
|
||||||
|
controltype(controllevel) = 6
|
||||||
|
IF temp = 0 THEN layout$ = "$IF " + temp$ + " THEN": GOTO finishednonexec 'no = sign in the $IF statement, so we're going to assume the user is doing something like $IF flag
|
||||||
|
l$ = RTRIM$(LEFT$(temp$, temp - 1)): r$ = LTRIM$(MID$(temp$, temp + 1))
|
||||||
|
layout$ = "$IF " + l$ + " = " + r$ + " THEN"
|
||||||
|
GOTO finishednonexec
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF a3u$ = "$ELSE" THEN
|
||||||
|
layout$ = "$ELSE"
|
||||||
|
lhscontrollevel = lhscontrollevel - 1
|
||||||
|
GOTO finishednonexec
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF LEFT$(a3u$, 5) = "$ELSE" THEN
|
||||||
|
temp$ = LTRIM$(MID$(a3u$, 6))
|
||||||
|
IF LEFT$(temp$, 3) = "IF " THEN
|
||||||
|
lhscontrollevel = lhscontrollevel - 1
|
||||||
|
temp$ = LTRIM$(MID$(temp$, 3)) 'strip off the IF and extra spaces
|
||||||
|
temp$ = RTRIM$(LEFT$(temp$, LEN(temp$) - 4)) 'and strip off the THEN and extra spaces
|
||||||
|
temp = INSTR(temp$, "=")
|
||||||
|
IF temp = 0 THEN layout$ = "$ELSE IF " + temp$ + " THEN": GOTO finishednonexec 'no = sign in the $IF statement, so we're going to assume the user is doing something like $IF flag
|
||||||
|
l$ = RTRIM$(LEFT$(temp$, temp - 1)): r$ = LTRIM$(MID$(temp$, temp + 1))
|
||||||
|
layout$ = "$ELSE IF " + l$ + " = " + r$ + " THEN"
|
||||||
|
GOTO finishednonexec
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END IF 'QB64 Metacommands
|
END IF 'QB64 Metacommands
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
linedataoffset = DataOffset
|
linedataoffset = DataOffset
|
||||||
|
|
||||||
entireline$ = lineformat(a3$): IF LEN(entireline$) = 0 THEN GOTO finishednonexec
|
entireline$ = lineformat(a3$): IF LEN(entireline$) = 0 THEN GOTO finishednonexec
|
||||||
|
@ -3926,7 +4131,7 @@ IF declaringlibrary THEN GOTO declibjmp1
|
||||||
IF closedmain = 0 THEN closemain
|
IF closedmain = 0 THEN closemain
|
||||||
|
|
||||||
'check for open controls (copy #2)
|
'check for open controls (copy #2)
|
||||||
IF controllevel THEN
|
IF controllevel <> 0 AND controltype(controllevel) <> 6 THEN 'It's OK for subs to be inside $IF blocks
|
||||||
x = controltype(controllevel)
|
x = controltype(controllevel)
|
||||||
IF x = 1 THEN a$ = "IF without END IF"
|
IF x = 1 THEN a$ = "IF without END IF"
|
||||||
IF x = 2 THEN a$ = "FOR without NEXT"
|
IF x = 2 THEN a$ = "FOR without NEXT"
|
||||||
|
@ -4404,7 +4609,7 @@ IF sf THEN
|
||||||
IF LEN(subfunc) = 0 THEN a$ = "END " + secondelement$ + " without " + secondelement$: GOTO errmes
|
IF LEN(subfunc) = 0 THEN a$ = "END " + secondelement$ + " without " + secondelement$: GOTO errmes
|
||||||
|
|
||||||
'check for open controls (copy #3)
|
'check for open controls (copy #3)
|
||||||
IF controllevel THEN
|
IF controllevel <> 0 AND controltype(controllevel) <> 6 THEN 'It's OK for subs to be inside $IF blocks
|
||||||
x = controltype(controllevel)
|
x = controltype(controllevel)
|
||||||
IF x = 1 THEN a$ = "IF without END IF"
|
IF x = 1 THEN a$ = "IF without END IF"
|
||||||
IF x = 2 THEN a$ = "FOR without NEXT"
|
IF x = 2 THEN a$ = "FOR without NEXT"
|
||||||
|
@ -9885,7 +10090,7 @@ GOTO ideret4 'return control to IDE
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
'layout is not currently used by the compiler (as appose to the IDE), if it was it would be used here
|
'layout is not currently used by the compiler (as appose to the IDE), if it was it would be used here
|
||||||
|
skipide4:
|
||||||
LOOP
|
LOOP
|
||||||
|
|
||||||
ide5:
|
ide5:
|
||||||
|
@ -9898,10 +10103,12 @@ IF definingtype THEN linenumber = definingtypeerror: a$ = "TYPE without END TYPE
|
||||||
'check for open controls (copy #1)
|
'check for open controls (copy #1)
|
||||||
IF controllevel THEN
|
IF controllevel THEN
|
||||||
x = controltype(controllevel)
|
x = controltype(controllevel)
|
||||||
|
a$ = "Unidentified open control block"
|
||||||
IF x = 1 THEN a$ = "IF without END IF"
|
IF x = 1 THEN a$ = "IF without END IF"
|
||||||
IF x = 2 THEN a$ = "FOR without NEXT"
|
IF x = 2 THEN a$ = "FOR without NEXT"
|
||||||
IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
|
IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
|
||||||
IF x = 5 THEN a$ = "WHILE without WEND"
|
IF x = 5 THEN a$ = "WHILE without WEND"
|
||||||
|
IF x = 6 THEN a$ = "$IF without $END IF"
|
||||||
IF (x >= 10 AND x <= 17) OR x = 18 OR x = 19 THEN a$ = "SELECT CASE without END SELECT"
|
IF (x >= 10 AND x <= 17) OR x = 18 OR x = 19 THEN a$ = "SELECT CASE without END SELECT"
|
||||||
linenumber = controlref(controllevel)
|
linenumber = controlref(controllevel)
|
||||||
GOTO errmes
|
GOTO errmes
|
||||||
|
@ -24008,6 +24215,180 @@ END IF
|
||||||
END IF
|
END IF
|
||||||
END FUNCTION
|
END FUNCTION
|
||||||
|
|
||||||
|
FUNCTION EvalPreIF (text$, err$)
|
||||||
|
temp$ = text$ 'so we don't corrupt the string sent to us for evaluation
|
||||||
|
err$ = "" 'null the err message to begin with
|
||||||
|
'first order of business is to solve for <>=
|
||||||
|
DIM PC_Op(3) AS STRING
|
||||||
|
PC_Op(1) = "="
|
||||||
|
PC_Op(2) = "<"
|
||||||
|
PC_Op(3) = ">"
|
||||||
|
DO
|
||||||
|
'look for the existence of the first symbol if there is any
|
||||||
|
firstsymbol$ = "": first = 0
|
||||||
|
FOR i = 1 TO UBOUND(PC_Op)
|
||||||
|
temp = INSTR(temp$, PC_Op(i))
|
||||||
|
IF first = 0 THEN first = temp: firstsymbol$ = PC_Op(i)
|
||||||
|
IF temp <> 0 AND temp < first THEN first = temp: firstsymbol$ = PC_Op(i)
|
||||||
|
NEXT
|
||||||
|
IF firstsymbol$ <> "" THEN 'we've got = < >; let's see if we have a combination of them
|
||||||
|
secondsymbol = 0: second = 0
|
||||||
|
FOR i = first + 1 TO LEN(temp$)
|
||||||
|
a$ = MID$(temp$, i, 1)
|
||||||
|
SELECT CASE a$
|
||||||
|
CASE " " 'ignore spaces
|
||||||
|
CASE "=", "<", ">"
|
||||||
|
IF a$ = firstsymbol$ THEN err$ = "Duplicate operator (" + a$ + ")": EXIT SUB
|
||||||
|
second = i: secondsymbol$ = a$
|
||||||
|
CASE ELSE 'we found a symbol we don't recognize
|
||||||
|
EXIT FOR
|
||||||
|
END SELECT
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
IF first THEN 'we found a symbol
|
||||||
|
l$ = RTRIM$(LEFT$(temp$, first - 1))
|
||||||
|
IF second THEN rightstart = second + 1 ELSE rightstart = first + 1
|
||||||
|
|
||||||
|
r$ = LTRIM$(MID$(temp$, rightstart))
|
||||||
|
symbol$ = MID$(temp$, first, 1) + MID$(temp$, second, 1)
|
||||||
|
'now we check for spaces to separate this segment from any other AND/OR conditions and such
|
||||||
|
FOR i = LEN(l$) TO 1 STEP -1
|
||||||
|
IF ASC(l$, i) = 32 THEN EXIT FOR
|
||||||
|
NEXT
|
||||||
|
leftside$ = RTRIM$(LEFT$(temp$, i))
|
||||||
|
l$ = LTRIM$(RTRIM$(MID$(temp$, i + 1, LEN(l$) - i)))
|
||||||
|
rightstop = LEN(r$)
|
||||||
|
FOR i = 1 TO LEN(r$)
|
||||||
|
IF ASC(r$, i) = 32 THEN EXIT FOR
|
||||||
|
NEXT
|
||||||
|
rightside$ = LTRIM$(MID$(r$, i + 1))
|
||||||
|
r$ = LTRIM$(RTRIM$(LEFT$(r$, i - 1)))
|
||||||
|
IF symbol$ = "=<" THEN symbol$ = "<="
|
||||||
|
IF symbol$ = "=>" THEN symbol$ = ">="
|
||||||
|
IF symbol$ = "><" THEN symbol$ = "<>"
|
||||||
|
result$ = " 0 "
|
||||||
|
IF symbol$ = "<>" THEN 'check to see if we're NOT equal in any case with <>
|
||||||
|
FOR i = 0 TO UserDefineCount
|
||||||
|
IF UserDefine(0, i) = l$ AND UserDefine(1, i) <> r$ THEN result$ = " -1 ": GOTO finishedcheck
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
IF INSTR(symbol$, "=") THEN 'check to see if we're equal in any case with =
|
||||||
|
FOR i = 0 TO UserDefineCount
|
||||||
|
IF UserDefine(0, i) = l$ AND UserDefine(1, i) = r$ THEN result$ = " -1 ": GOTO finishedcheck
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
|
||||||
|
IF INSTR(symbol$, ">") THEN 'check to see if we're greater than in any case with >
|
||||||
|
FOR i = 0 TO UserDefineCount
|
||||||
|
IF VerifyNumber(r$) AND VerifyNumber(UserDefine(1, i)) THEN 'we're comparing numeric values
|
||||||
|
IF UserDefine(0, i) = l$ AND VAL(UserDefine(1, i)) > VAL(r$) THEN result$ = " -1 ": GOTO finishedcheck
|
||||||
|
ELSE
|
||||||
|
IF UserDefine(0, i) = l$ AND UserDefine(1, i) > r$ THEN result$ = " -1 ": GOTO finishedcheck
|
||||||
|
END IF
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
IF INSTR(symbol$, "<") THEN 'check to see if we're less than in any case with <
|
||||||
|
FOR i = 0 TO UserDefineCount
|
||||||
|
IF VerifyNumber(r$) AND VerifyNumber(UserDefine(1, i)) THEN 'we're comparing numeric values
|
||||||
|
IF UserDefine(0, i) = l$ AND VAL(UserDefine(1, i)) < VAL(r$) THEN result$ = " -1 ": GOTO finishedcheck
|
||||||
|
ELSE
|
||||||
|
IF UserDefine(0, i) = l$ AND UserDefine(1, i) < r$ THEN result$ = " -1 ": GOTO finishedcheck
|
||||||
|
END IF
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
finishedcheck:
|
||||||
|
temp$ = leftside$ + result$ + rightside$
|
||||||
|
END IF
|
||||||
|
LOOP UNTIL first = 0
|
||||||
|
|
||||||
|
'And at this point we should now be down to a statement with nothing but AND/OR/XORS in it
|
||||||
|
|
||||||
|
PC_Op(1) = " AND "
|
||||||
|
PC_Op(2) = " OR "
|
||||||
|
PC_Op(3) = " XOR "
|
||||||
|
|
||||||
|
DO
|
||||||
|
first = 0
|
||||||
|
FOR i = 1 TO UBOUND(PC_Op)
|
||||||
|
IF PC_Op(i) <> "" THEN
|
||||||
|
t = INSTR(temp$, PC_Op(i))
|
||||||
|
IF first <> 0 THEN
|
||||||
|
IF t < first AND t <> 0 THEN first = t: firstsymbol = i
|
||||||
|
ELSE
|
||||||
|
first = t: firstsymbol = i
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
NEXT
|
||||||
|
IF first = 0 THEN EXIT DO
|
||||||
|
leftside$ = RTRIM$(LEFT$(temp$, first - 1))
|
||||||
|
symbol$ = MID$(temp$, first, LEN(PC_Op(firstsymbol)))
|
||||||
|
t$ = MID$(temp$, first + LEN(PC_Op(firstsymbol)))
|
||||||
|
t = INSTR(t$, " ") 'the first space we come to
|
||||||
|
IF t THEN
|
||||||
|
m$ = LTRIM$(RTRIM$(LEFT$(t$, t - 1)))
|
||||||
|
rightside$ = LTRIM$(MID$(t$, t))
|
||||||
|
ELSE
|
||||||
|
m$ = LTRIM$(MID$(t$, t))
|
||||||
|
rightside$ = ""
|
||||||
|
END IF
|
||||||
|
leftresult = 0
|
||||||
|
IF VerifyNumber(leftside$) THEN
|
||||||
|
IF VAL(leftside$) <> 0 THEN leftresult = -1
|
||||||
|
ELSE
|
||||||
|
FOR i = 0 TO UserDefineCount
|
||||||
|
IF UserDefine(0, i) = leftside$ THEN
|
||||||
|
t$ = LTRIM$(RTRIM$(UserDefine(1, i)))
|
||||||
|
IF t$ <> "0" AND t$ <> "" THEN leftresult = -1: EXIT FOR
|
||||||
|
END IF
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
rightresult = 0
|
||||||
|
IF VerifyNumber(m$) THEN
|
||||||
|
IF VAL(m$) <> 0 THEN rightresult = -1
|
||||||
|
ELSE
|
||||||
|
FOR i = 0 TO UserDefineCount
|
||||||
|
IF UserDefine(0, i) = m$ THEN
|
||||||
|
t$ = LTRIM$(RTRIM$(UserDefine(1, i)))
|
||||||
|
IF t$ <> "0" AND t$ <> "" THEN rightresult = -1: EXIT FOR
|
||||||
|
END IF
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
SELECT CASE LTRIM$(RTRIM$(symbol$))
|
||||||
|
CASE "AND"
|
||||||
|
IF leftresult <> 0 AND rightresult <> 0 THEN result$ = " -1 " ELSE result$ = " 0 "
|
||||||
|
CASE "OR"
|
||||||
|
IF leftresult <> 0 OR rightresult <> 0 THEN result$ = " -1 " ELSE result$ = " 0 "
|
||||||
|
CASE "XOR"
|
||||||
|
IF leftresult <> rightresult THEN result$ = " -1 " ELSE result$ = " 0 "
|
||||||
|
END SELECT
|
||||||
|
temp$ = result$ + rightside$
|
||||||
|
LOOP
|
||||||
|
|
||||||
|
IF VerifyNumber(temp$) THEN
|
||||||
|
EvalPreIF = VAL(temp$)
|
||||||
|
ELSE
|
||||||
|
IF INSTR(temp$, " ") THEN err$ = "Invalid Resolution of $IF; check statements" 'If we've got more than 1 statement, it's invalid
|
||||||
|
FOR i = 0 TO UserDefineCount
|
||||||
|
IF UserDefine(0, i) = temp$ THEN
|
||||||
|
t$ = LTRIM$(RTRIM$(UserDefine(1, i)))
|
||||||
|
IF t$ <> "0" AND t$ <> "" THEN EvalPreIF = -1: EXIT FOR
|
||||||
|
END IF
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
|
||||||
|
END SUB
|
||||||
|
|
||||||
|
FUNCTION VerifyNumber (text$)
|
||||||
|
t$ = LTRIM$(RTRIM$(text$))
|
||||||
|
v = VAL(t$)
|
||||||
|
t1$ = LTRIM$(STR$(v))
|
||||||
|
IF t$ = t1$ THEN VerifyNumber = -1
|
||||||
|
END FUNCTION
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'$INCLUDE:'subs_functions\extensions\opengl\opengl_methods.bas'
|
'$INCLUDE:'subs_functions\extensions\opengl\opengl_methods.bas'
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue