Skip to content

Commit 9ec149b

Browse files
authored
Merge pull request #478 from a740g/logical-operators
Logical Boolean operators
2 parents 561a5ce + 06101c0 commit 9ec149b

File tree

4 files changed

+142
-22
lines changed

4 files changed

+142
-22
lines changed

source/qb64pe.bas

+57-21
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,9 @@ HashAdd "AND", f, 0
11711171
HashAdd "OR", f, 0
11721172
HashAdd "XOR", f, 0
11731173
HashAdd "MOD", f, 0
1174+
HashAdd "_NEGATE", f, 0
1175+
HashAdd "_ANDALSO", f, 0
1176+
HashAdd "_ORELSE", f, 0
11741177

11751178
f = HASHFLAG_RESERVED + HASHFLAG_CUSTOMSYNTAX
11761179
HashAdd "LIST", f, 0
@@ -1548,6 +1551,11 @@ IF qb64prefix_set THEN
15481551

15491552
f = HASHFLAG_RESERVED + HASHFLAG_CUSTOMSYNTAX
15501553
HashAdd "EXPLICIT", f, 0
1554+
1555+
f = HASHFLAG_OPERATOR + HASHFLAG_RESERVED
1556+
HashAdd "NEGATE", f, 0
1557+
HashAdd "ANDALSO", f, 0
1558+
HashAdd "ORELSE", f, 0
15511559
END IF
15521560

15531561
DIM SHARED GlobTxtBuf: GlobTxtBuf = OpenBuffer%("O", tmpdir$ + "global.txt")
@@ -18828,6 +18836,12 @@ FUNCTION fixoperationorder$ (savea$)
1882818836
IF temp1$ = "XOR" AND temp2$ = "XOR" THEN Give_Error "Error: XOR XOR": EXIT FUNCTION
1882918837
IF temp1$ = "IMP" AND temp2$ = "IMP" THEN Give_Error "Error: IMP IMP": EXIT FUNCTION
1883018838
IF temp1$ = "EQV" AND temp2$ = "EQV" THEN Give_Error "Error: EQV EQV": EXIT FUNCTION
18839+
IF temp1$ = "_ANDALSO" AND temp2$ = "_ANDALSO" THEN Give_Error "Error: _ANDALSO _ANDALSO": EXIT FUNCTION
18840+
IF temp1$ = "_ORELSE" AND temp2$ = "_ORELSE" THEN Give_Error "Error: _ORELSE _ORELSE": EXIT FUNCTION
18841+
IF qb64prefix_set THEN
18842+
IF temp1$ = "ANDALSO" AND temp2$ = "ANDALSO" THEN Give_Error "Error: ANDALSO ANDALSO": EXIT FUNCTION
18843+
IF temp1$ = "ORELSE" AND temp2$ = "ORELSE" THEN Give_Error "Error: ORELSE ORELSE": EXIT FUNCTION
18844+
END IF
1883118845
NEXT
1883218846

