diff --git a/source/qb64pe.bas b/source/qb64pe.bas index e889336ef..94ad7475c 100644 --- a/source/qb64pe.bas +++ b/source/qb64pe.bas @@ -1171,6 +1171,9 @@ HashAdd "AND", f, 0 HashAdd "OR", f, 0 HashAdd "XOR", f, 0 HashAdd "MOD", f, 0 +HashAdd "_NEGATE", f, 0 +HashAdd "_ANDALSO", f, 0 +HashAdd "_ORELSE", f, 0 f = HASHFLAG_RESERVED + HASHFLAG_CUSTOMSYNTAX HashAdd "LIST", f, 0 @@ -1548,6 +1551,11 @@ IF qb64prefix_set THEN f = HASHFLAG_RESERVED + HASHFLAG_CUSTOMSYNTAX HashAdd "EXPLICIT", f, 0 + + f = HASHFLAG_OPERATOR + HASHFLAG_RESERVED + HashAdd "NEGATE", f, 0 + HashAdd "ANDALSO", f, 0 + HashAdd "ORELSE", f, 0 END IF DIM SHARED GlobTxtBuf: GlobTxtBuf = OpenBuffer%("O", tmpdir$ + "global.txt") @@ -18828,6 +18836,12 @@ FUNCTION fixoperationorder$ (savea$) IF temp1$ = "XOR" AND temp2$ = "XOR" THEN Give_Error "Error: XOR XOR": EXIT FUNCTION IF temp1$ = "IMP" AND temp2$ = "IMP" THEN Give_Error "Error: IMP IMP": EXIT FUNCTION IF temp1$ = "EQV" AND temp2$ = "EQV" THEN Give_Error "Error: EQV EQV": EXIT FUNCTION + IF temp1$ = "_ANDALSO" AND temp2$ = "_ANDALSO" THEN Give_Error "Error: _ANDALSO _ANDALSO": EXIT FUNCTION + IF temp1$ = "_ORELSE" AND temp2$ = "_ORELSE" THEN Give_Error "Error: _ORELSE _ORELSE": EXIT FUNCTION + IF qb64prefix_set THEN + IF temp1$ = "ANDALSO" AND temp2$ = "ANDALSO" THEN Give_Error "Error: ANDALSO ANDALSO": EXIT FUNCTION + IF temp1$ = "ORELSE" AND temp2$ = "ORELSE" THEN Give_Error "Error: ORELSE ORELSE": EXIT FUNCTION + END IF NEXT '----------------A. 'Quick' mismatched brackets check---------------- @@ -19784,11 +19798,14 @@ END SUB FUNCTION isoperator (a2$) a$ = UCASE$(a2$) l = 0 + l = l + 1: IF a$ = "_ORELSE" OR (qb64prefix_set AND a$ = "ORELSE") THEN GOTO opfound + l = l + 1: IF a$ = "_ANDALSO" OR (qb64prefix_set AND a$ = "ANDALSO") THEN GOTO opfound l = l + 1: IF a$ = "IMP" THEN GOTO opfound l = l + 1: IF a$ = "EQV" THEN GOTO opfound l = l + 1: IF a$ = "XOR" THEN GOTO opfound l = l + 1: IF a$ = "OR" THEN GOTO opfound l = l + 1: IF a$ = "AND" THEN GOTO opfound + l = l + 1: IF a$ = "_NEGATE" OR (qb64prefix_set AND a$ = "NEGATE") THEN GOTO opfound l = l + 1: IF a$ = "NOT" THEN GOTO opfound l = l + 1 IF a$ = "=" THEN GOTO opfound @@ -20883,9 +20900,12 @@ FUNCTION operatorusage (operator$, typ AS LONG, info$, lhs AS LONG, rhs AS LONG, IF operator$ = "XOR" THEN info$ = "^": operatorusage = 1: EXIT FUNCTION IF operator$ = "OR" THEN info$ = "|": operatorusage = 1: EXIT FUNCTION IF operator$ = "AND" THEN info$ = "&": operatorusage = 1: EXIT FUNCTION + IF operator$ = "_ORELSE" OR (qb64prefix_set AND operator$ = "ORELSE") THEN info$ = "||": operatorusage = 3: EXIT FUNCTION + IF operator$ = "_ANDALSO" OR (qb64prefix_set AND operator$ = "ANDALSO") THEN info$ = "&&": operatorusage = 3: EXIT FUNCTION lhs = 7 IF operator$ = "NOT" THEN info$ = "~": operatorusage = 5: EXIT FUNCTION + IF operator$ = "_NEGATE" OR (qb64prefix_set AND operator$ = "NEGATE") THEN info$ = "!": operatorusage = 5: EXIT FUNCTION IF Debug THEN PRINT #9, "INVALID NUMBERIC OPERATOR!": END @@ -23681,27 +23701,43 @@ FUNCTION SCase2$ (t$) IF ideautolayoutkwcapitals THEN SCase2$ = UCASE$(t$) ELSE - newWord = -1 - temp$ = "" - FOR i = 1 TO LEN(t$) - s$ = MID$(t$, i, 1) - IF newWord THEN - IF s$ = "_" OR s$ = separator$ THEN - temp$ = temp$ + s$ - ELSE - temp$ = temp$ + UCASE$(s$) - newWord = 0 - END IF - ELSE - IF s$ = separator$ THEN - temp$ = temp$ + separator$ - newWord = -1 - ELSE - temp$ = temp$ + LCASE$(s$) - END IF - END IF - NEXT - SCase2$ = temp$ + SELECT CASE t$ + CASE "_ANDALSO" + SCase2$ = "_AndAlso" + + CASE "ANDALSO" + SCase2$ = "AndAlso" + + CASE "_ORELSE" + SCase2$ = "_OrElse" + + CASE "ORELSE" + SCase2$ = "OrElse" + + CASE ELSE + newWord = -1 + temp$ = "" + FOR i = 1 TO LEN(t$) + s$ = MID$(t$, i, 1) + IF newWord THEN + IF s$ = "_" OR s$ = separator$ THEN + temp$ = temp$ + s$ + ELSE + temp$ = temp$ + UCASE$(s$) + newWord = 0 + END IF + ELSE + IF s$ = separator$ THEN + temp$ = temp$ + separator$ + newWord = -1 + ELSE + temp$ = temp$ + LCASE$(s$) + END IF + END IF + NEXT + SCase2$ = temp$ + + END SELECT END IF END FUNCTION diff --git a/source/subs_functions/syntax_highlighter_list.bas b/source/subs_functions/syntax_highlighter_list.bas index 19cc5f853..fa16146e2 100644 --- a/source/subs_functions/syntax_highlighter_list.bas +++ b/source/subs_functions/syntax_highlighter_list.bas @@ -5,5 +5,5 @@ listOfKeywords$ = listOfKeywords$ + "_GLCOPYTEXSUBIMAGE2D@_GLCULLFACE@_GLDELETEL 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@" listOfKeywords$ = listOfKeywords$ + "_SOFTWARE@_SQUAREPIXELS@_STRETCH@_ALLOWFULLSCREEN@_ALL@_ECHO@_READFILE$@_WRITEFILE@_INSTRREV@_TRIM$@_ACCEPTFILEDROP@_FINISHDROP@_TOTALDROPPEDFILES@_DROPPEDFILE@_DROPPEDFILE$@_SHR@_SHL@_ROR@_ROL@" 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@" -listOfKeywords$ = listOfKeywords$ + "_NOTIFYPOPUP@_MESSAGEBOX@_INPUTBOX$@_SELECTFOLDERDIALOG$@_COLORCHOOSERDIALOG@_OPENFILEDIALOG$@_SAVEFILEDIALOG$@_SAVEIMAGE@_FILES$@_FULLPATH$@" +listOfKeywords$ = listOfKeywords$ + "_NOTIFYPOPUP@_MESSAGEBOX@_INPUTBOX$@_SELECTFOLDERDIALOG$@_COLORCHOOSERDIALOG@_OPENFILEDIALOG$@_SAVEFILEDIALOG$@_SAVEIMAGE@_FILES$@_FULLPATH$@_NEGATE@_ANDALSO@_ORELSE@" listOfKeywords$ = listOfKeywords$ + "_STATUSCODE@_SNDNEW@_SCALEDWIDTH@_SCALEDHEIGHT@_UFONTHEIGHT@_UPRINTWIDTH@_ULINESPACING@_UPRINTSTRING@_UCHARPOS@" diff --git a/tests/compile_tests/bool_test/bool_test.bas b/tests/compile_tests/bool_test/bool_test.bas new file mode 100644 index 000000000..39879211d --- /dev/null +++ b/tests/compile_tests/bool_test/bool_test.bas @@ -0,0 +1,65 @@ +$CONSOLE:ONLY +_DEFINE A-Z AS LONG +OPTION _EXPLICIT + +CONST A = -100 +CONST B = -10 +CONST D = 10 +CONST E = 100 + +DIM c AS LONG + +PRINT "Logical op test:" +PRINT + +c = _NEGATE (_NEGATE (_NEGATE (_NEGATE c))) + +IF _NEGATE GetValue(c) THEN + PRINT "_NEGATE: Test passed." +ELSE + PRINT "_NEGATE: Test failed." +END IF + +IF GetValue(D) < 0 _ANDALSO GetValue(E) < 0 THEN + PRINT "_ANDALSO: Test failed." +ELSE + PRINT "_ANDALSO: Test passed." +END IF + +IF GetValue(A) < 0 _ORELSE GetValue(B) < 0 THEN + PRINT "_ORELSE: Test passed." +ELSE + PRINT "_ORELSE: Test failed." +END IF + + +PRINT +PRINT "Bitwise op test:" +PRINT + +c = NOT (NOT (NOT (NOT c))) + +IF NOT GetValue(c) THEN + PRINT "NOT: Test passed." +ELSE + PRINT "NOT: Test failed." +END IF + +IF GetValue(D) < 0 AND GetValue(E) < 0 THEN + PRINT "AND: Test failed." +ELSE + PRINT "AND: Test passed." +END IF + +IF GetValue(A) < 0 OR GetValue(B) < 0 THEN + PRINT "OR: Test passed." +ELSE + PRINT "OR: Test failed." +END IF + +SYSTEM + +FUNCTION GetValue& (x AS LONG) + PRINT "Function called for value:"; x + GetValue = x +END FUNCTION diff --git a/tests/compile_tests/bool_test/bool_test.output b/tests/compile_tests/bool_test/bool_test.output new file mode 100644 index 000000000..ef1e1be08 --- /dev/null +++ b/tests/compile_tests/bool_test/bool_test.output @@ -0,0 +1,19 @@ +Logical op test: + +Function called for value: 0 +_NEGATE: Test passed. +Function called for value: 10 +_ANDALSO: Test passed. +Function called for value:-100 +_ORELSE: Test passed. + +Bitwise op test: + +Function called for value: 0 +NOT: Test passed. +Function called for value: 10 +Function called for value: 100 +AND: Test passed. +Function called for value:-100 +Function called for value:-10 +OR: Test passed.