1883318847
'----------------A. 'Quick' mismatched brackets check----------------
@@ -19784,11 +19798,14 @@ END SUB
1978419798
FUNCTION isoperator (a2$)
1978519799
a$ = UCASE$(a2$)
1978619800
l = 0
19801+
l = l + 1: IF a$ = "_ORELSE" OR (qb64prefix_set AND a$ = "ORELSE") THEN GOTO opfound
19802+
l = l + 1: IF a$ = "_ANDALSO" OR (qb64prefix_set AND a$ = "ANDALSO") THEN GOTO opfound
1978719803
l = l + 1: IF a$ = "IMP" THEN GOTO opfound
1978819804
l = l + 1: IF a$ = "EQV" THEN GOTO opfound
1978919805
l = l + 1: IF a$ = "XOR" THEN GOTO opfound
1979019806
l = l + 1: IF a$ = "OR" THEN GOTO opfound
1979119807
l = l + 1: IF a$ = "AND" THEN GOTO opfound
19808+
l = l + 1: IF a$ = "_NEGATE" OR (qb64prefix_set AND a$ = "NEGATE") THEN GOTO opfound
1979219809
l = l + 1: IF a$ = "NOT" THEN GOTO opfound
1979319810
l = l + 1
1979419811
IF a$ = "=" THEN GOTO opfound
@@ -20883,9 +20900,12 @@ FUNCTION operatorusage (operator$, typ AS LONG, info$, lhs AS LONG, rhs AS LONG,
2088320900
IF operator$ = "XOR" THEN info$ = "^": operatorusage = 1: EXIT FUNCTION
2088420901
IF operator$ = "OR" THEN info$ = "|": operatorusage = 1: EXIT FUNCTION
2088520902
IF operator$ = "AND" THEN info$ = "&": operatorusage = 1: EXIT FUNCTION
20903+
IF operator$ = "_ORELSE" OR (qb64prefix_set AND operator$ = "ORELSE") THEN info$ = "||": operatorusage = 3: EXIT FUNCTION
20904+
IF operator$ = "_ANDALSO" OR (qb64prefix_set AND operator$ = "ANDALSO") THEN info$ = "&&": operatorusage = 3: EXIT FUNCTION
2088620905

2088720906
lhs = 7
2088820907
IF operator$ = "NOT" THEN info$ = "~": operatorusage = 5: EXIT FUNCTION
20908+
IF operator$ = "_NEGATE" OR (qb64prefix_set AND operator$ = "NEGATE") THEN info$ = "!": operatorusage = 5: EXIT FUNCTION
2088920909

2089020910
IF Debug THEN PRINT #9, "INVALID NUMBERIC OPERATOR!": END
2089120911

@@ -23681,27 +23701,43 @@ FUNCTION SCase2$ (t$)
2368123701
IF ideautolayoutkwcapitals THEN
2368223702
SCase2$ = UCASE$(t$)
2368323703
ELSE
23684-
newWord = -1
23685-
temp$ = ""
23686-
FOR i = 1 TO LEN(t$)
23687-
s$ = MID$(t$, i, 1)
23688-
IF newWord THEN
23689-
IF s$ = "_" OR s$ = separator$ THEN
23690-
temp$ = temp$ + s$
23691-
ELSE
23692-
temp$ = temp$ + UCASE$(s$)
23693-
newWord = 0
23694-
END IF
23695-
ELSE
23696-
IF s$ = separator$ THEN
23697-
temp$ = temp$ + separator$
23698-
newWord = -1
23699-
ELSE
23700-
temp$ = temp$ + LCASE$(s$)
23701-
END IF
23702-
END IF
23703-
NEXT
23704-
SCase2$ = temp$
23704+
SELECT CASE t$
23705+
CASE "_ANDALSO"
23706+
SCase2$ = "_AndAlso"
23707+
23708+
CASE "ANDALSO"
23709+
SCase2$ = "AndAlso"
23710+
23711+
CASE "_ORELSE"
23712+
SCase2$ = "_OrElse"
23713+
23714+
CASE "ORELSE"
23715+
SCase2$ = "OrElse"
23716+
23717+
CASE ELSE
23718+
newWord = -1
23719+
temp$ = ""
23720+
FOR i = 1 TO LEN(t$)
23721+
s$ = MID$(t$, i, 1)
23722+
IF newWord THEN
23723+
IF s$ = "_" OR s$ = separator$ THEN
23724+
temp$ = temp$ + s$
23725+
ELSE
23726+
temp$ = temp$ + UCASE$(s$)
23727+
newWord = 0
23728+
END IF
23729+
ELSE
23730+
IF s$ = separator$ THEN
23731+
temp$ = temp$ + separator$
23732+
newWord = -1
23733+
ELSE
23734+
temp$ = temp$ + LCASE$(s$)
23735+
END IF
23736+
END IF
23737+
NEXT
23738+
SCase2$ = temp$
23739+
23740+
END SELECT
2370523741
END IF
2370623742
END FUNCTION
2370723743

source/subs_functions/syntax_highlighter_list.bas

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ listOfKeywords$ = listOfKeywords$ + "_GLCOPYTEXSUBIMAGE2D@_GLCULLFACE@_GLDELETEL
55
listOfKeywords$ = listOfKeywords$ + "_GLPOPATTRIB@_GLPOPCLIENTATTRIB@_GLPOPMATRIX@_GLPOPNAME@_GLPRIORITIZETEXTURES@_GLPUSHATTRIB@_GLPUSHCLIENTATTRIB@_GLPUSHMATRIX@_GLPUSHNAME@_GLRASTERPOS2D@_GLRASTERPOS2DV@_GLRASTERPOS2F@_GLRASTERPOS2FV@_GLRASTERPOS2I@_GLRASTERPOS2IV@_GLRASTERPOS2S@_GLRASTERPOS2SV@_GLRASTERPOS3D@_GLRASTERPOS3DV@_GLRASTERPOS3F@_GLRASTERPOS3FV@_GLRASTERPOS3I@_GLRASTERPOS3IV@_GLRASTERPOS3S@_GLRASTERPOS3SV@_GLRASTERPOS4D@_GLRASTERPOS4DV@_GLRASTERPOS4F@_GLRASTERPOS4FV@_GLRASTERPOS4I@_GLRASTERPOS4IV@_GLRASTERPOS4S@_GLRASTERPOS4SV@_GLREADBUFFER@_GLREADPIXELS@_GLRECTD@_GLRECTDV@_GLRECTF@_GLRECTFV@_GLRECTI@_GLRECTIV@_GLRECTS@_GLRECTSV@_GLRENDERMODE@_GLROTATED@_GLROTATEF@_GLSCALED@_GLSCALEF@_GLSCISSOR@_GLSELECTBUFFER@_GLSHADEMODEL@_GLSTENCILFUNC@_GLSTENCILMASK@_GLSTENCILOP@_GLTEXCOORD1D@_GLTEXCOORD1DV@_GLTEXCOORD1F@_GLTEXCOORD1FV@_GLTEXCOORD1I@_GLTEXCOORD1IV@_GLTEXCOORD1S@_GLTEXCOORD1SV@_GLTEXCOORD2D@_GLTEXCOORD2DV@_GLTEXCOORD2F@_GLTEXCOORD2FV@_GLTEXCOORD2I@_GLTEXCOORD2IV@_GLTEXCOORD2S@_GLTEXCOORD2SV@_GLTEXCOORD3D@_GLTEXCOORD3DV@_GLTEXCOORD3F@_GLTEXCOORD3FV@_GLTEXCOORD3I@_GLTEXCOORD3IV@_GLTEXCOORD3S@_GLTEXCOORD3SV@_GLTEXCOORD4D@_GLTEXCOORD4DV@_GLTEXCOORD4F@_GLTEXCOORD4FV@_GLTEXCOORD4I@_GLTEXCOORD4IV@_GLTEXCOORD4S@_GLTEXCOORD4SV@_GLTEXCOORDPOINTER@_GLTEXENVF@_GLTEXENVFV@_GLTEXENVI@_GLTEXENVIV@_GLTEXGEND@_GLTEXGENDV@_GLTEXGENF@_GLTEXGENFV@_GLTEXGENI@_GLTEXGENIV@_GLTEXIMAGE1D@_GLTEXIMAGE2D@_GLTEXPARAMETERF@_GLTEXPARAMETERFV@_GLTEXPARAMETERI@_GLTEXPARAMETERIV@_GLTEXSUBIMAGE1D@_GLTEXSUBIMAGE2D@_GLTRANSLATED@_GLTRANSLATEF@_GLVERTEX2D@_GLVERTEX2DV@_GLVERTEX2F@_GLVERTEX2FV@_GLVERTEX2I@_GLVERTEX2IV@_GLVERTEX2S@_GLVERTEX2SV@_GLVERTEX3D@_GLVERTEX3DV@_GLVERTEX3F@_GLVERTEX3FV@_GLVERTEX3I@_GLVERTEX3IV@_GLVERTEX3S@_GLVERTEX3SV@_GLVERTEX4D@_GLVERTEX4DV@_GLVERTEX4F@_GLVERTEX4FV@_GLVERTEX4I@_GLVERTEX4IV@_GLVERTEX4S@_GLVERTEX4SV@_GLVERTEXPOINTER@_GLVIEWPORT@SMOOTH@STRETCH@_ANTICLOCKWISE@_BEHIND@_CLEAR@_FILLBACKGROUND@_GLUPERSPECTIVE@_HARDWARE@_HARDWARE1@_KEEPBACKGROUND@_NONE@_OFF@_ONLY@_ONLYBACKGROUND@_ONTOP@_SEAMLESS@_SMOOTH@_SMOOTHSHRUNK@_SMOOTHSTRETCHED@"
66
listOfKeywords$ = listOfKeywords$ + "_SOFTWARE@_SQUAREPIXELS@_STRETCH@_ALLOWFULLSCREEN@_ALL@_ECHO@_READFILE$@_WRITEFILE@_INSTRREV@_TRIM$@_ACCEPTFILEDROP@_FINISHDROP@_TOTALDROPPEDFILES@_DROPPEDFILE@_DROPPEDFILE$@_SHR@_SHL@_ROR@_ROL@"
77
listOfKeywords$ = listOfKeywords$ + "_ADLER32@_CRC32@_MD5$@_DEFLATE$@_INFLATE$@_READBIT@_RESETBIT@_SETBIT@_TOGGLEBIT@$INCLUDEONCE@$ASSERTS@CONSOLE@_ASSERT@_CAPSLOCK@_NUMLOCK@_SCROLLLOCK@_TOGGLE@_CONSOLEFONT@_CONSOLECURSOR@_CONSOLEINPUT@_CINP@$NOPREFIX@$COLOR@$DEBUG@$EMBED@_EMBEDDED$@_ENVIRONCOUNT@$UNSTABLE@$MIDISOUNDFONT@"
8-
listOfKeywords$ = listOfKeywords$ + "_NOTIFYPOPUP@_MESSAGEBOX@_INPUTBOX$@_SELECTFOLDERDIALOG$@_COLORCHOOSERDIALOG@_OPENFILEDIALOG$@_SAVEFILEDIALOG$@_SAVEIMAGE@_FILES$@_FULLPATH$@"
8+
listOfKeywords$ = listOfKeywords$ + "_NOTIFYPOPUP@_MESSAGEBOX@_INPUTBOX$@_SELECTFOLDERDIALOG$@_COLORCHOOSERDIALOG@_OPENFILEDIALOG$@_SAVEFILEDIALOG$@_SAVEIMAGE@_FILES$@_FULLPATH$@_NEGATE@_ANDALSO@_ORELSE@"
99
listOfKeywords$ = listOfKeywords$ + "_STATUSCODE@_SNDNEW@_SCALEDWIDTH@_SCALEDHEIGHT@_UFONTHEIGHT@_UPRINTWIDTH@_ULINESPACING@_UPRINTSTRING@_UCHARPOS@"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
$CONSOLE:ONLY
2+
_DEFINE A-Z AS LONG
3+
OPTION _EXPLICIT
4+
5+
CONST A = -100
6+
CONST B = -10
7+
CONST D = 10
8+
CONST E = 100
9+
10+
DIM c AS LONG
11+
12+
PRINT "Logical op test:"
13+
PRINT
14+
15+
c = _NEGATE (_NEGATE (_NEGATE (_NEGATE c)))
16+
17+
IF _NEGATE GetValue(c) THEN
18+
PRINT "_NEGATE: Test passed."
19+
ELSE
20+
PRINT "_NEGATE: Test failed."
21+
END IF
22+
23+
IF GetValue(D) < 0 _ANDALSO GetValue(E) < 0 THEN
24+
PRINT "_ANDALSO: Test failed."
25+
ELSE
26+
PRINT "_ANDALSO: Test passed."
27+
END IF
28+
29+
IF GetValue(A) < 0 _ORELSE GetValue(B) < 0 THEN
30+
PRINT "_ORELSE: Test passed."
31+
ELSE
32+
PRINT "_ORELSE: Test failed."
33+
END IF
34+
35+
36+
PRINT
37+
PRINT "Bitwise op test:"
38+
PRINT
39+
40+
c = NOT (NOT (NOT (NOT c)))
41+
42+
IF NOT GetValue(c) THEN
43+
PRINT "NOT: Test passed."
44+
ELSE
45+
PRINT "NOT: Test failed."
46+
END IF
47+
48+
IF GetValue(D) < 0 AND GetValue(E) < 0 THEN
49+
PRINT "AND: Test failed."
50+
ELSE
51+
PRINT "AND: Test passed."
52+
END IF
53+
54+
IF GetValue(A) < 0 OR GetValue(B) < 0 THEN
55+
PRINT "OR: Test passed."
56+
ELSE
57+
PRINT "OR: Test failed."
58+
END IF
59+
60+
SYSTEM
61+
62+
FUNCTION GetValue& (x AS LONG)
63+
PRINT "Function called for value:"; x
64+
GetValue = x
65+
END FUNCTION
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Logical op test:
2+
3+
Function called for value: 0
4+
_NEGATE: Test passed.
5+
Function called for value: 10
6+
_ANDALSO: Test passed.
7+
Function called for value:-100
8+
_ORELSE: Test passed.
9+
10+
Bitwise op test:
11+
12+
Function called for value: 0
13+
NOT: Test passed.
14+
Function called for value: 10
15+
Function called for value: 100
16+
AND: Test passed.
17+
Function called for value:-100
18+
Function called for value:-10
19+
OR: Test passed.

0 commit comments

Comments
 (0)