diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas
index 644a04fa5..961b584a5 100644
--- a/source/ide/ide_methods.bas
+++ b/source/ide/ide_methods.bas
@@ -6246,6 +6246,8 @@ FOR y = 0 TO (idewy - 9)
ELSEIF inquote OR MID$(a2$, m, 1) = CHR$(34) THEN
COLOR 14
END IF
+ If InValidLine(l) and 1 then color 7
+
LOCATE y + 3, 2 + m - 1
PRINT MID$(a2$, m, 1);
NEXT m
diff --git a/source/qb64.bas b/source/qb64.bas
index b079d036f..1f224476d 100644
--- a/source/qb64.bas
+++ b/source/qb64.bas
@@ -26,29 +26,44 @@ Set_OrderOfOperations 'This will also make certain our directories are valid, an
DIM SHARED MakeAndroid 'build an Android project (refer to SUB UseAndroid)
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
DIM SHARED Refactor_Source AS STRING
DIM SHARED Refactor_Dest AS STRING
IF _FILEEXISTS("refactor.txt") THEN
-fh = FREEFILE
-OPEN "refactor.txt" FOR BINARY AS #fh
-LINE INPUT #fh, Refactor_Source
-LINE INPUT #fh, Refactor_Dest
-CLOSE fh
+ fh = FREEFILE
+ OPEN "refactor.txt" FOR BINARY AS #fh
+ LINE INPUT #fh, Refactor_Source
+ LINE INPUT #fh, Refactor_Dest
+ CLOSE fh
END IF
IF _DIREXISTS("internal") = 0 THEN
-_SCREENSHOW
-PRINT "QB64 cannot locate the 'internal' folder"
-PRINT
-PRINT "Check that QB64 has been extracted properly."
-PRINT "For MacOSX, launch 'qb64_start.command' or enter './qb64' in Terminal."
-PRINT "For Linux, in the console enter './qb64'."
-DO
-_LIMIT 1
-LOOP UNTIL INKEY$ <> ""
-SYSTEM
+ _SCREENSHOW
+ PRINT "QB64 cannot locate the 'internal' folder"
+ PRINT
+ PRINT "Check that QB64 has been extracted properly."
+ PRINT "For MacOSX, launch 'qb64_start.command' or enter './qb64' in Terminal."
+ PRINT "For Linux, in the console enter './qb64'."
+ DO
+ _LIMIT 1
+ LOOP UNTIL INKEY$ <> ""
+ SYSTEM
END IF
DIM SHARED Include_GDB_Debugging_Info 'set using "options.bin"
@@ -86,11 +101,11 @@ DIM SHARED CMDLineFile AS STRING
CMDLineFile = ParseCMDLineArgs$
IF ConsoleMode THEN
-_DEST _CONSOLE
+ _DEST _CONSOLE
ELSE
-_CONSOLE OFF
-_SCREENSHOW
-_ICON
+ _CONSOLE OFF
+ _SCREENSHOW
+ _ICON
END IF
DIM SHARED NoChecks
@@ -173,7 +188,7 @@ IF MacOSX THEN BATCHFILE_EXTENSION = ".command"
DIM inlinedatastr(255) AS STRING
FOR i = 0 TO 255
-inlinedatastr(i) = str2$(i) + ","
+ inlinedatastr(i) = str2$(i) + ","
NEXT
@@ -197,27 +212,27 @@ E = 0
i = 1
OPEN tmpdir$ + "temp.bin" FOR OUTPUT LOCK WRITE AS #26
DO WHILE E
-i = i + 1
-IF i = 1000 THEN PRINT "Unable to locate the 'internal' folder": END
-MKDIR ".\internal\temp" + str2$(i)
-IF os$ = "WIN" THEN tmpdir$ = ".\internal\temp" + str2$(i) + "\": tmpdir2$ = "..\\temp" + str2$(i) + "\\"
-IF os$ = "LNX" THEN tmpdir$ = "./internal/temp" + str2$(i) + "/": tmpdir2$ = "../temp" + str2$(i) + "/"
-E = 0
-OPEN tmpdir$ + "temp.bin" FOR OUTPUT LOCK WRITE AS #26
+ i = i + 1
+ IF i = 1000 THEN PRINT "Unable to locate the 'internal' folder": END
+ MKDIR ".\internal\temp" + str2$(i)
+ IF os$ = "WIN" THEN tmpdir$ = ".\internal\temp" + str2$(i) + "\": tmpdir2$ = "..\\temp" + str2$(i) + "\\"
+ IF os$ = "LNX" THEN tmpdir$ = "./internal/temp" + str2$(i) + "/": tmpdir2$ = "../temp" + str2$(i) + "/"
+ E = 0
+ OPEN tmpdir$ + "temp.bin" FOR OUTPUT LOCK WRITE AS #26
LOOP
'temp folder established
tempfolderindex = i
IF i > 1 THEN
-'create modified version of qbx.cpp
-OPEN ".\internal\c\qbx" + str2$(i) + ".cpp" FOR OUTPUT AS #2
-OPEN ".\internal\c\qbx.cpp" FOR BINARY AS #1
-DO UNTIL EOF(1)
-LINE INPUT #1, a$
-x = INSTR(a$, "..\\temp\\"): IF x THEN a$ = LEFT$(a$, x - 1) + "..\\temp" + str2$(i) + "\\" + RIGHT$(a$, LEN(a$) - (x + 9))
-x = INSTR(a$, "../temp/"): IF x THEN a$ = LEFT$(a$, x - 1) + "../temp" + str2$(i) + "/" + RIGHT$(a$, LEN(a$) - (x + 7))
-PRINT #2, a$
-LOOP
-CLOSE #1, #2
+ 'create modified version of qbx.cpp
+ OPEN ".\internal\c\qbx" + str2$(i) + ".cpp" FOR OUTPUT AS #2
+ OPEN ".\internal\c\qbx.cpp" FOR BINARY AS #1
+ DO UNTIL EOF(1)
+ LINE INPUT #1, a$
+ x = INSTR(a$, "..\\temp\\"): IF x THEN a$ = LEFT$(a$, x - 1) + "..\\temp" + str2$(i) + "\\" + RIGHT$(a$, LEN(a$) - (x + 9))
+ x = INSTR(a$, "../temp/"): IF x THEN a$ = LEFT$(a$, x - 1) + "../temp" + str2$(i) + "/" + RIGHT$(a$, LEN(a$) - (x + 7))
+ PRINT #2, a$
+ LOOP
+ CLOSE #1, #2
END IF
IF Debug THEN OPEN tmpdir$ + "debug.txt" FOR OUTPUT AS #9
@@ -308,12 +323,12 @@ DIM SHARED idemessage AS STRING 'set by qb64-error(...) to the error message to
'hash table data
TYPE HashListItem
-Flags AS LONG
-Reference AS LONG
-NextItem AS LONG
-PrevItem AS LONG
-LastItem AS LONG 'note: this value is only valid on the first item in the list
-'note: name is stored in a seperate array of strings
+ Flags AS LONG
+ Reference AS LONG
+ NextItem AS LONG
+ PrevItem AS LONG
+ LastItem AS LONG 'note: this value is only valid on the first item in the list
+ 'note: name is stored in a seperate array of strings
END TYPE
DIM SHARED HashFind_NextListItem AS LONG
DIM SHARED HashFind_Reverse AS LONG
@@ -328,8 +343,8 @@ DIM SHARED HashListFreeLast AS LONG
DIM SHARED hash1char(255) AS INTEGER
DIM SHARED hash2char(65535) AS INTEGER
FOR x = 1 TO 26
-hash1char(64 + x) = x
-hash1char(96 + x) = x
+ hash1char(64 + x) = x
+ hash1char(96 + x) = x
NEXT
hash1char(95) = 27 '_
hash1char(48) = 28 '0
@@ -343,9 +358,9 @@ hash1char(55) = 19 '7
hash1char(56) = 18 '8
hash1char(57) = 17 '9
FOR c1 = 0 TO 255
-FOR c2 = 0 TO 255
-hash2char(c1 + c2 * 256) = hash1char(c1) + hash1char(c2) * 32
-NEXT
+ FOR c2 = 0 TO 255
+ hash2char(c1 + c2 * 256) = hash1char(c1) + hash1char(c2) * 32
+ NEXT
NEXT
'init
HashListSize = 65536
@@ -373,13 +388,13 @@ CONST HASHFLAG_XELEMENTNAME = 8192
CONST HASHFLAG_XTYPENAME = 16384
TYPE Label_Type
-State AS _UNSIGNED _BYTE '0=label referenced, 1=label created
-cn AS STRING * 256
-Scope AS LONG
-Data_Offset AS _INTEGER64 'offset within data
-Data_Referenced AS _UNSIGNED _BYTE 'set to 1 if data is referenced (data_offset will be used to create the data offset variable)
-Error_Line AS LONG 'the line number to reference on errors
-Scope_Restriction AS LONG 'cannot exist inside this scope (post checked)
+ State AS _UNSIGNED _BYTE '0=label referenced, 1=label created
+ cn AS STRING * 256
+ Scope AS LONG
+ Data_Offset AS _INTEGER64 'offset within data
+ Data_Referenced AS _UNSIGNED _BYTE 'set to 1 if data is referenced (data_offset will be used to create the data offset variable)
+ Error_Line AS LONG 'the line number to reference on errors
+ Scope_Restriction AS LONG 'cannot exist inside this scope (post checked)
END TYPE
DIM SHARED nLabels, Labels_Ubound
Labels_Ubound = 100
@@ -431,30 +446,30 @@ DIM SHARED fooindwel
DIM SHARED alphanumeric(255)
FOR i = 48 TO 57
-alphanumeric(i) = -1
+ alphanumeric(i) = -1
NEXT
FOR i = 65 TO 90
-alphanumeric(i) = -1
+ alphanumeric(i) = -1
NEXT
FOR i = 97 TO 122
-alphanumeric(i) = -1
+ alphanumeric(i) = -1
NEXT
'_ is treated as an alphabet letter
alphanumeric(95) = -1
DIM SHARED isalpha(255)
FOR i = 65 TO 90
-isalpha(i) = -1
+ isalpha(i) = -1
NEXT
FOR i = 97 TO 122
-isalpha(i) = -1
+ isalpha(i) = -1
NEXT
'_ is treated as an alphabet letter
isalpha(95) = -1
DIM SHARED isnumeric(255)
FOR i = 48 TO 57
-isnumeric(i) = -1
+ isnumeric(i) = -1
NEXT
@@ -543,48 +558,48 @@ DIM SHARED udtenext(1000) AS LONG
TYPE idstruct
-n AS STRING * 256 'name
-cn AS STRING * 256 'case sensitive version of n
+ n AS STRING * 256 'name
+ cn AS STRING * 256 'case sensitive version of n
-arraytype AS LONG 'similar to t
-arrayelements AS INTEGER
-staticarray AS INTEGER 'set for arrays declared in the main module with static elements
+ arraytype AS LONG 'similar to t
+ arrayelements AS INTEGER
+ staticarray AS INTEGER 'set for arrays declared in the main module with static elements
-mayhave AS STRING * 8 'mayhave and musthave are exclusive of each other
-musthave AS STRING * 8
-t AS LONG 'type
+ mayhave AS STRING * 8 'mayhave and musthave are exclusive of each other
+ musthave AS STRING * 8
+ t AS LONG 'type
-tsize AS LONG
+ tsize AS LONG
-subfunc AS INTEGER 'if function=1, sub=2 (max 100 arguments)
-Dependency AS INTEGER
-internal_subfunc AS INTEGER
+ subfunc AS INTEGER 'if function=1, sub=2 (max 100 arguments)
+ Dependency AS INTEGER
+ internal_subfunc AS INTEGER
-callname AS STRING * 256
-ccall AS INTEGER
-args AS INTEGER
-arg AS STRING * 400 'similar to t
-argsize AS STRING * 400 'similar to tsize (used for fixed length strings)
-specialformat AS STRING * 256
-secondargmustbe AS STRING * 256
-secondargcantbe AS STRING * 256
-ret AS LONG 'the value it returns if it is a function (again like t)
+ callname AS STRING * 256
+ ccall AS INTEGER
+ args AS INTEGER
+ arg AS STRING * 400 'similar to t
+ argsize AS STRING * 400 'similar to tsize (used for fixed length strings)
+ specialformat AS STRING * 256
+ secondargmustbe AS STRING * 256
+ secondargcantbe AS STRING * 256
+ ret AS LONG 'the value it returns if it is a function (again like t)
-insubfunc AS STRING * 256
-insubfuncn AS LONG
+ insubfunc AS STRING * 256
+ insubfuncn AS LONG
-share AS INTEGER
-nele AS STRING * 100
-nelereq AS STRING * 100
-linkid AS LONG
-linkarg AS INTEGER
-staticscope AS INTEGER
-'For variables which are arguments passed to a sub/function
-sfid AS LONG 'id number of variable's parent sub/function
-sfarg AS INTEGER 'argument/parameter # within call (1=first)
+ share AS INTEGER
+ nele AS STRING * 100
+ nelereq AS STRING * 100
+ linkid AS LONG
+ linkarg AS INTEGER
+ staticscope AS INTEGER
+ 'For variables which are arguments passed to a sub/function
+ sfid AS LONG 'id number of variable's parent sub/function
+ sfarg AS INTEGER 'argument/parameter # within call (1=first)
-NoCloud AS INTEGER
+ NoCloud AS INTEGER
END TYPE
DIM SHARED id AS idstruct
@@ -783,9 +798,9 @@ ON ERROR GOTO qberror
i2&& = 1
FOR i&& = 1 TO 56
-bitmask(i&&) = i2&&
-bitmaskinv(i&&) = NOT i2&&
-i2&& = i2&& + 2 ^ i&&
+ bitmask(i&&) = i2&&
+ bitmaskinv(i&&) = NOT i2&&
+ i2&& = i2&& + 2 ^ i&&
NEXT
DIM id2 AS idstruct
@@ -835,233 +850,233 @@ IF C = 0 THEN idemode = 0: GOTO noide
c$ = idereturn$
IF C = 2 THEN 'begin
-ideerrorline = 0 'addresses invalid prepass error line numbers being reported
-idepass = 1
-GOTO fullrecompile
-ideret1:
-wholeline$ = c$
-GOTO ideprepass
-ideret2:
-sendc$ = CHR$(3) 'request next line
-GOTO sendcommand
+ ideerrorline = 0 'addresses invalid prepass error line numbers being reported
+ idepass = 1
+ GOTO fullrecompile
+ ideret1:
+ wholeline$ = c$
+ GOTO ideprepass
+ ideret2:
+ sendc$ = CHR$(3) 'request next line
+ GOTO sendcommand
END IF
IF C = 4 THEN 'next line
-IF idepass = 1 THEN
-wholeline$ = c$
-GOTO ideprepass
-'(returns to ideret2: above)
-END IF
-'assume idepass>1
-a3$ = c$
-continuelinefrom = 0
-GOTO ide4
-ideret4:
-sendc$ = CHR$(3) 'request next line
-GOTO sendcommand
+ IF idepass = 1 THEN
+ wholeline$ = c$
+ GOTO ideprepass
+ '(returns to ideret2: above)
+ END IF
+ 'assume idepass>1
+ a3$ = c$
+ continuelinefrom = 0
+ GOTO ide4
+ ideret4:
+ sendc$ = CHR$(3) 'request next line
+ GOTO sendcommand
END IF
IF C = 5 THEN 'end of program reached
-IF idepass = 1 THEN
-'prepass complete
-idepass = 2
-GOTO ide3
-ideret3:
-sendc$ = CHR$(7) 'repass request
-GOTO sendcommand
-END IF
-'assume idepass=2
-'finalize program
-GOTO ide5
-ideret5: 'note: won't return here if a recompile was required!
-sendc$ = CHR$(6) 'ready
-idecompiled = 0
-GOTO sendcommand
+ IF idepass = 1 THEN
+ 'prepass complete
+ idepass = 2
+ GOTO ide3
+ ideret3:
+ sendc$ = CHR$(7) 'repass request
+ GOTO sendcommand
+ END IF
+ 'assume idepass=2
+ 'finalize program
+ GOTO ide5
+ ideret5: 'note: won't return here if a recompile was required!
+ sendc$ = CHR$(6) 'ready
+ idecompiled = 0
+ GOTO sendcommand
END IF
IF C = 9 THEN 'run
-IF idecompiled = 0 THEN 'exe needs to be compiled
-file$ = c$
+ IF idecompiled = 0 THEN 'exe needs to be compiled
+ file$ = c$
-'locate accessible file and truncate
-f$ = file$
-i = 1
-nextexeindex:
-IF _FILEEXISTS(file$ + extension$) THEN
-E = 0
-ON ERROR GOTO qberror_test
-KILL file$ + extension$
-ON ERROR GOTO qberror
-IF E = 1 THEN
-i = i + 1
-file$ = f$ + "(" + str2$(i) + ")"
-GOTO nextexeindex
-END IF
-END IF
+ 'locate accessible file and truncate
+ f$ = file$
+ i = 1
+ nextexeindex:
+ IF _FILEEXISTS(file$ + extension$) THEN
+ E = 0
+ ON ERROR GOTO qberror_test
+ KILL file$ + extension$
+ ON ERROR GOTO qberror
+ IF E = 1 THEN
+ i = i + 1
+ file$ = f$ + "(" + str2$(i) + ")"
+ GOTO nextexeindex
+ END IF
+ END IF
-'inform IDE of name change if necessary (IDE will respond with message 9 and corrected name)
-IF i <> 1 THEN
-sendc$ = CHR$(12) + file$
-GOTO sendcommand
-END IF
+ 'inform IDE of name change if necessary (IDE will respond with message 9 and corrected name)
+ IF i <> 1 THEN
+ sendc$ = CHR$(12) + file$
+ GOTO sendcommand
+ END IF
-ideerrorline = 0 'addresses C++ comp. error's line number
-GOTO ide6
-ideret6:
-idecompiled = 1
-END IF
+ ideerrorline = 0 'addresses C++ comp. error's line number
+ GOTO ide6
+ ideret6:
+ idecompiled = 1
+ END IF
-IF MakeAndroid THEN
+ IF MakeAndroid THEN
-'generate program name
+ 'generate program name
-pf$ = "programs\android\" + file$
+ pf$ = "programs\android\" + file$
-IF _DIREXISTS(pf$) = 0 THEN
-'once only setup
+ IF _DIREXISTS(pf$) = 0 THEN
+ 'once only setup
-COLOR 7, 1: LOCATE idewy - 3, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 2, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 1, 2: PRINT SPACE$(idewx - 2); 'clear status window
-LOCATE idewy - 3, 2: PRINT "Initializing project [programs\android\" + file$ + "]...";
-PCOPY 3, 0
+ COLOR 7, 1: LOCATE idewy - 3, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 2, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 1, 2: PRINT SPACE$(idewx - 2); 'clear status window
+ LOCATE idewy - 3, 2: PRINT "Initializing project [programs\android\" + file$ + "]...";
+ PCOPY 3, 0
-MKDIR pf$
-SHELL _HIDE "cmd /c xcopy /e programs\android\project_template\*.* " + pf$
-SHELL _HIDE "cmd /c xcopy /e programs\android\eclipse_template\*.* " + pf$
+ MKDIR pf$
+ SHELL _HIDE "cmd /c xcopy /e programs\android\project_template\*.* " + pf$
+ SHELL _HIDE "cmd /c xcopy /e programs\android\eclipse_template\*.* " + pf$
-'modify templates
-fr_fh = FREEFILE
-OPEN pf$ + "\AndroidManifest.xml" FOR BINARY AS #fr_fh
-a$ = SPACE$(LOF(fr_fh))
-GET #fr_fh, , a$
-CLOSE fr_fh
-OPEN pf$ + "\AndroidManifest.xml" FOR OUTPUT AS #fr_fh
-ss$ = CHR$(34) + "com.example.native_activity" + CHR$(34)
-file_namespace$ = LCASE$(file$)
-a = ASC(file_namespace$)
-IF a >= 48 AND a <= 57 THEN file_namespace$ = "ns_" + file_namespace$
-i = INSTR(a$, ss$)
-a$ = LEFT$(a$, i - 1) + CHR$(34) + "com.example." + file_namespace$ + CHR$(34) + RIGHT$(a$, LEN(a$) - i - LEN(ss$) + 1)
-PRINT #fr_fh, a$;
-CLOSE fr_fh
+ 'modify templates
+ fr_fh = FREEFILE
+ OPEN pf$ + "\AndroidManifest.xml" FOR BINARY AS #fr_fh
+ a$ = SPACE$(LOF(fr_fh))
+ GET #fr_fh, , a$
+ CLOSE fr_fh
+ OPEN pf$ + "\AndroidManifest.xml" FOR OUTPUT AS #fr_fh
+ ss$ = CHR$(34) + "com.example.native_activity" + CHR$(34)
+ file_namespace$ = LCASE$(file$)
+ a = ASC(file_namespace$)
+ IF a >= 48 AND a <= 57 THEN file_namespace$ = "ns_" + file_namespace$
+ i = INSTR(a$, ss$)
+ a$ = LEFT$(a$, i - 1) + CHR$(34) + "com.example." + file_namespace$ + CHR$(34) + RIGHT$(a$, LEN(a$) - i - LEN(ss$) + 1)
+ PRINT #fr_fh, a$;
+ CLOSE fr_fh
-fr_fh = FREEFILE
-OPEN pf$ + "\res\values\strings.xml" FOR BINARY AS #fr_fh
-a$ = SPACE$(LOF(fr_fh))
-GET #fr_fh, , a$
-CLOSE fr_fh
-OPEN pf$ + "\res\values\strings.xml" FOR OUTPUT AS #fr_fh
-ss$ = ">NativeActivity<"
-i = INSTR(a$, ss$)
-a$ = LEFT$(a$, i - 1) + ">" + file$ + "<" + RIGHT$(a$, LEN(a$) - i - LEN(ss$) + 1)
-PRINT #fr_fh, a$;
-CLOSE fr_fh
+ fr_fh = FREEFILE
+ OPEN pf$ + "\res\values\strings.xml" FOR BINARY AS #fr_fh
+ a$ = SPACE$(LOF(fr_fh))
+ GET #fr_fh, , a$
+ CLOSE fr_fh
+ OPEN pf$ + "\res\values\strings.xml" FOR OUTPUT AS #fr_fh
+ ss$ = ">NativeActivity<"
+ i = INSTR(a$, ss$)
+ a$ = LEFT$(a$, i - 1) + ">" + file$ + "<" + RIGHT$(a$, LEN(a$) - i - LEN(ss$) + 1)
+ PRINT #fr_fh, a$;
+ CLOSE fr_fh
-fr_fh = FREEFILE
-OPEN pf$ + "\.project" FOR BINARY AS #fr_fh
-a$ = SPACE$(LOF(fr_fh))
-GET #fr_fh, , a$
-CLOSE fr_fh
-OPEN pf$ + "\.project" FOR OUTPUT AS #fr_fh
-ss$ = "NativeActivity"
-i = INSTR(a$, ss$)
-a$ = LEFT$(a$, i - 1) + "" + file$ + "" + RIGHT$(a$, LEN(a$) - i - LEN(ss$) + 1)
-PRINT #fr_fh, a$;
-CLOSE fr_fh
+ fr_fh = FREEFILE
+ OPEN pf$ + "\.project" FOR BINARY AS #fr_fh
+ a$ = SPACE$(LOF(fr_fh))
+ GET #fr_fh, , a$
+ CLOSE fr_fh
+ OPEN pf$ + "\.project" FOR OUTPUT AS #fr_fh
+ ss$ = "NativeActivity"
+ i = INSTR(a$, ss$)
+ a$ = LEFT$(a$, i - 1) + "" + file$ + "" + RIGHT$(a$, LEN(a$) - i - LEN(ss$) + 1)
+ PRINT #fr_fh, a$;
+ CLOSE fr_fh
-IF _DIREXISTS(pf$ + "\jni\temp") = 0 THEN MKDIR pf$ + "\jni\temp"
+ IF _DIREXISTS(pf$ + "\jni\temp") = 0 THEN MKDIR pf$ + "\jni\temp"
-IF _DIREXISTS(pf$ + "\jni\c") = 0 THEN MKDIR pf$ + "\jni\c"
+ IF _DIREXISTS(pf$ + "\jni\c") = 0 THEN MKDIR pf$ + "\jni\c"
-'c
-ex_fh = FREEFILE
-OPEN "internal\temp\xcopy_exclude.txt" FOR OUTPUT AS #ex_fh
-PRINT #ex_fh, "c_compiler\"
-CLOSE ex_fh
-SHELL _HIDE "cmd /c xcopy /e /EXCLUDE:internal\temp\xcopy_exclude.txt internal\c\*.* " + pf$ + "\jni\c"
+ 'c
+ ex_fh = FREEFILE
+ OPEN "internal\temp\xcopy_exclude.txt" FOR OUTPUT AS #ex_fh
+ PRINT #ex_fh, "c_compiler\"
+ CLOSE ex_fh
+ SHELL _HIDE "cmd /c xcopy /e /EXCLUDE:internal\temp\xcopy_exclude.txt internal\c\*.* " + pf$ + "\jni\c"
-ELSE
+ ELSE
-COLOR 7, 1: LOCATE idewy - 3, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 2, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 1, 2: PRINT SPACE$(idewx - 2); 'clear status window
-LOCATE idewy - 3, 2: PRINT "Updating project [programs\android\" + file$ + "]...";
-PCOPY 3, 0
+ COLOR 7, 1: LOCATE idewy - 3, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 2, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 1, 2: PRINT SPACE$(idewx - 2); 'clear status window
+ LOCATE idewy - 3, 2: PRINT "Updating project [programs\android\" + file$ + "]...";
+ PCOPY 3, 0
-END IF
+ END IF
-'temp
-SHELL _HIDE "cmd /c del " + pf$ + "\jni\temp\*.txt"
-SHELL _HIDE "cmd /c copy " + tmpdir$ + "*.txt " + pf$ + "\jni\temp"
+ 'temp
+ SHELL _HIDE "cmd /c del " + pf$ + "\jni\temp\*.txt"
+ SHELL _HIDE "cmd /c copy " + tmpdir$ + "*.txt " + pf$ + "\jni\temp"
-'touch main.cpp (for ndk)
-fr_fh = FREEFILE
-OPEN pf$ + "\jni\main.cpp" FOR BINARY AS #fr_fh
-a$ = SPACE$(LOF(fr_fh))
-GET #fr_fh, , a$
-CLOSE fr_fh
-OPEN pf$ + "\jni\main.cpp" FOR OUTPUT AS #fr_fh
-IF ASC(a$, LEN(a$)) <> 32 THEN a$ = a$ + " " ELSE a$ = LEFT$(a$, LEN(a$) - 1)
-PRINT #fr_fh, a$;
-CLOSE fr_fh
+ 'touch main.cpp (for ndk)
+ fr_fh = FREEFILE
+ OPEN pf$ + "\jni\main.cpp" FOR BINARY AS #fr_fh
+ a$ = SPACE$(LOF(fr_fh))
+ GET #fr_fh, , a$
+ CLOSE fr_fh
+ OPEN pf$ + "\jni\main.cpp" FOR OUTPUT AS #fr_fh
+ IF ASC(a$, LEN(a$)) <> 32 THEN a$ = a$ + " " ELSE a$ = LEFT$(a$, LEN(a$) - 1)
+ PRINT #fr_fh, a$;
+ CLOSE fr_fh
-'note: .bat files affect the directory they are called from
-CHDIR pf$
-IF INSTR(IdeAndroidStartScript$, ":") THEN
-SHELL _HIDE IdeAndroidMakeScript$
-ELSE
-SHELL _HIDE "..\..\..\" + IdeAndroidMakeScript$
-END IF
-CHDIR "..\..\.."
+ 'note: .bat files affect the directory they are called from
+ CHDIR pf$
+ IF INSTR(IdeAndroidStartScript$, ":") THEN
+ SHELL _HIDE IdeAndroidMakeScript$
+ ELSE
+ SHELL _HIDE "..\..\..\" + IdeAndroidMakeScript$
+ END IF
+ CHDIR "..\..\.."
-''touch manifest (for Eclipse)
-'fr_fh = FREEFILE
-'OPEN pf$ + "\AndroidManifest.xml" FOR BINARY AS #fr_fh
-'a$ = SPACE$(LOF(fr_fh))
-'GET #fr_fh, , a$
-'CLOSE fr_fh
-'OPEN pf$ + "\AndroidManifest.xml" FOR OUTPUT AS #fr_fh
-'IF ASC(a$, LEN(a$)) <> 32 THEN a$ = a$ + " " ELSE a$ = LEFT$(a$, LEN(a$) - 1)
-'PRINT #fr_fh, a$;
-'CLOSE fr_fh
-'^^^^above inconsistent^^^^
+ ''touch manifest (for Eclipse)
+ 'fr_fh = FREEFILE
+ 'OPEN pf$ + "\AndroidManifest.xml" FOR BINARY AS #fr_fh
+ 'a$ = SPACE$(LOF(fr_fh))
+ 'GET #fr_fh, , a$
+ 'CLOSE fr_fh
+ 'OPEN pf$ + "\AndroidManifest.xml" FOR OUTPUT AS #fr_fh
+ 'IF ASC(a$, LEN(a$)) <> 32 THEN a$ = a$ + " " ELSE a$ = LEFT$(a$, LEN(a$) - 1)
+ 'PRINT #fr_fh, a$;
+ 'CLOSE fr_fh
+ '^^^^above inconsistent^^^^
-'clear the gen folder (for Eclipse)
-IF _DIREXISTS(pf$ + "\gen") THEN
-SHELL _HIDE "cmd /c rmdir /s /q " + pf$ + "\gen"
-SHELL _HIDE "cmd /c md " + pf$ + "\gen"
-END IF
+ 'clear the gen folder (for Eclipse)
+ IF _DIREXISTS(pf$ + "\gen") THEN
+ SHELL _HIDE "cmd /c rmdir /s /q " + pf$ + "\gen"
+ SHELL _HIDE "cmd /c md " + pf$ + "\gen"
+ END IF
-sendc$ = CHR$(11) '".EXE file created" aka "Android project created"
-GOTO sendcommand
+ sendc$ = CHR$(11) '".EXE file created" aka "Android project created"
+ GOTO sendcommand
-END IF
+ END IF
-IF iderunmode = 2 THEN
-sendc$ = CHR$(11) '.EXE file created
-GOTO sendcommand
-END IF
+ IF iderunmode = 2 THEN
+ sendc$ = CHR$(11) '.EXE file created
+ GOTO sendcommand
+ END IF
-'hack! (a new message should be sent to the IDE stating C++ compilation was successful)
-COLOR 7, 1: LOCATE idewy - 3, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 2, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 1, 2: PRINT SPACE$(idewx - 2); 'clear status window
-LOCATE idewy - 3, 2: PRINT "Starting program...";
-PCOPY 3, 0
+ 'hack! (a new message should be sent to the IDE stating C++ compilation was successful)
+ COLOR 7, 1: LOCATE idewy - 3, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 2, 2: PRINT SPACE$(idewx - 2);: LOCATE idewy - 1, 2: PRINT SPACE$(idewx - 2); 'clear status window
+ LOCATE idewy - 3, 2: PRINT "Starting program...";
+ PCOPY 3, 0
-'execute program
+ 'execute program
-IF iderunmode = 1 THEN
-IF os$ = "WIN" THEN SHELL _DONTWAIT QuotedFilename$(CHR$(34) + file$ + extension$ + CHR$(34))
-IF os$ = "LNX" THEN SHELL _DONTWAIT QuotedFilename$("./" + file$ + extension$)
-ELSE
-IF os$ = "WIN" THEN SHELL QuotedFilename$(CHR$(34) + file$ + extension$ + CHR$(34))
-IF os$ = "LNX" THEN SHELL QuotedFilename$("./" + file$ + extension$)
-END IF
+ IF iderunmode = 1 THEN
+ IF os$ = "WIN" THEN SHELL _DONTWAIT QuotedFilename$(CHR$(34) + file$ + extension$ + CHR$(34))
+ IF os$ = "LNX" THEN SHELL _DONTWAIT QuotedFilename$("./" + file$ + extension$)
+ ELSE
+ IF os$ = "WIN" THEN SHELL QuotedFilename$(CHR$(34) + file$ + extension$ + CHR$(34))
+ IF os$ = "LNX" THEN SHELL QuotedFilename$("./" + file$ + extension$)
+ END IF
-sendc$ = CHR$(6) 'ready
-GOTO sendcommand
+ sendc$ = CHR$(6) 'ready
+ GOTO sendcommand
END IF
PRINT "Invalid IDE message": END
@@ -1075,9 +1090,9 @@ noide:
PRINT "QB64 COMPILER V" + Version$
IF CMDLineFile = "" THEN
-LINE INPUT ; "COMPILE (.bas)>", f$
+ LINE INPUT ; "COMPILE (.bas)>", f$
ELSE
-f$ = CMDLineFile
+ f$ = CMDLineFile
END IF
f$ = LTRIM$(RTRIM$(f$))
@@ -1089,11 +1104,11 @@ sourcefile$ = f$
f$ = RemoveFileExtension$(f$)
FOR x = LEN(f$) TO 1 STEP -1
-a$ = MID$(f$, x, 1)
-IF a$ = "/" OR a$ = "\" THEN
-f$ = RIGHT$(f$, LEN(f$) - x)
-EXIT FOR
-END IF
+ a$ = MID$(f$, x, 1)
+ IF a$ = "/" OR a$ = "\" THEN
+ f$ = RIGHT$(f$, LEN(f$) - x)
+ EXIT FOR
+ END IF
NEXT
file$ = f$
@@ -1118,9 +1133,9 @@ IF Debug THEN CLOSE #9: OPEN tmpdir$ + "debug.txt" FOR OUTPUT AS #9
FOR i = 1 TO ids_max + 1
-arrayelementslist(i) = 0
-cmemlist(i) = 0
-sfcmemargs(i) = ""
+ arrayelementslist(i) = 0
+ cmemlist(i) = 0
+ sfcmemargs(i) = ""
NEXT
@@ -1336,6 +1351,9 @@ stringprocessinghappened = 0
subfuncn = 0
subfunc = ""
SelectCaseCounter = 0
+ExecCounter = 0
+UserDefineCount = 6
+REDIM SHARED InValidLine(10000) AS _BIT
''create a type for storing memory blocks
''UDT
@@ -1361,68 +1379,68 @@ SelectCaseCounter = 0
ptrsz = OS_BITS \ 8
IF Cloud = 0 THEN
-lasttype = lasttype + 1: i = lasttype
-udtxname(i) = "_MEM"
-udtxcname(i) = "_MEM"
-udtxsize(i) = ((ptrsz) * 4 + (4) * 2 + (8) * 1) * 8
-udtxbytealign(i) = 1
-lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
-udtename(i2) = "OFFSET"
-udtecname(i2) = "OFFSET"
-udtebytealign(i2) = 1
-udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
-udtetypesize(i2) = 0 'tsize
-udtxnext(i) = i2
-i3 = i2
-lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
-udtename(i2) = "SIZE"
-udtecname(i2) = "SIZE"
-udtebytealign(i2) = 1
-udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
-udtetypesize(i2) = 0 'tsize
-udtenext(i3) = i2
-i3 = i2
-lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
-udtename(i2) = "$_LOCK_ID"
-udtecname(i2) = "$_LOCK_ID"
-udtebytealign(i2) = 1
-udtetype(i2) = INTEGER64TYPE: udtesize(i2) = 64
-udtetypesize(i2) = 0 'tsize
-udtenext(i3) = i2
-i3 = i2
-lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
-udtename(i2) = "$_LOCK_OFFSET"
-udtecname(i2) = "$_LOCK_OFFSET"
-udtebytealign(i2) = 1
-udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
-udtetypesize(i2) = 0 'tsize
-udtenext(i3) = i2
-i3 = i2
-lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
-udtename(i2) = "TYPE"
-udtecname(i2) = "TYPE"
-udtebytealign(i2) = 1
-udtetype(i2) = LONGTYPE: udtesize(i2) = 32
-udtetypesize(i2) = 0 'tsize
-udtenext(i3) = i2
-i3 = i2
-lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
-udtename(i2) = "ELEMENTSIZE"
-udtecname(i2) = "ELEMENTSIZE"
-udtebytealign(i2) = 1
-udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
-udtetypesize(i2) = 0 'tsize
-udtenext(i3) = i2
-udtenext(i2) = 0
-i3 = i2
-lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
-udtename(i2) = "IMAGE"
-udtecname(i2) = "IMAGE"
-udtebytealign(i2) = 1
-udtetype(i2) = LONGTYPE: udtesize(i2) = 32
-udtetypesize(i2) = 0 'tsize
-udtenext(i3) = i2
-udtenext(i2) = 0
+ lasttype = lasttype + 1: i = lasttype
+ udtxname(i) = "_MEM"
+ udtxcname(i) = "_MEM"
+ udtxsize(i) = ((ptrsz) * 4 + (4) * 2 + (8) * 1) * 8
+ udtxbytealign(i) = 1
+ lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
+ udtename(i2) = "OFFSET"
+ udtecname(i2) = "OFFSET"
+ udtebytealign(i2) = 1
+ udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
+ udtetypesize(i2) = 0 'tsize
+ udtxnext(i) = i2
+ i3 = i2
+ lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
+ udtename(i2) = "SIZE"
+ udtecname(i2) = "SIZE"
+ udtebytealign(i2) = 1
+ udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
+ udtetypesize(i2) = 0 'tsize
+ udtenext(i3) = i2
+ i3 = i2
+ lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
+ udtename(i2) = "$_LOCK_ID"
+ udtecname(i2) = "$_LOCK_ID"
+ udtebytealign(i2) = 1
+ udtetype(i2) = INTEGER64TYPE: udtesize(i2) = 64
+ udtetypesize(i2) = 0 'tsize
+ udtenext(i3) = i2
+ i3 = i2
+ lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
+ udtename(i2) = "$_LOCK_OFFSET"
+ udtecname(i2) = "$_LOCK_OFFSET"
+ udtebytealign(i2) = 1
+ udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
+ udtetypesize(i2) = 0 'tsize
+ udtenext(i3) = i2
+ i3 = i2
+ lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
+ udtename(i2) = "TYPE"
+ udtecname(i2) = "TYPE"
+ udtebytealign(i2) = 1
+ udtetype(i2) = LONGTYPE: udtesize(i2) = 32
+ udtetypesize(i2) = 0 'tsize
+ udtenext(i3) = i2
+ i3 = i2
+ lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
+ udtename(i2) = "ELEMENTSIZE"
+ udtecname(i2) = "ELEMENTSIZE"
+ udtebytealign(i2) = 1
+ udtetype(i2) = OFFSETTYPE: udtesize(i2) = ptrsz * 8
+ udtetypesize(i2) = 0 'tsize
+ udtenext(i3) = i2
+ udtenext(i2) = 0
+ i3 = i2
+ lasttypeelement = lasttypeelement + 1: i2 = lasttypeelement
+ udtename(i2) = "IMAGE"
+ udtecname(i2) = "IMAGE"
+ udtebytealign(i2) = 1
+ udtetype(i2) = LONGTYPE: udtesize(i2) = 32
+ udtetypesize(i2) = 0 'tsize
+ udtenext(i3) = i2
+ udtenext(i2) = 0
END IF 'cloud = 0
@@ -1444,18 +1462,18 @@ OPEN tmpdir$ + "temp.bin" FOR OUTPUT LOCK WRITE AS #26 'relock
IF Debug THEN CLOSE #9: OPEN tmpdir$ + "debug.txt" FOR APPEND AS #9
IF idemode = 0 THEN
-qberrorhappened = -1
-OPEN sourcefile$ FOR INPUT AS #1
-qberrorhappened1:
-IF qberrorhappened = 1 THEN
-PRINT
-PRINT "CANNOT LOCATE SOURCE FILE:" + sourcefile$
-IF ConsoleMode THEN SYSTEM 1
-END 1
-ELSE
-CLOSE #1
-END IF
-qberrorhappened = 0
+ qberrorhappened = -1
+ OPEN sourcefile$ FOR INPUT AS #1
+ qberrorhappened1:
+ IF qberrorhappened = 1 THEN
+ PRINT
+ PRINT "CANNOT LOCATE SOURCE FILE:" + sourcefile$
+ IF ConsoleMode THEN SYSTEM 1
+ END 1
+ ELSE
+ CLOSE #1
+ END IF
+ qberrorhappened = 0
END IF
reginternal
@@ -1465,10 +1483,10 @@ OPEN tmpdir$ + "global.txt" FOR OUTPUT AS #18
IF Cloud THEN PRINT #18, "int32 cloud_app=1;" ELSE PRINT #18, "int32 cloud_app=0;"
IF iderecompile THEN
-iderecompile = 0
-idepass = 1 'prepass must be done again
-sendc$ = CHR$(7) 'repass request
-GOTO sendcommand
+ iderecompile = 0
+ idepass = 1 'prepass must be done again
+ sendc$ = CHR$(7) 'repass request
+ GOTO sendcommand
END IF
IF idemode THEN GOTO ideret1
@@ -1477,943 +1495,1076 @@ lineinput3load sourcefile$
DO
-stevewashere: '### STEVE EDIT FOR CONST EXPANSION 10/11/2013
-
-wholeline$ = lineinput3$
-IF wholeline$ = CHR$(13) THEN EXIT DO
-ideprepass:
-
-wholestv$ = wholeline$ '### STEVE EDIT FOR CONST EXPANSION 10/11/2013
-
-prepass = 1
-layout = ""
-layoutok = 0
-
-linenumber = linenumber + 1
-IF LEN(wholeline$) THEN
-
-wholeline$ = lineformat(wholeline$)
-IF Error_Happened THEN GOTO errmes
-
-cwholeline$ = wholeline$
-wholeline$ = eleucase$(wholeline$) '********REMOVE THIS LINE LATER********
-
-
-addmetadynamic = 0: addmetastatic = 0
-wholelinen = numelements(wholeline$)
-
-IF wholelinen THEN
-
-wholelinei = 1
-
-'skip line number?
-e$ = getelement$(wholeline$, 1)
-IF (ASC(e$) >= 48 AND ASC(e$) <= 59) OR ASC(e$) = 46 THEN wholelinei = 2: GOTO ppskpl
-
-'skip 'POSSIBLE' line label?
-IF wholelinen >= 2 THEN
-x2 = INSTR(wholeline$, sp + ":" + sp): x3 = x2 + 2
-IF x2 = 0 THEN
-IF RIGHT$(wholeline$, 2) = sp + ":" THEN x2 = LEN(wholeline$) - 1: x3 = x2 + 1
-END IF
-
-IF x2 THEN
-e$ = LEFT$(wholeline$, x2 - 1)
-IF validlabel(e$) THEN
-wholeline$ = RIGHT$(wholeline$, LEN(wholeline$) - x3)
-cwholeline$ = RIGHT$(cwholeline$, LEN(wholeline$) - x3)
-wholelinen = numelements(wholeline$)
-GOTO ppskpl
-END IF 'valid
-END IF 'includes ":"
-END IF 'wholelinen>=2
-
-ppskpl:
-IF wholelinei <= wholelinen THEN
-'----------------------------------------
-a$ = ""
-ca$ = ""
-ppblda:
-e$ = getelement$(wholeline$, wholelinei)
-ce$ = getelement$(cwholeline$, wholelinei)
-IF e$ = ":" OR e$ = "ELSE" OR e$ = "THEN" OR e$ = "" THEN
-IF LEN(a$) THEN
-IF Debug THEN PRINT #9, "PP[" + a$ + "]"
-n = numelements(a$)
-firstelement$ = getelement(a$, 1)
-secondelement$ = getelement(a$, 2)
-thirdelement$ = getelement(a$, 3)
-'========================================
-
-'declare library
-IF declaringlibrary THEN
-
-IF firstelement$ = "END" THEN
-IF n <> 2 OR secondelement$ <> "DECLARE" THEN a$ = "Expected END DECLARE": GOTO errmes
-declaringlibrary = 0
-GOTO finishedlinepp
-END IF 'end declare
-
-declaringlibrary = 2
-
-IF firstelement$ = "SUB" OR firstelement$ = "FUNCTION" THEN subfuncn = subfuncn - 1: GOTO declaresubfunc
-
-a$ = "Expected SUB/FUNCTION definition or END DECLARE (#2)": GOTO errmes
-END IF
-
-'UDT TYPE definition
-IF definingtype THEN
-i = definingtype
-
-IF n >= 1 THEN
-IF firstelement$ = "END" THEN
-IF n <> 2 OR secondelement$ <> "TYPE" THEN a$ = "Expected END TYPE": GOTO errmes
-IF udtxnext(i) = 0 THEN a$ = "No elements defined in TYPE": GOTO errmes
-definingtype = 0
-
-'create global buffer for SWAP space
-siz$ = str2$(udtxsize(i) \ 8)
-PRINT #18, "char *g_tmp_udt_" + RTRIM$(udtxname(i)) + "=(char*)malloc(" + siz$ + ");"
-
-'print "END TYPE";udtxsize(i);udtxbytealign(i)
-GOTO finishedlinepp
-END IF
-END IF
-
-lasttypeelement = lasttypeelement + 1
-i2 = lasttypeelement
-udtenext(i2) = 0
-
-IF n < 3 THEN a$ = "Expected variablename AS type or END TYPE": GOTO errmes
-n$ = firstelement$
-
-ii = 2
-
-udtearrayelements(i2) = 0
-
-IF ii >= n OR getelement$(a$, ii) <> "AS" THEN a$ = "Expected variablename AS type or END TYPE": GOTO errmes
-t$ = getelements$(a$, ii + 1, n)
-
-typ = typname2typ(t$)
-IF Error_Happened THEN GOTO errmes
-IF typ = 0 THEN a$ = "Undefined type": GOTO errmes
-typsize = typname2typsize
-
-IF validname(n$) = 0 THEN a$ = "Invalid name": GOTO errmes
-udtename(i2) = n$
-
-udtecname(i2) = getelement$(ca$, 1)
-udtetype(i2) = typ
-udtetypesize(i2) = typsize
-
-hashname$ = n$
-
-'check for name conflicts (any similar reserved or element from current UDT)
-hashchkflags = HASHFLAG_RESERVED + HASHFLAG_UDTELEMENT
-hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-IF hashresflags AND HASHFLAG_UDTELEMENT THEN
-IF hashresref = i THEN a$ = "Name already in use": GOTO errmes
-END IF
-IF hashresflags AND HASHFLAG_RESERVED THEN
-IF hashresflags AND (HASHFLAG_TYPE + HASHFLAG_CUSTOMSYNTAX + HASHFLAG_OPERATOR + HASHFLAG_XELEMENTNAME) THEN a$ = "Name already in use": GOTO errmes
-END IF
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-'add to hash table
-HashAdd hashname$, HASHFLAG_UDTELEMENT, i
-
-'Calculate element's size
-IF typ AND ISUDT THEN
-u = typ AND 511
-udtesize(i2) = udtxsize(u)
-IF udtxbytealign(u) THEN udtxbytealign(i) = 1: udtebytealign(i2) = 1
-ELSE
-IF (typ AND ISSTRING) THEN
-IF (typ AND ISFIXEDLENGTH) = 0 THEN a$ = "Expected STRING *": GOTO errmes
-udtesize(i2) = typsize * 8
-udtxbytealign(i) = 1: udtebytealign(i2) = 1
-ELSE
-udtesize(i2) = typ AND 511
-IF (typ AND ISOFFSETINBITS) = 0 THEN udtxbytealign(i) = 1: udtebytealign(i2) = 1
-END IF
-END IF
-
-'Increase block size
-IF udtebytealign(i2) THEN
-IF udtxsize(i) MOD 8 THEN
-udtxsize(i) = udtxsize(i) + (8 - (udtxsize(i) MOD 8))
-END IF
-END IF
-udtxsize(i) = udtxsize(i) + udtesize(i2)
-
-'Link element to previous element
-IF udtxnext(i) = 0 THEN
-udtxnext(i) = i2
-ELSE
-udtenext(i2 - 1) = i2
-END IF
-
-'print "+"+rtrim$(udtename(i2));udtesize(i2);udtebytealign(i2);udtxsize(i)
-
-GOTO finishedlinepp
-
-END IF 'definingtype
-
-IF definingtype AND n >= 1 THEN a$ = "Expected END TYPE": GOTO errmes
-
-IF n >= 1 THEN
-IF firstelement$ = "TYPE" THEN
-IF n <> 2 THEN a$ = "Expected TYPE typename": GOTO errmes
-lasttype = lasttype + 1
-definingtype = lasttype
-i = definingtype
-IF validname(secondelement$) = 0 THEN a$ = "Invalid name": GOTO errmes
-udtxname(i) = secondelement$
-udtxcname(i) = getelement(ca$, 2)
-udtxnext(i) = 0
-udtxsize(i) = 0
-
-hashname$ = secondelement$
-hashflags = HASHFLAG_UDT
-'check for name conflicts (any similar reserved/sub/function/UDT name)
-hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_UDT
-hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-allow = 0
-IF hashresflags AND (HASHFLAG_SUB + HASHFLAG_FUNCTION) THEN
-allow = 1
-END IF
-IF hashresflags AND HASHFLAG_RESERVED THEN
-IF (hashresflags AND (HASHFLAG_TYPE + HASHFLAG_OPERATOR + HASHFLAG_CUSTOMSYNTAX + HASHFLAG_XTYPENAME)) = 0 THEN allow = 1
-END IF
-IF allow = 0 THEN a$ = "Name already in use": GOTO errmes
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-
-'add to hash table
-HashAdd hashname$, hashflags, i
-
-GOTO finishedlinepp
-END IF
-END IF
-
-
-
-
-
-stevewashere2: ' ### STEVE EDIT ON 10/11/2013 (Const Expansion)
-
-
-IF n >= 1 AND firstelement$ = "CONST" THEN
-'l$ = "CONST"
-'DEF... do not change type, the expression is stored in a suitable type
-'based on its value if type isn't forced/specified
-
-
-
-
-
-'convert periods to _046_
-i2 = INSTR(a$, sp + "." + sp)
-IF i2 THEN
-DO
-a$ = LEFT$(a$, i2 - 1) + fix046$ + RIGHT$(a$, LEN(a$) - i2 - 2)
-ca$ = LEFT$(ca$, i2 - 1) + fix046$ + RIGHT$(ca$, LEN(ca$) - i2 - 2)
-i2 = INSTR(a$, sp + "." + sp)
-LOOP UNTIL i2 = 0
-n = numelements(a$)
-firstelement$ = getelement(a$, 1): secondelement$ = getelement(a$, 2): thirdelement$ = getelement(a$, 3)
-END IF
-
-
-'Steve Tweak to add _RGB32 and _MATH support to CONST
-'Our alteration to allow for multiple uses of RGB and RGBA inside a CONST //SMcNeill
-altered = 0
-
-'Edit 02/23/2014 to add space between = and _ for statements like CONST x=_RGB(123,0,0) and stop us from gettting an error.
-DO
-L = INSTR(wholestv$, "=_")
-IF L THEN
-wholestv$ = LEFT$(wholestv$, L) + " " + MID$(wholestv$, L + 1)
-END IF
-LOOP UNTIL L = 0
-'End of Edit on 02/23/2014
-
-DO
-finished = -1
-L = INSTR(L + 1, UCASE$(wholestv$), " _RGBA")
-IF L > 0 THEN
-altered = -1
-l$ = LEFT$(wholestv$, L - 1)
-vp = INSTR(L, wholestv$, "(")
-IF vp > 0 THEN
-E = INSTR(vp + 1, wholestv$, ")")
-IF E > 0 THEN
-'get our 3 colors or 4 if we need RGBA values
-first = INSTR(vp, wholestv$, ",")
-second = INSTR(first + 1, wholestv$, ",")
-third = INSTR(second + 1, wholestv$, ",")
-fourth = INSTR(third + 1, wholestv$, ",") 'If we need RGBA we need this one as well
-red$ = MID$(wholestv$, vp + 1, first - vp - 1)
-green$ = MID$(wholestv$, first + 1, second - first - 1)
-blue$ = MID$(wholestv$, second + 1, third - second - 1)
-alpha$ = MID$(wholestv$, third + 1)
-IF MID$(wholestv$, L + 6, 2) = "32" THEN
-val$ = "32"
-ELSE
-val$ = MID$(wholestv$, fourth + 1)
-END IF
-SELECT CASE VAL(val$)
-CASE 0, 1, 2, 7, 8, 9, 10, 11, 12, 13, 256
-wi& = _NEWIMAGE(240, 120, VAL(val$))
-clr~& = _RGBA(VAL(red$), VAL(green$), VAL(blue$), VAL(alpha$), wi&)
-_FREEIMAGE wi&
-CASE 32
-clr~& = _RGBA32(VAL(red$), VAL(green$), VAL(blue$), VAL(alpha$))
-CASE ELSE
-a$ = "Invalid Screen Mode.": GOTO errmes
-END SELECT
-
-wholestv$ = l$ + STR$(clr~&) + RIGHT$(wholestv$, LEN(wholestv$) - E)
-finished = 0
-ELSE
-'no finishing bracket
-a$ = ") Expected": GOTO errmes
-END IF
-ELSE
-'no starting bracket
-a$ = "( Expected": GOTO errmes
-END IF
-END IF
-LOOP UNTIL finished
-
-DO
-finished = -1
-L = INSTR(L + 1, UCASE$(wholestv$), " _RGB")
-IF L > 0 THEN
-altered = -1
-l$ = LEFT$(wholestv$, L - 1)
-vp = INSTR(L, wholestv$, "(")
-IF vp > 0 THEN
-E = INSTR(vp + 1, wholestv$, ")")
-IF E > 0 THEN
-first = INSTR(vp, wholestv$, ",")
-second = INSTR(first + 1, wholestv$, ",")
-third = INSTR(second + 1, wholestv$, ",")
-red$ = MID$(wholestv$, vp + 1, first - vp - 1)
-green$ = MID$(wholestv$, first + 1, second - first - 1)
-blue$ = MID$(wholestv$, second + 1)
-IF MID$(wholestv$, L + 5, 2) = "32" THEN
-val$ = "32"
-ELSE
-val$ = MID$(wholestv$, third + 1)
-END IF
-
-SELECT CASE VAL(val$)
-CASE 0, 1, 2, 7, 8, 9, 10, 11, 12, 13, 256
-wi& = _NEWIMAGE(240, 120, VAL(val$))
-clr~& = _RGB(VAL(red$), VAL(green$), VAL(blue$), wi&)
-_FREEIMAGE wi&
-CASE 32
-clr~& = _RGB32(VAL(red$), VAL(green$), VAL(blue$))
-CASE ELSE
-a$ = "Invalid Screen Mode.": GOTO errmes
-END SELECT
-
-wholestv$ = l$ + STR$(clr~&) + RIGHT$(wholestv$, LEN(wholestv$) - E)
-finished = 0
-ELSE
-a$ = ") Expected": GOTO errmes
-END IF
-ELSE
-a$ = "( Expected": GOTO errmes
-END IF
-END IF
-LOOP UNTIL finished
-
-' ### END OF STEVE EDIT FOR EXPANDED CONST SUPPORT ###
-
-'New Edit by Steve on 02/23/2014 to add support for the new Math functions
-
-L = 0: Emergency_Exit = 0 'A counter where if we're inside the same DO-Loop for more than 10,000 times, we assume it's an endless loop that didn't process properly and toss out an error message instead of locking up the program.
-DO
-L = INSTR(L + 1, wholestv$, "=")
-IF L THEN
-l2 = INSTR(L + 1, wholestv$, ",") 'Look for a comma after that
-IF l2 = 0 THEN 'If there's no comma, then we're working to the end of the line
-l2 = LEN(wholestv$)
-ELSE
-l2 = l2 - 1 'else we only want to take what's before that comma and see if we can use it
-END IF
-temp$ = RTRIM$(LTRIM$(MID$(wholestv$, L + 1, l2 - L)))
-temp1$ = RTRIM$(LTRIM$(Evaluate_Expression$(temp$)))
-IF LEFT$(temp1$, 5) <> "ERROR" AND temp$ <> temp1$ THEN
-'The math routine should have did its replacement for us.
-altered = -1
-wholestv$ = LEFT$(wholestv$, L) + temp1$ + MID$(wholestv$, l2 + 1)
-ELSE
-'We should leave it as it is and let the normal CONST routine handle things from here on out and see if it passes the rest of the error checks.
-END IF
-L = L + 1
-END IF
-Emergency_Exit = Emergency_Exit + 1
-IF Emergency_Exit > 10000 THEN a$ = "CONST ERROR: Attempting to process MATH Function caused Endless Loop. Please recheck your math formula.": GOTO errmes
-LOOP UNTIL L = 0
-'End of Math Support Edit
-
-
-'Steve edit to update the CONST with the Math and _RGB functions
-IF altered THEN
-altered = 0
-wholeline$ = wholestv$
-linenumber = linenumber - 1
-GOTO ideprepass
-END IF
-'End of Final Edits to CONST
-
-
-
-
-IF n < 3 THEN a$ = "Expected CONST name = value/expression": GOTO errmes
-i = 2
-constdefpendingpp:
-pending = 0
-
-n$ = getelement$(ca$, i): i = i + 1
-'l$ = l$ + sp + n$ + sp + "="
-typeoverride = 0
-s$ = removesymbol$(n$)
-IF Error_Happened THEN GOTO errmes
-IF s$ <> "" THEN
-typeoverride = typname2typ(s$)
-IF Error_Happened THEN GOTO errmes
-IF typeoverride AND ISFIXEDLENGTH THEN a$ = "Invalid constant type": GOTO errmes
-IF typeoverride = 0 THEN a$ = "Invalid constant type": GOTO errmes
-END IF
-
-IF getelement$(a$, i) <> "=" THEN a$ = "Expected =": GOTO errmes
-i = i + 1
-
-'get expression
-e$ = ""
-B = 0
-FOR i2 = i TO n
-e2$ = getelement$(ca$, i2)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF e2$ = "," AND B = 0 THEN
-pending = 1
-i = i2 + 1
-IF i > n - 2 THEN a$ = "Expected CONST ... , name = value/expression": GOTO errmes
-EXIT FOR
-END IF
-IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
-NEXT
-
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-'l$ = l$ + sp + tlayout$
-e$ = evaluateconst(e$, t)
-IF Error_Happened THEN GOTO errmes
-
-IF t AND ISSTRING THEN 'string type
-
-IF typeoverride THEN
-IF (typeoverride AND ISSTRING) = 0 THEN a$ = "Type mismatch": GOTO errmes
-END IF
-
-ELSE 'not a string type
-
-IF typeoverride THEN
-IF typeoverride AND ISSTRING THEN a$ = "Type mismatch": GOTO errmes
-END IF
-
-IF t AND ISFLOAT THEN
-constval## = _CV(_FLOAT, e$)
-constval&& = constval##
-constval~&& = constval&&
-ELSE
-IF (t AND ISUNSIGNED) AND (t AND 511) = 64 THEN
-constval~&& = _CV(_UNSIGNED _INTEGER64, e$)
-constval&& = constval~&&
-constval## = constval&&
-ELSE
-constval&& = _CV(_INTEGER64, e$)
-constval## = constval&&
-constval~&& = constval&&
-END IF
-END IF
-
-'override type?
-IF typeoverride THEN
-'range check required here (noted in todo)
-t = typeoverride
-END IF
-
-END IF 'not a string type
-
-constlast = constlast + 1
-IF constlast > constmax THEN
-constmax = constmax * 2
-REDIM _PRESERVE constname(constmax) AS STRING
-REDIM _PRESERVE constcname(constmax) AS STRING
-REDIM _PRESERVE constnamesymbol(constmax) AS STRING 'optional name symbol
-REDIM _PRESERVE consttype(constmax) AS LONG 'variable type number
-REDIM _PRESERVE constinteger(constmax) AS _INTEGER64
-REDIM _PRESERVE constuinteger(constmax) AS _UNSIGNED _INTEGER64
-REDIM _PRESERVE constfloat(constmax) AS _FLOAT
-REDIM _PRESERVE conststring(constmax) AS STRING
-REDIM _PRESERVE constsubfunc(constmax) AS LONG
-REDIM _PRESERVE constdefined(constmax) AS LONG
-END IF
-
-i2 = constlast
-
-constsubfunc(i2) = subfuncn
-'IF subfunc = "" THEN constlastshared = i2
-
-IF validname(n$) = 0 THEN a$ = "Invalid name": GOTO errmes
-constname(i2) = UCASE$(n$)
-
-hashname$ = n$
-'check for name conflicts (any similar: reserved, sub, function, constant)
-
-allow = 0
-const_recheck:
-hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_CONSTANT
-hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-IF hashresflags AND HASHFLAG_CONSTANT THEN
-IF constsubfunc(hashresref) = subfuncn THEN a$ = "Name already in use": GOTO errmes
-END IF
-IF hashresflags AND HASHFLAG_RESERVED THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-IF hashresflags AND (HASHFLAG_SUB + HASHFLAG_FUNCTION) THEN
-IF ids(hashresref).internal_subfunc = 0 OR RTRIM$(ids(hashresref).musthave) <> "$" THEN a$ = "Name already in use": GOTO errmes
-IF t AND ISSTRING THEN a$ = "Name already in use": GOTO errmes
-END IF
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-
-'add to hash table
-HashAdd hashname$, HASHFLAG_CONSTANT, i2
-
-
-
-
-
-constdefined(i2) = 1
-constcname(i2) = n$
-constnamesymbol(i2) = typevalue2symbol$(t)
-IF Error_Happened THEN GOTO errmes
-consttype(i2) = t
-IF t AND ISSTRING THEN
-conststring(i2) = e$
-ELSE
-IF t AND ISFLOAT THEN
-constfloat(i2) = constval##
-ELSE
-IF t AND ISUNSIGNED THEN
-constuinteger(i2) = constval~&&
-ELSE
-constinteger(i2) = constval&&
-END IF
-END IF
-END IF
-
-IF pending THEN
-'l$ = l$ + sp2 + ","
-GOTO constdefpendingpp
-END IF
-
-'layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-
-GOTO finishedlinepp
-END IF
-
-
-
-'DEFINE
-d = 0
-IF firstelement$ = "DEFINT" THEN d = 1
-IF firstelement$ = "DEFLNG" THEN d = 1
-IF firstelement$ = "DEFSNG" THEN d = 1
-IF firstelement$ = "DEFDBL" THEN d = 1
-IF firstelement$ = "DEFSTR" THEN d = 1
-IF firstelement$ = "_DEFINE" THEN d = 1
-IF d THEN
-predefining = 1: GOTO predefine
-predefined: predefining = 0
-GOTO finishedlinepp
-END IF
-
-'declare library
-IF firstelement$ = "DECLARE" THEN
-IF secondelement$ = "LIBRARY" OR secondelement$ = "DYNAMIC" OR secondelement$ = "CUSTOMTYPE" OR secondelement$ = "STATIC" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-declaringlibrary = 1
-indirectlibrary = 0
-IF secondelement$ = "CUSTOMTYPE" OR secondelement$ = "DYNAMIC" THEN indirectlibrary = 1
-GOTO finishedlinepp
-END IF
-END IF
-
-'SUB/FUNCTION
-dynamiclibrary = 0
-declaresubfunc:
-firstelement$ = getelement$(a$, 1)
-sf = 0
-IF firstelement$ = "FUNCTION" THEN sf = 1
-IF firstelement$ = "SUB" THEN sf = 2
-IF sf THEN
-
-subfuncn = subfuncn + 1
-
-IF n = 1 THEN a$ = "Expected name after SUB/FUNCTION": GOTO errmes
-
-'convert periods to _046_
-i2 = INSTR(a$, sp + "." + sp)
-IF i2 THEN
-DO
-a$ = LEFT$(a$, i2 - 1) + fix046$ + RIGHT$(a$, LEN(a$) - i2 - 2)
-ca$ = LEFT$(ca$, i2 - 1) + fix046$ + RIGHT$(ca$, LEN(ca$) - i2 - 2)
-i2 = INSTR(a$, sp + "." + sp)
-LOOP UNTIL i2 = 0
-n = numelements(a$)
-firstelement$ = getelement(a$, 1): secondelement$ = getelement(a$, 2): thirdelement$ = getelement(a$, 3)
-END IF
-
-n$ = getelement$(ca$, 2)
-symbol$ = removesymbol$(n$)
-IF Error_Happened THEN GOTO errmes
-IF sf = 2 AND symbol$ <> "" THEN a$ = "Type symbols after a SUB name are invalid": GOTO errmes
-
-'remove STATIC (which is ignored)
-e$ = getelement$(a$, n): IF e$ = "STATIC" THEN a$ = LEFT$(a$, LEN(a$) - 7): ca$ = LEFT$(ca$, LEN(ca$) - 7): n = n - 1
-
-'check for ALIAS
-aliasname$ = n$ 'use given name by default
-IF n > 2 THEN
-e$ = getelement$(a$, 3)
-IF e$ = "ALIAS" THEN
-IF declaringlibrary = 0 THEN a$ = "ALIAS can only be used with DECLARE LIBRARY": GOTO errmes
-IF n = 3 THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
-e$ = getelement$(ca$, 4)
-'strip string content (optional)
-IF LEFT$(e$, 1) = CHR$(34) THEN
-e$ = RIGHT$(e$, LEN(e$) - 1)
-x = INSTR(e$, CHR$(34)): IF x = 0 THEN a$ = "Expected " + CHR$(34): GOTO errmes
-e$ = LEFT$(e$, x - 1)
-END IF
-'strip fix046$ (created by unquoted periods)
-DO WHILE INSTR(e$, fix046$)
-x = INSTR(e$, fix046$): e$ = LEFT$(e$, x - 1) + "." + RIGHT$(e$, LEN(e$) - x + 1 - LEN(fix046$))
-LOOP
-'validate alias name
-IF LEN(e$) = 0 THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
-FOR x = 1 TO LEN(e$)
-a = ASC(e$, x)
-IF alphanumeric(a) = 0 AND a <> ASC_FULLSTOP AND a <> ASC_COLON THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
-NEXT
-aliasname$ = e$
-'remove ALIAS section from line
-IF n <= 4 THEN a$ = getelements(a$, 1, 2)
-IF n >= 5 THEN a$ = getelements(a$, 1, 2) + sp + getelements(a$, 5, n)
-IF n <= 4 THEN ca$ = getelements(ca$, 1, 2)
-IF n >= 5 THEN ca$ = getelements(ca$, 1, 2) + sp + getelements(ca$, 5, n)
-n = n - 2
-END IF
-END IF
-
-IF declaringlibrary THEN
-IF indirectlibrary THEN
-aliasname$ = n$ 'override the alias name
-END IF
-END IF
-
-params = 0
-params$ = ""
-paramsize$ = ""
-nele$ = ""
-nelereq$ = ""
-IF n > 2 THEN
-e$ = getelement$(a$, 3)
-IF e$ <> "(" THEN a$ = "Expected (": GOTO errmes
-e$ = getelement$(a$, n)
-IF e$ <> ")" THEN a$ = "Expected )": GOTO errmes
-IF n < 4 THEN a$ = "Expected ( ... )": GOTO errmes
-IF n = 4 THEN GOTO nosfparams
-B = 0
-a2$ = ""
-FOR i = 4 TO n - 1
-e$ = getelement$(a$, i)
-IF e$ = "(" THEN B = B + 1
-IF e$ = ")" THEN B = B - 1
-IF e$ = "," AND B = 0 THEN
-IF i = n - 1 THEN a$ = "Expected , ... )": GOTO errmes
-getlastparam:
-IF a2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
-a2$ = LEFT$(a2$, LEN(a2$) - 1)
-'possible format: [BYVAL]a[%][(1)][AS][type]
-n2 = numelements(a2$)
-array = 0
-t2$ = ""
-
-i2 = 1
-e$ = getelement$(a2$, i2): i2 = i2 + 1
-
-byvalue = 0
-IF e$ = "BYVAL" THEN
-IF declaringlibrary = 0 THEN a$ = "BYVAL can currently only be used with DECLARE LIBRARY": GOTO errmes
-e$ = getelement$(a2$, i2): i2 = i2 + 1: byvalue = 1
-END IF
-
-n2$ = e$
-symbol2$ = removesymbol$(n2$)
-IF validname(n2$) = 0 THEN a$ = "Invalid name": GOTO errmes
-
-IF Error_Happened THEN GOTO errmes
-m = 0
-FOR i2 = i2 TO n2
-e$ = getelement$(a2$, i2)
-IF e$ = "(" THEN
-IF m <> 0 THEN a$ = "Syntax error": GOTO errmes
-m = 1
-array = 1
-GOTO gotaa
-END IF
-IF e$ = ")" THEN
-IF m <> 1 THEN a$ = "Syntax error": GOTO errmes
-m = 2
-GOTO gotaa
-END IF
-IF e$ = "AS" THEN
-IF m <> 0 AND m <> 2 THEN a$ = "Syntax error": GOTO errmes
-m = 3
-GOTO gotaa
-END IF
-IF m = 1 THEN GOTO gotaa 'ignore contents of bracket
-IF m <> 3 THEN a$ = "Syntax error": GOTO errmes
-IF t2$ = "" THEN t2$ = e$ ELSE t2$ = t2$ + " " + e$
-gotaa:
-NEXT i2
-
-params = params + 1: IF params > 100 THEN a$ = "SUB/FUNCTION exceeds 100 parameter limit": GOTO errmes
-
-argnelereq = 0
-
-IF symbol2$ <> "" AND t2$ <> "" THEN a$ = "Syntax error": GOTO errmes
-IF t2$ = "" THEN t2$ = symbol2$
-IF t2$ = "" THEN
-IF LEFT$(n2$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n2$)) - 64
-t2$ = defineaz(v)
-END IF
-
-paramsize = 0
-IF array = 1 THEN
-t = typname2typ(t2$)
-IF Error_Happened THEN GOTO errmes
-IF t = 0 THEN a$ = "Illegal SUB/FUNCTION parameter": GOTO errmes
-IF (t AND ISFIXEDLENGTH) THEN paramsize = typname2typsize
-t = t + ISARRAY
-'check for recompilation override
-FOR i10 = 0 TO sflistn
-IF sfidlist(i10) = idn + 1 THEN
-IF sfarglist(i10) = params THEN
-argnelereq = sfelelist(i10)
-END IF
-END IF
-NEXT
-ELSE
-t = typname2typ(t2$)
-IF Error_Happened THEN GOTO errmes
-IF t = 0 THEN a$ = "Illegal SUB/FUNCTION parameter": GOTO errmes
-IF (t AND ISFIXEDLENGTH) THEN paramsize = typname2typsize
-
-IF byvalue THEN
-IF t AND ISPOINTER THEN t = t - ISPOINTER
-END IF
-
-END IF
-nelereq$ = nelereq$ + CHR$(argnelereq)
-
-'consider changing 0 in following line too!
-nele$ = nele$ + CHR$(0)
-
-paramsize$ = paramsize$ + MKL$(paramsize)
-params$ = params$ + MKL$(t)
-a2$ = ""
-ELSE
-a2$ = a2$ + e$ + sp
-IF i = n - 1 THEN GOTO getlastparam
-END IF
-NEXT i
-END IF 'n>2
-nosfparams:
-
-IF sf = 1 THEN
-'function
-clearid
-id.n = n$
-id.subfunc = 1
-
-id.callname = "FUNC_" + UCASE$(n$)
-IF declaringlibrary THEN
-id.ccall = 1
-IF indirectlibrary = 0 THEN id.callname = aliasname$
-END IF
-id.args = params
-id.arg = params$
-id.argsize = paramsize$
-id.nele = nele$
-id.nelereq = nelereq$
-IF symbol$ <> "" THEN
-id.ret = typname2typ(symbol$)
-IF Error_Happened THEN GOTO errmes
-ELSE
-IF LEFT$(n$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n$)) - 64
-symbol$ = defineaz(v)
-id.ret = typname2typ(symbol$)
-IF Error_Happened THEN GOTO errmes
-END IF
-IF id.ret = 0 THEN a$ = "Invalid FUNCTION return type": GOTO errmes
-
-IF declaringlibrary THEN
-
-ctype$ = typ2ctyp$(id.ret, "")
-IF Error_Happened THEN GOTO errmes
-IF ctype$ = "qbs" THEN ctype$ = "char*"
-id.callname = "( " + ctype$ + " )" + RTRIM$(id.callname)
-
-END IF
-
-s$ = LEFT$(symbol$, 1)
-IF s$ <> "~" AND s$ <> "`" AND s$ <> "%" AND s$ <> "&" AND s$ <> "!" AND s$ <> "#" AND s$ <> "$" THEN
-symbol$ = type2symbol$(symbol$)
-IF Error_Happened THEN GOTO errmes
-END IF
-id.mayhave = symbol$
-IF id.ret AND ISPOINTER THEN
-IF (id.ret AND ISSTRING) = 0 THEN id.ret = id.ret - ISPOINTER
-END IF
-regid
-IF Error_Happened THEN GOTO errmes
-ELSE
-'sub
-clearid
-id.n = n$
-id.subfunc = 2
-id.callname = "SUB_" + UCASE$(n$)
-IF declaringlibrary THEN
-id.ccall = 1
-IF indirectlibrary = 0 THEN id.callname = aliasname$
-END IF
-id.args = params
-id.arg = params$
-id.argsize = paramsize$
-id.nele = nele$
-id.nelereq = nelereq$
-
-IF UCASE$(n$) = "_GL" AND params = 0 AND UseGL = 0 THEN reginternalsubfunc = 1: UseGL = 1: id.n = "_GL": DEPENDENCY(DEPENDENCY_GL) = 1
-regid
-reginternalsubfunc = 0
-
-IF Error_Happened THEN GOTO errmes
-END IF
-
-
-END IF
-
-'========================================
-finishedlinepp:
-END IF
-a$ = ""
-ca$ = ""
-ELSE
-IF a$ = "" THEN a$ = e$: ca$ = ce$ ELSE a$ = a$ + sp + e$: ca$ = ca$ + sp + ce$
-END IF
-IF wholelinei <= wholelinen THEN wholelinei = wholelinei + 1: GOTO ppblda
-'----------------------------------------
-END IF 'wholelinei<=wholelinen
-END IF 'wholelinen
-END IF 'len(wholeline$)
-
-'Include Manager #1
-
-
-
-IF LEN(addmetainclude$) THEN
-IF Debug THEN PRINT #9, "Pre-pass:INCLUDE$-ing file:'" + addmetainclude$ + "':On line"; linenumber
-a$ = addmetainclude$: addmetainclude$ = "" 'read/clear message
-IF inclevel = 100 THEN a$ = "Too many indwelling INCLUDE files": GOTO errmes
-'1. Verify file exists (location is either (a)relative to source file or (b)absolute)
-fh = 99 + inclevel + 1
-FOR try = 1 TO 2
-IF try = 1 THEN
-IF inclevel = 0 THEN
-IF idemode THEN p$ = idepath$ + pathsep$ ELSE p$ = getfilepath$(sourcefile$)
-ELSE
-p$ = getfilepath$(incname(inclevel))
-END IF
-f$ = p$ + a$
-END IF
-IF try = 2 THEN f$ = a$
-IF _FILEEXISTS(f$) THEN
-qberrorhappened = -3
-'We're using the faster LINE INPUT, which requires a BINARY open.
-OPEN f$ FOR BINARY AS #fh
-'And another line below edited
-qberrorhappened3:
-IF qberrorhappened = -3 THEN EXIT FOR
-END IF
-qberrorhappened = 0
-NEXT
-IF qberrorhappened <> -3 THEN qberrorhappened = 0: a$ = "File " + a$ + " not found": GOTO errmes
-inclevel = inclevel + 1: incname$(inclevel) = f$: inclinenumber(inclevel) = 0
-END IF 'fall through to next section...
-'--------------------
-DO WHILE inclevel
-
-fh = 99 + inclevel
-'2. Feed next line
-IF EOF(fh) = 0 THEN
-LINE INPUT #fh, x$
-wholeline$ = x$
-inclinenumber(inclevel) = inclinenumber(inclevel) + 1
-'create extended error string 'incerror$'
-e$ = " in line " + str2(inclinenumber(inclevel)) + " of " + incname$(inclevel) + " included"
-IF inclevel > 1 THEN
-e$ = e$ + " (through "
-FOR x = 1 TO inclevel - 1 STEP 1
-e$ = e$ + incname$(x)
-IF x < inclevel - 1 THEN 'a sep is req
-IF x = inclevel - 2 THEN
-e$ = e$ + " then "
-ELSE
-e$ = e$ + ", "
-END IF
-END IF
-NEXT
-e$ = e$ + ")"
-END IF
-incerror$ = e$
-linenumber = linenumber - 1 'lower official linenumber to counter later increment
-
-IF Debug THEN PRINT #9, "Pre-pass:Feeding INCLUDE$ line:[" + wholeline$ + "]"
-IF idemode THEN sendc$ = CHR$(10) + wholeline$: GOTO sendcommand 'passback
-GOTO ideprepass
-END IF
-'3. Close & return control
-CLOSE #fh
-inclevel = inclevel - 1
-LOOP
-'(end manager)
-
-
-
-IF idemode THEN GOTO ideret2
+ stevewashere: '### STEVE EDIT FOR CONST EXPANSION 10/11/2013
+
+ wholeline$ = lineinput3$
+ IF wholeline$ = CHR$(13) THEN EXIT DO
+ ideprepass:
+
+ wholestv$ = wholeline$ '### STEVE EDIT FOR CONST EXPANSION 10/11/2013
+
+ prepass = 1
+ layout = ""
+ layoutok = 0
+
+ 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
+
+ wholeline$ = lineformat(wholeline$)
+ 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 = ": 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$
+ wholeline$ = eleucase$(wholeline$) '********REMOVE THIS LINE LATER********
+
+
+ addmetadynamic = 0: addmetastatic = 0
+ wholelinen = numelements(wholeline$)
+
+ IF wholelinen THEN
+
+ wholelinei = 1
+
+ 'skip line number?
+ e$ = getelement$(wholeline$, 1)
+ IF (ASC(e$) >= 48 AND ASC(e$) <= 59) OR ASC(e$) = 46 THEN wholelinei = 2: GOTO ppskpl
+
+ 'skip 'POSSIBLE' line label?
+ IF wholelinen >= 2 THEN
+ x2 = INSTR(wholeline$, sp + ":" + sp): x3 = x2 + 2
+ IF x2 = 0 THEN
+ IF RIGHT$(wholeline$, 2) = sp + ":" THEN x2 = LEN(wholeline$) - 1: x3 = x2 + 1
+ END IF
+
+ IF x2 THEN
+ e$ = LEFT$(wholeline$, x2 - 1)
+ IF validlabel(e$) THEN
+ wholeline$ = RIGHT$(wholeline$, LEN(wholeline$) - x3)
+ cwholeline$ = RIGHT$(cwholeline$, LEN(wholeline$) - x3)
+ wholelinen = numelements(wholeline$)
+ GOTO ppskpl
+ END IF 'valid
+ END IF 'includes ":"
+ END IF 'wholelinen>=2
+
+ ppskpl:
+ IF wholelinei <= wholelinen THEN
+ '----------------------------------------
+ a$ = ""
+ ca$ = ""
+ ppblda:
+ e$ = getelement$(wholeline$, wholelinei)
+ ce$ = getelement$(cwholeline$, wholelinei)
+ IF e$ = ":" OR e$ = "ELSE" OR e$ = "THEN" OR e$ = "" THEN
+ IF LEN(a$) THEN
+ IF Debug THEN PRINT #9, "PP[" + a$ + "]"
+ n = numelements(a$)
+ firstelement$ = getelement(a$, 1)
+ secondelement$ = getelement(a$, 2)
+ thirdelement$ = getelement(a$, 3)
+ '========================================
+
+ 'declare library
+ IF declaringlibrary THEN
+
+ IF firstelement$ = "END" THEN
+ IF n <> 2 OR secondelement$ <> "DECLARE" THEN a$ = "Expected END DECLARE": GOTO errmes
+ declaringlibrary = 0
+ GOTO finishedlinepp
+ END IF 'end declare
+
+ declaringlibrary = 2
+
+ IF firstelement$ = "SUB" OR firstelement$ = "FUNCTION" THEN subfuncn = subfuncn - 1: GOTO declaresubfunc
+
+ a$ = "Expected SUB/FUNCTION definition or END DECLARE (#2)": GOTO errmes
+ END IF
+
+ 'UDT TYPE definition
+ IF definingtype THEN
+ i = definingtype
+
+ IF n >= 1 THEN
+ IF firstelement$ = "END" THEN
+ IF n <> 2 OR secondelement$ <> "TYPE" THEN a$ = "Expected END TYPE": GOTO errmes
+ IF udtxnext(i) = 0 THEN a$ = "No elements defined in TYPE": GOTO errmes
+ definingtype = 0
+
+ 'create global buffer for SWAP space
+ siz$ = str2$(udtxsize(i) \ 8)
+ PRINT #18, "char *g_tmp_udt_" + RTRIM$(udtxname(i)) + "=(char*)malloc(" + siz$ + ");"
+
+ 'print "END TYPE";udtxsize(i);udtxbytealign(i)
+ GOTO finishedlinepp
+ END IF
+ END IF
+
+ lasttypeelement = lasttypeelement + 1
+ i2 = lasttypeelement
+ udtenext(i2) = 0
+
+ IF n < 3 THEN a$ = "Expected variablename AS type or END TYPE": GOTO errmes
+ n$ = firstelement$
+
+ ii = 2
+
+ udtearrayelements(i2) = 0
+
+ IF ii >= n OR getelement$(a$, ii) <> "AS" THEN a$ = "Expected variablename AS type or END TYPE": GOTO errmes
+ t$ = getelements$(a$, ii + 1, n)
+
+ typ = typname2typ(t$)
+ IF Error_Happened THEN GOTO errmes
+ IF typ = 0 THEN a$ = "Undefined type": GOTO errmes
+ typsize = typname2typsize
+
+ IF validname(n$) = 0 THEN a$ = "Invalid name": GOTO errmes
+ udtename(i2) = n$
+
+ udtecname(i2) = getelement$(ca$, 1)
+ udtetype(i2) = typ
+ udtetypesize(i2) = typsize
+
+ hashname$ = n$
+
+ 'check for name conflicts (any similar reserved or element from current UDT)
+ hashchkflags = HASHFLAG_RESERVED + HASHFLAG_UDTELEMENT
+ hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ IF hashresflags AND HASHFLAG_UDTELEMENT THEN
+ IF hashresref = i THEN a$ = "Name already in use": GOTO errmes
+ END IF
+ IF hashresflags AND HASHFLAG_RESERVED THEN
+ IF hashresflags AND (HASHFLAG_TYPE + HASHFLAG_CUSTOMSYNTAX + HASHFLAG_OPERATOR + HASHFLAG_XELEMENTNAME) THEN a$ = "Name already in use": GOTO errmes
+ END IF
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+ 'add to hash table
+ HashAdd hashname$, HASHFLAG_UDTELEMENT, i
+
+ 'Calculate element's size
+ IF typ AND ISUDT THEN
+ u = typ AND 511
+ udtesize(i2) = udtxsize(u)
+ IF udtxbytealign(u) THEN udtxbytealign(i) = 1: udtebytealign(i2) = 1
+ ELSE
+ IF (typ AND ISSTRING) THEN
+ IF (typ AND ISFIXEDLENGTH) = 0 THEN a$ = "Expected STRING *": GOTO errmes
+ udtesize(i2) = typsize * 8
+ udtxbytealign(i) = 1: udtebytealign(i2) = 1
+ ELSE
+ udtesize(i2) = typ AND 511
+ IF (typ AND ISOFFSETINBITS) = 0 THEN udtxbytealign(i) = 1: udtebytealign(i2) = 1
+ END IF
+ END IF
+
+ 'Increase block size
+ IF udtebytealign(i2) THEN
+ IF udtxsize(i) MOD 8 THEN
+ udtxsize(i) = udtxsize(i) + (8 - (udtxsize(i) MOD 8))
+ END IF
+ END IF
+ udtxsize(i) = udtxsize(i) + udtesize(i2)
+
+ 'Link element to previous element
+ IF udtxnext(i) = 0 THEN
+ udtxnext(i) = i2
+ ELSE
+ udtenext(i2 - 1) = i2
+ END IF
+
+ 'print "+"+rtrim$(udtename(i2));udtesize(i2);udtebytealign(i2);udtxsize(i)
+
+ GOTO finishedlinepp
+
+ END IF 'definingtype
+
+ IF definingtype AND n >= 1 THEN a$ = "Expected END TYPE": GOTO errmes
+
+ IF n >= 1 THEN
+ IF firstelement$ = "TYPE" THEN
+ IF n <> 2 THEN a$ = "Expected TYPE typename": GOTO errmes
+ lasttype = lasttype + 1
+ definingtype = lasttype
+ i = definingtype
+ IF validname(secondelement$) = 0 THEN a$ = "Invalid name": GOTO errmes
+ udtxname(i) = secondelement$
+ udtxcname(i) = getelement(ca$, 2)
+ udtxnext(i) = 0
+ udtxsize(i) = 0
+
+ hashname$ = secondelement$
+ hashflags = HASHFLAG_UDT
+ 'check for name conflicts (any similar reserved/sub/function/UDT name)
+ hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_UDT
+ hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ allow = 0
+ IF hashresflags AND (HASHFLAG_SUB + HASHFLAG_FUNCTION) THEN
+ allow = 1
+ END IF
+ IF hashresflags AND HASHFLAG_RESERVED THEN
+ IF (hashresflags AND (HASHFLAG_TYPE + HASHFLAG_OPERATOR + HASHFLAG_CUSTOMSYNTAX + HASHFLAG_XTYPENAME)) = 0 THEN allow = 1
+ END IF
+ IF allow = 0 THEN a$ = "Name already in use": GOTO errmes
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+
+ 'add to hash table
+ HashAdd hashname$, hashflags, i
+
+ GOTO finishedlinepp
+ END IF
+ END IF
+
+
+
+
+
+ stevewashere2: ' ### STEVE EDIT ON 10/11/2013 (Const Expansion)
+
+
+ IF n >= 1 AND firstelement$ = "CONST" THEN
+ 'l$ = "CONST"
+ 'DEF... do not change type, the expression is stored in a suitable type
+ 'based on its value if type isn't forced/specified
+
+
+
+
+
+ 'convert periods to _046_
+ i2 = INSTR(a$, sp + "." + sp)
+ IF i2 THEN
+ DO
+ a$ = LEFT$(a$, i2 - 1) + fix046$ + RIGHT$(a$, LEN(a$) - i2 - 2)
+ ca$ = LEFT$(ca$, i2 - 1) + fix046$ + RIGHT$(ca$, LEN(ca$) - i2 - 2)
+ i2 = INSTR(a$, sp + "." + sp)
+ LOOP UNTIL i2 = 0
+ n = numelements(a$)
+ firstelement$ = getelement(a$, 1): secondelement$ = getelement(a$, 2): thirdelement$ = getelement(a$, 3)
+ END IF
+
+
+ 'Steve Tweak to add _RGB32 and _MATH support to CONST
+ 'Our alteration to allow for multiple uses of RGB and RGBA inside a CONST //SMcNeill
+ altered = 0
+
+ 'Edit 02/23/2014 to add space between = and _ for statements like CONST x=_RGB(123,0,0) and stop us from gettting an error.
+ DO
+ L = INSTR(wholestv$, "=_")
+ IF L THEN
+ wholestv$ = LEFT$(wholestv$, L) + " " + MID$(wholestv$, L + 1)
+ END IF
+ LOOP UNTIL L = 0
+ 'End of Edit on 02/23/2014
+
+ DO
+ finished = -1
+ L = INSTR(L + 1, UCASE$(wholestv$), " _RGBA")
+ IF L > 0 THEN
+ altered = -1
+ l$ = LEFT$(wholestv$, L - 1)
+ vp = INSTR(L, wholestv$, "(")
+ IF vp > 0 THEN
+ E = INSTR(vp + 1, wholestv$, ")")
+ IF E > 0 THEN
+ 'get our 3 colors or 4 if we need RGBA values
+ first = INSTR(vp, wholestv$, ",")
+ second = INSTR(first + 1, wholestv$, ",")
+ third = INSTR(second + 1, wholestv$, ",")
+ fourth = INSTR(third + 1, wholestv$, ",") 'If we need RGBA we need this one as well
+ red$ = MID$(wholestv$, vp + 1, first - vp - 1)
+ green$ = MID$(wholestv$, first + 1, second - first - 1)
+ blue$ = MID$(wholestv$, second + 1, third - second - 1)
+ alpha$ = MID$(wholestv$, third + 1)
+ IF MID$(wholestv$, L + 6, 2) = "32" THEN
+ val$ = "32"
+ ELSE
+ val$ = MID$(wholestv$, fourth + 1)
+ END IF
+ SELECT CASE VAL(val$)
+ CASE 0, 1, 2, 7, 8, 9, 10, 11, 12, 13, 256
+ wi& = _NEWIMAGE(240, 120, VAL(val$))
+ clr~& = _RGBA(VAL(red$), VAL(green$), VAL(blue$), VAL(alpha$), wi&)
+ _FREEIMAGE wi&
+ CASE 32
+ clr~& = _RGBA32(VAL(red$), VAL(green$), VAL(blue$), VAL(alpha$))
+ CASE ELSE
+ a$ = "Invalid Screen Mode.": GOTO errmes
+ END SELECT
+
+ wholestv$ = l$ + STR$(clr~&) + RIGHT$(wholestv$, LEN(wholestv$) - E)
+ finished = 0
+ ELSE
+ 'no finishing bracket
+ a$ = ") Expected": GOTO errmes
+ END IF
+ ELSE
+ 'no starting bracket
+ a$ = "( Expected": GOTO errmes
+ END IF
+ END IF
+ LOOP UNTIL finished
+
+ DO
+ finished = -1
+ L = INSTR(L + 1, UCASE$(wholestv$), " _RGB")
+ IF L > 0 THEN
+ altered = -1
+ l$ = LEFT$(wholestv$, L - 1)
+ vp = INSTR(L, wholestv$, "(")
+ IF vp > 0 THEN
+ E = INSTR(vp + 1, wholestv$, ")")
+ IF E > 0 THEN
+ first = INSTR(vp, wholestv$, ",")
+ second = INSTR(first + 1, wholestv$, ",")
+ third = INSTR(second + 1, wholestv$, ",")
+ red$ = MID$(wholestv$, vp + 1, first - vp - 1)
+ green$ = MID$(wholestv$, first + 1, second - first - 1)
+ blue$ = MID$(wholestv$, second + 1)
+ IF MID$(wholestv$, L + 5, 2) = "32" THEN
+ val$ = "32"
+ ELSE
+ val$ = MID$(wholestv$, third + 1)
+ END IF
+
+ SELECT CASE VAL(val$)
+ CASE 0, 1, 2, 7, 8, 9, 10, 11, 12, 13, 256
+ wi& = _NEWIMAGE(240, 120, VAL(val$))
+ clr~& = _RGB(VAL(red$), VAL(green$), VAL(blue$), wi&)
+ _FREEIMAGE wi&
+ CASE 32
+ clr~& = _RGB32(VAL(red$), VAL(green$), VAL(blue$))
+ CASE ELSE
+ a$ = "Invalid Screen Mode.": GOTO errmes
+ END SELECT
+
+ wholestv$ = l$ + STR$(clr~&) + RIGHT$(wholestv$, LEN(wholestv$) - E)
+ finished = 0
+ ELSE
+ a$ = ") Expected": GOTO errmes
+ END IF
+ ELSE
+ a$ = "( Expected": GOTO errmes
+ END IF
+ END IF
+ LOOP UNTIL finished
+
+ ' ### END OF STEVE EDIT FOR EXPANDED CONST SUPPORT ###
+
+ 'New Edit by Steve on 02/23/2014 to add support for the new Math functions
+
+ L = 0: Emergency_Exit = 0 'A counter where if we're inside the same DO-Loop for more than 10,000 times, we assume it's an endless loop that didn't process properly and toss out an error message instead of locking up the program.
+ DO
+ L = INSTR(L + 1, wholestv$, "=")
+ IF L THEN
+ l2 = INSTR(L + 1, wholestv$, ",") 'Look for a comma after that
+ IF l2 = 0 THEN 'If there's no comma, then we're working to the end of the line
+ l2 = LEN(wholestv$)
+ ELSE
+ l2 = l2 - 1 'else we only want to take what's before that comma and see if we can use it
+ END IF
+ temp$ = RTRIM$(LTRIM$(MID$(wholestv$, L + 1, l2 - L)))
+ temp1$ = RTRIM$(LTRIM$(Evaluate_Expression$(temp$)))
+ IF LEFT$(temp1$, 5) <> "ERROR" AND temp$ <> temp1$ THEN
+ 'The math routine should have did its replacement for us.
+ altered = -1
+ wholestv$ = LEFT$(wholestv$, L) + temp1$ + MID$(wholestv$, l2 + 1)
+ ELSE
+ 'We should leave it as it is and let the normal CONST routine handle things from here on out and see if it passes the rest of the error checks.
+ END IF
+ L = L + 1
+ END IF
+ Emergency_Exit = Emergency_Exit + 1
+ IF Emergency_Exit > 10000 THEN a$ = "CONST ERROR: Attempting to process MATH Function caused Endless Loop. Please recheck your math formula.": GOTO errmes
+ LOOP UNTIL L = 0
+ 'End of Math Support Edit
+
+
+ 'Steve edit to update the CONST with the Math and _RGB functions
+ IF altered THEN
+ altered = 0
+ wholeline$ = wholestv$
+ linenumber = linenumber - 1
+ GOTO ideprepass
+ END IF
+ 'End of Final Edits to CONST
+
+
+
+
+ IF n < 3 THEN a$ = "Expected CONST name = value/expression": GOTO errmes
+ i = 2
+ constdefpendingpp:
+ pending = 0
+
+ n$ = getelement$(ca$, i): i = i + 1
+ 'l$ = l$ + sp + n$ + sp + "="
+ typeoverride = 0
+ s$ = removesymbol$(n$)
+ IF Error_Happened THEN GOTO errmes
+ IF s$ <> "" THEN
+ typeoverride = typname2typ(s$)
+ IF Error_Happened THEN GOTO errmes
+ IF typeoverride AND ISFIXEDLENGTH THEN a$ = "Invalid constant type": GOTO errmes
+ IF typeoverride = 0 THEN a$ = "Invalid constant type": GOTO errmes
+ END IF
+
+ IF getelement$(a$, i) <> "=" THEN a$ = "Expected =": GOTO errmes
+ i = i + 1
+
+ 'get expression
+ e$ = ""
+ B = 0
+ FOR i2 = i TO n
+ e2$ = getelement$(ca$, i2)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF e2$ = "," AND B = 0 THEN
+ pending = 1
+ i = i2 + 1
+ IF i > n - 2 THEN a$ = "Expected CONST ... , name = value/expression": GOTO errmes
+ EXIT FOR
+ END IF
+ IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
+ NEXT
+
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ 'l$ = l$ + sp + tlayout$
+ e$ = evaluateconst(e$, t)
+ IF Error_Happened THEN GOTO errmes
+
+ IF t AND ISSTRING THEN 'string type
+
+ IF typeoverride THEN
+ IF (typeoverride AND ISSTRING) = 0 THEN a$ = "Type mismatch": GOTO errmes
+ END IF
+
+ ELSE 'not a string type
+
+ IF typeoverride THEN
+ IF typeoverride AND ISSTRING THEN a$ = "Type mismatch": GOTO errmes
+ END IF
+
+ IF t AND ISFLOAT THEN
+ constval## = _CV(_FLOAT, e$)
+ constval&& = constval##
+ constval~&& = constval&&
+ ELSE
+ IF (t AND ISUNSIGNED) AND (t AND 511) = 64 THEN
+ constval~&& = _CV(_UNSIGNED _INTEGER64, e$)
+ constval&& = constval~&&
+ constval## = constval&&
+ ELSE
+ constval&& = _CV(_INTEGER64, e$)
+ constval## = constval&&
+ constval~&& = constval&&
+ END IF
+ END IF
+
+ 'override type?
+ IF typeoverride THEN
+ 'range check required here (noted in todo)
+ t = typeoverride
+ END IF
+
+ END IF 'not a string type
+
+ constlast = constlast + 1
+ IF constlast > constmax THEN
+ constmax = constmax * 2
+ REDIM _PRESERVE constname(constmax) AS STRING
+ REDIM _PRESERVE constcname(constmax) AS STRING
+ REDIM _PRESERVE constnamesymbol(constmax) AS STRING 'optional name symbol
+ REDIM _PRESERVE consttype(constmax) AS LONG 'variable type number
+ REDIM _PRESERVE constinteger(constmax) AS _INTEGER64
+ REDIM _PRESERVE constuinteger(constmax) AS _UNSIGNED _INTEGER64
+ REDIM _PRESERVE constfloat(constmax) AS _FLOAT
+ REDIM _PRESERVE conststring(constmax) AS STRING
+ REDIM _PRESERVE constsubfunc(constmax) AS LONG
+ REDIM _PRESERVE constdefined(constmax) AS LONG
+ END IF
+
+ i2 = constlast
+
+ constsubfunc(i2) = subfuncn
+ 'IF subfunc = "" THEN constlastshared = i2
+
+ IF validname(n$) = 0 THEN a$ = "Invalid name": GOTO errmes
+ constname(i2) = UCASE$(n$)
+
+ hashname$ = n$
+ 'check for name conflicts (any similar: reserved, sub, function, constant)
+
+ allow = 0
+ const_recheck:
+ hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_CONSTANT
+ hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ IF hashresflags AND HASHFLAG_CONSTANT THEN
+ IF constsubfunc(hashresref) = subfuncn THEN a$ = "Name already in use": GOTO errmes
+ END IF
+ IF hashresflags AND HASHFLAG_RESERVED THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ IF hashresflags AND (HASHFLAG_SUB + HASHFLAG_FUNCTION) THEN
+ IF ids(hashresref).internal_subfunc = 0 OR RTRIM$(ids(hashresref).musthave) <> "$" THEN a$ = "Name already in use": GOTO errmes
+ IF t AND ISSTRING THEN a$ = "Name already in use": GOTO errmes
+ END IF
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+
+ 'add to hash table
+ HashAdd hashname$, HASHFLAG_CONSTANT, i2
+
+
+
+
+
+ constdefined(i2) = 1
+ constcname(i2) = n$
+ constnamesymbol(i2) = typevalue2symbol$(t)
+ IF Error_Happened THEN GOTO errmes
+ consttype(i2) = t
+ IF t AND ISSTRING THEN
+ conststring(i2) = e$
+ ELSE
+ IF t AND ISFLOAT THEN
+ constfloat(i2) = constval##
+ ELSE
+ IF t AND ISUNSIGNED THEN
+ constuinteger(i2) = constval~&&
+ ELSE
+ constinteger(i2) = constval&&
+ END IF
+ END IF
+ END IF
+
+ IF pending THEN
+ 'l$ = l$ + sp2 + ","
+ GOTO constdefpendingpp
+ END IF
+
+ 'layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+
+ GOTO finishedlinepp
+ END IF
+
+
+
+ 'DEFINE
+ d = 0
+ IF firstelement$ = "DEFINT" THEN d = 1
+ IF firstelement$ = "DEFLNG" THEN d = 1
+ IF firstelement$ = "DEFSNG" THEN d = 1
+ IF firstelement$ = "DEFDBL" THEN d = 1
+ IF firstelement$ = "DEFSTR" THEN d = 1
+ IF firstelement$ = "_DEFINE" THEN d = 1
+ IF d THEN
+ predefining = 1: GOTO predefine
+ predefined: predefining = 0
+ GOTO finishedlinepp
+ END IF
+
+ 'declare library
+ IF firstelement$ = "DECLARE" THEN
+ IF secondelement$ = "LIBRARY" OR secondelement$ = "DYNAMIC" OR secondelement$ = "CUSTOMTYPE" OR secondelement$ = "STATIC" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ declaringlibrary = 1
+ indirectlibrary = 0
+ IF secondelement$ = "CUSTOMTYPE" OR secondelement$ = "DYNAMIC" THEN indirectlibrary = 1
+ GOTO finishedlinepp
+ END IF
+ END IF
+
+ 'SUB/FUNCTION
+ dynamiclibrary = 0
+ declaresubfunc:
+ firstelement$ = getelement$(a$, 1)
+ sf = 0
+ IF firstelement$ = "FUNCTION" THEN sf = 1
+ IF firstelement$ = "SUB" THEN sf = 2
+ IF sf THEN
+
+ subfuncn = subfuncn + 1
+
+ IF n = 1 THEN a$ = "Expected name after SUB/FUNCTION": GOTO errmes
+
+ 'convert periods to _046_
+ i2 = INSTR(a$, sp + "." + sp)
+ IF i2 THEN
+ DO
+ a$ = LEFT$(a$, i2 - 1) + fix046$ + RIGHT$(a$, LEN(a$) - i2 - 2)
+ ca$ = LEFT$(ca$, i2 - 1) + fix046$ + RIGHT$(ca$, LEN(ca$) - i2 - 2)
+ i2 = INSTR(a$, sp + "." + sp)
+ LOOP UNTIL i2 = 0
+ n = numelements(a$)
+ firstelement$ = getelement(a$, 1): secondelement$ = getelement(a$, 2): thirdelement$ = getelement(a$, 3)
+ END IF
+
+ n$ = getelement$(ca$, 2)
+ symbol$ = removesymbol$(n$)
+ IF Error_Happened THEN GOTO errmes
+ IF sf = 2 AND symbol$ <> "" THEN a$ = "Type symbols after a SUB name are invalid": GOTO errmes
+
+ 'remove STATIC (which is ignored)
+ e$ = getelement$(a$, n): IF e$ = "STATIC" THEN a$ = LEFT$(a$, LEN(a$) - 7): ca$ = LEFT$(ca$, LEN(ca$) - 7): n = n - 1
+
+ 'check for ALIAS
+ aliasname$ = n$ 'use given name by default
+ IF n > 2 THEN
+ e$ = getelement$(a$, 3)
+ IF e$ = "ALIAS" THEN
+ IF declaringlibrary = 0 THEN a$ = "ALIAS can only be used with DECLARE LIBRARY": GOTO errmes
+ IF n = 3 THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
+ e$ = getelement$(ca$, 4)
+ 'strip string content (optional)
+ IF LEFT$(e$, 1) = CHR$(34) THEN
+ e$ = RIGHT$(e$, LEN(e$) - 1)
+ x = INSTR(e$, CHR$(34)): IF x = 0 THEN a$ = "Expected " + CHR$(34): GOTO errmes
+ e$ = LEFT$(e$, x - 1)
+ END IF
+ 'strip fix046$ (created by unquoted periods)
+ DO WHILE INSTR(e$, fix046$)
+ x = INSTR(e$, fix046$): e$ = LEFT$(e$, x - 1) + "." + RIGHT$(e$, LEN(e$) - x + 1 - LEN(fix046$))
+ LOOP
+ 'validate alias name
+ IF LEN(e$) = 0 THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
+ FOR x = 1 TO LEN(e$)
+ a = ASC(e$, x)
+ IF alphanumeric(a) = 0 AND a <> ASC_FULLSTOP AND a <> ASC_COLON THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
+ NEXT
+ aliasname$ = e$
+ 'remove ALIAS section from line
+ IF n <= 4 THEN a$ = getelements(a$, 1, 2)
+ IF n >= 5 THEN a$ = getelements(a$, 1, 2) + sp + getelements(a$, 5, n)
+ IF n <= 4 THEN ca$ = getelements(ca$, 1, 2)
+ IF n >= 5 THEN ca$ = getelements(ca$, 1, 2) + sp + getelements(ca$, 5, n)
+ n = n - 2
+ END IF
+ END IF
+
+ IF declaringlibrary THEN
+ IF indirectlibrary THEN
+ aliasname$ = n$ 'override the alias name
+ END IF
+ END IF
+
+ params = 0
+ params$ = ""
+ paramsize$ = ""
+ nele$ = ""
+ nelereq$ = ""
+ IF n > 2 THEN
+ e$ = getelement$(a$, 3)
+ IF e$ <> "(" THEN a$ = "Expected (": GOTO errmes
+ e$ = getelement$(a$, n)
+ IF e$ <> ")" THEN a$ = "Expected )": GOTO errmes
+ IF n < 4 THEN a$ = "Expected ( ... )": GOTO errmes
+ IF n = 4 THEN GOTO nosfparams
+ B = 0
+ a2$ = ""
+ FOR i = 4 TO n - 1
+ e$ = getelement$(a$, i)
+ IF e$ = "(" THEN B = B + 1
+ IF e$ = ")" THEN B = B - 1
+ IF e$ = "," AND B = 0 THEN
+ IF i = n - 1 THEN a$ = "Expected , ... )": GOTO errmes
+ getlastparam:
+ IF a2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
+ a2$ = LEFT$(a2$, LEN(a2$) - 1)
+ 'possible format: [BYVAL]a[%][(1)][AS][type]
+ n2 = numelements(a2$)
+ array = 0
+ t2$ = ""
+
+ i2 = 1
+ e$ = getelement$(a2$, i2): i2 = i2 + 1
+
+ byvalue = 0
+ IF e$ = "BYVAL" THEN
+ IF declaringlibrary = 0 THEN a$ = "BYVAL can currently only be used with DECLARE LIBRARY": GOTO errmes
+ e$ = getelement$(a2$, i2): i2 = i2 + 1: byvalue = 1
+ END IF
+
+ n2$ = e$
+ symbol2$ = removesymbol$(n2$)
+ IF validname(n2$) = 0 THEN a$ = "Invalid name": GOTO errmes
+
+ IF Error_Happened THEN GOTO errmes
+ m = 0
+ FOR i2 = i2 TO n2
+ e$ = getelement$(a2$, i2)
+ IF e$ = "(" THEN
+ IF m <> 0 THEN a$ = "Syntax error": GOTO errmes
+ m = 1
+ array = 1
+ GOTO gotaa
+ END IF
+ IF e$ = ")" THEN
+ IF m <> 1 THEN a$ = "Syntax error": GOTO errmes
+ m = 2
+ GOTO gotaa
+ END IF
+ IF e$ = "AS" THEN
+ IF m <> 0 AND m <> 2 THEN a$ = "Syntax error": GOTO errmes
+ m = 3
+ GOTO gotaa
+ END IF
+ IF m = 1 THEN GOTO gotaa 'ignore contents of bracket
+ IF m <> 3 THEN a$ = "Syntax error": GOTO errmes
+ IF t2$ = "" THEN t2$ = e$ ELSE t2$ = t2$ + " " + e$
+ gotaa:
+ NEXT i2
+
+ params = params + 1: IF params > 100 THEN a$ = "SUB/FUNCTION exceeds 100 parameter limit": GOTO errmes
+
+ argnelereq = 0
+
+ IF symbol2$ <> "" AND t2$ <> "" THEN a$ = "Syntax error": GOTO errmes
+ IF t2$ = "" THEN t2$ = symbol2$
+ IF t2$ = "" THEN
+ IF LEFT$(n2$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n2$)) - 64
+ t2$ = defineaz(v)
+ END IF
+
+ paramsize = 0
+ IF array = 1 THEN
+ t = typname2typ(t2$)
+ IF Error_Happened THEN GOTO errmes
+ IF t = 0 THEN a$ = "Illegal SUB/FUNCTION parameter": GOTO errmes
+ IF (t AND ISFIXEDLENGTH) THEN paramsize = typname2typsize
+ t = t + ISARRAY
+ 'check for recompilation override
+ FOR i10 = 0 TO sflistn
+ IF sfidlist(i10) = idn + 1 THEN
+ IF sfarglist(i10) = params THEN
+ argnelereq = sfelelist(i10)
+ END IF
+ END IF
+ NEXT
+ ELSE
+ t = typname2typ(t2$)
+ IF Error_Happened THEN GOTO errmes
+ IF t = 0 THEN a$ = "Illegal SUB/FUNCTION parameter": GOTO errmes
+ IF (t AND ISFIXEDLENGTH) THEN paramsize = typname2typsize
+
+ IF byvalue THEN
+ IF t AND ISPOINTER THEN t = t - ISPOINTER
+ END IF
+
+ END IF
+ nelereq$ = nelereq$ + CHR$(argnelereq)
+
+ 'consider changing 0 in following line too!
+ nele$ = nele$ + CHR$(0)
+
+ paramsize$ = paramsize$ + MKL$(paramsize)
+ params$ = params$ + MKL$(t)
+ a2$ = ""
+ ELSE
+ a2$ = a2$ + e$ + sp
+ IF i = n - 1 THEN GOTO getlastparam
+ END IF
+ NEXT i
+ END IF 'n>2
+ nosfparams:
+
+ IF sf = 1 THEN
+ 'function
+ clearid
+ id.n = n$
+ id.subfunc = 1
+
+ id.callname = "FUNC_" + UCASE$(n$)
+ IF declaringlibrary THEN
+ id.ccall = 1
+ IF indirectlibrary = 0 THEN id.callname = aliasname$
+ END IF
+ id.args = params
+ id.arg = params$
+ id.argsize = paramsize$
+ id.nele = nele$
+ id.nelereq = nelereq$
+ IF symbol$ <> "" THEN
+ id.ret = typname2typ(symbol$)
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ IF LEFT$(n$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n$)) - 64
+ symbol$ = defineaz(v)
+ id.ret = typname2typ(symbol$)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+ IF id.ret = 0 THEN a$ = "Invalid FUNCTION return type": GOTO errmes
+
+ IF declaringlibrary THEN
+
+ ctype$ = typ2ctyp$(id.ret, "")
+ IF Error_Happened THEN GOTO errmes
+ IF ctype$ = "qbs" THEN ctype$ = "char*"
+ id.callname = "( " + ctype$ + " )" + RTRIM$(id.callname)
+
+ END IF
+
+ s$ = LEFT$(symbol$, 1)
+ IF s$ <> "~" AND s$ <> "`" AND s$ <> "%" AND s$ <> "&" AND s$ <> "!" AND s$ <> "#" AND s$ <> "$" THEN
+ symbol$ = type2symbol$(symbol$)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+ id.mayhave = symbol$
+ IF id.ret AND ISPOINTER THEN
+ IF (id.ret AND ISSTRING) = 0 THEN id.ret = id.ret - ISPOINTER
+ END IF
+ regid
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ 'sub
+ clearid
+ id.n = n$
+ id.subfunc = 2
+ id.callname = "SUB_" + UCASE$(n$)
+ IF declaringlibrary THEN
+ id.ccall = 1
+ IF indirectlibrary = 0 THEN id.callname = aliasname$
+ END IF
+ id.args = params
+ id.arg = params$
+ id.argsize = paramsize$
+ id.nele = nele$
+ id.nelereq = nelereq$
+
+ IF UCASE$(n$) = "_GL" AND params = 0 AND UseGL = 0 THEN reginternalsubfunc = 1: UseGL = 1: id.n = "_GL": DEPENDENCY(DEPENDENCY_GL) = 1
+ regid
+ reginternalsubfunc = 0
+
+ IF Error_Happened THEN GOTO errmes
+ END IF
+
+
+ END IF
+
+ '========================================
+ finishedlinepp:
+ END IF
+ a$ = ""
+ ca$ = ""
+ ELSE
+ IF a$ = "" THEN a$ = e$: ca$ = ce$ ELSE a$ = a$ + sp + e$: ca$ = ca$ + sp + ce$
+ END IF
+ IF wholelinei <= wholelinen THEN wholelinei = wholelinei + 1: GOTO ppblda
+ '----------------------------------------
+ END IF 'wholelinei<=wholelinen
+ END IF 'wholelinen
+ END IF 'len(wholeline$)
+
+ 'Include Manager #1
+
+
+
+ IF LEN(addmetainclude$) THEN
+ IF Debug THEN PRINT #9, "Pre-pass:INCLUDE$-ing file:'" + addmetainclude$ + "':On line"; linenumber
+ a$ = addmetainclude$: addmetainclude$ = "" 'read/clear message
+ IF inclevel = 100 THEN a$ = "Too many indwelling INCLUDE files": GOTO errmes
+ '1. Verify file exists (location is either (a)relative to source file or (b)absolute)
+ fh = 99 + inclevel + 1
+ FOR try = 1 TO 2
+ IF try = 1 THEN
+ IF inclevel = 0 THEN
+ IF idemode THEN p$ = idepath$ + pathsep$ ELSE p$ = getfilepath$(sourcefile$)
+ ELSE
+ p$ = getfilepath$(incname(inclevel))
+ END IF
+ f$ = p$ + a$
+ END IF
+ IF try = 2 THEN f$ = a$
+ IF _FILEEXISTS(f$) THEN
+ qberrorhappened = -3
+ 'We're using the faster LINE INPUT, which requires a BINARY open.
+ OPEN f$ FOR BINARY AS #fh
+ 'And another line below edited
+ qberrorhappened3:
+ IF qberrorhappened = -3 THEN EXIT FOR
+ END IF
+ qberrorhappened = 0
+ NEXT
+ IF qberrorhappened <> -3 THEN qberrorhappened = 0: a$ = "File " + a$ + " not found": GOTO errmes
+ inclevel = inclevel + 1: incname$(inclevel) = f$: inclinenumber(inclevel) = 0
+ END IF 'fall through to next section...
+ '--------------------
+ DO WHILE inclevel
+
+ fh = 99 + inclevel
+ '2. Feed next line
+ IF EOF(fh) = 0 THEN
+ LINE INPUT #fh, x$
+ wholeline$ = x$
+ inclinenumber(inclevel) = inclinenumber(inclevel) + 1
+ 'create extended error string 'incerror$'
+ e$ = " in line " + str2(inclinenumber(inclevel)) + " of " + incname$(inclevel) + " included"
+ IF inclevel > 1 THEN
+ e$ = e$ + " (through "
+ FOR x = 1 TO inclevel - 1 STEP 1
+ e$ = e$ + incname$(x)
+ IF x < inclevel - 1 THEN 'a sep is req
+ IF x = inclevel - 2 THEN
+ e$ = e$ + " then "
+ ELSE
+ e$ = e$ + ", "
+ END IF
+ END IF
+ NEXT
+ e$ = e$ + ")"
+ END IF
+ incerror$ = e$
+ linenumber = linenumber - 1 'lower official linenumber to counter later increment
+
+ IF Debug THEN PRINT #9, "Pre-pass:Feeding INCLUDE$ line:[" + wholeline$ + "]"
+ IF idemode THEN sendc$ = CHR$(10) + wholeline$: GOTO sendcommand 'passback
+ GOTO ideprepass
+ END IF
+ '3. Close & return control
+ CLOSE #fh
+ inclevel = inclevel - 1
+ LOOP
+ '(end manager)
+
+
+
+ IF idemode THEN GOTO ideret2
LOOP
IF definingtype THEN definingtype = 0 'ignore this error so that auto-formatting can be performed and catch it again later
IF declaringlibrary THEN declaringlibrary = 0 'ignore this error so that auto-formatting can be performed and catch it again later
@@ -2504,3800 +2655,3854 @@ IF UseGL THEN gl_include_content
IF idemode THEN GOTO ideret3
DO
-ide4:
-includeline:
-prepass = 0
-
-stringprocessinghappened = 0
-
-IF continuelinefrom THEN
-start = continuelinefrom
-continuelinefrom = 0
-GOTO contline
-END IF
-
-'begin a new line
-
-impliedendif = 0
-THENGOTO = 0
-continueline = 0
-endifs = 0
-lineelseused = 0
-newif = 0
-
-'apply metacommands from previous line
-IF addmetadynamic = 1 THEN addmetadynamic = 0: DynamicMode = 1
-IF addmetastatic = 1 THEN addmetastatic = 0: DynamicMode = 0
-
-'a3$ is passed in idemode and when using $include
-IF idemode = 0 AND inclevel = 0 THEN a3$ = lineinput3$
-IF a3$ = CHR$(13) THEN EXIT DO
-linenumber = linenumber + 1
-
-layout = ""
-layoutok = 1
-
-IF idemode = 0 THEN
-IF LEN(a3$) THEN
-dotlinecount = dotlinecount + 1: IF dotlinecount >= 100 THEN dotlinecount = 0: PRINT ".";
-END IF
-END IF
-
-a3$ = LTRIM$(RTRIM$(a3$))
-wholeline = a3$
-
-layoutoriginal$ = a3$
-layoutcomment$ = "" 'clear any previous layout comment
-lhscontrollevel = controllevel
-
-linefragment = "[INFORMATION UNAVAILABLE]"
-IF LEN(a3$) = 0 THEN GOTO finishednonexec
-IF Debug THEN PRINT #9, "########" + a3$ + "########"
-
-layoutdone = 1 'validates layout of any following goto finishednonexec/finishedline
-
-'QB64 Metacommands
-IF ASC(a3$) = 36 THEN '$
-
-a3u$ = UCASE$(a3$)
-
-IF a3u$ = "$CHECKING:OFF" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-layout$ = "$CHECKING:OFF"
-NoChecks = 1
-GOTO finishednonexec
-END IF
-
-IF a3u$ = "$CHECKING:ON" THEN
-layout$ = "$CHECKING:ON"
-NoChecks = 0
-GOTO finishednonexec
-END IF
-
-IF a3u$ = "$CONSOLE" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-layout$ = "$CONSOLE"
-Console = 1
-GOTO finishednonexec
-END IF
-
-IF a3u$ = "$CONSOLE:ONLY" THEN
-layout$ = "$CONSOLE:ONLY"
-DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) = DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) OR 1
-Console = 1
-GOTO finishednonexec
-END IF
-
-IF a3u$ = "$SCREENHIDE" THEN
-layout$ = "$SCREENHIDE"
-ScreenHide = 1
-GOTO finishednonexec
-END IF
-IF a3u$ = "$SCREENSHOW" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-layout$ = "$SCREENSHOW"
-ScreenHide = 0
-GOTO finishednonexec
-END IF
-
-IF a3u$ = "$RESIZE:OFF" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-layout$ = "$RESIZE:OFF"
-Resize = 0: Resize_Scale = 0
-GOTO finishednonexec
-END IF
-IF a3u$ = "$RESIZE:ON" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-layout$ = "$RESIZE:ON"
-Resize = 1: Resize_Scale = 0
-GOTO finishednonexec
-END IF
-
-IF a3u$ = "$RESIZE:STRETCH" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-layout$ = "$RESIZE:STRETCH"
-Resize = 1: Resize_Scale = 1
-GOTO finishednonexec
-END IF
-IF a3u$ = "$RESIZE:SMOOTH" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-layout$ = "$RESIZE:SMOOTH"
-Resize = 1: Resize_Scale = 2
-GOTO finishednonexec
-END IF
-
-
-
-END IF 'QB64 Metacommands
-
-linedataoffset = DataOffset
-
-entireline$ = lineformat(a3$): IF LEN(entireline$) = 0 THEN GOTO finishednonexec
-IF Error_Happened THEN GOTO errmes
-u$ = UCASE$(entireline$)
-
-newif = 0
-
-'Convert "CASE ELSE" to "CASE C-EL" to avoid confusing compiler
-'note: CASE does not have to begin on a new line
-s = 1
-i = INSTR(s, u$, "CASE" + sp + "ELSE")
-DO WHILE i
-skip = 0
-IF i <> 1 THEN
-IF MID$(u$, i - 1, 1) <> sp THEN skip = 1
-END IF
-IF i <> LEN(u$) - 8 THEN
-IF MID$(u$, i + 9, 1) <> sp THEN skip = 1
-END IF
-IF skip = 0 THEN
-MID$(entireline$, i) = "CASE" + sp + "C-EL"
-u$ = UCASE$(entireline$)
-END IF
-s = i + 9
-i = INSTR(s, u$, "CASE" + sp + "ELSE")
-LOOP
-
-n = numelements(entireline$)
-
-'line number?
-a = ASC(entireline$)
-IF (a >= 48 AND a <= 57) OR a = 46 THEN 'numeric
-label$ = getelement(entireline$, 1)
-IF validlabel(label$) THEN
-
-v = HashFind(label$, HASHFLAG_LABEL, ignore, r)
-addlabchk100:
-IF v THEN
-s = Labels(r).Scope
-IF s = subfuncn OR s = -1 THEN 'same scope?
-IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
-IF Labels(r).State = 1 THEN a$ = "Duplicate label": GOTO errmes
-'aquire state 0 types
-tlayout$ = RTRIM$(Labels(r).cn)
-GOTO addlabaq100
-END IF 'same scope
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO addlabchk100
-END IF
-
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd label$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).cn = tlayout$
-Labels(r).Scope = subfuncn
-addlabaq100:
-Labels(r).State = 1
-Labels(r).Data_Offset = linedataoffset
-
-layout$ = tlayout$
-PRINT #12, "LABEL_" + label$ + ":;"
-
-
-IF INSTR(label$, "p") THEN MID$(label$, INSTR(label$, "p"), 1) = "."
-IF RIGHT$(label$, 1) = "d" OR RIGHT$(label$, 1) = "s" THEN label$ = LEFT$(label$, LEN(label$) - 1)
-PRINT #12, "last_line=" + label$ + ";"
-IF NoChecks = 0 THEN
-PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");r=0;}"
-END IF
-IF n = 1 THEN GOTO finishednonexec
-entireline$ = getelements(entireline$, 2, n): u$ = UCASE$(entireline$): n = n - 1
-'note: fall through, numeric labels can be followed by alphanumeric label
-END IF 'validlabel
-END IF 'numeric
-'it wasn't a line number
-
-'label?
-'note: ignores possibility that this could be a single command SUB/FUNCTION (as in QBASIC?)
-IF n >= 2 THEN
-x2 = INSTR(entireline$, sp + ":")
-IF x2 THEN
-IF x2 = LEN(entireline$) - 1 THEN x3 = x2 + 1 ELSE x3 = x2 + 2
-a$ = LEFT$(entireline$, x2 - 1)
-
-CreatingLabel = 1
-IF validlabel(a$) THEN
-
-IF validname(a$) = 0 THEN a$ = "Invalid name": GOTO errmes
-
-v = HashFind(a$, HASHFLAG_LABEL, ignore, r)
-addlabchk:
-IF v THEN
-s = Labels(r).Scope
-IF s = subfuncn OR s = -1 THEN 'same scope?
-IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
-IF Labels(r).State = 1 THEN a$ = "Duplicate label": GOTO errmes
-'aquire state 0 types
-tlayout$ = RTRIM$(Labels(r).cn)
-GOTO addlabaq
-END IF 'same scope
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO addlabchk
-END IF
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd a$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).cn = tlayout$
-Labels(r).Scope = subfuncn
-addlabaq:
-Labels(r).State = 1
-Labels(r).Data_Offset = linedataoffset
-
-
-IF LEN(layout$) THEN layout$ = layout$ + sp + tlayout$ + ":" ELSE layout$ = tlayout$ + ":"
-
-PRINT #12, "LABEL_" + a$ + ":;"
-IF NoChecks = 0 THEN
-PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");r=0;}"
-END IF
-entireline$ = RIGHT$(entireline$, LEN(entireline$) - x3): u$ = UCASE$(entireline$)
-n = numelements(entireline$): IF n = 0 THEN GOTO finishednonexec
-END IF 'valid
-END IF 'includes sp+":"
-END IF 'n>=2
-
-'remove leading ":"
-DO WHILE ASC(u$) = 58 '":"
-IF LEN(layout$) THEN layout$ = layout$ + sp2 + ":" ELSE layout$ = ":"
-IF LEN(u$) = 1 THEN GOTO finishednonexec
-entireline$ = getelements(entireline$, 2, n): u$ = UCASE$(entireline$): n = n - 1
-LOOP
-
-'ELSE at the beginning of a line
-IF ASC(u$) = 69 THEN '"E"
-
-e1$ = getelement(u$, 1)
-
-IF e1$ = "ELSE" THEN
-a$ = "ELSE"
-IF n > 1 THEN continuelinefrom = 2
-GOTO gotcommand
-END IF
-
-IF e1$ = "ELSEIF" THEN
-IF n < 3 THEN a$ = "Expected ... THEN": GOTO errmes
-IF getelement(u$, n) = "THEN" THEN a$ = entireline$: GOTO gotcommand
-FOR i = 3 TO n - 1
-IF getelement(u$, i) = "THEN" THEN
-a$ = getelements(entireline$, 1, i)
-continuelinefrom = i + 1
-GOTO gotcommand
-END IF
-NEXT
-a$ = "Expected THEN": GOTO errmes
-END IF
-
-END IF '"E"
-
-start = 1
-
-GOTO skipcontinit
-
-contline:
-
-n = numelements(entireline$)
-u$ = UCASE$(entireline$)
-
-skipcontinit:
-
-'jargon:
-'lineelseused - counts how many line ELSEs can POSSIBLY follow
-'endifs - how many C++ endifs "}" need to be added at the end of the line
-'lineelseused - counts the number of indwelling ELSE statements on a line
-'impliedendif - stops autoformat from adding "END IF"
-
-a$ = ""
-
-FOR i = start TO n
-e$ = getelement(u$, i)
-
-
-IF e$ = ":" THEN
-IF i = start THEN
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp2 + ":" ELSE layout$ = ":"
-IF i <> n THEN continuelinefrom = i + 1
-GOTO finishednonexec
-END IF
-IF i <> n THEN continuelinefrom = i
-GOTO gotcommand
-END IF
-
-
-'begin scanning an 'IF' statement
-IF e$ = "IF" AND a$ = "" THEN newif = 1
-
-
-IF e$ = "THEN" OR (e$ = "GOTO" AND newif = 1) THEN
-IF newif = 0 THEN a$ = "THEN without IF": GOTO errmes
-newif = 0
-IF lineelseused > 0 THEN lineelseused = lineelseused - 1
-IF e$ = "GOTO" THEN
-IF i = n THEN a$ = "Expected IF expression GOTO label": GOTO errmes
-i = i - 1
-END IF
-a$ = a$ + sp + e$ '+"THEN"/"GOTO"
-IF i <> n THEN continuelinefrom = i + 1: endifs = endifs + 1
-GOTO gotcommand
-END IF
-
-
-IF e$ = "ELSE" THEN
-
-IF start = i THEN
-IF lineelseused >= 1 THEN
-'note: more than one else used (in a row) on this line, so close first if with an 'END IF' first
-'note: parses 'END IF' then (after continuelinefrom) parses 'ELSE'
-'consider the following: (square brackets make reading easier)
-'eg. if a=1 then [if b=2 then c=2 else d=2] else e=3
-impliedendif = 1: a$ = "END" + sp + "IF"
-endifs = endifs - 1
-continuelinefrom = i
-lineelseused = lineelseused - 1
-GOTO gotcommand
-END IF
-'follow up previously encountered 'ELSE' by applying 'ELSE'
-a$ = "ELSE": continuelinefrom = i + 1
-lineelseused = lineelseused + 1
-GOTO gotcommand
-END IF 'start=i
-
-'apply everything up to (but not including) 'ELSE'
-continuelinefrom = i
-GOTO gotcommand
-END IF '"ELSE"
-
-
-e$ = getelement(entireline$, i): IF a$ = "" THEN a$ = e$ ELSE a$ = a$ + sp + e$
-NEXT
-
-
-'we're reached the end of the line
-IF endifs > 0 THEN
-endifs = endifs - 1
-impliedendif = 1: entireline$ = entireline$ + sp + ":" + sp + "END" + sp + "IF": n = n + 3
-i = i + 1 'skip the ":" (i is now equal to n+2)
-continuelinefrom = i
-GOTO gotcommand
-END IF
-
-
-gotcommand:
-
-dynscope = 0
-
-ca$ = a$
-a$ = eleucase$(ca$) '***REVISE THIS SECTION LATER***
-
-
-layoutdone = 0
-
-linefragment = a$
-IF Debug THEN PRINT #9, a$
-n = numelements(a$)
-IF n = 0 THEN GOTO finishednonexec
-
-'convert non-UDT dimensioned periods to _046_
-IF INSTR(ca$, sp + "." + sp) THEN
-a3$ = getelement(ca$, 1)
-except = 0
-aa$ = a3$ + sp 'rebuilt a$ (always has a trailing spacer)
-lastfuse = -1
-FOR x = 2 TO n
-a2$ = getelement(ca$, x)
-IF except = 1 THEN except = 2: GOTO udtperiod 'skip element name
-IF a2$ = "." AND x <> n THEN
-IF except = 2 THEN except = 1: GOTO udtperiod 'sub-element of UDT
-
-IF a3$ = ")" THEN
-'assume it was something like typevar(???).x and treat as a UDT
-except = 1
-GOTO udtperiod
-END IF
-
-'find an ID of that type
-try = findid(UCASE$(a3$))
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF ((id.t AND ISUDT) <> 0) OR ((id.arraytype AND ISUDT) <> 0) THEN
-except = 1
-GOTO udtperiod
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(UCASE$(a3$)) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-'not a udt; fuse lhs & rhs with _046_
-IF isalpha(ASC(a3$)) = 0 AND lastfuse <> x - 2 THEN a$ = "Invalid '.'": GOTO errmes
-aa$ = LEFT$(aa$, LEN(aa$) - 1) + fix046$
-lastfuse = x
-GOTO periodfused
-END IF '"."
-except = 0
-udtperiod:
-aa$ = aa$ + a2$ + sp
-periodfused:
-a3$ = a2$
-NEXT
-a$ = LEFT$(aa$, LEN(aa$) - 1)
-ca$ = a$
-a$ = eleucase$(ca$)
-n = numelements(a$)
-END IF
-
-arrayprocessinghappened = 0
-
-firstelement$ = getelement(a$, 1)
-secondelement$ = getelement(a$, 2)
-thirdelement$ = getelement(a$, 3)
-
-'non-executable section
-
-IF n = 1 THEN
-IF firstelement$ = "'" THEN layoutdone = 1: GOTO finishednonexec 'nop
-END IF
-
-IF n <= 2 THEN
-IF firstelement$ = "DATA" THEN
-l$ = firstelement$
-IF n = 2 THEN
-
-e$ = SPACE$((LEN(secondelement$) - 1) \ 2)
-FOR x = 1 TO LEN(e$)
-v1 = ASC(secondelement$, x * 2)
-v2 = ASC(secondelement$, x * 2 + 1)
-IF v1 < 65 THEN v1 = v1 - 48 ELSE v1 = v1 - 55
-IF v2 < 65 THEN v2 = v2 - 48 ELSE v2 = v2 - 55
-ASC(e$, x) = v1 + v2 * 16
-NEXT
-l$ = l$ + sp + e$
-END IF 'n=2
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-
-GOTO finishednonexec
-END IF
-END IF
-
-
-
-'declare library
-IF declaringlibrary THEN
-
-IF firstelement$ = "END" THEN
-IF n <> 2 OR secondelement$ <> "DECLARE" THEN a$ = "Expected END DECLARE": GOTO errmes
-declaringlibrary = 0
-l$ = "END" + sp + "DECLARE"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec
-END IF 'end declare
-
-declaringlibrary = 2
-
-IF firstelement$ = "SUB" OR firstelement$ = "FUNCTION" THEN
-GOTO declaresubfunc2
-END IF
-
-a$ = "Expected SUB/FUNCTION definition or END DECLARE": GOTO errmes
-END IF 'declaringlibrary
-
-'check TYPE declarations (created on prepass)
-IF definingtype THEN
-
-IF firstelement$ = "END" THEN
-IF n <> 2 OR secondelement$ <> "TYPE" THEN a$ = "Expected END TYPE": GOTO errmes
-definingtype = 0
-l$ = "END" + sp + "TYPE"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec
-END IF
-
-IF n < 3 OR secondelement$ <> "AS" THEN a$ = "Expected element-name AS type-name": GOTO errmes
-definingtype = 2
-l$ = getelement(ca$, 1) + sp + "AS"
-t$ = getelements$(a$, 3, n)
-typ = typname2typ(t$)
-IF Error_Happened THEN GOTO errmes
-IF typ = 0 THEN a$ = "Undefined type": GOTO errmes
-IF typ AND ISUDT THEN
-t$ = RTRIM$(udtxcname(typ AND 511))
-END IF
-l$ = l$ + sp + t$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec
+ ide4:
+ includeline:
+ prepass = 0
+
+ stringprocessinghappened = 0
+
+ IF continuelinefrom THEN
+ start = continuelinefrom
+ continuelinefrom = 0
+ GOTO contline
+ END IF
+
+ 'begin a new line
+
+ impliedendif = 0
+ THENGOTO = 0
+ continueline = 0
+ endifs = 0
+ lineelseused = 0
+ newif = 0
+
+ 'apply metacommands from previous line
+ IF addmetadynamic = 1 THEN addmetadynamic = 0: DynamicMode = 1
+ IF addmetastatic = 1 THEN addmetastatic = 0: DynamicMode = 0
+
+ 'a3$ is passed in idemode and when using $include
+ IF idemode = 0 AND inclevel = 0 THEN a3$ = lineinput3$
+ IF a3$ = CHR$(13) THEN EXIT DO
+ 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 = ""
+ layoutok = 1
+
+ IF idemode = 0 THEN
+ IF LEN(a3$) THEN
+ dotlinecount = dotlinecount + 1: IF dotlinecount >= 100 THEN dotlinecount = 0: PRINT ".";
+ END IF
+ END IF
+
+ a3$ = LTRIM$(RTRIM$(a3$))
+ wholeline = a3$
+
+ layoutoriginal$ = a3$
+ layoutcomment$ = "" 'clear any previous layout comment
+ lhscontrollevel = controllevel
+
+ linefragment = "[INFORMATION UNAVAILABLE]"
+ IF LEN(a3$) = 0 THEN GOTO finishednonexec
+ IF Debug THEN PRINT #9, "########" + a3$ + "########"
+
+ 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
+ IF ASC(a3$) = 36 THEN '$
+
+ a3u$ = UCASE$(a3$)
+
+ IF a3u$ = "$CHECKING:OFF" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ layout$ = "$CHECKING:OFF"
+ NoChecks = 1
+ GOTO finishednonexec
+ END IF
+
+ IF a3u$ = "$CHECKING:ON" THEN
+ layout$ = "$CHECKING:ON"
+ NoChecks = 0
+ GOTO finishednonexec
+ END IF
+
+ IF a3u$ = "$CONSOLE" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ layout$ = "$CONSOLE"
+ Console = 1
+ GOTO finishednonexec
+ END IF
+
+ IF a3u$ = "$CONSOLE:ONLY" THEN
+ layout$ = "$CONSOLE:ONLY"
+ DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) = DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) OR 1
+ Console = 1
+ GOTO finishednonexec
+ END IF
+
+ IF a3u$ = "$SCREENHIDE" THEN
+ layout$ = "$SCREENHIDE"
+ ScreenHide = 1
+ GOTO finishednonexec
+ END IF
+ IF a3u$ = "$SCREENSHOW" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ layout$ = "$SCREENSHOW"
+ ScreenHide = 0
+ GOTO finishednonexec
+ END IF
+
+ IF a3u$ = "$RESIZE:OFF" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ layout$ = "$RESIZE:OFF"
+ Resize = 0: Resize_Scale = 0
+ GOTO finishednonexec
+ END IF
+ IF a3u$ = "$RESIZE:ON" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ layout$ = "$RESIZE:ON"
+ Resize = 1: Resize_Scale = 0
+ GOTO finishednonexec
+ END IF
+
+ IF a3u$ = "$RESIZE:STRETCH" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ layout$ = "$RESIZE:STRETCH"
+ Resize = 1: Resize_Scale = 1
+ GOTO finishednonexec
+ END IF
+ IF a3u$ = "$RESIZE:SMOOTH" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ layout$ = "$RESIZE:SMOOTH"
+ Resize = 1: Resize_Scale = 2
+ GOTO finishednonexec
+ 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
+
+
+
+ linedataoffset = DataOffset
+
+ entireline$ = lineformat(a3$): IF LEN(entireline$) = 0 THEN GOTO finishednonexec
+ IF Error_Happened THEN GOTO errmes
+ u$ = UCASE$(entireline$)
+
+ newif = 0
+
+ 'Convert "CASE ELSE" to "CASE C-EL" to avoid confusing compiler
+ 'note: CASE does not have to begin on a new line
+ s = 1
+ i = INSTR(s, u$, "CASE" + sp + "ELSE")
+ DO WHILE i
+ skip = 0
+ IF i <> 1 THEN
+ IF MID$(u$, i - 1, 1) <> sp THEN skip = 1
+ END IF
+ IF i <> LEN(u$) - 8 THEN
+ IF MID$(u$, i + 9, 1) <> sp THEN skip = 1
+ END IF
+ IF skip = 0 THEN
+ MID$(entireline$, i) = "CASE" + sp + "C-EL"
+ u$ = UCASE$(entireline$)
+ END IF
+ s = i + 9
+ i = INSTR(s, u$, "CASE" + sp + "ELSE")
+ LOOP
+
+ n = numelements(entireline$)
+
+ 'line number?
+ a = ASC(entireline$)
+ IF (a >= 48 AND a <= 57) OR a = 46 THEN 'numeric
+ label$ = getelement(entireline$, 1)
+ IF validlabel(label$) THEN
+
+ v = HashFind(label$, HASHFLAG_LABEL, ignore, r)
+ addlabchk100:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = subfuncn OR s = -1 THEN 'same scope?
+ IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
+ IF Labels(r).State = 1 THEN a$ = "Duplicate label": GOTO errmes
+ 'aquire state 0 types
+ tlayout$ = RTRIM$(Labels(r).cn)
+ GOTO addlabaq100
+ END IF 'same scope
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO addlabchk100
+ END IF
+
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd label$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = subfuncn
+ addlabaq100:
+ Labels(r).State = 1
+ Labels(r).Data_Offset = linedataoffset
+
+ layout$ = tlayout$
+ PRINT #12, "LABEL_" + label$ + ":;"
+
+
+ IF INSTR(label$, "p") THEN MID$(label$, INSTR(label$, "p"), 1) = "."
+ IF RIGHT$(label$, 1) = "d" OR RIGHT$(label$, 1) = "s" THEN label$ = LEFT$(label$, LEN(label$) - 1)
+ PRINT #12, "last_line=" + label$ + ";"
+ IF NoChecks = 0 THEN
+ PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");r=0;}"
+ END IF
+ IF n = 1 THEN GOTO finishednonexec
+ entireline$ = getelements(entireline$, 2, n): u$ = UCASE$(entireline$): n = n - 1
+ 'note: fall through, numeric labels can be followed by alphanumeric label
+ END IF 'validlabel
+ END IF 'numeric
+ 'it wasn't a line number
+
+ 'label?
+ 'note: ignores possibility that this could be a single command SUB/FUNCTION (as in QBASIC?)
+ IF n >= 2 THEN
+ x2 = INSTR(entireline$, sp + ":")
+ IF x2 THEN
+ IF x2 = LEN(entireline$) - 1 THEN x3 = x2 + 1 ELSE x3 = x2 + 2
+ a$ = LEFT$(entireline$, x2 - 1)
+
+ CreatingLabel = 1
+ IF validlabel(a$) THEN
+
+ IF validname(a$) = 0 THEN a$ = "Invalid name": GOTO errmes
+
+ v = HashFind(a$, HASHFLAG_LABEL, ignore, r)
+ addlabchk:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = subfuncn OR s = -1 THEN 'same scope?
+ IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
+ IF Labels(r).State = 1 THEN a$ = "Duplicate label": GOTO errmes
+ 'aquire state 0 types
+ tlayout$ = RTRIM$(Labels(r).cn)
+ GOTO addlabaq
+ END IF 'same scope
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO addlabchk
+ END IF
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd a$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = subfuncn
+ addlabaq:
+ Labels(r).State = 1
+ Labels(r).Data_Offset = linedataoffset
+
+
+ IF LEN(layout$) THEN layout$ = layout$ + sp + tlayout$ + ":" ELSE layout$ = tlayout$ + ":"
+
+ PRINT #12, "LABEL_" + a$ + ":;"
+ IF NoChecks = 0 THEN
+ PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");r=0;}"
+ END IF
+ entireline$ = RIGHT$(entireline$, LEN(entireline$) - x3): u$ = UCASE$(entireline$)
+ n = numelements(entireline$): IF n = 0 THEN GOTO finishednonexec
+ END IF 'valid
+ END IF 'includes sp+":"
+ END IF 'n>=2
+
+ 'remove leading ":"
+ DO WHILE ASC(u$) = 58 '":"
+ IF LEN(layout$) THEN layout$ = layout$ + sp2 + ":" ELSE layout$ = ":"
+ IF LEN(u$) = 1 THEN GOTO finishednonexec
+ entireline$ = getelements(entireline$, 2, n): u$ = UCASE$(entireline$): n = n - 1
+ LOOP
+
+ 'ELSE at the beginning of a line
+ IF ASC(u$) = 69 THEN '"E"
+
+ e1$ = getelement(u$, 1)
+
+ IF e1$ = "ELSE" THEN
+ a$ = "ELSE"
+ IF n > 1 THEN continuelinefrom = 2
+ GOTO gotcommand
+ END IF
+
+ IF e1$ = "ELSEIF" THEN
+ IF n < 3 THEN a$ = "Expected ... THEN": GOTO errmes
+ IF getelement(u$, n) = "THEN" THEN a$ = entireline$: GOTO gotcommand
+ FOR i = 3 TO n - 1
+ IF getelement(u$, i) = "THEN" THEN
+ a$ = getelements(entireline$, 1, i)
+ continuelinefrom = i + 1
+ GOTO gotcommand
+ END IF
+ NEXT
+ a$ = "Expected THEN": GOTO errmes
+ END IF
+
+ END IF '"E"
+
+ start = 1
+
+ GOTO skipcontinit
+
+ contline:
+
+ n = numelements(entireline$)
+ u$ = UCASE$(entireline$)
+
+ skipcontinit:
+
+ 'jargon:
+ 'lineelseused - counts how many line ELSEs can POSSIBLY follow
+ 'endifs - how many C++ endifs "}" need to be added at the end of the line
+ 'lineelseused - counts the number of indwelling ELSE statements on a line
+ 'impliedendif - stops autoformat from adding "END IF"
+
+ a$ = ""
+
+ FOR i = start TO n
+ e$ = getelement(u$, i)
+
+
+ IF e$ = ":" THEN
+ IF i = start THEN
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp2 + ":" ELSE layout$ = ":"
+ IF i <> n THEN continuelinefrom = i + 1
+ GOTO finishednonexec
+ END IF
+ IF i <> n THEN continuelinefrom = i
+ GOTO gotcommand
+ END IF
+
+
+ 'begin scanning an 'IF' statement
+ IF e$ = "IF" AND a$ = "" THEN newif = 1
+
+
+ IF e$ = "THEN" OR (e$ = "GOTO" AND newif = 1) THEN
+ IF newif = 0 THEN a$ = "THEN without IF": GOTO errmes
+ newif = 0
+ IF lineelseused > 0 THEN lineelseused = lineelseused - 1
+ IF e$ = "GOTO" THEN
+ IF i = n THEN a$ = "Expected IF expression GOTO label": GOTO errmes
+ i = i - 1
+ END IF
+ a$ = a$ + sp + e$ '+"THEN"/"GOTO"
+ IF i <> n THEN continuelinefrom = i + 1: endifs = endifs + 1
+ GOTO gotcommand
+ END IF
+
+
+ IF e$ = "ELSE" THEN
+
+ IF start = i THEN
+ IF lineelseused >= 1 THEN
+ 'note: more than one else used (in a row) on this line, so close first if with an 'END IF' first
+ 'note: parses 'END IF' then (after continuelinefrom) parses 'ELSE'
+ 'consider the following: (square brackets make reading easier)
+ 'eg. if a=1 then [if b=2 then c=2 else d=2] else e=3
+ impliedendif = 1: a$ = "END" + sp + "IF"
+ endifs = endifs - 1
+ continuelinefrom = i
+ lineelseused = lineelseused - 1
+ GOTO gotcommand
+ END IF
+ 'follow up previously encountered 'ELSE' by applying 'ELSE'
+ a$ = "ELSE": continuelinefrom = i + 1
+ lineelseused = lineelseused + 1
+ GOTO gotcommand
+ END IF 'start=i
+
+ 'apply everything up to (but not including) 'ELSE'
+ continuelinefrom = i
+ GOTO gotcommand
+ END IF '"ELSE"
+
+
+ e$ = getelement(entireline$, i): IF a$ = "" THEN a$ = e$ ELSE a$ = a$ + sp + e$
+ NEXT
+
+
+ 'we're reached the end of the line
+ IF endifs > 0 THEN
+ endifs = endifs - 1
+ impliedendif = 1: entireline$ = entireline$ + sp + ":" + sp + "END" + sp + "IF": n = n + 3
+ i = i + 1 'skip the ":" (i is now equal to n+2)
+ continuelinefrom = i
+ GOTO gotcommand
+ END IF
+
+
+ gotcommand:
+
+ dynscope = 0
+
+ ca$ = a$
+ a$ = eleucase$(ca$) '***REVISE THIS SECTION LATER***
+
+
+ layoutdone = 0
+
+ linefragment = a$
+ IF Debug THEN PRINT #9, a$
+ n = numelements(a$)
+ IF n = 0 THEN GOTO finishednonexec
+
+ 'convert non-UDT dimensioned periods to _046_
+ IF INSTR(ca$, sp + "." + sp) THEN
+ a3$ = getelement(ca$, 1)
+ except = 0
+ aa$ = a3$ + sp 'rebuilt a$ (always has a trailing spacer)
+ lastfuse = -1
+ FOR x = 2 TO n
+ a2$ = getelement(ca$, x)
+ IF except = 1 THEN except = 2: GOTO udtperiod 'skip element name
+ IF a2$ = "." AND x <> n THEN
+ IF except = 2 THEN except = 1: GOTO udtperiod 'sub-element of UDT
+
+ IF a3$ = ")" THEN
+ 'assume it was something like typevar(???).x and treat as a UDT
+ except = 1
+ GOTO udtperiod
+ END IF
+
+ 'find an ID of that type
+ try = findid(UCASE$(a3$))
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF ((id.t AND ISUDT) <> 0) OR ((id.arraytype AND ISUDT) <> 0) THEN
+ except = 1
+ GOTO udtperiod
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(UCASE$(a3$)) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ 'not a udt; fuse lhs & rhs with _046_
+ IF isalpha(ASC(a3$)) = 0 AND lastfuse <> x - 2 THEN a$ = "Invalid '.'": GOTO errmes
+ aa$ = LEFT$(aa$, LEN(aa$) - 1) + fix046$
+ lastfuse = x
+ GOTO periodfused
+ END IF '"."
+ except = 0
+ udtperiod:
+ aa$ = aa$ + a2$ + sp
+ periodfused:
+ a3$ = a2$
+ NEXT
+ a$ = LEFT$(aa$, LEN(aa$) - 1)
+ ca$ = a$
+ a$ = eleucase$(ca$)
+ n = numelements(a$)
+ END IF
+
+ arrayprocessinghappened = 0
+
+ firstelement$ = getelement(a$, 1)
+ secondelement$ = getelement(a$, 2)
+ thirdelement$ = getelement(a$, 3)
+
+ 'non-executable section
+
+ IF n = 1 THEN
+ IF firstelement$ = "'" THEN layoutdone = 1: GOTO finishednonexec 'nop
+ END IF
+
+ IF n <= 2 THEN
+ IF firstelement$ = "DATA" THEN
+ l$ = firstelement$
+ IF n = 2 THEN
+
+ e$ = SPACE$((LEN(secondelement$) - 1) \ 2)
+ FOR x = 1 TO LEN(e$)
+ v1 = ASC(secondelement$, x * 2)
+ v2 = ASC(secondelement$, x * 2 + 1)
+ IF v1 < 65 THEN v1 = v1 - 48 ELSE v1 = v1 - 55
+ IF v2 < 65 THEN v2 = v2 - 48 ELSE v2 = v2 - 55
+ ASC(e$, x) = v1 + v2 * 16
+ NEXT
+ l$ = l$ + sp + e$
+ END IF 'n=2
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+
+ GOTO finishednonexec
+ END IF
+ END IF
+
+
+
+ 'declare library
+ IF declaringlibrary THEN
+
+ IF firstelement$ = "END" THEN
+ IF n <> 2 OR secondelement$ <> "DECLARE" THEN a$ = "Expected END DECLARE": GOTO errmes
+ declaringlibrary = 0
+ l$ = "END" + sp + "DECLARE"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec
+ END IF 'end declare
+
+ declaringlibrary = 2
+
+ IF firstelement$ = "SUB" OR firstelement$ = "FUNCTION" THEN
+ GOTO declaresubfunc2
+ END IF
+
+ a$ = "Expected SUB/FUNCTION definition or END DECLARE": GOTO errmes
+ END IF 'declaringlibrary
+
+ 'check TYPE declarations (created on prepass)
+ IF definingtype THEN
+
+ IF firstelement$ = "END" THEN
+ IF n <> 2 OR secondelement$ <> "TYPE" THEN a$ = "Expected END TYPE": GOTO errmes
+ definingtype = 0
+ l$ = "END" + sp + "TYPE"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec
+ END IF
+
+ IF n < 3 OR secondelement$ <> "AS" THEN a$ = "Expected element-name AS type-name": GOTO errmes
+ definingtype = 2
+ l$ = getelement(ca$, 1) + sp + "AS"
+ t$ = getelements$(a$, 3, n)
+ typ = typname2typ(t$)
+ IF Error_Happened THEN GOTO errmes
+ IF typ = 0 THEN a$ = "Undefined type": GOTO errmes
+ IF typ AND ISUDT THEN
+ t$ = RTRIM$(udtxcname(typ AND 511))
+ END IF
+ l$ = l$ + sp + t$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec
-END IF 'defining type
+ END IF 'defining type
-IF firstelement$ = "TYPE" THEN
-IF n <> 2 THEN a$ = "Expected TYPE type-name": GOTO errmes
-l$ = "TYPE" + sp + getelement(ca$, 2)
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-definingtype = 1
-definingtypeerror = linenumber
-GOTO finishednonexec
-END IF
+ IF firstelement$ = "TYPE" THEN
+ IF n <> 2 THEN a$ = "Expected TYPE type-name": GOTO errmes
+ l$ = "TYPE" + sp + getelement(ca$, 2)
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ definingtype = 1
+ definingtypeerror = linenumber
+ GOTO finishednonexec
+ END IF
-'skip DECLARE SUB/FUNCTION
-IF n >= 1 THEN
-IF firstelement$ = "DECLARE" THEN
+ 'skip DECLARE SUB/FUNCTION
+ IF n >= 1 THEN
+ IF firstelement$ = "DECLARE" THEN
-IF secondelement$ = "LIBRARY" OR secondelement$ = "DYNAMIC" OR secondelement$ = "CUSTOMTYPE" OR secondelement$ = "STATIC" THEN
+ IF secondelement$ = "LIBRARY" OR secondelement$ = "DYNAMIC" OR secondelement$ = "CUSTOMTYPE" OR secondelement$ = "STATIC" THEN
-declaringlibrary = 1
-dynamiclibrary = 0
-customtypelibrary = 0
-indirectlibrary = 0
-staticlinkedlibrary = 0
+ declaringlibrary = 1
+ dynamiclibrary = 0
+ customtypelibrary = 0
+ indirectlibrary = 0
+ staticlinkedlibrary = 0
-x = 3
-l$ = "DECLARE" + sp + "LIBRARY"
+ x = 3
+ l$ = "DECLARE" + sp + "LIBRARY"
-IF secondelement$ = "DYNAMIC" THEN
-e$ = getelement$(a$, 3): IF e$ <> "LIBRARY" THEN a$ = "Expected DYNAMIC LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
-dynamiclibrary = 1
-x = 4
-l$ = "DECLARE" + sp + "DYNAMIC" + sp + "LIBRARY"
-IF n = 3 THEN a$ = "Expected DECLARE DYNAMIC LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
-indirectlibrary = 1
-END IF
-
-IF secondelement$ = "CUSTOMTYPE" THEN
-e$ = getelement$(a$, 3): IF e$ <> "LIBRARY" THEN a$ = "Expected CUSTOMTYPE LIBRARY": GOTO errmes
-customtypelibrary = 1
-x = 4
-l$ = "DECLARE" + sp + "CUSTOMTYPE" + sp + "LIBRARY"
-indirectlibrary = 1
-END IF
-
-IF secondelement$ = "STATIC" THEN
-e$ = getelement$(a$, 3): IF e$ <> "LIBRARY" THEN a$ = "Expected STATIC LIBRARY": GOTO errmes
-x = 4
-l$ = "DECLARE" + sp + "STATIC" + sp + "LIBRARY"
-staticlinkedlibrary = 1
-END IF
-
-sfdeclare = 0: sfheader = 0
-
-IF n >= x THEN
-
-sfdeclare = 1
-
-addlibrary:
-
-libname$ = ""
-headername$ = ""
-
-
-'assume library name in double quotes follows
-'assume library is in main qb64 folder
-x$ = getelement$(ca$, x)
-IF ASC(x$) <> 34 THEN a$ = "Expected LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
-x$ = RIGHT$(x$, LEN(x$) - 1)
-z = INSTR(x$, CHR$(34))
-IF z = 0 THEN a$ = "Expected LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
-x$ = LEFT$(x$, z - 1)
-
-IF dynamiclibrary <> 0 AND LEN(x$) = 0 THEN a$ = "Expected DECLARE DYNAMIC LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
-IF customtypelibrary <> 0 AND LEN(x$) = 0 THEN a$ = "Expected DECLARE CUSTOMTYPE LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
-
-
-
-
-
-
-
-
-
-
-
-
-
-'convert '\\' to '\'
-WHILE INSTR(x$, "\\")
-z = INSTR(x$, "\\")
-x$ = LEFT$(x$, z - 1) + RIGHT$(x$, LEN(x$) - z)
-WEND
-
-autoformat_x$ = x$ 'used for autolayout purposes
-
-'Remove version number from library name
-'Eg. libname:1.0 becomes libname <-> 1.0 which later becomes libname.so.1.0
-v$ = ""
-striplibver:
-FOR z = LEN(x$) TO 1 STEP -1
-a = ASC(x$, z)
-IF a = ASC_BACKSLASH OR a = ASC_FORWARDSLASH THEN EXIT FOR
-IF a = ASC_FULLSTOP OR a = ASC_COLON THEN
-IF isuinteger(RIGHT$(x$, LEN(x$) - z)) THEN
-IF LEN(v$) THEN v$ = RIGHT$(x$, LEN(x$) - z) + "." + v$ ELSE v$ = RIGHT$(x$, LEN(x$) - z)
-x$ = LEFT$(x$, z - 1)
-IF a = ASC_COLON THEN EXIT FOR
-GOTO striplibver
-ELSE
-EXIT FOR
-END IF
-END IF
-NEXT
-libver$ = v$
-
-
-IF os$ = "WIN" THEN
-'convert forward-slashes to back-slashes
-DO WHILE INSTR(x$, "/")
-z = INSTR(x$, "/")
-x$ = LEFT$(x$, z - 1) + "\" + RIGHT$(x$, LEN(x$) - z)
-LOOP
-END IF
-
-IF os$ = "LNX" THEN
-'convert any back-slashes to forward-slashes
-DO WHILE INSTR(x$, "\")
-z = INSTR(x$, "\")
-x$ = LEFT$(x$, z - 1) + "/" + RIGHT$(x$, LEN(x$) - z)
-LOOP
-END IF
-
-'Seperate path from name
-libpath$ = ""
-FOR z = LEN(x$) TO 1 STEP -1
-a = ASC(x$, z)
-IF a = 47 OR a = 92 THEN '\ or /
-libpath$ = LEFT$(x$, z)
-x$ = RIGHT$(x$, LEN(x$) - z)
-EXIT FOR
-END IF
-NEXT
-
-'Create a path which can be used for inline code (uses \\ instead of \)
-libpath_inline$ = ""
-FOR z = 1 TO LEN(libpath$)
-a = ASC(libpath$, z)
-libpath_inline$ = libpath_inline$ + CHR$(a)
-IF a = 92 THEN libpath_inline$ = libpath_inline$ + "\"
-NEXT
-
-IF LEN(x$) THEN
-IF dynamiclibrary = 0 THEN
-'Static library
-
-IF os$ = "WIN" THEN
-'check for .lib
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + x$ + ".lib") THEN
-libname$ = libpath$ + x$ + ".lib"
-inlinelibname$ = libpath_inline$ + x$ + ".lib"
-END IF
-END IF
-'check for .a
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + x$ + ".a") THEN
-libname$ = libpath$ + x$ + ".a"
-inlinelibname$ = libpath_inline$ + x$ + ".a"
-END IF
-END IF
-'check for .o
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + x$ + ".o") THEN
-libname$ = libpath$ + x$ + ".o"
-inlinelibname$ = libpath_inline$ + x$ + ".o"
-END IF
-END IF
-'check for .lib
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(x$ + ".lib") THEN
-libname$ = x$ + ".lib"
-inlinelibname$ = x$ + ".lib"
-END IF
-END IF
-'check for .a
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(x$ + ".a") THEN
-libname$ = x$ + ".a"
-inlinelibname$ = x$ + ".a"
-END IF
-END IF
-'check for .o
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(x$ + ".o") THEN
-libname$ = x$ + ".o"
-inlinelibname$ = x$ + ".o"
-END IF
-END IF
-END IF 'Windows
-
-IF os$ = "LNX" THEN
-IF staticlinkedlibrary = 0 THEN
-
-IF MacOSX THEN 'dylib support
-'check for .dylib (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".dylib") THEN
-libname$ = libpath$ + "lib" + x$ + ".dylib"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".dylib"
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-END IF
-
-'check for .so (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so." + libver$) THEN
-libname$ = libpath$ + "lib" + x$ + ".so." + libver$
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so." + libver$
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so") THEN
-libname$ = libpath$ + "lib" + x$ + ".so"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so"
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-END IF
-'check for .a (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".a") THEN
-libname$ = libpath$ + "lib" + x$ + ".a"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".a"
-END IF
-END IF
-'check for .o (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".o") THEN
-libname$ = libpath$ + "lib" + x$ + ".o"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".o"
-END IF
-END IF
-IF staticlinkedlibrary = 0 THEN
-'check for .so (usr/lib64)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so"
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
-END IF
-END IF
-END IF
-'check for .a (usr/lib64)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".a") THEN
-libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".a"
-inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".a"
-END IF
-END IF
-IF staticlinkedlibrary = 0 THEN
-
-IF MacOSX THEN 'dylib support
-'check for .dylib (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".dylib") THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".dylib"
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
-END IF
-END IF
-END IF
-
-'check for .so (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so"
-IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
-END IF
-END IF
-END IF
-'check for .a (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".a") THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".a"
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".a"
-END IF
-END IF
-'--------------------------(without path)------------------------------
-IF staticlinkedlibrary = 0 THEN
-
-IF MacOSX THEN 'dylib support
-'check for .dylib (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = "lib" + x$ + "." + libver$ + ".dylib"
-mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".dylib") THEN
-libname$ = "lib" + x$ + ".dylib"
-inlinelibname$ = "lib" + x$ + ".dylib"
-mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-END IF
-
-'check for .so (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".so." + libver$) THEN
-libname$ = "lib" + x$ + ".so." + libver$
-inlinelibname$ = "lib" + x$ + ".so." + libver$
-mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".so") THEN
-libname$ = "lib" + x$ + ".so"
-inlinelibname$ = "lib" + x$ + ".so"
-mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
-END IF
-END IF
-END IF
-'check for .a (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".a") THEN
-libname$ = "lib" + x$ + ".a"
-inlinelibname$ = "lib" + x$ + ".a"
-END IF
-END IF
-'check for .o (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".o") THEN
-libname$ = "lib" + x$ + ".o"
-inlinelibname$ = "lib" + x$ + ".o"
-END IF
-END IF
-IF staticlinkedlibrary = 0 THEN
-'check for .so (usr/lib64)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
-mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib64/" + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so"
-mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
-END IF
-END IF
-END IF
-'check for .a (usr/lib64)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".a") THEN
-libname$ = "/usr/lib64/" + "lib" + x$ + ".a"
-inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".a"
-END IF
-END IF
-IF staticlinkedlibrary = 0 THEN
-
-IF MacOSX THEN 'dylib support
-'check for .dylib (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".dylib") THEN
-libname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
-mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
-END IF
-END IF
-END IF
-
-'check for .so (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib/" + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so"
-mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
-END IF
-END IF
-END IF
-'check for .a (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".a") THEN
-libname$ = "/usr/lib/" + "lib" + x$ + ".a"
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".a"
-mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
-END IF
-END IF
-END IF 'Linux
-
-
-'check for header
-IF LEN(headername$) = 0 THEN
-IF os$ = "WIN" THEN
-IF _FILEEXISTS(libpath$ + x$ + ".h") THEN
-headername$ = libpath_inline$ + x$ + ".h"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS(libpath$ + x$ + ".hpp") THEN
-headername$ = libpath_inline$ + x$ + ".hpp"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-'--------------------------(without path)------------------------------
-IF _FILEEXISTS(x$ + ".h") THEN
-headername$ = x$ + ".h"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS(x$ + ".hpp") THEN
-headername$ = x$ + ".hpp"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-END IF 'Windows
-
-IF os$ = "LNX" THEN
-IF _FILEEXISTS(libpath$ + x$ + ".h") THEN
-headername$ = libpath_inline$ + x$ + ".h"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS(libpath$ + x$ + ".hpp") THEN
-headername$ = libpath_inline$ + x$ + ".hpp"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS("/usr/include/" + libpath$ + x$ + ".h") THEN
-headername$ = "/usr/include/" + libpath_inline$ + x$ + ".h"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS("/usr/include/" + libpath$ + x$ + ".hpp") THEN
-headername$ = "/usr/include/" + libpath_inline$ + x$ + ".hpp"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-'--------------------------(without path)------------------------------
-IF _FILEEXISTS(x$ + ".h") THEN
-headername$ = x$ + ".h"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS(x$ + ".hpp") THEN
-headername$ = x$ + ".hpp"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS("/usr/include/" + x$ + ".h") THEN
-headername$ = "/usr/include/" + x$ + ".h"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-IF _FILEEXISTS("/usr/include/" + x$ + ".hpp") THEN
-headername$ = "/usr/include/" + x$ + ".hpp"
-IF customtypelibrary = 0 THEN sfdeclare = 0
-sfheader = 1
-GOTO GotHeader
-END IF
-END IF 'Linux
-
-GotHeader:
-END IF
-
-ELSE
-'dynamic library
-
-IF os$ = "WIN" THEN
-'check for .dll (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + x$ + ".dll") THEN
-libname$ = libpath$ + x$ + ".dll"
-inlinelibname$ = libpath_inline$ + x$ + ".dll"
-END IF
-END IF
-'check for .dll (system32)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(ENVIRON$("SYSTEMROOT") + "\System32\" + libpath$ + x$ + ".dll") THEN
-libname$ = libpath$ + x$ + ".dll"
-inlinelibname$ = libpath_inline$ + x$ + ".dll"
-END IF
-END IF
-'--------------------------(without path)------------------------------
-'check for .dll (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(x$ + ".dll") THEN
-libname$ = x$ + ".dll"
-inlinelibname$ = x$ + ".dll"
-END IF
-END IF
-'check for .dll (system32)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(ENVIRON$("SYSTEMROOT") + "\System32\" + x$ + ".dll") THEN
-libname$ = x$ + ".dll"
-inlinelibname$ = x$ + ".dll"
-END IF
-END IF
-END IF 'Windows
-
-IF os$ = "LNX" THEN
-'Note: STATIC libraries (.a/.o) cannot be loaded as dynamic objects
-
-
-IF MacOSX THEN 'dylib support
-'check for .dylib (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
-IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".dylib") THEN
-libname$ = libpath$ + "lib" + x$ + ".dylib"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".dylib"
-IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-END IF
-
-'check for .so (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so." + libver$) THEN
-libname$ = libpath$ + "lib" + x$ + ".so." + libver$
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so." + libver$
-IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so") THEN
-libname$ = libpath$ + "lib" + x$ + ".so"
-inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so"
-IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-'check for .so (usr/lib64)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so"
-END IF
-END IF
-
-IF MacOSX THEN 'dylib support
-'check for .dylib (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".dylib") THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".dylib"
-END IF
-END IF
-END IF
-
-'check for .so (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so"
-END IF
-END IF
-'--------------------------(without path)------------------------------
-IF MacOSX THEN 'dylib support
-'check for .dylib (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = "lib" + x$ + "." + libver$ + ".dylib"
-libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".dylib") THEN
-libname$ = "lib" + x$ + ".dylib"
-inlinelibname$ = "lib" + x$ + ".dylib"
-libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-END IF
-
-'check for .so (direct)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".so." + libver$) THEN
-libname$ = "lib" + x$ + ".so." + libver$
-inlinelibname$ = "lib" + x$ + ".so." + libver$
-libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("lib" + x$ + ".so") THEN
-libname$ = "lib" + x$ + ".so"
-inlinelibname$ = "lib" + x$ + ".so"
-libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
-END IF
-END IF
-'check for .so (usr/lib64)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib64/" + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so"
-END IF
-END IF
-
-IF MacOSX THEN 'dylib support
-'check for .dylib (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib") THEN
-libname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".dylib") THEN
-libname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
-END IF
-END IF
-END IF
-
-'check for .so (usr/lib)
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so." + libver$) THEN
-libname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
-END IF
-END IF
-IF LEN(libname$) = 0 THEN
-IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so") THEN
-libname$ = "/usr/lib/" + "lib" + x$ + ".so"
-inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so"
-END IF
-END IF
-END IF 'Linux
-
-END IF 'Dynamic
-
-'library found?
-IF dynamiclibrary <> 0 AND LEN(libname$) = 0 THEN a$ = "DYNAMIC LIBRARY not found": GOTO errmes
-IF LEN(libname$) = 0 AND LEN(headername$) = 0 THEN a$ = "LIBRARY not found": GOTO errmes
-
-'***actual method should cull redundant header and library entries***
-
-IF dynamiclibrary = 0 THEN
-
-'static
-IF LEN(libname$) THEN
-IF os$ = "WIN" THEN
-mylib$ = mylib$ + " ..\..\" + libname$ + " "
-END IF
-IF os$ = "LNX" THEN
-IF LEFT$(libname$, 1) = "/" THEN
-mylib$ = mylib$ + " " + libname$ + " "
-ELSE
-mylib$ = mylib$ + " ../../" + libname$ + " "
-END IF
-END IF
-
-END IF
-
-ELSE
-
-'dynamic
-IF LEN(headername$) = 0 THEN 'no header
-
-IF subfuncn THEN
-f = FREEFILE
-OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #f
-ELSE
-f = 13
-END IF
-
-'make name a C-appropriate variable name
-'by converting everything except numbers and
-'letters to underscores
-x2$ = x$
-FOR x2 = 1 TO LEN(x2$)
-IF ASC(x2$, x2) < 48 THEN ASC(x2$, x2) = 95
-IF ASC(x2$, x2) > 57 AND ASC(x2$, x2) < 65 THEN ASC(x2$, x2) = 95
-IF ASC(x2$, x2) > 90 AND ASC(x2$, x2) < 97 THEN ASC(x2$, x2) = 95
-IF ASC(x2$, x2) > 122 THEN ASC(x2$, x2) = 95
-NEXT
-DLLname$ = x2$
-
-IF sfdeclare THEN
-
-IF os$ = "WIN" THEN
-PRINT #17, "HINSTANCE DLL_" + x2$ + "=NULL;"
-PRINT #f, "if (!DLL_" + x2$ + "){"
-PRINT #f, "DLL_" + x2$ + "=LoadLibrary(" + CHR$(34) + inlinelibname$ + CHR$(34) + ");"
-PRINT #f, "if (!DLL_" + x2$ + ") error(259);"
-PRINT #f, "}"
-END IF
-
-IF os$ = "LNX" THEN
-PRINT #17, "void *DLL_" + x2$ + "=NULL;"
-PRINT #f, "if (!DLL_" + x2$ + "){"
-PRINT #f, "DLL_" + x2$ + "=dlopen(" + CHR$(34) + inlinelibname$ + CHR$(34) + ",RTLD_LAZY);"
-PRINT #f, "if (!DLL_" + x2$ + ") error(259);"
-PRINT #f, "}"
-END IF
-
-
-END IF
-
-IF subfuncn THEN CLOSE #f
-
-END IF 'no header
-
-END IF 'dynamiclibrary
-
-IF LEN(headername$) THEN
-IF os$ = "WIN" THEN
-PRINT #17, "#include " + CHR$(34) + "..\\..\\" + headername$ + CHR$(34)
-END IF
-IF os$ = "LNX" THEN
-
-IF LEFT$(headername$, 1) = "/" THEN
-PRINT #17, "#include " + CHR$(34) + headername$ + CHR$(34)
-ELSE
-PRINT #17, "#include " + CHR$(34) + "../../" + headername$ + CHR$(34)
-END IF
-
-END IF
-END IF
-
-END IF
-
-l$ = l$ + sp + CHR$(34) + autoformat_x$ + CHR$(34)
-
-IF n > x THEN
-IF dynamiclibrary THEN a$ = "Cannot specify multiple DYNAMIC LIBRARY names in a single DECLARE statement": GOTO errmes
-x = x + 1: x2$ = getelement$(a$, x): IF x2$ <> "," THEN a$ = "Expected ,": GOTO errmes
-l$ = l$ + sp2 + ","
-x = x + 1: IF x > n THEN a$ = "Expected , ...": GOTO errmes
-GOTO addlibrary
-END IF
-
-END IF 'n>=x
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec
-END IF
-
-GOTO finishednonexec 'note: no layout required
-END IF
-END IF
-
-'begin SUB/FUNCTION
-IF n >= 1 THEN
-dynamiclibrary = 0
-declaresubfunc2:
-sf = 0
-IF firstelement$ = "FUNCTION" THEN sf = 1
-IF firstelement$ = "SUB" THEN sf = 2
-IF sf THEN
-
-IF declaringlibrary = 0 THEN
-IF LEN(subfunc) THEN a$ = "Expected END SUB/FUNCTION before " + firstelement$: GOTO errmes
-END IF
-
-IF n = 1 THEN a$ = "Expected name after SUB/FUNCTION": GOTO errmes
-e$ = getelement$(ca$, 2)
-symbol$ = removesymbol$(e$) '$,%,etc.
-IF Error_Happened THEN GOTO errmes
-IF sf = 2 AND symbol$ <> "" THEN a$ = "Type symbols after a SUB name are invalid": GOTO errmes
-try = findid(e$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.subfunc = sf THEN GOTO createsf
-IF try = 2 THEN findanotherid = 1: try = findid(e$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-a$ = "Unregistered SUB/FUNCTION encountered": GOTO errmes
-createsf:
-IF UCASE$(e$) = "_GL" THEN e$ = "_GL"
-l$ = firstelement$ + sp + e$ + symbol$
-id2 = id
-targetid = currentid
-
-'check for ALIAS
-aliasname$ = RTRIM$(id.cn)
-IF n > 2 THEN
-ee$ = getelement$(a$, 3)
-IF ee$ = "ALIAS" THEN
-IF declaringlibrary = 0 THEN a$ = "ALIAS can only be used with DECLARE LIBRARY": GOTO errmes
-IF n = 3 THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
-ee$ = getelement$(ca$, 4)
-
-'strip string content (optional)
-IF LEFT$(ee$, 1) = CHR$(34) THEN
-ee$ = RIGHT$(ee$, LEN(ee$) - 1)
-x = INSTR(ee$, CHR$(34)): IF x = 0 THEN a$ = "Expected " + CHR$(34): GOTO errmes
-ee$ = LEFT$(ee$, x - 1)
-l$ = l$ + sp + "ALIAS" + sp + CHR_QUOTE + ee$ + CHR_QUOTE
-ELSE
-l$ = l$ + sp + "ALIAS" + sp + ee$
-END IF
-
-'strip fix046$ (created by unquoted periods)
-DO WHILE INSTR(ee$, fix046$)
-x = INSTR(ee$, fix046$): ee$ = LEFT$(ee$, x - 1) + "." + RIGHT$(ee$, LEN(ee$) - x + 1 - LEN(fix046$))
-LOOP
-aliasname$ = ee$
-'remove ALIAS section from line
-IF n <= 4 THEN a$ = getelements(a$, 1, 2)
-IF n >= 5 THEN a$ = getelements(a$, 1, 2) + sp + getelements(a$, 5, n)
-IF n <= 4 THEN ca$ = getelements(ca$, 1, 2)
-IF n >= 5 THEN ca$ = getelements(ca$, 1, 2) + sp + getelements(ca$, 5, n)
-n = n - 2
-END IF
-END IF
-
-IF declaringlibrary THEN GOTO declibjmp1
-
-
-IF closedmain = 0 THEN closemain
-
-'check for open controls (copy #2)
-IF controllevel THEN
-x = controltype(controllevel)
-IF x = 1 THEN a$ = "IF without END IF"
-IF x = 2 THEN a$ = "FOR without NEXT"
-IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
-IF x = 5 THEN a$ = "WHILE without WEND"
-IF (x >= 10 AND x <= 17) OR x = 18 OR x = 19 THEN a$ = "SELECT CASE without END SELECT"
-linenumber = controlref(controllevel)
-GOTO errmes
-END IF
-
-subfunc = RTRIM$(id.callname) 'SUB_..."
-subfuncn = subfuncn + 1
-subfuncid = targetid
-
-subfuncret$ = ""
-
-CLOSE #13: OPEN tmpdir$ + "data" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #13
-CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #19
-CLOSE #15: OPEN tmpdir$ + "ret" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #15
-PRINT #15, "if (next_return_point){"
-PRINT #15, "next_return_point--;"
-PRINT #15, "switch(return_point[next_return_point]){"
-PRINT #15, "case 0:"
-PRINT #15, "error(3);" 'return without gosub!
-PRINT #15, "break;"
-defdatahandle = 13
-
-declibjmp1:
-
-IF declaringlibrary THEN
-IF sfdeclare = 0 AND indirectlibrary = 0 THEN
-CLOSE #17
-OPEN tmpdir$ + "regsf_ignore.txt" FOR OUTPUT AS #17
-END IF
-IF sfdeclare = 1 AND customtypelibrary = 0 AND dynamiclibrary = 0 AND indirectlibrary = 0 THEN
-PRINT #17, "#include " + CHR$(34) + "externtype" + str2(ResolveStaticFunctions + 1) + ".txt" + CHR$(34)
-fh = FREEFILE: OPEN tmpdir$ + "externtype" + str2(ResolveStaticFunctions + 1) + ".txt" FOR OUTPUT AS #fh: CLOSE #fh
-END IF
-END IF
-
-
-
-
-IF sf = 1 THEN
-rettyp = id.ret
-t$ = typ2ctyp$(id.ret, "")
-IF Error_Happened THEN GOTO errmes
-IF t$ = "qbs" THEN t$ = "qbs*"
-
-IF declaringlibrary THEN
-IF rettyp AND ISSTRING THEN
-t$ = "char*"
-END IF
-END IF
-
-IF declaringlibrary <> 0 AND dynamiclibrary <> 0 THEN
-IF os$ = "WIN" THEN
-PRINT #17, "typedef " + t$ + " (CALLBACK* DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
-END IF
-IF os$ = "LNX" THEN
-PRINT #17, "typedef " + t$ + " (*DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
-END IF
-ELSEIF declaringlibrary <> 0 AND customtypelibrary <> 0 THEN
-PRINT #17, "typedef " + t$ + " CUSTOMCALL_" + removecast$(RTRIM$(id.callname)) + "(";
-ELSE
-PRINT #17, t$ + " " + removecast$(RTRIM$(id.callname)) + "(";
-END IF
-IF declaringlibrary THEN GOTO declibjmp2
-PRINT #12, t$ + " " + removecast$(RTRIM$(id.callname)) + "(";
-
-'create variable to return result
-'if type wasn't specified, define it
-IF symbol$ = "" THEN
-a = ASC(UCASE$(e$)): IF a = 95 THEN a = 91
-a = a - 64 'so A=1, Z=27 and _=28
-symbol$ = defineextaz(a)
-END IF
-reginternalvariable = 1
-ignore = dim2(e$, symbol$, 0, "")
-IF Error_Happened THEN GOTO errmes
-reginternalvariable = 0
-'the following line stops the return variable from being free'd before being returned
-CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #19
-'create return
-IF (rettyp AND ISSTRING) THEN
-r$ = refer$(str2$(currentid), id.t, 1)
-IF Error_Happened THEN GOTO errmes
-subfuncret$ = subfuncret$ + "qbs_maketmp(" + r$ + ");"
-subfuncret$ = subfuncret$ + "return " + r$ + ";"
-ELSE
-r$ = refer$(str2$(currentid), id.t, 0)
-IF Error_Happened THEN GOTO errmes
-subfuncret$ = "return " + r$ + ";"
-END IF
-ELSE
-
-IF declaringlibrary <> 0 AND dynamiclibrary <> 0 THEN
-IF os$ = "WIN" THEN
-PRINT #17, "typedef void (CALLBACK* DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
-END IF
-IF os$ = "LNX" THEN
-PRINT #17, "typedef void (*DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
-END IF
-ELSEIF declaringlibrary <> 0 AND customtypelibrary <> 0 THEN
-PRINT #17, "typedef void CUSTOMCALL_" + removecast$(RTRIM$(id.callname)) + "(";
-ELSE
-PRINT #17, "void " + removecast$(RTRIM$(id.callname)) + "(";
-END IF
-IF declaringlibrary THEN GOTO declibjmp2
-PRINT #12, "void " + removecast$(RTRIM$(id.callname)) + "(";
-END IF
-declibjmp2:
-
-addstatic2layout = 0
-staticsf = 0
-e$ = getelement$(a$, n)
-IF e$ = "STATIC" THEN
-IF declaringlibrary THEN a$ = "STATIC cannot be used in a library declaration": GOTO errmes
-addstatic2layout = 1
-staticsf = 2
-a$ = LEFT$(a$, LEN(a$) - 7): n = n - 1 'remove STATIC
-END IF
-
-'check items to pass
-params = 0
-AllowLocalName = 1
-IF n > 2 THEN
-e$ = getelement$(a$, 3)
-IF e$ <> "(" THEN a$ = "Expected (": GOTO errmes
-e$ = getelement$(a$, n)
-IF e$ <> ")" THEN a$ = "Expected )": GOTO errmes
-l$ = l$ + sp + "("
-IF n = 4 THEN GOTO nosfparams2
-IF n < 4 THEN a$ = "Expected ( ... )": GOTO errmes
-B = 0
-a2$ = ""
-FOR i = 4 TO n - 1
-e$ = getelement$(ca$, i)
-IF e$ = "(" THEN B = B + 1
-IF e$ = ")" THEN B = B - 1
-IF e$ = "," AND B = 0 THEN
-IF i = n - 1 THEN a$ = "Expected , ... )": GOTO errmes
-getlastparam2:
-IF a2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
-a2$ = LEFT$(a2$, LEN(a2$) - 1)
-'possible format: [BYVAL]a[%][(1)][AS][type]
-params = params + 1
-glinkid = targetid
-glinkarg = params
-
-
-
-IF params > 1 THEN
-PRINT #17, ",";
-
-IF declaringlibrary = 0 THEN
-PRINT #12, ",";
-END IF
-
-END IF
-n2 = numelements(a2$)
-array = 0
-t2$ = ""
-e$ = getelement$(a2$, 1)
-
-byvalue = 0
-IF UCASE$(e$) = "BYVAL" THEN
-IF declaringlibrary = 0 THEN a$ = "BYVAL can currently only be used with DECLARE LIBRARY": GOTO errmes
-byvalue = 1: a2$ = RIGHT$(a2$, LEN(a2$) - 6)
-IF RIGHT$(l$, 1) = "(" THEN l$ = l$ + sp2 + "BYVAL" ELSE l$ = l$ + sp + "BYVAL"
-n2 = numelements(a2$): e$ = getelement$(a2$, 1)
-END IF
-
-IF RIGHT$(l$, 1) = "(" THEN l$ = l$ + sp2 + e$ ELSE l$ = l$ + sp + e$
-
-n2$ = e$
-dimmethod = 0
-
-
-symbol2$ = removesymbol$(n2$)
-IF validname(n2$) = 0 THEN a$ = "Invalid name": GOTO errmes
-
-IF Error_Happened THEN GOTO errmes
-IF symbol2$ <> "" THEN dimmethod = 1
-m = 0
-FOR i2 = 2 TO n2
-e$ = getelement$(a2$, i2)
-IF e$ = "(" THEN
-IF m <> 0 THEN a$ = "Syntax error": GOTO errmes
-m = 1
-array = 1
-l$ = l$ + sp2 + "("
-GOTO gotaa2
-END IF
-IF e$ = ")" THEN
-IF m <> 1 THEN a$ = "Syntax error": GOTO errmes
-m = 2
-l$ = l$ + sp2 + ")"
-GOTO gotaa2
-END IF
-IF UCASE$(e$) = "AS" THEN
-IF m <> 0 AND m <> 2 THEN a$ = "Syntax error": GOTO errmes
-m = 3
-l$ = l$ + sp + "AS"
-GOTO gotaa2
-END IF
-IF m = 1 THEN l$ = l$ + sp + e$: GOTO gotaa2 'ignore contents of option bracket telling how many dimensions (add to layout as is)
-IF m <> 3 THEN a$ = "Syntax error": GOTO errmes
-IF t2$ = "" THEN t2$ = e$ ELSE t2$ = t2$ + " " + e$
-gotaa2:
-NEXT i2
-IF symbol2$ <> "" AND t2$ <> "" THEN a$ = "Syntax error": GOTO errmes
-
-
-IF LEN(t2$) THEN 'add type-name after AS
-t2$ = UCASE$(t2$)
-t3$ = t2$
-typ = typname2typ(t3$)
-IF Error_Happened THEN GOTO errmes
-IF typ = 0 THEN a$ = "Undefined type": GOTO errmes
-IF typ AND ISUDT THEN
-t3$ = RTRIM$(udtxcname(typ AND 511))
-ELSE
-FOR t3i = 1 TO LEN(t3i)
-IF ASC(t3$, t3i) = 32 THEN ASC(t3$, t3i) = ASC(sp)
-NEXT
-END IF
-l$ = l$ + sp + t3$
-END IF
-
-IF t2$ = "" THEN t2$ = symbol2$
-IF t2$ = "" THEN
-IF LEFT$(n2$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n2$)) - 64
-t2$ = defineaz(v)
-dimmethod = 1
-END IF
-
-
-
-
-IF array = 1 THEN
-IF declaringlibrary THEN a$ = "Arrays cannot be passed to a library": GOTO errmes
-dimsfarray = 1
-'note: id2.nele is currently 0
-nelereq = ASC(MID$(id2.nelereq, params, 1))
-IF nelereq THEN
-nele = nelereq
-MID$(id2.nele, params, 1) = CHR$(nele)
-
-ids(targetid) = id2
-
-ignore = dim2(n2$, t2$, dimmethod, str2$(nele))
-IF Error_Happened THEN GOTO errmes
-ELSE
-nele = 1
-MID$(id2.nele, params, 1) = CHR$(nele)
-
-ids(targetid) = id2
-
-ignore = dim2(n2$, t2$, dimmethod, "?")
-IF Error_Happened THEN GOTO errmes
-END IF
-
-dimsfarray = 0
-r$ = refer$(str2$(currentid), id.t, 1)
-IF Error_Happened THEN GOTO errmes
-PRINT #17, "ptrszint*" + r$;
-PRINT #12, "ptrszint*" + r$;
-ELSE
-
-IF declaringlibrary THEN
-'is it a udt?
-FOR xx = 1 TO lasttype
-IF t2$ = RTRIM$(udtxname(xx)) THEN
-PRINT #17, "void*"
-GOTO decudt
-END IF
-NEXT
-t$ = typ2ctyp$(0, t2$)
-
-IF Error_Happened THEN GOTO errmes
-IF t$ = "qbs" THEN
-t$ = "char*"
-IF byvalue = 1 THEN a$ = "STRINGs cannot be passed using BYVAL": GOTO errmes
-byvalue = 1 'use t$ as is
-END IF
-IF byvalue THEN PRINT #17, t$; ELSE PRINT #17, t$ + "*";
-decudt:
-GOTO declibjmp3
-END IF
-
-dimsfarray = 1
-ignore = dim2(n2$, t2$, dimmethod, "")
-IF Error_Happened THEN GOTO errmes
-
-
-dimsfarray = 0
-t$ = ""
-typ = id.t 'the typ of the ID created by dim2
-
-t$ = typ2ctyp$(typ, "")
-IF Error_Happened THEN GOTO errmes
-
-
-
-IF t$ = "" THEN a$ = "Cannot find C type to return array data": GOTO errmes
-'searchpoint
-'get the name of the variable
-r$ = refer$(str2$(currentid), id.t, 1)
-IF Error_Happened THEN GOTO errmes
-PRINT #17, t$ + "*" + r$;
-PRINT #12, t$ + "*" + r$;
-IF t$ = "qbs" THEN
-u$ = str2$(uniquenumber)
-PRINT #13, "qbs*oldstr" + u$ + "=NULL;"
-PRINT #13, "if(" + r$ + "->tmp||" + r$ + "->fixed||" + r$ + "->readonly){"
-PRINT #13, "oldstr" + u$ + "=" + r$ + ";"
-
-PRINT #13, "if (oldstr" + u$ + "->cmem_descriptor){"
-PRINT #13, r$ + "=qbs_new_cmem(oldstr" + u$ + "->len,0);"
-PRINT #13, "}else{"
-PRINT #13, r$ + "=qbs_new(oldstr" + u$ + "->len,0);"
-PRINT #13, "}"
-
-PRINT #13, "memcpy(" + r$ + "->chr,oldstr" + u$ + "->chr,oldstr" + u$ + "->len);"
-PRINT #13, "}"
-
-PRINT #19, "if(oldstr" + u$ + "){"
-PRINT #19, "if(oldstr" + u$ + "->fixed)qbs_set(oldstr" + u$ + "," + r$ + ");"
-PRINT #19, "qbs_free(" + r$ + ");"
-PRINT #19, "}"
-END IF
-END IF
-declibjmp3:
-IF i <> n - 1 THEN l$ = l$ + sp2 + ","
-
-a2$ = ""
-ELSE
-a2$ = a2$ + e$ + sp
-IF i = n - 1 THEN GOTO getlastparam2
-END IF
-NEXT i
-nosfparams2:
-l$ = l$ + sp2 + ")"
-END IF 'n>2
-AllowLocalName = 0
-
-IF addstatic2layout THEN l$ = l$ + sp + "STATIC"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-
-PRINT #17, ");"
-
-IF declaringlibrary THEN GOTO declibjmp4
-
-PRINT #12, "){"
-PRINT #12, "qbs *tqbs;"
-PRINT #12, "ptrszint tmp_long;"
-PRINT #12, "int32 tmp_fileno;"
-PRINT #12, "uint32 qbs_tmp_base=qbs_tmp_list_nexti;"
-PRINT #12, "uint8 *tmp_mem_static_pointer=mem_static_pointer;"
-PRINT #12, "uint32 tmp_cmem_sp=cmem_sp;"
-PRINT #12, "#include " + CHR$(34) + "data" + str2$(subfuncn) + ".txt" + CHR$(34)
-
-'create new _MEM lock for this scope
-PRINT #12, "mem_lock *sf_mem_lock;" 'MUST not be static for recursion reasons
-PRINT #12, "new_mem_lock();"
-PRINT #12, "sf_mem_lock=mem_lock_tmp;"
-PRINT #12, "sf_mem_lock->type=3;"
-
-PRINT #12, "if (new_error) goto exit_subfunc;"
-
-'statementn = statementn + 1
-'if nochecks=0 then PRINT #12, "S_" + str2$(statementn) + ":;"
-
-dimstatic = staticsf
-
-declibjmp4:
-
-IF declaringlibrary THEN
-
-IF customtypelibrary THEN
-
-callname$ = removecast$(RTRIM$(id2.callname))
-
-PRINT #17, "CUSTOMCALL_" + callname$ + " *" + callname$ + "=NULL;"
-
-IF subfuncn THEN
-f = FREEFILE
-OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #f
-ELSE
-f = 13
-END IF
-
-
-PRINT #f, callname$ + "=(CUSTOMCALL_" + callname$ + "*)&" + aliasname$ + ";"
-
-IF subfuncn THEN CLOSE #f
-
-'if no header exists to make the external function available, the function definition must be found
-IF sfheader = 0 AND sfdeclare <> 0 THEN
-ResolveStaticFunctions = ResolveStaticFunctions + 1
-'expand array if necessary
-IF ResolveStaticFunctions > UBOUND(ResolveStaticFunction_Name) THEN
-REDIM _PRESERVE ResolveStaticFunction_Name(1 TO ResolveStaticFunctions + 100) AS STRING
-REDIM _PRESERVE ResolveStaticFunction_File(1 TO ResolveStaticFunctions + 100) AS STRING
-REDIM _PRESERVE ResolveStaticFunction_Method(1 TO ResolveStaticFunctions + 100) AS LONG
-END IF
-ResolveStaticFunction_File(ResolveStaticFunctions) = libname$
-ResolveStaticFunction_Name(ResolveStaticFunctions) = aliasname$
-ResolveStaticFunction_Method(ResolveStaticFunctions) = 1
-END IF 'sfheader=0
-
-END IF
-
-IF dynamiclibrary THEN
-IF sfdeclare THEN
-
-PRINT #17, "DLLCALL_" + removecast$(RTRIM$(id2.callname)) + " " + removecast$(RTRIM$(id2.callname)) + "=NULL;"
-
-IF subfuncn THEN
-f = FREEFILE
-OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #f
-ELSE
-f = 13
-END IF
-
-PRINT #f, "if (!" + removecast$(RTRIM$(id2.callname)) + "){"
-IF os$ = "WIN" THEN
-PRINT #f, removecast$(RTRIM$(id2.callname)) + "=(DLLCALL_" + removecast$(RTRIM$(id2.callname)) + ")GetProcAddress(DLL_" + DLLname$ + "," + CHR$(34) + aliasname$ + CHR$(34) + ");"
-PRINT #f, "if (!" + removecast$(RTRIM$(id2.callname)) + ") error(260);"
-END IF
-IF os$ = "LNX" THEN
-PRINT #f, removecast$(RTRIM$(id2.callname)) + "=(DLLCALL_" + removecast$(RTRIM$(id2.callname)) + ")dlsym(DLL_" + DLLname$ + "," + CHR$(34) + aliasname$ + CHR$(34) + ");"
-PRINT #f, "if (dlerror()) error(260);"
-END IF
-PRINT #f, "}"
-
-IF subfuncn THEN CLOSE #f
-
-END IF 'sfdeclare
-END IF 'dynamic
-
-IF sfdeclare = 1 AND customtypelibrary = 0 AND dynamiclibrary = 0 AND indirectlibrary = 0 THEN
-ResolveStaticFunctions = ResolveStaticFunctions + 1
-'expand array if necessary
-IF ResolveStaticFunctions > UBOUND(ResolveStaticFunction_Name) THEN
-REDIM _PRESERVE ResolveStaticFunction_Name(1 TO ResolveStaticFunctions + 100) AS STRING
-REDIM _PRESERVE ResolveStaticFunction_File(1 TO ResolveStaticFunctions + 100) AS STRING
-REDIM _PRESERVE ResolveStaticFunction_Method(1 TO ResolveStaticFunctions + 100) AS LONG
-END IF
-ResolveStaticFunction_File(ResolveStaticFunctions) = libname$
-ResolveStaticFunction_Name(ResolveStaticFunctions) = aliasname$
-ResolveStaticFunction_Method(ResolveStaticFunctions) = 2
-END IF
-
-IF sfdeclare = 0 AND indirectlibrary = 0 THEN
-CLOSE #17
-OPEN tmpdir$ + "regsf.txt" FOR APPEND AS #17
-END IF
-
-END IF 'declaring library
-
-GOTO finishednonexec
-END IF
-END IF
-
-'END SUB/FUNCTION
-IF n = 2 THEN
-IF firstelement$ = "END" THEN
-sf = 0
-IF secondelement$ = "FUNCTION" THEN sf = 1
-IF secondelement$ = "SUB" THEN sf = 2
-IF sf THEN
-
-IF LEN(subfunc) = 0 THEN a$ = "END " + secondelement$ + " without " + secondelement$: GOTO errmes
-
-'check for open controls (copy #3)
-IF controllevel THEN
-x = controltype(controllevel)
-IF x = 1 THEN a$ = "IF without END IF"
-IF x = 2 THEN a$ = "FOR without NEXT"
-IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
-IF x = 5 THEN a$ = "WHILE without WEND"
-IF (x >= 10 AND x <= 17) OR x = 18 OR x = 19 THEN a$ = "SELECT CASE without END SELECT"
-linenumber = controlref(controllevel)
-GOTO errmes
-END IF
-
-l$ = firstelement$ + sp + secondelement$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-
-staticarraylist = "": staticarraylistn = 0 'remove previously listed arrays
-dimstatic = 0
-PRINT #12, "exit_subfunc:;"
-
-'release _MEM lock for this scope
-PRINT #12, "free_mem_lock(sf_mem_lock);"
-
-PRINT #12, "#include " + CHR$(34) + "free" + str2$(subfuncn) + ".txt" + CHR$(34)
-PRINT #12, "if ((tmp_mem_static_pointer>=mem_static)&&(tmp_mem_static_pointer<=mem_static_limit)) mem_static_pointer=tmp_mem_static_pointer; else mem_static_pointer=mem_static;"
-PRINT #12, "cmem_sp=tmp_cmem_sp;"
-IF subfuncret$ <> "" THEN PRINT #12, subfuncret$
-
-PRINT #12, "}" 'skeleton sub
-'ret???.txt
-PRINT #15, "}" 'end case
-PRINT #15, "}"
-PRINT #15, "error(3);" 'no valid return possible
-subfunc = ""
-
-'unshare temp. shared variables
-FOR i = 1 TO idn
-IF ids(i).share AND 2 THEN ids(i).share = ids(i).share - 2
-NEXT
-
-FOR i = 1 TO revertmaymusthaven
-x = revertmaymusthave(i)
-SWAP ids(x).musthave, ids(x).mayhave
-NEXT
-revertmaymusthaven = 0
-
-'undeclare constants in sub/function's scope
-'constlast = constlastshared
-GOTO finishednonexec
-
-END IF
-END IF
-END IF
-
-
-
-IF n >= 1 AND firstelement$ = "CONST" THEN
-l$ = "CONST"
-'DEF... do not change type, the expression is stored in a suitable type
-'based on its value if type isn't forced/specified
-IF n < 3 THEN a$ = "Expected CONST name = value/expression": GOTO errmes
-i = 2
-
-constdefpending:
-pending = 0
-
-n$ = getelement$(ca$, i): i = i + 1
-l$ = l$ + sp + n$ + sp + "="
-typeoverride = 0
-s$ = removesymbol$(n$)
-IF Error_Happened THEN GOTO errmes
-IF s$ <> "" THEN
-typeoverride = typname2typ(s$)
-IF Error_Happened THEN GOTO errmes
-IF typeoverride AND ISFIXEDLENGTH THEN a$ = "Invalid constant type": GOTO errmes
-IF typeoverride = 0 THEN a$ = "Invalid constant type": GOTO errmes
-END IF
-
-IF getelement$(a$, i) <> "=" THEN a$ = "Expected =": GOTO errmes
-i = i + 1
-
-'get expression
-e$ = ""
-B = 0
-FOR i2 = i TO n
-e2$ = getelement$(ca$, i2)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF e2$ = "," AND B = 0 THEN
-pending = 1
-i = i2 + 1
-IF i > n - 2 THEN a$ = "Expected CONST ... , name = value/expression": GOTO errmes
-EXIT FOR
-END IF
-IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
-NEXT
-
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-
-'Note: Actual CONST definition handled in prepass
-
-'Set CONST as defined
-hashname$ = n$
-hashchkflags = HASHFLAG_CONSTANT
-hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-IF constsubfunc(hashresref) = subfuncn THEN constdefined(hashresref) = 1: EXIT DO
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-
-IF pending THEN l$ = l$ + sp2 + ",": GOTO constdefpending
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-
-GOTO finishednonexec
-END IF
-
-predefine:
-IF n >= 2 THEN
-asreq = 0
-IF firstelement$ = "DEFINT" THEN a$ = a$ + sp + "AS" + sp + "INTEGER": n = n + 2: GOTO definetype
-IF firstelement$ = "DEFLNG" THEN a$ = a$ + sp + "AS" + sp + "LONG": n = n + 2: GOTO definetype
-IF firstelement$ = "DEFSNG" THEN a$ = a$ + sp + "AS" + sp + "SINGLE": n = n + 2: GOTO definetype
-IF firstelement$ = "DEFDBL" THEN a$ = a$ + sp + "AS" + sp + "DOUBLE": n = n + 2: GOTO definetype
-IF firstelement$ = "DEFSTR" THEN a$ = a$ + sp + "AS" + sp + "STRING": n = n + 2: GOTO definetype
-IF firstelement$ = "_DEFINE" THEN
-asreq = 1
-definetype:
-l$ = firstelement$
-'get type from rhs
-typ$ = ""
-typ2$ = ""
-t$ = ""
-FOR i = n TO 2 STEP -1
-t$ = getelement$(a$, i)
-IF t$ = "AS" THEN EXIT FOR
-typ$ = t$ + " " + typ$
-typ2$ = t$ + sp + typ2$
-NEXT
-typ$ = RTRIM$(typ$)
-IF t$ <> "AS" THEN a$ = "_DEFINE: Expected ... AS ...": GOTO errmes
-IF i = n OR i = 2 THEN a$ = "_DEFINE: Expected ... AS ...": GOTO errmes
-
-
-n = i - 1
-'the data is from element 2 to element n
-i = 2 - 1
-definenext:
-'expects an alphabet letter or underscore
-i = i + 1: e$ = getelement$(a$, i): E = ASC(UCASE$(e$))
-IF LEN(e$) > 1 THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
-IF E <> 95 AND (E > 90 OR E < 65) THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
-IF E = 95 THEN E = 27 ELSE E = E - 64
-defineaz(E) = typ$
-defineextaz(E) = type2symbol(typ$)
-IF Error_Happened THEN GOTO errmes
-firste = E
-l$ = l$ + sp + e$
-
-IF i = n THEN
-IF predefining = 1 THEN GOTO predefined
-IF asreq THEN l$ = l$ + sp + "AS" + sp + typ2$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec
-END IF
-
-'expects "-" or ","
-i = i + 1: e$ = getelement$(a$, i)
-IF e$ <> "-" AND e$ <> "," THEN a$ = "_DEFINE: Expected - or ,": GOTO errmes
-IF e$ = "-" THEN
-l$ = l$ + sp2 + "-"
-IF i = n THEN a$ = "_DEFINE: Syntax incomplete": GOTO errmes
-'expects an alphabet letter or underscore
-i = i + 1: e$ = getelement$(a$, i): E = ASC(UCASE$(e$))
-IF LEN(e$) > 1 THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
-IF E <> 95 AND (E > 90 OR E < 65) THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
-IF E = 95 THEN E = 27 ELSE E = E - 64
-IF firste > E THEN SWAP E, firste
-FOR e2 = firste TO E
-defineaz(e2) = typ$
-defineextaz(e2) = type2symbol(typ$)
-IF Error_Happened THEN GOTO errmes
-NEXT
-l$ = l$ + sp2 + e$
-IF i = n THEN
-IF predefining = 1 THEN GOTO predefined
-IF asreq THEN l$ = l$ + sp + "AS" + sp + typ2$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec
-END IF
-'expects ","
-i = i + 1: e$ = getelement$(a$, i)
-IF e$ <> "," THEN a$ = "_DEFINE: Expected ,": GOTO errmes
-END IF
-l$ = l$ + sp2 + ","
-GOTO definenext
-END IF '_DEFINE
-END IF '2
-IF predefining = 1 THEN GOTO predefined
-
-IF closedmain <> 0 AND subfunc = "" THEN a$ = "Statement cannot be placed between SUB/FUNCTIONs": GOTO errmes
-
-'executable section:
-
-statementn = statementn + 1
-
-
-IF n >= 1 THEN
-IF firstelement$ = "NEXT" THEN
-
-l$ = "NEXT"
-IF n = 1 THEN GOTO simplenext
-v$ = ""
-FOR i = 2 TO n
-a2$ = getelement(ca$, i)
-
-IF a2$ = "," THEN
-
-lastnextele:
-e$ = fixoperationorder(v$)
-IF Error_Happened THEN GOTO errmes
-IF LEN(l$) = 4 THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp2 + "," + sp + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN
-getid VAL(e$)
-IF Error_Happened THEN GOTO errmes
-IF (id.t AND ISPOINTER) THEN
-IF (id.t AND ISSTRING) = 0 THEN
-IF (id.t AND ISOFFSETINBITS) = 0 THEN
-IF (id.t AND ISARRAY) = 0 THEN
-GOTO fornextfoundvar2
-END IF
-END IF
-END IF
-END IF
-END IF
-a$ = "Unsupported variable after NEXT": GOTO errmes
-fornextfoundvar2:
-simplenext:
-IF controltype(controllevel) <> 2 THEN a$ = "NEXT without FOR": GOTO errmes
-IF n <> 1 AND controlvalue(controllevel) <> currentid THEN a$ = "Incorrect variable after NEXT": GOTO errmes
-PRINT #12, "}"
-PRINT #12, "fornext_exit_" + str2$(controlid(controllevel)) + ":;"
-controllevel = controllevel - 1
-IF n = 1 THEN EXIT FOR
-v$ = ""
-
-ELSE
-
-IF LEN(v$) THEN v$ = v$ + sp + a2$ ELSE v$ = a2$
-IF i = n THEN GOTO lastnextele
-
-END IF
-
-NEXT
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec '***no error causing code, event checking done by FOR***
-END IF
-END IF
-
-
-
-IF n >= 1 THEN
-IF firstelement$ = "WHILE" THEN
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-
-controllevel = controllevel + 1
-controlref(controllevel) = linenumber
-controltype(controllevel) = 5
-controlid(controllevel) = uniquenumber
-IF n >= 2 THEN
-e$ = fixoperationorder(getelements$(ca$, 2, n))
-IF Error_Happened THEN GOTO errmes
-l$ = "WHILE" + sp + tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")"
-IF (typ AND ISSTRING) THEN a$ = "WHILE ERROR! Cannot accept a STRING type.": GOTO errmes
-PRINT #12, "while((" + e$ + ")||new_error){"
-ELSE
-a$ = "WHILE ERROR! Expected expression after WHILE.": GOTO errmes
-END IF
-
-GOTO finishedline
-END IF
-END IF
-
-IF n = 1 THEN
-IF firstelement$ = "WEND" THEN
-
-
-IF controltype(controllevel) <> 5 THEN a$ = "WEND without WHILE": GOTO errmes
-PRINT #12, "}"
-PRINT #12, "ww_exit_" + str2$(controlid(controllevel)) + ":;"
-controllevel = controllevel - 1
-l$ = "WEND"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec '***no error causing code, event checking done by WHILE***
-END IF
-END IF
-
-
-
-
-
-IF n >= 1 THEN
-IF firstelement$ = "DO" THEN
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-controllevel = controllevel + 1
-controlref(controllevel) = linenumber
-l$ = "DO"
-IF n >= 2 THEN
-whileuntil = 0
-IF secondelement$ = "WHILE" THEN whileuntil = 1: l$ = l$ + sp + "WHILE"
-IF secondelement$ = "UNTIL" THEN whileuntil = 2: l$ = l$ + sp + "UNTIL"
-IF whileuntil = 0 THEN a$ = "DO ERROR! Expected WHILE or UNTIL after DO.": GOTO errmes
-e$ = fixoperationorder(getelements$(ca$, 3, n))
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")"
-IF (typ AND ISSTRING) THEN a$ = "DO ERROR! Cannot accept a STRING type.": GOTO errmes
-IF whileuntil = 1 THEN PRINT #12, "while((" + e$ + ")||new_error){" ELSE PRINT #12, "while((!(" + e$ + "))||new_error){"
-controltype(controllevel) = 4
-ELSE
-controltype(controllevel) = 3
-PRINT #12, "do{"
-END IF
-controlid(controllevel) = uniquenumber
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-
-IF n >= 1 THEN
-IF firstelement$ = "LOOP" THEN
-l$ = "LOOP"
-IF controltype(controllevel) <> 3 AND controltype(controllevel) <> 4 THEN a$ = "PROGRAM FLOW ERROR!": GOTO errmes
-IF n >= 2 THEN
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-IF controltype(controllevel) = 4 THEN a$ = "PROGRAM FLOW ERROR!": GOTO errmes
-whileuntil = 0
-IF secondelement$ = "WHILE" THEN whileuntil = 1: l$ = l$ + sp + "WHILE"
-IF secondelement$ = "UNTIL" THEN whileuntil = 2: l$ = l$ + sp + "UNTIL"
-IF whileuntil = 0 THEN a$ = "LOOP ERROR! Expected WHILE or UNTIL after LOOP.": GOTO errmes
-e$ = fixoperationorder(getelements$(ca$, 3, n))
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")"
-IF (typ AND ISSTRING) THEN a$ = "LOOP ERROR! Cannot accept a STRING type.": GOTO errmes
-IF whileuntil = 1 THEN PRINT #12, "}while((" + e$ + ")&&(!new_error));" ELSE PRINT #12, "}while((!(" + e$ + "))&&(!new_error));"
-ELSE
-IF controltype(controllevel) = 4 THEN
-PRINT #12, "}"
-ELSE
-PRINT #12, "}while(1);" 'infinite loop!
-END IF
-END IF
-PRINT #12, "dl_exit_" + str2$(controlid(controllevel)) + ":;"
-controllevel = controllevel - 1
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-IF n = 1 THEN GOTO finishednonexec '***no error causing code, event checking done by DO***
-GOTO finishedline
-END IF
-END IF
-
-
-
-
-
-
-
-
-
-IF n >= 1 THEN
-IF firstelement$ = "FOR" THEN
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-
-l$ = "FOR"
-controllevel = controllevel + 1
-controlref(controllevel) = linenumber
-controltype(controllevel) = 2
-controlid(controllevel) = uniquenumber
-
-v$ = ""
-startvalue$ = ""
-p3$ = "1": stepused = 0
-p2$ = ""
-mode = 0
-E = 0
-FOR i = 2 TO n
-e$ = getelement$(a$, i)
-IF e$ = "=" THEN
-IF mode <> 0 THEN E = 1: EXIT FOR
-mode = 1
-v$ = getelements$(ca$, 2, i - 1)
-equpos = i
-END IF
-IF e$ = "TO" THEN
-IF mode <> 1 THEN E = 1: EXIT FOR
-mode = 2
-startvalue$ = getelements$(ca$, equpos + 1, i - 1)
-topos = i
-END IF
-IF e$ = "STEP" THEN
-IF mode <> 2 THEN E = 1: EXIT FOR
-mode = 3
-stepused = 1
-p2$ = getelements$(ca$, topos + 1, i - 1)
-p3$ = getelements$(ca$, i + 1, n)
-EXIT FOR
-END IF
-NEXT
-IF mode < 2 THEN E = 1
-IF p2$ = "" THEN p2$ = getelements$(ca$, topos + 1, n)
-IF LEN(v$) = 0 OR LEN(startvalue$) = 0 OR LEN(p2$) = 0 THEN E = 1
-IF E <> 0 AND mode < 3 THEN a$ = "Expected FOR name = start TO end": GOTO errmes
-IF E THEN a$ = "Expected FOR name = start TO end STEP increment": GOTO errmes
-
-e$ = fixoperationorder(v$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN
-getid VAL(e$)
-IF Error_Happened THEN GOTO errmes
-IF (id.t AND ISPOINTER) THEN
-IF (id.t AND ISSTRING) = 0 THEN
-IF (id.t AND ISOFFSETINBITS) = 0 THEN
-IF (id.t AND ISARRAY) = 0 THEN
-GOTO fornextfoundvar
-END IF
-END IF
-END IF
-END IF
-END IF
-a$ = "Unsupported variable used in FOR statement": GOTO errmes
-fornextfoundvar:
-controlvalue(controllevel) = currentid
-v$ = e$
-
-'find C++ datatype to match variable
-'markup to cater for greater range/accuracy
-ctype$ = ""
-ctyp = typ - ISPOINTER
-bits = typ AND 511
-IF (typ AND ISFLOAT) THEN
-IF bits = 32 THEN ctype$ = "double": ctyp = 64& + ISFLOAT
-IF bits = 64 THEN ctype$ = "long double": ctyp = 256& + ISFLOAT
-IF bits = 256 THEN ctype$ = "long double": ctyp = 256& + ISFLOAT
-ELSE
-IF bits = 8 THEN ctype$ = "int16": ctyp = 16&
-IF bits = 16 THEN ctype$ = "int32": ctyp = 32&
-IF bits = 32 THEN ctype$ = "int64": ctyp = 64&
-IF bits = 64 THEN ctype$ = "int64": ctyp = 64&
-END IF
-IF ctype$ = "" THEN a$ = "Unsupported variable used in FOR statement": GOTO errmes
-u$ = str2(uniquenumber)
-
-IF subfunc = "" THEN
-PRINT #13, "static " + ctype$ + " fornext_value" + u$ + ";"
-PRINT #13, "static " + ctype$ + " fornext_finalvalue" + u$ + ";"
-PRINT #13, "static " + ctype$ + " fornext_step" + u$ + ";"
-PRINT #13, "static uint8 fornext_step_negative" + u$ + ";"
-ELSE
-PRINT #13, ctype$ + " fornext_value" + u$ + ";"
-PRINT #13, ctype$ + " fornext_finalvalue" + u$ + ";"
-PRINT #13, ctype$ + " fornext_step" + u$ + ";"
-PRINT #13, "uint8 fornext_step_negative" + u$ + ";"
-END IF
-
-'calculate start
-e$ = fixoperationorder$(startvalue$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + "=" + sp + tlayout$
-e$ = evaluatetotyp$(e$, ctyp)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "fornext_value" + u$ + "=" + e$ + ";"
-
-'final
-e$ = fixoperationorder$(p2$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + "TO" + sp + tlayout$
-e$ = evaluatetotyp(e$, ctyp)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "fornext_finalvalue" + u$ + "=" + e$ + ";"
-
-'step
-e$ = fixoperationorder$(p3$)
-IF Error_Happened THEN GOTO errmes
-IF stepused = 1 THEN l$ = l$ + sp + "STEP" + sp + tlayout$
-e$ = evaluatetotyp(e$, ctyp)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "fornext_step" + u$ + "=" + e$ + ";"
-PRINT #12, "if (fornext_step" + u$ + "<0) fornext_step_negative" + u$ + "=1; else fornext_step_negative" + u$ + "=0;"
-
-PRINT #12, "if (new_error) goto fornext_error" + u$ + ";"
-PRINT #12, "goto fornext_entrylabel" + u$ + ";"
-PRINT #12, "while(1){"
-typbak = typ
-PRINT #12, "fornext_value" + u$ + "=fornext_step" + u$ + "+(" + refer$(v$, typ, 0) + ");"
-IF Error_Happened THEN GOTO errmes
-typ = typbak
-PRINT #12, "fornext_entrylabel" + u$ + ":"
-setrefer v$, typ, "fornext_value" + u$, 1
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "if (fornext_step_negative" + u$ + "){"
-PRINT #12, "if (fornext_value" + u$ + "fornext_finalvalue" + u$ + ") break;"
-PRINT #12, "}"
-PRINT #12, "fornext_error" + u$ + ":;"
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-
-GOTO finishedline
-END IF
-END IF
-
-
-IF n = 1 THEN
-IF firstelement$ = "ELSE" THEN
-
-'Routine to add error checking for ELSE so we'll no longer be able to do things like the following:
-'IF x = 1 THEN
-' SELECT CASE s
-' CASE 1
-' END SELECT ELSE y = 2
-'END IF
-'Notice the ELSE with the SELECT CASE? Before this patch, commands like those were considered valid QB64 code.
-temp$ = UCASE$(LTRIM$(RTRIM$(wholeline)))
-goodelse = 0 'a check to see if it's a good else
-IF LEFT$(temp$, 2) = "IF" THEN goodelse = -1: GOTO skipelsecheck 'If we have an IF, the else is probably good
-IF LEFT$(temp$, 4) = "ELSE" THEN goodelse = -1: GOTO skipelsecheck 'If it's an else by itself,then we'll call it good too at this point and let the rest of the syntax checking check for us
-DO
-spacelocation = INSTR(temp$, " ")
-IF spacelocation THEN temp$ = LEFT$(temp$, spacelocation - 1) + MID$(temp$, spacelocation + 1)
-LOOP UNTIL spacelocation = 0
-IF INSTR(temp$, ":ELSE") OR INSTR(temp$, ":IF") THEN goodelse = -1: GOTO skipelsecheck 'I personally don't like the idea of a :ELSE statement, but this checks for that and validates it as well. YUCK! (I suppose this might be useful if there's a label where the ELSE is, like thisline: ELSE
-count = 0
-DO
-count = count + 1
-SELECT CASE MID$(temp$, count, 1)
-CASE IS = "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ":"
-CASE ELSE: EXIT DO
-END SELECT
-LOOP UNTIL count >= LEN(temp$)
-IF MID$(temp$, count, 4) = "ELSE" OR MID$(temp$, count, 2) = "IF" THEN goodelse = -1 'We only had numbers before our else
-IF NOT goodelse THEN a$ = "Invalid Syntax for ELSE": GOTO errmes
-skipelsecheck:
-'End of ELSE Error checking
-FOR i = controllevel TO 1 STEP -1
-t = controltype(i)
-IF t = 1 THEN
-IF controlstate(controllevel) = 2 THEN a$ = "IF-THEN already contains an ELSE statement": GOTO errmes
-PRINT #12, "}else{"
-controlstate(controllevel) = 2
-IF lineelseused = 0 THEN lhscontrollevel = lhscontrollevel - 1
-l$ = "ELSE"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec '***no error causing code, event checking done by IF***
-END IF
-NEXT
-a$ = "ELSE without IF": GOTO errmes
-END IF
-END IF
-
-IF n >= 3 THEN
-IF firstelement$ = "ELSEIF" THEN
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-
-FOR i = controllevel TO 1 STEP -1
-t = controltype(i)
-IF t = 1 THEN
-IF controlstate(controllevel) = 2 THEN a$ = "ELSEIF invalid after ELSE": GOTO errmes
-controlstate(controllevel) = 1
-controlvalue(controllevel) = controlvalue(controllevel) + 1
-e$ = getelement$(a$, n)
-IF e$ <> "THEN" THEN a$ = "Expected ELSEIF expression THEN": GOTO errmes
-PRINT #12, "}else{"
-e$ = fixoperationorder$(getelements$(ca$, 2, n - 1))
-IF Error_Happened THEN GOTO errmes
-l$ = "ELSEIF" + sp + tlayout$ + sp + "THEN"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-IF typ AND ISSTRING THEN
-a$ = "Expected ELSEIF LEN(stringexpression) THEN": GOTO errmes
-END IF
-IF stringprocessinghappened THEN
-PRINT #12, "if (" + cleanupstringprocessingcall$ + e$ + ")){"
-ELSE
-PRINT #12, "if (" + e$ + "){"
-END IF
-lhscontrollevel = lhscontrollevel - 1
-GOTO finishedline
-END IF
-NEXT
-a$ = "ELSEIF without IF": GOTO errmes
-END IF
-END IF
-
-IF n >= 3 THEN
-IF firstelement$ = "IF" THEN
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-
-e$ = getelement(a$, n)
-iftype = 0
-IF e$ = "THEN" THEN iftype = 1
-IF e$ = "GOTO" THEN iftype = 2
-IF iftype = 0 THEN a$ = "Expected IF expression THEN/GOTO": GOTO errmes
-
-controllevel = controllevel + 1
-controlref(controllevel) = linenumber
-controltype(controllevel) = 1
-controlvalue(controllevel) = 0 'number of extra closing } required at END IF
-controlstate(controllevel) = 0
-
-e$ = fixoperationorder$(getelements(ca$, 2, n - 1))
-IF Error_Happened THEN GOTO errmes
-l$ = "IF" + sp + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-
-IF typ AND ISSTRING THEN
-a$ = "Expected IF LEN(stringexpression) THEN": GOTO errmes
-END IF
-
-IF stringprocessinghappened THEN
-PRINT #12, "if ((" + cleanupstringprocessingcall$ + e$ + "))||new_error){"
-ELSE
-PRINT #12, "if ((" + e$ + ")||new_error){"
-END IF
-
-IF iftype = 1 THEN l$ = l$ + sp + "THEN" 'note: 'GOTO' will be added when iftype=2
-layoutdone = 1: IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-
-IF iftype = 2 THEN 'IF ... GOTO
-GOTO finishedline
-END IF
-
-THENGOTO = 1 'possible: IF a=1 THEN 10
-GOTO finishedline2
-END IF
-END IF
-
-'ENDIF
-IF n = 1 AND getelement(a$, 1) = "ENDIF" THEN
-IF controltype(controllevel) <> 1 THEN a$ = "END IF without IF": GOTO errmes
-layoutdone = 1
-IF impliedendif = 0 THEN
-l$ = "END IF"
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-END IF
-
-PRINT #12, "}"
-FOR i = 1 TO controlvalue(controllevel)
-PRINT #12, "}"
-NEXT
-controllevel = controllevel - 1
-GOTO finishednonexec '***no error causing code, event checking done by IF***
-END IF
-
-
-'END IF
-IF n = 2 THEN
-IF getelement(a$, 1) = "END" AND getelement(a$, 2) = "IF" THEN
-
-
-IF controltype(controllevel) <> 1 THEN a$ = "END IF without IF": GOTO errmes
-layoutdone = 1
-IF impliedendif = 0 THEN
-l$ = "END" + sp + "IF"
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-END IF
-
-PRINT #12, "}"
-FOR i = 1 TO controlvalue(controllevel)
-PRINT #12, "}"
-NEXT
-controllevel = controllevel - 1
-GOTO finishednonexec '***no error causing code, event checking done by IF***
-END IF
-END IF
-
-
-
-'SELECT CASE
-IF n >= 1 THEN
-IF firstelement$ = "SELECT" THEN
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-SelectCaseCounter = SelectCaseCounter + 1
-IF UBOUND(EveryCaseSet) <= SelectCaseCounter THEN REDIM _PRESERVE EveryCaseSet(SelectCaseCounter)
-
-IF secondelement$ = "EVERYCASE" THEN
-EveryCaseSet(SelectCaseCounter) = -1
-IF n = 2 THEN a$ = "Expected SELECT CASE expression": GOTO errmes
-e$ = fixoperationorder(getelements$(ca$, 3, n))
-IF Error_Happened THEN GOTO errmes
-l$ = "SELECT EVERYCASE " + tlayout$
-ELSE
-EveryCaseSet(SelectCaseCounter) = 0
-IF n = 1 OR secondelement$ <> "CASE" THEN a$ = "Expected CASE or EVERYCASE": GOTO errmes
-IF n = 2 THEN a$ = "Expected SELECT CASE expression": GOTO errmes
-e$ = fixoperationorder(getelements$(ca$, 3, n))
-IF Error_Happened THEN GOTO errmes
-l$ = "SELECT CASE " + tlayout$
-END IF
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-u = uniquenumber
-
-controllevel = controllevel + 1
-controlvalue(controllevel) = 0 'id
-
-t$ = ""
-IF (typ AND ISSTRING) THEN
-t = 0
-IF (typ AND ISUDT) = 0 AND (typ AND ISARRAY) = 0 AND (typ AND ISREFERENCE) <> 0 THEN
-controlvalue(controllevel) = VAL(e$)
-ELSE
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-PRINT #13, "static qbs *sc_" + str2$(u) + "=qbs_new(0,0);"
-PRINT #12, "qbs_set(sc_" + str2$(u) + "," + e$ + ");"
-IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
-END IF
-
-ELSE
-
-IF (typ AND ISFLOAT) THEN
-
-IF (typ AND 511) > 64 THEN t = 3: t$ = "long double"
-IF (typ AND 511) = 32 THEN t = 4: t$ = "float"
-IF (typ AND 511) = 64 THEN t = 5: t$ = "double"
-IF (typ AND ISUDT) = 0 AND (typ AND ISARRAY) = 0 AND (typ AND ISREFERENCE) <> 0 THEN
-controlvalue(controllevel) = VAL(e$)
-ELSE
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-
-PRINT #13, "static " + t$ + " sc_" + str2$(u) + ";"
-PRINT #12, "sc_" + str2$(u) + "=" + e$ + ";"
-IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
-END IF
-
-ELSE
-
-'non-float
-t = 1: t$ = "int64"
-IF (typ AND ISUNSIGNED) THEN
-IF (typ AND 511) <= 32 THEN t = 7: t$ = "uint32"
-IF (typ AND 511) > 32 THEN t = 2: t$ = "uint64"
-ELSE
-IF (typ AND 511) <= 32 THEN t = 6: t$ = "int32"
-IF (typ AND 511) > 32 THEN t = 1: t$ = "int64"
-END IF
-IF (typ AND ISUDT) = 0 AND (typ AND ISARRAY) = 0 AND (typ AND ISREFERENCE) <> 0 THEN
-controlvalue(controllevel) = VAL(e$)
-ELSE
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-PRINT #13, "static " + t$ + " sc_" + str2$(u) + ";"
-PRINT #12, "sc_" + str2$(u) + "=" + e$ + ";"
-IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
-END IF
-
-END IF
-END IF
-
-
-
-controlref(controllevel) = linenumber
-controltype(controllevel) = 10 + t
-controlid(controllevel) = u
-IF EveryCaseSet(SelectCaseCounter) THEN PRINT #13, "int32 sc_" + str2$(controlid(controllevel)) + "_var;"
-IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_var=0;"
-GOTO finishedline
-END IF
-END IF
-
-
-'END SELECT
-IF n = 2 THEN
-IF firstelement$ = "END" AND secondelement$ = "SELECT" THEN
-'complete current case if necessary
-'18=CASE (awaiting END SELECT/CASE/CASE ELSE)
-'19=CASE ELSE (awaiting END SELECT)
-IF controltype(controllevel) = 18 THEN
-controllevel = controllevel - 1
-IF EveryCaseSet(SelectCaseCounter) = 0 THEN PRINT #12, "goto sc_" + str2$(controlid(controllevel)) + "_end;"
-PRINT #12, "}"
-END IF
-IF controltype(controllevel) = 19 THEN
-controllevel = controllevel - 1
-IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "} /* End of SELECT EVERYCASE ELSE */"
-END IF
-PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_end:;"
-IF controltype(controllevel) < 10 OR controltype(controllevel) > 17 THEN a$ = "END SELECT without SELECT CASE": GOTO errmes
-controllevel = controllevel - 1
-SelectCaseCounter = SelectCaseCounter - 1
-l$ = "END" + sp + "SELECT"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec '***no error causing code, event checking done by SELECT CASE***
-END IF
-END IF
-
-'Steve Edit on 07-05-2014 to generate an error message if someone inserts code between SELECT CASE and CASE such as:
-'SELECT CASE x
-'m = 3
-'CASE 1
-'END SELECT
-'The above used to give no errors, but this one line fix should correct that. (I hope)
-IF n >= 1 AND firstelement$ <> "CASE" AND controltype(controllevel) >= 10 AND controltype(controllevel) < 17 THEN a$ = "Expected CASE expression": GOTO errmes
-'End of Edit
-
-
-'CASE
-IF n >= 1 THEN
-IF firstelement$ = "CASE" THEN
-
-l$ = "CASE"
-'complete current case if necessary
-'18=CASE (awaiting END SELECT/CASE/CASE ELSE)
-'19=CASE ELSE (awaiting END SELECT)
-IF controltype(controllevel) = 19 THEN a$ = "Expected END SELECT": GOTO errmes
-IF controltype(controllevel) = 18 THEN
-lhscontrollevel = lhscontrollevel - 1
-controllevel = controllevel - 1
-IF EveryCaseSet(SelectCaseCounter) = 0 THEN
-PRINT #12, "goto sc_" + str2$(controlid(controllevel)) + "_end;"
-ELSE
-PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_var=-1;"
-END IF
-PRINT #12, "}"
-'following line fixes problem related to RESUME after error
-'statementn = statementn + 1
-'if nochecks=0 then PRINT #12, "S_" + str2$(statementn) + ":;"
-END IF
-
-IF controltype(controllevel) < 10 OR controltype(controllevel) > 17 THEN a$ = "CASE without SELECT CASE": GOTO errmes
-IF n = 1 THEN a$ = "Expected CASE expression": GOTO errmes
-
-
-
-'upgrade:
-'#1: variables can be referred to directly by storing an id in 'controlref'
-' (but not if part of an array etc.)
-'DIM controlvalue(1000) AS LONG
-'#2: more types will be available
-' +SINGLE
-' +DOUBLE
-' -LONG DOUBLE
-' +INT32
-' +UINT32
-'14=SELECT CASE float ...
-'15=SELECT CASE double
-'16=SELECT CASE int32
-'17=SELECT CASE uint32
-
-'10=SELECT CASE qbs (awaiting END SELECT/CASE)
-'11=SELECT CASE int64 (awaiting END SELECT/CASE)
-'12=SELECT CASE uint64 (awaiting END SELECT/CASE)
-'13=SELECT CASE LONG double (awaiting END SELECT/CASE/CASE ELSE)
-'14=SELECT CASE float ...
-'15=SELECT CASE double
-'16=SELECT CASE int32
-'17=SELECT CASE uint32
-
-' bits = targettyp AND 511
-' IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
-' IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
-' IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
-
-
-t = controltype(controllevel) - 10
-'get required type cast, and float options
-flt = 0
-IF t = 0 THEN tc$ = ""
-IF t = 1 THEN tc$ = ""
-IF t = 2 THEN tc$ = ""
-IF t = 3 THEN tc$ = "": flt = 1
-IF t = 4 THEN tc$ = "(float)": flt = 1
-IF t = 5 THEN tc$ = "(double)": flt = 1
-IF t = 6 THEN tc$ = ""
-IF t = 7 THEN tc$ = ""
-
-n$ = "sc_" + str2$(controlid(controllevel))
-cv = controlvalue(controllevel)
-IF cv THEN
-n$ = refer$(str2$(cv), 0, 0)
-IF Error_Happened THEN GOTO errmes
-END IF
-
-'CASE ELSE
-IF n = 2 THEN
-IF getelement$(a$, 2) = "C-EL" THEN
-IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "if (sc_" + str2$(controlid(controllevel)) + "_var==0) {"
-controllevel = controllevel + 1: controltype(controllevel) = 19
-controlref(controllevel) = controlref(controllevel - 1)
-l$ = l$ + sp + "ELSE"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishednonexec '***no error causing code, event checking done by SELECT CASE***
-END IF
-END IF
-
-IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
-
-
-
-f12$ = ""
-
-nexp = 0
-B = 0
-e$ = ""
-FOR i = 2 TO n
-e2$ = getelement$(ca$, i)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF i = n THEN e$ = e$ + sp + e2$
-IF i = n OR (e2$ = "," AND B = 0) THEN
-IF nexp <> 0 THEN l$ = l$ + sp2 + ",": f12$ = f12$ + "||"
-IF e$ = "" THEN a$ = "Expected expression": GOTO errmes
-e$ = RIGHT$(e$, LEN(e$) - 1)
-
-
-
-'TYPE 1? ... TO ...
-n2 = numelements(e$)
-b2 = 0
-el$ = "": er$ = ""
-usedto = 0
-FOR i2 = 1 TO n2
-e3$ = getelement$(e$, i2)
-IF e3$ = "(" THEN b2 = b2 + 1
-IF e3$ = ")" THEN b2 = b2 - 1
-IF b2 = 0 AND UCASE$(e3$) = "TO" THEN
-usedto = 1
-ELSE
-IF usedto = 0 THEN el$ = el$ + sp + e3$ ELSE er$ = er$ + sp + e3$
-END IF
-NEXT
-IF usedto = 1 THEN
-IF el$ = "" OR er$ = "" THEN a$ = "Expected expression TO expression": GOTO errmes
-el$ = RIGHT$(el$, LEN(el$) - 1): er$ = RIGHT$(er$, LEN(er$) - 1)
-'evaluate each side
-FOR i2 = 1 TO 2
-IF i2 = 1 THEN e$ = el$ ELSE e$ = er$
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-IF i2 = 1 THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + "TO" + sp + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-IF t = 0 THEN
-IF (typ AND ISSTRING) = 0 THEN a$ = "Expected string expression": GOTO errmes
-IF i2 = 1 THEN f12$ = f12$ + "(qbs_greaterorequal(" + n$ + "," + e$ + ")&&qbs_lessorequal(" + n$ + ","
-IF i2 = 2 THEN f12$ = f12$ + e$ + "))"
-ELSE
-IF (typ AND ISSTRING) THEN a$ = "Expected numeric expression": GOTO errmes
-'round to integer?
-IF (typ AND ISFLOAT) THEN
-IF t = 1 THEN e$ = "qbr(" + e$ + ")"
-IF t = 2 THEN e$ = "qbr_longdouble_to_uint64(" + e$ + ")"
-IF t = 6 OR t = 7 THEN e$ = "qbr_double_to_long(" + e$ + ")"
-END IF
-'cast result?
-IF LEN(tc$) THEN e$ = tc$ + "(" + e$ + ")"
-IF i2 = 1 THEN f12$ = f12$ + "((" + n$ + ">=(" + e$ + "))&&(" + n$ + "<=("
-IF i2 = 2 THEN f12$ = f12$ + e$ + ")))"
-END IF
-NEXT
-GOTO addedexp
-END IF
-
-'10=SELECT CASE qbs (awaiting END SELECT/CASE)
-'11=SELECT CASE int64 (awaiting END SELECT/CASE)
-'12=SELECT CASE uint64 (awaiting END SELECT/CASE)
-'13=SELECT CASE LONG double (awaiting END SELECT/CASE/CASE ELSE)
-'14=SELECT CASE float ...
-'15=SELECT CASE double
-'16=SELECT CASE int32
-'17=SELECT CASE uint32
-
-' bits = targettyp AND 511
-' IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
-' IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
-' IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
-
-
-
-
-
-
-o$ = "==" 'used by type 3
-
-'TYPE 2?
-x$ = getelement$(e$, 1)
-IF isoperator(x$) THEN 'non-standard usage correction
-IF x$ = "=" OR x$ = "<>" OR x$ = ">" OR x$ = "<" OR x$ = ">=" OR x$ = "<=" THEN
-e$ = "IS" + sp + e$
-x$ = "IS"
-END IF
-END IF
-IF UCASE$(x$) = "IS" THEN
-n2 = numelements(e$)
-IF n2 < 3 THEN a$ = "Expected IS =,<>,>,<,>=,<= expression": GOTO errmes
-o$ = getelement$(e$, 2)
-o2$ = o$
-o = 0
-IF o$ = "=" THEN o$ = "==": o = 1
-IF o$ = "<>" THEN o$ = "!=": o = 1
-IF o$ = ">" THEN o = 1
-IF o$ = "<" THEN o = 1
-IF o$ = ">=" THEN o = 1
-IF o$ = "<=" THEN o = 1
-IF o <> 1 THEN a$ = "Expected IS =,<>,>,<,>=,<= expression": GOTO errmes
-l$ = l$ + sp + "IS" + sp + o2$
-e$ = getelements$(e$, 3, n2)
-'fall through to type 3 using modified e$ & o$
-END IF
-
-'TYPE 3? simple expression
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-IF t = 0 THEN
-'string comparison
-IF (typ AND ISSTRING) = 0 THEN a$ = "Expected string expression": GOTO errmes
-IF o$ = "==" THEN o$ = "qbs_equal"
-IF o$ = "!=" THEN o$ = "qbs_notequal"
-IF o$ = ">" THEN o$ = "qbs_greaterthan"
-IF o$ = "<" THEN o$ = "qbs_lessthan"
-IF o$ = ">=" THEN o$ = "qbs_greaterorequal"
-IF o$ = "<=" THEN o$ = "qbs_lessorequal"
-f12$ = f12$ + o$ + "(" + n$ + "," + e$ + ")"
-ELSE
-'numeric
-IF (typ AND ISSTRING) THEN a$ = "Expected numeric expression": GOTO errmes
-'round to integer?
-IF (typ AND ISFLOAT) THEN
-IF t = 1 THEN e$ = "qbr(" + e$ + ")"
-IF t = 2 THEN e$ = "qbr_longdouble_to_uint64(" + e$ + ")"
-IF t = 6 OR t = 7 THEN e$ = "qbr_double_to_long(" + e$ + ")"
-END IF
-'cast result?
-IF LEN(tc$) THEN e$ = tc$ + "(" + e$ + ")"
-f12$ = f12$ + "(" + n$ + o$ + "(" + e$ + "))"
-END IF
-
-addedexp:
-e$ = ""
-nexp = nexp + 1
-ELSE
-e$ = e$ + sp + e2$
-END IF
-NEXT
-
-IF stringprocessinghappened THEN
-PRINT #12, "if ((" + cleanupstringprocessingcall$ + f12$ + "))||new_error){"
-ELSE
-PRINT #12, "if ((" + f12$ + ")||new_error){"
-END IF
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-controllevel = controllevel + 1
-controlref(controllevel) = controlref(controllevel - 1)
-controltype(controllevel) = 18
-GOTO finishedline
-END IF
-END IF
-
-
-
-
-
-
-
-
-
-
-
-
-'static scope commands:
-
-IF NoChecks = 0 THEN
-PRINT #12, "do{"
-'PRINT #12, "S_" + str2$(statementn) + ":;"
-END IF
-
-
-IF n > 1 THEN
-IF firstelement$ = "PALETTE" THEN
-IF secondelement$ = "USING" THEN
-l$ = "PALETTE" + sp + "USING" + sp
-IF n < 3 THEN a$ = "Expected PALETTE USING array-name": GOTO errmes
-'check array
-e$ = getelement$(ca$, 3)
-IF FindArray(e$) THEN
-IF Error_Happened THEN GOTO errmes
-z = 1
-t = id.arraytype
-IF (t AND 511) <> 16 AND (t AND 511) <> 32 THEN z = 0
-IF t AND ISFLOAT THEN z = 0
-IF t AND ISOFFSETINBITS THEN z = 0
-IF t AND ISSTRING THEN z = 0
-IF t AND ISUDT THEN z = 0
-IF t AND ISUNSIGNED THEN z = 0
-IF z = 0 THEN a$ = "Array must be of type INTEGER or LONG": GOTO errmes
-bits = t AND 511
-GOTO pu_gotarray
-END IF
-IF Error_Happened THEN GOTO errmes
-a$ = "Expected PALETTE USING array-name": GOTO errmes
-pu_gotarray:
-'add () if index not specified
-IF n = 3 THEN
-e$ = e$ + sp + "(" + sp + ")"
-ELSE
-IF n = 4 OR getelement$(a$, 4) <> "(" OR getelement$(a$, n) <> ")" THEN a$ = "Expected PALETTE USING array-name(...)": GOTO errmes
-e$ = e$ + sp + getelements$(ca$, 4, n)
-END IF
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$
-e$ = evaluatetotyp(e$, -2)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_paletteusing(" + e$ + "," + str2(bits) + ");"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF 'using
-END IF 'palette
-END IF 'n>1
-
-
-IF firstelement$ = "KEY" THEN
-IF n = 1 THEN a$ = "Expected KEY ...": GOTO errmes
-l$ = "KEY" + sp
-IF secondelement$ = "OFF" THEN
-IF n > 2 THEN a$ = "Expected KEY OFF only": GOTO errmes
-l$ = l$ + "OFF": layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-PRINT #12, "key_off();"
-GOTO finishedline
-END IF
-IF secondelement$ = "ON" THEN
-IF n > 2 THEN a$ = "Expected KEY ON only": GOTO errmes
-l$ = l$ + "ON": layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-PRINT #12, "key_on();"
-GOTO finishedline
-END IF
-IF secondelement$ = "LIST" THEN
-IF n > 2 THEN a$ = "Expected KEY LIST only": GOTO errmes
-l$ = l$ + "LIST": layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-PRINT #12, "key_list();"
-GOTO finishedline
-END IF
-'search for comma to indicate assignment
-B = 0: e$ = ""
-FOR i = 2 TO n
-e2$ = getelement(ca$, i)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF e2$ = "," AND B = 0 THEN
-i = i + 1: GOTO key_assignment
-END IF
-IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
-NEXT
-'assume KEY(x) ON/OFF/STOP and handle as a sub
-GOTO key_fallthrough
-key_assignment:
-'KEY x, "string"
-'index
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$ + sp2 + "," + sp
-e$ = evaluatetotyp(e$, 32&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "key_assign(" + e$ + ",";
-'string
-e$ = getelements$(ca$, i, n)
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$
-e$ = evaluatetotyp(e$, ISSTRING)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, e$ + ");"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF 'KEY
-key_fallthrough:
-
-
-
-
-IF firstelement$ = "FIELD" THEN
-
-'get filenumber
-B = 0: e$ = ""
-FOR i = 2 TO n
-e2$ = getelement(ca$, i)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF e2$ = "," AND B = 0 THEN
-i = i + 1: GOTO fieldgotfn
-END IF
-IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
-NEXT
-GOTO fielderror
-fieldgotfn:
-IF e$ = "#" OR LEN(e$) = 0 THEN GOTO fielderror
-IF LEFT$(e$, 2) = "#" + sp THEN e$ = RIGHT$(e$, LEN(e$) - 2): l$ = "FIELD" + sp + "#" + sp2 ELSE l$ = "FIELD" + sp
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$ + sp2 + "," + sp
-e$ = evaluatetotyp(e$, 32&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "field_new(" + e$ + ");"
-
-fieldnext:
-
-'get fieldwidth
-IF i > n THEN GOTO fielderror
-B = 0: e$ = ""
-FOR i = i TO n
-e2$ = getelement(ca$, i)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF UCASE$(e2$) = "AS" AND B = 0 THEN
-i = i + 1: GOTO fieldgotfw
-END IF
-IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
-NEXT
-GOTO fielderror
-fieldgotfw:
-IF LEN(e$) = 0 THEN GOTO fielderror
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$ + sp + "AS" + sp
-sizee$ = evaluatetotyp(e$, 32&)
-IF Error_Happened THEN GOTO errmes
-
-'get variable name
-IF i > n THEN GOTO fielderror
-B = 0: e$ = ""
-FOR i = i TO n
-e2$ = getelement(ca$, i)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF (i = n OR e2$ = ",") AND B = 0 THEN
-IF e2$ = "," THEN i = i - 1
-IF i = n THEN
-IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
-END IF
-GOTO fieldgotfname
-END IF
-IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
-NEXT
-GOTO fielderror
-fieldgotfname:
-IF LEN(e$) = 0 THEN GOTO fielderror
-'evaluate it to check it is a STRING
-e$ = fixoperationorder(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF (typ AND ISSTRING) = 0 THEN GOTO fielderror
-IF typ AND ISFIXEDLENGTH THEN a$ = "Fixed length strings cannot be used in a FIELD statement": GOTO errmes
-IF (typ AND ISREFERENCE) = 0 THEN GOTO fielderror
-e$ = refer(e$, typ, 0)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "field_add(" + e$ + "," + sizee$ + ");"
-
-IF i < n THEN
-i = i + 1
-e$ = getelement(a$, i)
-IF e$ <> "," THEN a$ = "Expected ,": GOTO errmes
-l$ = l$ + sp2 + "," + sp
-i = i + 1
-GOTO fieldnext
-END IF
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-
-fielderror: a$ = "Expected FIELD #filenumber, characters AS variable$, ...": GOTO errmes
-END IF
-
-
-
-
-
-'1=IF (awaiting END IF)
-'2=FOR (awaiting NEXT)
-'3=DO (awaiting LOOP [UNTIL|WHILE param])
-'4=DO WHILE/UNTIL (awaiting LOOP)
-'5=WHILE (awaiting WEND)
-
-IF n = 2 THEN
-IF firstelement$ = "EXIT" THEN
-
-l$ = firstelement$ + sp + secondelement$
-
-IF secondelement$ = "DO" THEN
-'scan backwards until previous control level reached
-FOR i = controllevel TO 1 STEP -1
-t = controltype(i)
-IF t = 3 OR t = 4 THEN
-PRINT #12, "goto dl_exit_" + str2$(controlid(i)) + ";"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-NEXT
-a$ = "EXIT DO without DO": GOTO errmes
-END IF
-
-IF secondelement$ = "FOR" THEN
-'scan backwards until previous control level reached
-FOR i = controllevel TO 1 STEP -1
-t = controltype(i)
-IF t = 2 THEN
-PRINT #12, "goto fornext_exit_" + str2$(controlid(i)) + ";"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-NEXT
-a$ = "EXIT FOR without FOR": GOTO errmes
-END IF
-
-IF secondelement$ = "WHILE" THEN
-'scan backwards until previous control level reached
-FOR i = controllevel TO 1 STEP -1
-t = controltype(i)
-IF t = 5 THEN
-PRINT #12, "goto ww_exit_" + str2$(controlid(i)) + ";"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-NEXT
-a$ = "EXIT WHILE without WHILE": GOTO errmes
-END IF
-
-END IF
-END IF
-
-
-
-
-
-
-
-
-IF n >= 2 THEN
-IF firstelement$ = "ON" AND secondelement$ = "STRIG" THEN
-DEPENDENCY(DEPENDENCY_DEVICEINPUT) = 1
-i = 3
-IF i > n THEN a$ = "Expected (": GOTO errmes
-a2$ = getelement$(ca$, i): i = i + 1
-IF a2$ <> "(" THEN a$ = "Expected (": GOTO errmes
-l$ = "ON" + sp + "STRIG" + sp2 + "("
-IF i > n THEN a$ = "Expected ...": GOTO errmes
-B = 0
-x = 0
-e2$ = ""
-e3$ = ""
-FOR i = i TO n
-e$ = getelement$(ca$, i)
-a = ASC(e$)
-IF a = 40 THEN B = B + 1
-IF a = 41 THEN B = B - 1
-IF B = -1 THEN GOTO onstriggotarg
-IF a = 44 AND B = 0 THEN
-x = x + 1
-IF x > 1 THEN a$ = "Expected )": GOTO errmes
-IF e2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
-e3$ = e2$
-e2$ = ""
-ELSE
-IF LEN(e2$) THEN e2$ = e2$ + sp + e$ ELSE e2$ = e$
-END IF
-NEXT
-a$ = "Expected )": GOTO errmes
-onstriggotarg:
-IF e2$ = "" THEN a$ = "Expected ... )": GOTO errmes
-PRINT #12, "onstrig_setup(";
-
-'sort scanned results
-IF LEN(e3$) THEN
-optI$ = e3$
-optController$ = e2$
-optPassed$ = "1"
-ELSE
-optI$ = e2$
-optController$ = "0"
-optPassed$ = "0"
-END IF
-
-'i
-e$ = fixoperationorder$(optI$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + tlayout$
-e$ = evaluatetotyp(e$, 32&): IF Error_Happened THEN GOTO errmes
-PRINT #12, e$ + ",";
-
-'controller , passed
-IF optPassed$ = "1" THEN
-e$ = fixoperationorder$(optController$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-e$ = evaluatetotyp(e$, 32&): IF Error_Happened THEN GOTO errmes
-ELSE
-e$ = optController$
-END IF
-PRINT #12, e$ + "," + optPassed$ + ",";
-
-l$ = l$ + sp2 + ")" + sp 'close brackets
-
-i = i + 1
-IF i > n THEN a$ = "Expected GOSUB/sub-name": GOTO errmes
-a2$ = getelement$(a$, i): i = i + 1
-onstrigid = onstrigid + 1
-PRINT #12, str2$(onstrigid) + ",";
-
-IF a2$ = "GOSUB" THEN
-IF i > n THEN a$ = "Expected linenumber/label": GOTO errmes
-a2$ = getelement$(ca$, i): i = i + 1
-
-PRINT #12, "0);"
-
-IF validlabel(a2$) = 0 THEN a$ = "Invalid label": GOTO errmes
-
-v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk60z:
-IF v THEN
-s = Labels(r).Scope
-IF s = 0 OR s = -1 THEN 'main scope?
-IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-Labels(r).Scope_Restriction = subfuncn
-Labels(r).Error_Line = linenumber
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk60z
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd a2$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = 0
-Labels(r).Error_Line = linenumber
-Labels(r).Scope_Restriction = subfuncn
-END IF 'x
-l$ = l$ + "GOSUB" + sp + tlayout$
-
-PRINT #30, "if(strig_event_id==" + str2$(onstrigid) + ")goto LABEL_" + a2$ + ";"
-
-PRINT #29, "case " + str2$(onstrigid) + ":"
-PRINT #29, "strig_event_occurred++;"
-PRINT #29, "strig_event_id=" + str2$(onstrigid) + ";"
-PRINT #29, "strig_event_occurred++;"
-PRINT #29, "return_point[next_return_point++]=0;"
-PRINT #29, "if (next_return_point>=return_points) more_return_points();"
-PRINT #29, "QBMAIN(NULL);"
-PRINT #29, "break;"
-
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-layoutdone = 1
-GOTO finishedline
-
-ELSE
-
-'establish whether sub a2$ exists using try
-x = 0
-try = findid(a2$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.subfunc = 2 THEN x = 1: EXIT DO
-IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-IF x = 0 THEN a$ = "Expected GOSUB/sub": GOTO errmes
-
-l$ = l$ + RTRIM$(id.cn)
-
-PRINT #29, "case " + str2$(onstrigid) + ":"
-PRINT #29, RTRIM$(id.callname) + "(";
-
-IF id.args > 1 THEN a$ = "SUB requires more than one argument": GOTO errmes
-
-IF i > n THEN
-
-IF id.args = 1 THEN a$ = "Expected argument after SUB": GOTO errmes
-PRINT #12, "0);"
-PRINT #29, ");"
-
-ELSE
-
-IF id.args = 0 THEN a$ = "SUB has no arguments": GOTO errmes
-
-t = CVL(id.arg)
-B = t AND 511
-IF B = 0 OR (t AND ISARRAY) <> 0 OR (t AND ISFLOAT) <> 0 OR (t AND ISSTRING) <> 0 OR (t AND ISOFFSETINBITS) <> 0 THEN a$ = "Only SUB arguments of integer-type allowed": GOTO errmes
-IF B = 8 THEN ct$ = "int8"
-IF B = 16 THEN ct$ = "int16"
-IF B = 32 THEN ct$ = "int32"
-IF B = 64 THEN ct$ = "int64"
-IF t AND ISOFFSET THEN ct$ = "ptrszint"
-IF t AND ISUNSIGNED THEN ct$ = "u" + ct$
-PRINT #29, "(" + ct$ + "*)&i64);"
-
-e$ = getelements$(ca$, i, n)
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluatetotyp(e$, INTEGER64TYPE - ISPOINTER)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, e$ + ");"
-
-END IF
-
-PRINT #29, "break;"
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-layoutdone = 1
-GOTO finishedline
-END IF
-
-END IF
-END IF
-
-
-
-
-
-
-
-
-
-
-
-
-IF n >= 2 THEN
-IF firstelement$ = "ON" AND secondelement$ = "TIMER" THEN
-i = 3
-IF i > n THEN a$ = "Expected (": GOTO errmes
-a2$ = getelement$(ca$, i): i = i + 1
-IF a2$ <> "(" THEN a$ = "Expected (": GOTO errmes
-l$ = "ON" + sp + "TIMER" + sp2 + "("
-IF i > n THEN a$ = "Expected ...": GOTO errmes
-B = 0
-x = 0
-e2$ = ""
-e3$ = ""
-FOR i = i TO n
-e$ = getelement$(ca$, i)
-a = ASC(e$)
-IF a = 40 THEN B = B + 1
-IF a = 41 THEN B = B - 1
-IF B = -1 THEN GOTO ontimgotarg
-IF a = 44 AND B = 0 THEN
-x = x + 1
-IF x > 1 THEN a$ = "Expected )": GOTO errmes
-IF e2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
-e3$ = e2$
-e2$ = ""
-ELSE
-IF LEN(e2$) THEN e2$ = e2$ + sp + e$ ELSE e2$ = e$
-END IF
-NEXT
-a$ = "Expected )": GOTO errmes
-ontimgotarg:
-IF e2$ = "" THEN a$ = "Expected ... )": GOTO errmes
-PRINT #12, "ontimer_setup(";
-'i
-IF LEN(e3$) THEN
-e$ = fixoperationorder$(e3$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + tlayout$ + "," + sp
-e$ = evaluatetotyp(e$, 32&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, e$ + ",";
-ELSE
-PRINT #12, "0,";
-l$ = l$ + sp2
-END IF
-'sec
-e$ = fixoperationorder$(e2$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$ + sp2 + ")" + sp
-e$ = evaluatetotyp(e$, DOUBLETYPE - ISPOINTER)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, e$ + ",";
-i = i + 1
-IF i > n THEN a$ = "Expected GOSUB/sub-name": GOTO errmes
-a2$ = getelement$(a$, i): i = i + 1
-ontimerid = ontimerid + 1
-PRINT #12, str2$(ontimerid) + ",";
-
-IF a2$ = "GOSUB" THEN
-IF i > n THEN a$ = "Expected linenumber/label": GOTO errmes
-a2$ = getelement$(ca$, i): i = i + 1
-
-PRINT #12, "0);"
-
-IF validlabel(a2$) = 0 THEN a$ = "Invalid label": GOTO errmes
-
-v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk60:
-IF v THEN
-s = Labels(r).Scope
-IF s = 0 OR s = -1 THEN 'main scope?
-IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-Labels(r).Scope_Restriction = subfuncn
-Labels(r).Error_Line = linenumber
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk60
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd a2$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = 0
-Labels(r).Error_Line = linenumber
-Labels(r).Scope_Restriction = subfuncn
-END IF 'x
-l$ = l$ + "GOSUB" + sp + tlayout$
-
-PRINT #25, "if(timer_event_id==" + str2$(ontimerid) + ")goto LABEL_" + a2$ + ";"
-
-PRINT #24, "case " + str2$(ontimerid) + ":"
-PRINT #24, "timer_event_occurred++;"
-PRINT #24, "timer_event_id=" + str2$(ontimerid) + ";"
-PRINT #24, "timer_event_occurred++;"
-PRINT #24, "return_point[next_return_point++]=0;"
-PRINT #24, "if (next_return_point>=return_points) more_return_points();"
-PRINT #24, "QBMAIN(NULL);"
-PRINT #24, "break;"
-
-
-
-'call validlabel (to validate the label) [see goto]
-'increment ontimerid
-'use ontimerid to generate the jumper routine
-'etc.
-
-
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-layoutdone = 1
-GOTO finishedline
-ELSE
-
-'establish whether sub a2$ exists using try
-x = 0
-try = findid(a2$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.subfunc = 2 THEN x = 1: EXIT DO
-IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-IF x = 0 THEN a$ = "Expected GOSUB/sub": GOTO errmes
-
-l$ = l$ + RTRIM$(id.cn)
-
-PRINT #24, "case " + str2$(ontimerid) + ":"
-PRINT #24, RTRIM$(id.callname) + "(";
-
-IF id.args > 1 THEN a$ = "SUB requires more than one argument": GOTO errmes
-
-IF i > n THEN
-
-IF id.args = 1 THEN a$ = "Expected argument after SUB": GOTO errmes
-PRINT #12, "0);"
-PRINT #24, ");"
-
-ELSE
-
-IF id.args = 0 THEN a$ = "SUB has no arguments": GOTO errmes
-
-t = CVL(id.arg)
-B = t AND 511
-IF B = 0 OR (t AND ISARRAY) <> 0 OR (t AND ISFLOAT) <> 0 OR (t AND ISSTRING) <> 0 OR (t AND ISOFFSETINBITS) <> 0 THEN a$ = "Only SUB arguments of integer-type allowed": GOTO errmes
-IF B = 8 THEN ct$ = "int8"
-IF B = 16 THEN ct$ = "int16"
-IF B = 32 THEN ct$ = "int32"
-IF B = 64 THEN ct$ = "int64"
-IF t AND ISOFFSET THEN ct$ = "ptrszint"
-IF t AND ISUNSIGNED THEN ct$ = "u" + ct$
-PRINT #24, "(" + ct$ + "*)&i64);"
-
-e$ = getelements$(ca$, i, n)
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluatetotyp(e$, INTEGER64TYPE - ISPOINTER)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, e$ + ");"
-
-END IF
-
-PRINT #24, "break;"
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-layoutdone = 1
-GOTO finishedline
-END IF
-
-END IF
-END IF
-
-
-
-
-IF n >= 2 THEN
-IF firstelement$ = "ON" AND secondelement$ = "KEY" THEN
-i = 3
-IF i > n THEN a$ = "Expected (": GOTO errmes
-a2$ = getelement$(ca$, i): i = i + 1
-IF a2$ <> "(" THEN a$ = "Expected (": GOTO errmes
-l$ = "ON" + sp + "KEY" + sp2 + "("
-IF i > n THEN a$ = "Expected ...": GOTO errmes
-B = 0
-x = 0
-e2$ = ""
-FOR i = i TO n
-e$ = getelement$(ca$, i)
-a = ASC(e$)
-
-
-IF a = 40 THEN B = B + 1
-IF a = 41 THEN B = B - 1
-IF B = -1 THEN EXIT FOR
-IF LEN(e2$) THEN e2$ = e2$ + sp + e$ ELSE e2$ = e$
-NEXT
-IF i = n + 1 THEN a$ = "Expected )": GOTO errmes
-IF e2$ = "" THEN a$ = "Expected ... )": GOTO errmes
-
-e$ = fixoperationorder$(e2$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$ + sp2 + ")" + sp
-e$ = evaluatetotyp(e$, DOUBLETYPE - ISPOINTER)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "onkey_setup(" + e$ + ",";
-
-i = i + 1
-IF i > n THEN a$ = "Expected GOSUB/sub-name": GOTO errmes
-a2$ = getelement$(a$, i): i = i + 1
-onkeyid = onkeyid + 1
-PRINT #12, str2$(onkeyid) + ",";
-
-IF a2$ = "GOSUB" THEN
-IF i > n THEN a$ = "Expected linenumber/label": GOTO errmes
-a2$ = getelement$(ca$, i): i = i + 1
-
-PRINT #12, "0);"
-
-IF validlabel(a2$) = 0 THEN a$ = "Invalid label": GOTO errmes
-
-v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk61:
-IF v THEN
-s = Labels(r).Scope
-IF s = 0 OR s = -1 THEN 'main scope?
-IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-Labels(r).Scope_Restriction = subfuncn
-Labels(r).Error_Line = linenumber
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk61
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd a2$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = 0
-Labels(r).Error_Line = linenumber
-Labels(r).Scope_Restriction = subfuncn
-END IF 'x
-l$ = l$ + "GOSUB" + sp + tlayout$
+ IF secondelement$ = "DYNAMIC" THEN
+ e$ = getelement$(a$, 3): IF e$ <> "LIBRARY" THEN a$ = "Expected DYNAMIC LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
+ dynamiclibrary = 1
+ x = 4
+ l$ = "DECLARE" + sp + "DYNAMIC" + sp + "LIBRARY"
+ IF n = 3 THEN a$ = "Expected DECLARE DYNAMIC LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
+ indirectlibrary = 1
+ END IF
+
+ IF secondelement$ = "CUSTOMTYPE" THEN
+ e$ = getelement$(a$, 3): IF e$ <> "LIBRARY" THEN a$ = "Expected CUSTOMTYPE LIBRARY": GOTO errmes
+ customtypelibrary = 1
+ x = 4
+ l$ = "DECLARE" + sp + "CUSTOMTYPE" + sp + "LIBRARY"
+ indirectlibrary = 1
+ END IF
+
+ IF secondelement$ = "STATIC" THEN
+ e$ = getelement$(a$, 3): IF e$ <> "LIBRARY" THEN a$ = "Expected STATIC LIBRARY": GOTO errmes
+ x = 4
+ l$ = "DECLARE" + sp + "STATIC" + sp + "LIBRARY"
+ staticlinkedlibrary = 1
+ END IF
+
+ sfdeclare = 0: sfheader = 0
+
+ IF n >= x THEN
+
+ sfdeclare = 1
+
+ addlibrary:
+
+ libname$ = ""
+ headername$ = ""
+
+
+ 'assume library name in double quotes follows
+ 'assume library is in main qb64 folder
+ x$ = getelement$(ca$, x)
+ IF ASC(x$) <> 34 THEN a$ = "Expected LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
+ x$ = RIGHT$(x$, LEN(x$) - 1)
+ z = INSTR(x$, CHR$(34))
+ IF z = 0 THEN a$ = "Expected LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
+ x$ = LEFT$(x$, z - 1)
+
+ IF dynamiclibrary <> 0 AND LEN(x$) = 0 THEN a$ = "Expected DECLARE DYNAMIC LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
+ IF customtypelibrary <> 0 AND LEN(x$) = 0 THEN a$ = "Expected DECLARE CUSTOMTYPE LIBRARY " + CHR$(34) + "..." + CHR$(34): GOTO errmes
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'convert '\\' to '\'
+ WHILE INSTR(x$, "\\")
+ z = INSTR(x$, "\\")
+ x$ = LEFT$(x$, z - 1) + RIGHT$(x$, LEN(x$) - z)
+ WEND
+
+ autoformat_x$ = x$ 'used for autolayout purposes
+
+ 'Remove version number from library name
+ 'Eg. libname:1.0 becomes libname <-> 1.0 which later becomes libname.so.1.0
+ v$ = ""
+ striplibver:
+ FOR z = LEN(x$) TO 1 STEP -1
+ a = ASC(x$, z)
+ IF a = ASC_BACKSLASH OR a = ASC_FORWARDSLASH THEN EXIT FOR
+ IF a = ASC_FULLSTOP OR a = ASC_COLON THEN
+ IF isuinteger(RIGHT$(x$, LEN(x$) - z)) THEN
+ IF LEN(v$) THEN v$ = RIGHT$(x$, LEN(x$) - z) + "." + v$ ELSE v$ = RIGHT$(x$, LEN(x$) - z)
+ x$ = LEFT$(x$, z - 1)
+ IF a = ASC_COLON THEN EXIT FOR
+ GOTO striplibver
+ ELSE
+ EXIT FOR
+ END IF
+ END IF
+ NEXT
+ libver$ = v$
+
+
+ IF os$ = "WIN" THEN
+ 'convert forward-slashes to back-slashes
+ DO WHILE INSTR(x$, "/")
+ z = INSTR(x$, "/")
+ x$ = LEFT$(x$, z - 1) + "\" + RIGHT$(x$, LEN(x$) - z)
+ LOOP
+ END IF
+
+ IF os$ = "LNX" THEN
+ 'convert any back-slashes to forward-slashes
+ DO WHILE INSTR(x$, "\")
+ z = INSTR(x$, "\")
+ x$ = LEFT$(x$, z - 1) + "/" + RIGHT$(x$, LEN(x$) - z)
+ LOOP
+ END IF
+
+ 'Seperate path from name
+ libpath$ = ""
+ FOR z = LEN(x$) TO 1 STEP -1
+ a = ASC(x$, z)
+ IF a = 47 OR a = 92 THEN '\ or /
+ libpath$ = LEFT$(x$, z)
+ x$ = RIGHT$(x$, LEN(x$) - z)
+ EXIT FOR
+ END IF
+ NEXT
+
+ 'Create a path which can be used for inline code (uses \\ instead of \)
+ libpath_inline$ = ""
+ FOR z = 1 TO LEN(libpath$)
+ a = ASC(libpath$, z)
+ libpath_inline$ = libpath_inline$ + CHR$(a)
+ IF a = 92 THEN libpath_inline$ = libpath_inline$ + "\"
+ NEXT
+
+ IF LEN(x$) THEN
+ IF dynamiclibrary = 0 THEN
+ 'Static library
+
+ IF os$ = "WIN" THEN
+ 'check for .lib
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + x$ + ".lib") THEN
+ libname$ = libpath$ + x$ + ".lib"
+ inlinelibname$ = libpath_inline$ + x$ + ".lib"
+ END IF
+ END IF
+ 'check for .a
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + x$ + ".a") THEN
+ libname$ = libpath$ + x$ + ".a"
+ inlinelibname$ = libpath_inline$ + x$ + ".a"
+ END IF
+ END IF
+ 'check for .o
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + x$ + ".o") THEN
+ libname$ = libpath$ + x$ + ".o"
+ inlinelibname$ = libpath_inline$ + x$ + ".o"
+ END IF
+ END IF
+ 'check for .lib
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(x$ + ".lib") THEN
+ libname$ = x$ + ".lib"
+ inlinelibname$ = x$ + ".lib"
+ END IF
+ END IF
+ 'check for .a
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(x$ + ".a") THEN
+ libname$ = x$ + ".a"
+ inlinelibname$ = x$ + ".a"
+ END IF
+ END IF
+ 'check for .o
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(x$ + ".o") THEN
+ libname$ = x$ + ".o"
+ inlinelibname$ = x$ + ".o"
+ END IF
+ END IF
+ END IF 'Windows
+
+ IF os$ = "LNX" THEN
+ IF staticlinkedlibrary = 0 THEN
+
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".dylib") THEN
+ libname$ = libpath$ + "lib" + x$ + ".dylib"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".dylib"
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = libpath$ + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so." + libver$
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so") THEN
+ libname$ = libpath$ + "lib" + x$ + ".so"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so"
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath " + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ END IF
+ 'check for .a (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".a") THEN
+ libname$ = libpath$ + "lib" + x$ + ".a"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".a"
+ END IF
+ END IF
+ 'check for .o (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".o") THEN
+ libname$ = libpath$ + "lib" + x$ + ".o"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".o"
+ END IF
+ END IF
+ IF staticlinkedlibrary = 0 THEN
+ 'check for .so (usr/lib64)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so"
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
+ END IF
+ END IF
+ END IF
+ 'check for .a (usr/lib64)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".a") THEN
+ libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".a"
+ inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".a"
+ END IF
+ END IF
+ IF staticlinkedlibrary = 0 THEN
+
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".dylib"
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so"
+ IF LEN(libpath$) THEN mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/" + libpath$ + " " ELSE mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
+ END IF
+ END IF
+ END IF
+ 'check for .a (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".a") THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".a"
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".a"
+ END IF
+ END IF
+ '--------------------------(without path)------------------------------
+ IF staticlinkedlibrary = 0 THEN
+
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = "lib" + x$ + "." + libver$ + ".dylib"
+ mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".dylib") THEN
+ libname$ = "lib" + x$ + ".dylib"
+ inlinelibname$ = "lib" + x$ + ".dylib"
+ mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".so." + libver$) THEN
+ libname$ = "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "lib" + x$ + ".so." + libver$
+ mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".so") THEN
+ libname$ = "lib" + x$ + ".so"
+ inlinelibname$ = "lib" + x$ + ".so"
+ mylibopt$ = mylibopt$ + " -Wl,-rpath ./ "
+ END IF
+ END IF
+ END IF
+ 'check for .a (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".a") THEN
+ libname$ = "lib" + x$ + ".a"
+ inlinelibname$ = "lib" + x$ + ".a"
+ END IF
+ END IF
+ 'check for .o (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".o") THEN
+ libname$ = "lib" + x$ + ".o"
+ inlinelibname$ = "lib" + x$ + ".o"
+ END IF
+ END IF
+ IF staticlinkedlibrary = 0 THEN
+ 'check for .so (usr/lib64)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
+ mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib64/" + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so"
+ mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib64/ "
+ END IF
+ END IF
+ END IF
+ 'check for .a (usr/lib64)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".a") THEN
+ libname$ = "/usr/lib64/" + "lib" + x$ + ".a"
+ inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".a"
+ END IF
+ END IF
+ IF staticlinkedlibrary = 0 THEN
+
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
+ mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so"
+ mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
+ END IF
+ END IF
+ END IF
+ 'check for .a (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".a") THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + ".a"
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".a"
+ mylibopt$ = mylibopt$ + " -Wl,-rpath /usr/lib/ "
+ END IF
+ END IF
+ END IF 'Linux
+
+
+ 'check for header
+ IF LEN(headername$) = 0 THEN
+ IF os$ = "WIN" THEN
+ IF _FILEEXISTS(libpath$ + x$ + ".h") THEN
+ headername$ = libpath_inline$ + x$ + ".h"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS(libpath$ + x$ + ".hpp") THEN
+ headername$ = libpath_inline$ + x$ + ".hpp"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ '--------------------------(without path)------------------------------
+ IF _FILEEXISTS(x$ + ".h") THEN
+ headername$ = x$ + ".h"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS(x$ + ".hpp") THEN
+ headername$ = x$ + ".hpp"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ END IF 'Windows
+
+ IF os$ = "LNX" THEN
+ IF _FILEEXISTS(libpath$ + x$ + ".h") THEN
+ headername$ = libpath_inline$ + x$ + ".h"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS(libpath$ + x$ + ".hpp") THEN
+ headername$ = libpath_inline$ + x$ + ".hpp"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS("/usr/include/" + libpath$ + x$ + ".h") THEN
+ headername$ = "/usr/include/" + libpath_inline$ + x$ + ".h"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS("/usr/include/" + libpath$ + x$ + ".hpp") THEN
+ headername$ = "/usr/include/" + libpath_inline$ + x$ + ".hpp"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ '--------------------------(without path)------------------------------
+ IF _FILEEXISTS(x$ + ".h") THEN
+ headername$ = x$ + ".h"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS(x$ + ".hpp") THEN
+ headername$ = x$ + ".hpp"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS("/usr/include/" + x$ + ".h") THEN
+ headername$ = "/usr/include/" + x$ + ".h"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ IF _FILEEXISTS("/usr/include/" + x$ + ".hpp") THEN
+ headername$ = "/usr/include/" + x$ + ".hpp"
+ IF customtypelibrary = 0 THEN sfdeclare = 0
+ sfheader = 1
+ GOTO GotHeader
+ END IF
+ END IF 'Linux
+
+ GotHeader:
+ END IF
+
+ ELSE
+ 'dynamic library
+
+ IF os$ = "WIN" THEN
+ 'check for .dll (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + x$ + ".dll") THEN
+ libname$ = libpath$ + x$ + ".dll"
+ inlinelibname$ = libpath_inline$ + x$ + ".dll"
+ END IF
+ END IF
+ 'check for .dll (system32)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(ENVIRON$("SYSTEMROOT") + "\System32\" + libpath$ + x$ + ".dll") THEN
+ libname$ = libpath$ + x$ + ".dll"
+ inlinelibname$ = libpath_inline$ + x$ + ".dll"
+ END IF
+ END IF
+ '--------------------------(without path)------------------------------
+ 'check for .dll (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(x$ + ".dll") THEN
+ libname$ = x$ + ".dll"
+ inlinelibname$ = x$ + ".dll"
+ END IF
+ END IF
+ 'check for .dll (system32)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(ENVIRON$("SYSTEMROOT") + "\System32\" + x$ + ".dll") THEN
+ libname$ = x$ + ".dll"
+ inlinelibname$ = x$ + ".dll"
+ END IF
+ END IF
+ END IF 'Windows
+
+ IF os$ = "LNX" THEN
+ 'Note: STATIC libraries (.a/.o) cannot be loaded as dynamic objects
+
+
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
+ IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".dylib") THEN
+ libname$ = libpath$ + "lib" + x$ + ".dylib"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".dylib"
+ IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = libpath$ + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so." + libver$
+ IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS(libpath$ + "lib" + x$ + ".so") THEN
+ libname$ = libpath$ + "lib" + x$ + ".so"
+ inlinelibname$ = libpath_inline$ + "lib" + x$ + ".so"
+ IF LEFT$(libpath$, 1) <> "/" THEN libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ 'check for .so (usr/lib64)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + libpath$ + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib64/" + libpath$ + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib64/" + libpath_inline$ + "lib" + x$ + ".so"
+ END IF
+ END IF
+
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + "." + libver$ + ".dylib"
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".dylib"
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so." + libver$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + libpath$ + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib/" + libpath$ + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib/" + libpath_inline$ + "lib" + x$ + ".so"
+ END IF
+ END IF
+ '--------------------------(without path)------------------------------
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = "lib" + x$ + "." + libver$ + ".dylib"
+ libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".dylib") THEN
+ libname$ = "lib" + x$ + ".dylib"
+ inlinelibname$ = "lib" + x$ + ".dylib"
+ libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (direct)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".so." + libver$) THEN
+ libname$ = "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "lib" + x$ + ".so." + libver$
+ libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("lib" + x$ + ".so") THEN
+ libname$ = "lib" + x$ + ".so"
+ inlinelibname$ = "lib" + x$ + ".so"
+ libname$ = "./" + libname$: inlinelibname$ = "./" + inlinelibname$
+ END IF
+ END IF
+ 'check for .so (usr/lib64)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so." + libver$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib64/" + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib64/" + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib64/" + "lib" + x$ + ".so"
+ END IF
+ END IF
+
+ IF MacOSX THEN 'dylib support
+ 'check for .dylib (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + "." + libver$ + ".dylib"
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".dylib") THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".dylib"
+ END IF
+ END IF
+ END IF
+
+ 'check for .so (usr/lib)
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so." + libver$) THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so." + libver$
+ END IF
+ END IF
+ IF LEN(libname$) = 0 THEN
+ IF _FILEEXISTS("/usr/lib/" + "lib" + x$ + ".so") THEN
+ libname$ = "/usr/lib/" + "lib" + x$ + ".so"
+ inlinelibname$ = "/usr/lib/" + "lib" + x$ + ".so"
+ END IF
+ END IF
+ END IF 'Linux
+
+ END IF 'Dynamic
+
+ 'library found?
+ IF dynamiclibrary <> 0 AND LEN(libname$) = 0 THEN a$ = "DYNAMIC LIBRARY not found": GOTO errmes
+ IF LEN(libname$) = 0 AND LEN(headername$) = 0 THEN a$ = "LIBRARY not found": GOTO errmes
+
+ '***actual method should cull redundant header and library entries***
+
+ IF dynamiclibrary = 0 THEN
+
+ 'static
+ IF LEN(libname$) THEN
+ IF os$ = "WIN" THEN
+ mylib$ = mylib$ + " ..\..\" + libname$ + " "
+ END IF
+ IF os$ = "LNX" THEN
+ IF LEFT$(libname$, 1) = "/" THEN
+ mylib$ = mylib$ + " " + libname$ + " "
+ ELSE
+ mylib$ = mylib$ + " ../../" + libname$ + " "
+ END IF
+ END IF
+
+ END IF
+
+ ELSE
+
+ 'dynamic
+ IF LEN(headername$) = 0 THEN 'no header
+
+ IF subfuncn THEN
+ f = FREEFILE
+ OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #f
+ ELSE
+ f = 13
+ END IF
+
+ 'make name a C-appropriate variable name
+ 'by converting everything except numbers and
+ 'letters to underscores
+ x2$ = x$
+ FOR x2 = 1 TO LEN(x2$)
+ IF ASC(x2$, x2) < 48 THEN ASC(x2$, x2) = 95
+ IF ASC(x2$, x2) > 57 AND ASC(x2$, x2) < 65 THEN ASC(x2$, x2) = 95
+ IF ASC(x2$, x2) > 90 AND ASC(x2$, x2) < 97 THEN ASC(x2$, x2) = 95
+ IF ASC(x2$, x2) > 122 THEN ASC(x2$, x2) = 95
+ NEXT
+ DLLname$ = x2$
+
+ IF sfdeclare THEN
+
+ IF os$ = "WIN" THEN
+ PRINT #17, "HINSTANCE DLL_" + x2$ + "=NULL;"
+ PRINT #f, "if (!DLL_" + x2$ + "){"
+ PRINT #f, "DLL_" + x2$ + "=LoadLibrary(" + CHR$(34) + inlinelibname$ + CHR$(34) + ");"
+ PRINT #f, "if (!DLL_" + x2$ + ") error(259);"
+ PRINT #f, "}"
+ END IF
+
+ IF os$ = "LNX" THEN
+ PRINT #17, "void *DLL_" + x2$ + "=NULL;"
+ PRINT #f, "if (!DLL_" + x2$ + "){"
+ PRINT #f, "DLL_" + x2$ + "=dlopen(" + CHR$(34) + inlinelibname$ + CHR$(34) + ",RTLD_LAZY);"
+ PRINT #f, "if (!DLL_" + x2$ + ") error(259);"
+ PRINT #f, "}"
+ END IF
+
+
+ END IF
+
+ IF subfuncn THEN CLOSE #f
+
+ END IF 'no header
+
+ END IF 'dynamiclibrary
+
+ IF LEN(headername$) THEN
+ IF os$ = "WIN" THEN
+ PRINT #17, "#include " + CHR$(34) + "..\\..\\" + headername$ + CHR$(34)
+ END IF
+ IF os$ = "LNX" THEN
+
+ IF LEFT$(headername$, 1) = "/" THEN
+ PRINT #17, "#include " + CHR$(34) + headername$ + CHR$(34)
+ ELSE
+ PRINT #17, "#include " + CHR$(34) + "../../" + headername$ + CHR$(34)
+ END IF
+
+ END IF
+ END IF
+
+ END IF
+
+ l$ = l$ + sp + CHR$(34) + autoformat_x$ + CHR$(34)
+
+ IF n > x THEN
+ IF dynamiclibrary THEN a$ = "Cannot specify multiple DYNAMIC LIBRARY names in a single DECLARE statement": GOTO errmes
+ x = x + 1: x2$ = getelement$(a$, x): IF x2$ <> "," THEN a$ = "Expected ,": GOTO errmes
+ l$ = l$ + sp2 + ","
+ x = x + 1: IF x > n THEN a$ = "Expected , ...": GOTO errmes
+ GOTO addlibrary
+ END IF
+
+ END IF 'n>=x
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec
+ END IF
+
+ GOTO finishednonexec 'note: no layout required
+ END IF
+ END IF
+
+ 'begin SUB/FUNCTION
+ IF n >= 1 THEN
+ dynamiclibrary = 0
+ declaresubfunc2:
+ sf = 0
+ IF firstelement$ = "FUNCTION" THEN sf = 1
+ IF firstelement$ = "SUB" THEN sf = 2
+ IF sf THEN
+
+ IF declaringlibrary = 0 THEN
+ IF LEN(subfunc) THEN a$ = "Expected END SUB/FUNCTION before " + firstelement$: GOTO errmes
+ END IF
+
+ IF n = 1 THEN a$ = "Expected name after SUB/FUNCTION": GOTO errmes
+ e$ = getelement$(ca$, 2)
+ symbol$ = removesymbol$(e$) '$,%,etc.
+ IF Error_Happened THEN GOTO errmes
+ IF sf = 2 AND symbol$ <> "" THEN a$ = "Type symbols after a SUB name are invalid": GOTO errmes
+ try = findid(e$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.subfunc = sf THEN GOTO createsf
+ IF try = 2 THEN findanotherid = 1: try = findid(e$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ a$ = "Unregistered SUB/FUNCTION encountered": GOTO errmes
+ createsf:
+ IF UCASE$(e$) = "_GL" THEN e$ = "_GL"
+ l$ = firstelement$ + sp + e$ + symbol$
+ id2 = id
+ targetid = currentid
+
+ 'check for ALIAS
+ aliasname$ = RTRIM$(id.cn)
+ IF n > 2 THEN
+ ee$ = getelement$(a$, 3)
+ IF ee$ = "ALIAS" THEN
+ IF declaringlibrary = 0 THEN a$ = "ALIAS can only be used with DECLARE LIBRARY": GOTO errmes
+ IF n = 3 THEN a$ = "Expected ALIAS name-in-library": GOTO errmes
+ ee$ = getelement$(ca$, 4)
+
+ 'strip string content (optional)
+ IF LEFT$(ee$, 1) = CHR$(34) THEN
+ ee$ = RIGHT$(ee$, LEN(ee$) - 1)
+ x = INSTR(ee$, CHR$(34)): IF x = 0 THEN a$ = "Expected " + CHR$(34): GOTO errmes
+ ee$ = LEFT$(ee$, x - 1)
+ l$ = l$ + sp + "ALIAS" + sp + CHR_QUOTE + ee$ + CHR_QUOTE
+ ELSE
+ l$ = l$ + sp + "ALIAS" + sp + ee$
+ END IF
+
+ 'strip fix046$ (created by unquoted periods)
+ DO WHILE INSTR(ee$, fix046$)
+ x = INSTR(ee$, fix046$): ee$ = LEFT$(ee$, x - 1) + "." + RIGHT$(ee$, LEN(ee$) - x + 1 - LEN(fix046$))
+ LOOP
+ aliasname$ = ee$
+ 'remove ALIAS section from line
+ IF n <= 4 THEN a$ = getelements(a$, 1, 2)
+ IF n >= 5 THEN a$ = getelements(a$, 1, 2) + sp + getelements(a$, 5, n)
+ IF n <= 4 THEN ca$ = getelements(ca$, 1, 2)
+ IF n >= 5 THEN ca$ = getelements(ca$, 1, 2) + sp + getelements(ca$, 5, n)
+ n = n - 2
+ END IF
+ END IF
+
+ IF declaringlibrary THEN GOTO declibjmp1
+
+
+ IF closedmain = 0 THEN closemain
+
+ 'check for open controls (copy #2)
+ IF controllevel <> 0 AND controltype(controllevel) <> 6 THEN 'It's OK for subs to be inside $IF blocks
+ x = controltype(controllevel)
+ IF x = 1 THEN a$ = "IF without END IF"
+ IF x = 2 THEN a$ = "FOR without NEXT"
+ IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
+ IF x = 5 THEN a$ = "WHILE without WEND"
+ IF (x >= 10 AND x <= 17) OR x = 18 OR x = 19 THEN a$ = "SELECT CASE without END SELECT"
+ linenumber = controlref(controllevel)
+ GOTO errmes
+ END IF
+
+ subfunc = RTRIM$(id.callname) 'SUB_..."
+ subfuncn = subfuncn + 1
+ subfuncid = targetid
+
+ subfuncret$ = ""
+
+ CLOSE #13: OPEN tmpdir$ + "data" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #13
+ CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #19
+ CLOSE #15: OPEN tmpdir$ + "ret" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #15
+ PRINT #15, "if (next_return_point){"
+ PRINT #15, "next_return_point--;"
+ PRINT #15, "switch(return_point[next_return_point]){"
+ PRINT #15, "case 0:"
+ PRINT #15, "error(3);" 'return without gosub!
+ PRINT #15, "break;"
+ defdatahandle = 13
+
+ declibjmp1:
+
+ IF declaringlibrary THEN
+ IF sfdeclare = 0 AND indirectlibrary = 0 THEN
+ CLOSE #17
+ OPEN tmpdir$ + "regsf_ignore.txt" FOR OUTPUT AS #17
+ END IF
+ IF sfdeclare = 1 AND customtypelibrary = 0 AND dynamiclibrary = 0 AND indirectlibrary = 0 THEN
+ PRINT #17, "#include " + CHR$(34) + "externtype" + str2(ResolveStaticFunctions + 1) + ".txt" + CHR$(34)
+ fh = FREEFILE: OPEN tmpdir$ + "externtype" + str2(ResolveStaticFunctions + 1) + ".txt" FOR OUTPUT AS #fh: CLOSE #fh
+ END IF
+ END IF
+
+
+
+
+ IF sf = 1 THEN
+ rettyp = id.ret
+ t$ = typ2ctyp$(id.ret, "")
+ IF Error_Happened THEN GOTO errmes
+ IF t$ = "qbs" THEN t$ = "qbs*"
+
+ IF declaringlibrary THEN
+ IF rettyp AND ISSTRING THEN
+ t$ = "char*"
+ END IF
+ END IF
+
+ IF declaringlibrary <> 0 AND dynamiclibrary <> 0 THEN
+ IF os$ = "WIN" THEN
+ PRINT #17, "typedef " + t$ + " (CALLBACK* DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
+ END IF
+ IF os$ = "LNX" THEN
+ PRINT #17, "typedef " + t$ + " (*DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
+ END IF
+ ELSEIF declaringlibrary <> 0 AND customtypelibrary <> 0 THEN
+ PRINT #17, "typedef " + t$ + " CUSTOMCALL_" + removecast$(RTRIM$(id.callname)) + "(";
+ ELSE
+ PRINT #17, t$ + " " + removecast$(RTRIM$(id.callname)) + "(";
+ END IF
+ IF declaringlibrary THEN GOTO declibjmp2
+ PRINT #12, t$ + " " + removecast$(RTRIM$(id.callname)) + "(";
+
+ 'create variable to return result
+ 'if type wasn't specified, define it
+ IF symbol$ = "" THEN
+ a = ASC(UCASE$(e$)): IF a = 95 THEN a = 91
+ a = a - 64 'so A=1, Z=27 and _=28
+ symbol$ = defineextaz(a)
+ END IF
+ reginternalvariable = 1
+ ignore = dim2(e$, symbol$, 0, "")
+ IF Error_Happened THEN GOTO errmes
+ reginternalvariable = 0
+ 'the following line stops the return variable from being free'd before being returned
+ CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR OUTPUT AS #19
+ 'create return
+ IF (rettyp AND ISSTRING) THEN
+ r$ = refer$(str2$(currentid), id.t, 1)
+ IF Error_Happened THEN GOTO errmes
+ subfuncret$ = subfuncret$ + "qbs_maketmp(" + r$ + ");"
+ subfuncret$ = subfuncret$ + "return " + r$ + ";"
+ ELSE
+ r$ = refer$(str2$(currentid), id.t, 0)
+ IF Error_Happened THEN GOTO errmes
+ subfuncret$ = "return " + r$ + ";"
+ END IF
+ ELSE
+
+ IF declaringlibrary <> 0 AND dynamiclibrary <> 0 THEN
+ IF os$ = "WIN" THEN
+ PRINT #17, "typedef void (CALLBACK* DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
+ END IF
+ IF os$ = "LNX" THEN
+ PRINT #17, "typedef void (*DLLCALL_" + removecast$(RTRIM$(id.callname)) + ")(";
+ END IF
+ ELSEIF declaringlibrary <> 0 AND customtypelibrary <> 0 THEN
+ PRINT #17, "typedef void CUSTOMCALL_" + removecast$(RTRIM$(id.callname)) + "(";
+ ELSE
+ PRINT #17, "void " + removecast$(RTRIM$(id.callname)) + "(";
+ END IF
+ IF declaringlibrary THEN GOTO declibjmp2
+ PRINT #12, "void " + removecast$(RTRIM$(id.callname)) + "(";
+ END IF
+ declibjmp2:
+
+ addstatic2layout = 0
+ staticsf = 0
+ e$ = getelement$(a$, n)
+ IF e$ = "STATIC" THEN
+ IF declaringlibrary THEN a$ = "STATIC cannot be used in a library declaration": GOTO errmes
+ addstatic2layout = 1
+ staticsf = 2
+ a$ = LEFT$(a$, LEN(a$) - 7): n = n - 1 'remove STATIC
+ END IF
+
+ 'check items to pass
+ params = 0
+ AllowLocalName = 1
+ IF n > 2 THEN
+ e$ = getelement$(a$, 3)
+ IF e$ <> "(" THEN a$ = "Expected (": GOTO errmes
+ e$ = getelement$(a$, n)
+ IF e$ <> ")" THEN a$ = "Expected )": GOTO errmes
+ l$ = l$ + sp + "("
+ IF n = 4 THEN GOTO nosfparams2
+ IF n < 4 THEN a$ = "Expected ( ... )": GOTO errmes
+ B = 0
+ a2$ = ""
+ FOR i = 4 TO n - 1
+ e$ = getelement$(ca$, i)
+ IF e$ = "(" THEN B = B + 1
+ IF e$ = ")" THEN B = B - 1
+ IF e$ = "," AND B = 0 THEN
+ IF i = n - 1 THEN a$ = "Expected , ... )": GOTO errmes
+ getlastparam2:
+ IF a2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
+ a2$ = LEFT$(a2$, LEN(a2$) - 1)
+ 'possible format: [BYVAL]a[%][(1)][AS][type]
+ params = params + 1
+ glinkid = targetid
+ glinkarg = params
+
+
+
+ IF params > 1 THEN
+ PRINT #17, ",";
+
+ IF declaringlibrary = 0 THEN
+ PRINT #12, ",";
+ END IF
+
+ END IF
+ n2 = numelements(a2$)
+ array = 0
+ t2$ = ""
+ e$ = getelement$(a2$, 1)
+
+ byvalue = 0
+ IF UCASE$(e$) = "BYVAL" THEN
+ IF declaringlibrary = 0 THEN a$ = "BYVAL can currently only be used with DECLARE LIBRARY": GOTO errmes
+ byvalue = 1: a2$ = RIGHT$(a2$, LEN(a2$) - 6)
+ IF RIGHT$(l$, 1) = "(" THEN l$ = l$ + sp2 + "BYVAL" ELSE l$ = l$ + sp + "BYVAL"
+ n2 = numelements(a2$): e$ = getelement$(a2$, 1)
+ END IF
+
+ IF RIGHT$(l$, 1) = "(" THEN l$ = l$ + sp2 + e$ ELSE l$ = l$ + sp + e$
+
+ n2$ = e$
+ dimmethod = 0
+
+
+ symbol2$ = removesymbol$(n2$)
+ IF validname(n2$) = 0 THEN a$ = "Invalid name": GOTO errmes
+
+ IF Error_Happened THEN GOTO errmes
+ IF symbol2$ <> "" THEN dimmethod = 1
+ m = 0
+ FOR i2 = 2 TO n2
+ e$ = getelement$(a2$, i2)
+ IF e$ = "(" THEN
+ IF m <> 0 THEN a$ = "Syntax error": GOTO errmes
+ m = 1
+ array = 1
+ l$ = l$ + sp2 + "("
+ GOTO gotaa2
+ END IF
+ IF e$ = ")" THEN
+ IF m <> 1 THEN a$ = "Syntax error": GOTO errmes
+ m = 2
+ l$ = l$ + sp2 + ")"
+ GOTO gotaa2
+ END IF
+ IF UCASE$(e$) = "AS" THEN
+ IF m <> 0 AND m <> 2 THEN a$ = "Syntax error": GOTO errmes
+ m = 3
+ l$ = l$ + sp + "AS"
+ GOTO gotaa2
+ END IF
+ IF m = 1 THEN l$ = l$ + sp + e$: GOTO gotaa2 'ignore contents of option bracket telling how many dimensions (add to layout as is)
+ IF m <> 3 THEN a$ = "Syntax error": GOTO errmes
+ IF t2$ = "" THEN t2$ = e$ ELSE t2$ = t2$ + " " + e$
+ gotaa2:
+ NEXT i2
+ IF symbol2$ <> "" AND t2$ <> "" THEN a$ = "Syntax error": GOTO errmes
+
+
+ IF LEN(t2$) THEN 'add type-name after AS
+ t2$ = UCASE$(t2$)
+ t3$ = t2$
+ typ = typname2typ(t3$)
+ IF Error_Happened THEN GOTO errmes
+ IF typ = 0 THEN a$ = "Undefined type": GOTO errmes
+ IF typ AND ISUDT THEN
+ t3$ = RTRIM$(udtxcname(typ AND 511))
+ ELSE
+ FOR t3i = 1 TO LEN(t3i)
+ IF ASC(t3$, t3i) = 32 THEN ASC(t3$, t3i) = ASC(sp)
+ NEXT
+ END IF
+ l$ = l$ + sp + t3$
+ END IF
+
+ IF t2$ = "" THEN t2$ = symbol2$
+ IF t2$ = "" THEN
+ IF LEFT$(n2$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n2$)) - 64
+ t2$ = defineaz(v)
+ dimmethod = 1
+ END IF
+
+
+
+
+ IF array = 1 THEN
+ IF declaringlibrary THEN a$ = "Arrays cannot be passed to a library": GOTO errmes
+ dimsfarray = 1
+ 'note: id2.nele is currently 0
+ nelereq = ASC(MID$(id2.nelereq, params, 1))
+ IF nelereq THEN
+ nele = nelereq
+ MID$(id2.nele, params, 1) = CHR$(nele)
+
+ ids(targetid) = id2
+
+ ignore = dim2(n2$, t2$, dimmethod, str2$(nele))
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ nele = 1
+ MID$(id2.nele, params, 1) = CHR$(nele)
+
+ ids(targetid) = id2
+
+ ignore = dim2(n2$, t2$, dimmethod, "?")
+ IF Error_Happened THEN GOTO errmes
+ END IF
+
+ dimsfarray = 0
+ r$ = refer$(str2$(currentid), id.t, 1)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #17, "ptrszint*" + r$;
+ PRINT #12, "ptrszint*" + r$;
+ ELSE
+
+ IF declaringlibrary THEN
+ 'is it a udt?
+ FOR xx = 1 TO lasttype
+ IF t2$ = RTRIM$(udtxname(xx)) THEN
+ PRINT #17, "void*"
+ GOTO decudt
+ END IF
+ NEXT
+ t$ = typ2ctyp$(0, t2$)
+
+ IF Error_Happened THEN GOTO errmes
+ IF t$ = "qbs" THEN
+ t$ = "char*"
+ IF byvalue = 1 THEN a$ = "STRINGs cannot be passed using BYVAL": GOTO errmes
+ byvalue = 1 'use t$ as is
+ END IF
+ IF byvalue THEN PRINT #17, t$; ELSE PRINT #17, t$ + "*";
+ decudt:
+ GOTO declibjmp3
+ END IF
+
+ dimsfarray = 1
+ ignore = dim2(n2$, t2$, dimmethod, "")
+ IF Error_Happened THEN GOTO errmes
+
+
+ dimsfarray = 0
+ t$ = ""
+ typ = id.t 'the typ of the ID created by dim2
+
+ t$ = typ2ctyp$(typ, "")
+ IF Error_Happened THEN GOTO errmes
+
+
+
+ IF t$ = "" THEN a$ = "Cannot find C type to return array data": GOTO errmes
+ 'searchpoint
+ 'get the name of the variable
+ r$ = refer$(str2$(currentid), id.t, 1)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #17, t$ + "*" + r$;
+ PRINT #12, t$ + "*" + r$;
+ IF t$ = "qbs" THEN
+ u$ = str2$(uniquenumber)
+ PRINT #13, "qbs*oldstr" + u$ + "=NULL;"
+ PRINT #13, "if(" + r$ + "->tmp||" + r$ + "->fixed||" + r$ + "->readonly){"
+ PRINT #13, "oldstr" + u$ + "=" + r$ + ";"
+
+ PRINT #13, "if (oldstr" + u$ + "->cmem_descriptor){"
+ PRINT #13, r$ + "=qbs_new_cmem(oldstr" + u$ + "->len,0);"
+ PRINT #13, "}else{"
+ PRINT #13, r$ + "=qbs_new(oldstr" + u$ + "->len,0);"
+ PRINT #13, "}"
+
+ PRINT #13, "memcpy(" + r$ + "->chr,oldstr" + u$ + "->chr,oldstr" + u$ + "->len);"
+ PRINT #13, "}"
+
+ PRINT #19, "if(oldstr" + u$ + "){"
+ PRINT #19, "if(oldstr" + u$ + "->fixed)qbs_set(oldstr" + u$ + "," + r$ + ");"
+ PRINT #19, "qbs_free(" + r$ + ");"
+ PRINT #19, "}"
+ END IF
+ END IF
+ declibjmp3:
+ IF i <> n - 1 THEN l$ = l$ + sp2 + ","
+
+ a2$ = ""
+ ELSE
+ a2$ = a2$ + e$ + sp
+ IF i = n - 1 THEN GOTO getlastparam2
+ END IF
+ NEXT i
+ nosfparams2:
+ l$ = l$ + sp2 + ")"
+ END IF 'n>2
+ AllowLocalName = 0
+
+ IF addstatic2layout THEN l$ = l$ + sp + "STATIC"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+
+ PRINT #17, ");"
+
+ IF declaringlibrary THEN GOTO declibjmp4
+
+ PRINT #12, "){"
+ PRINT #12, "qbs *tqbs;"
+ PRINT #12, "ptrszint tmp_long;"
+ PRINT #12, "int32 tmp_fileno;"
+ PRINT #12, "uint32 qbs_tmp_base=qbs_tmp_list_nexti;"
+ PRINT #12, "uint8 *tmp_mem_static_pointer=mem_static_pointer;"
+ PRINT #12, "uint32 tmp_cmem_sp=cmem_sp;"
+ PRINT #12, "#include " + CHR$(34) + "data" + str2$(subfuncn) + ".txt" + CHR$(34)
+
+ 'create new _MEM lock for this scope
+ PRINT #12, "mem_lock *sf_mem_lock;" 'MUST not be static for recursion reasons
+ PRINT #12, "new_mem_lock();"
+ PRINT #12, "sf_mem_lock=mem_lock_tmp;"
+ PRINT #12, "sf_mem_lock->type=3;"
+
+ PRINT #12, "if (new_error) goto exit_subfunc;"
+
+ 'statementn = statementn + 1
+ 'if nochecks=0 then PRINT #12, "S_" + str2$(statementn) + ":;"
+
+ dimstatic = staticsf
+
+ declibjmp4:
+
+ IF declaringlibrary THEN
+
+ IF customtypelibrary THEN
+
+ callname$ = removecast$(RTRIM$(id2.callname))
+
+ PRINT #17, "CUSTOMCALL_" + callname$ + " *" + callname$ + "=NULL;"
+
+ IF subfuncn THEN
+ f = FREEFILE
+ OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #f
+ ELSE
+ f = 13
+ END IF
+
+
+ PRINT #f, callname$ + "=(CUSTOMCALL_" + callname$ + "*)&" + aliasname$ + ";"
+
+ IF subfuncn THEN CLOSE #f
+
+ 'if no header exists to make the external function available, the function definition must be found
+ IF sfheader = 0 AND sfdeclare <> 0 THEN
+ ResolveStaticFunctions = ResolveStaticFunctions + 1
+ 'expand array if necessary
+ IF ResolveStaticFunctions > UBOUND(ResolveStaticFunction_Name) THEN
+ REDIM _PRESERVE ResolveStaticFunction_Name(1 TO ResolveStaticFunctions + 100) AS STRING
+ REDIM _PRESERVE ResolveStaticFunction_File(1 TO ResolveStaticFunctions + 100) AS STRING
+ REDIM _PRESERVE ResolveStaticFunction_Method(1 TO ResolveStaticFunctions + 100) AS LONG
+ END IF
+ ResolveStaticFunction_File(ResolveStaticFunctions) = libname$
+ ResolveStaticFunction_Name(ResolveStaticFunctions) = aliasname$
+ ResolveStaticFunction_Method(ResolveStaticFunctions) = 1
+ END IF 'sfheader=0
+
+ END IF
+
+ IF dynamiclibrary THEN
+ IF sfdeclare THEN
+
+ PRINT #17, "DLLCALL_" + removecast$(RTRIM$(id2.callname)) + " " + removecast$(RTRIM$(id2.callname)) + "=NULL;"
+
+ IF subfuncn THEN
+ f = FREEFILE
+ OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #f
+ ELSE
+ f = 13
+ END IF
+
+ PRINT #f, "if (!" + removecast$(RTRIM$(id2.callname)) + "){"
+ IF os$ = "WIN" THEN
+ PRINT #f, removecast$(RTRIM$(id2.callname)) + "=(DLLCALL_" + removecast$(RTRIM$(id2.callname)) + ")GetProcAddress(DLL_" + DLLname$ + "," + CHR$(34) + aliasname$ + CHR$(34) + ");"
+ PRINT #f, "if (!" + removecast$(RTRIM$(id2.callname)) + ") error(260);"
+ END IF
+ IF os$ = "LNX" THEN
+ PRINT #f, removecast$(RTRIM$(id2.callname)) + "=(DLLCALL_" + removecast$(RTRIM$(id2.callname)) + ")dlsym(DLL_" + DLLname$ + "," + CHR$(34) + aliasname$ + CHR$(34) + ");"
+ PRINT #f, "if (dlerror()) error(260);"
+ END IF
+ PRINT #f, "}"
+
+ IF subfuncn THEN CLOSE #f
+
+ END IF 'sfdeclare
+ END IF 'dynamic
+
+ IF sfdeclare = 1 AND customtypelibrary = 0 AND dynamiclibrary = 0 AND indirectlibrary = 0 THEN
+ ResolveStaticFunctions = ResolveStaticFunctions + 1
+ 'expand array if necessary
+ IF ResolveStaticFunctions > UBOUND(ResolveStaticFunction_Name) THEN
+ REDIM _PRESERVE ResolveStaticFunction_Name(1 TO ResolveStaticFunctions + 100) AS STRING
+ REDIM _PRESERVE ResolveStaticFunction_File(1 TO ResolveStaticFunctions + 100) AS STRING
+ REDIM _PRESERVE ResolveStaticFunction_Method(1 TO ResolveStaticFunctions + 100) AS LONG
+ END IF
+ ResolveStaticFunction_File(ResolveStaticFunctions) = libname$
+ ResolveStaticFunction_Name(ResolveStaticFunctions) = aliasname$
+ ResolveStaticFunction_Method(ResolveStaticFunctions) = 2
+ END IF
+
+ IF sfdeclare = 0 AND indirectlibrary = 0 THEN
+ CLOSE #17
+ OPEN tmpdir$ + "regsf.txt" FOR APPEND AS #17
+ END IF
+
+ END IF 'declaring library
+
+ GOTO finishednonexec
+ END IF
+ END IF
+
+ 'END SUB/FUNCTION
+ IF n = 2 THEN
+ IF firstelement$ = "END" THEN
+ sf = 0
+ IF secondelement$ = "FUNCTION" THEN sf = 1
+ IF secondelement$ = "SUB" THEN sf = 2
+ IF sf THEN
+
+ IF LEN(subfunc) = 0 THEN a$ = "END " + secondelement$ + " without " + secondelement$: GOTO errmes
+
+ 'check for open controls (copy #3)
+ IF controllevel <> 0 AND controltype(controllevel) <> 6 THEN 'It's OK for subs to be inside $IF blocks
+ x = controltype(controllevel)
+ IF x = 1 THEN a$ = "IF without END IF"
+ IF x = 2 THEN a$ = "FOR without NEXT"
+ IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
+ IF x = 5 THEN a$ = "WHILE without WEND"
+ IF (x >= 10 AND x <= 17) OR x = 18 OR x = 19 THEN a$ = "SELECT CASE without END SELECT"
+ linenumber = controlref(controllevel)
+ GOTO errmes
+ END IF
+
+ l$ = firstelement$ + sp + secondelement$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+
+ staticarraylist = "": staticarraylistn = 0 'remove previously listed arrays
+ dimstatic = 0
+ PRINT #12, "exit_subfunc:;"
+
+ 'release _MEM lock for this scope
+ PRINT #12, "free_mem_lock(sf_mem_lock);"
+
+ PRINT #12, "#include " + CHR$(34) + "free" + str2$(subfuncn) + ".txt" + CHR$(34)
+ PRINT #12, "if ((tmp_mem_static_pointer>=mem_static)&&(tmp_mem_static_pointer<=mem_static_limit)) mem_static_pointer=tmp_mem_static_pointer; else mem_static_pointer=mem_static;"
+ PRINT #12, "cmem_sp=tmp_cmem_sp;"
+ IF subfuncret$ <> "" THEN PRINT #12, subfuncret$
+
+ PRINT #12, "}" 'skeleton sub
+ 'ret???.txt
+ PRINT #15, "}" 'end case
+ PRINT #15, "}"
+ PRINT #15, "error(3);" 'no valid return possible
+ subfunc = ""
+
+ 'unshare temp. shared variables
+ FOR i = 1 TO idn
+ IF ids(i).share AND 2 THEN ids(i).share = ids(i).share - 2
+ NEXT
+
+ FOR i = 1 TO revertmaymusthaven
+ x = revertmaymusthave(i)
+ SWAP ids(x).musthave, ids(x).mayhave
+ NEXT
+ revertmaymusthaven = 0
+
+ 'undeclare constants in sub/function's scope
+ 'constlast = constlastshared
+ GOTO finishednonexec
+
+ END IF
+ END IF
+ END IF
+
+
+
+ IF n >= 1 AND firstelement$ = "CONST" THEN
+ l$ = "CONST"
+ 'DEF... do not change type, the expression is stored in a suitable type
+ 'based on its value if type isn't forced/specified
+ IF n < 3 THEN a$ = "Expected CONST name = value/expression": GOTO errmes
+ i = 2
+
+ constdefpending:
+ pending = 0
+
+ n$ = getelement$(ca$, i): i = i + 1
+ l$ = l$ + sp + n$ + sp + "="
+ typeoverride = 0
+ s$ = removesymbol$(n$)
+ IF Error_Happened THEN GOTO errmes
+ IF s$ <> "" THEN
+ typeoverride = typname2typ(s$)
+ IF Error_Happened THEN GOTO errmes
+ IF typeoverride AND ISFIXEDLENGTH THEN a$ = "Invalid constant type": GOTO errmes
+ IF typeoverride = 0 THEN a$ = "Invalid constant type": GOTO errmes
+ END IF
+
+ IF getelement$(a$, i) <> "=" THEN a$ = "Expected =": GOTO errmes
+ i = i + 1
+
+ 'get expression
+ e$ = ""
+ B = 0
+ FOR i2 = i TO n
+ e2$ = getelement$(ca$, i2)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF e2$ = "," AND B = 0 THEN
+ pending = 1
+ i = i2 + 1
+ IF i > n - 2 THEN a$ = "Expected CONST ... , name = value/expression": GOTO errmes
+ EXIT FOR
+ END IF
+ IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
+ NEXT
+
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+
+ 'Note: Actual CONST definition handled in prepass
+
+ 'Set CONST as defined
+ hashname$ = n$
+ hashchkflags = HASHFLAG_CONSTANT
+ hashres = HashFind(hashname$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ IF constsubfunc(hashresref) = subfuncn THEN constdefined(hashresref) = 1: EXIT DO
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+
+ IF pending THEN l$ = l$ + sp2 + ",": GOTO constdefpending
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+
+ GOTO finishednonexec
+ END IF
+
+ predefine:
+ IF n >= 2 THEN
+ asreq = 0
+ IF firstelement$ = "DEFINT" THEN a$ = a$ + sp + "AS" + sp + "INTEGER": n = n + 2: GOTO definetype
+ IF firstelement$ = "DEFLNG" THEN a$ = a$ + sp + "AS" + sp + "LONG": n = n + 2: GOTO definetype
+ IF firstelement$ = "DEFSNG" THEN a$ = a$ + sp + "AS" + sp + "SINGLE": n = n + 2: GOTO definetype
+ IF firstelement$ = "DEFDBL" THEN a$ = a$ + sp + "AS" + sp + "DOUBLE": n = n + 2: GOTO definetype
+ IF firstelement$ = "DEFSTR" THEN a$ = a$ + sp + "AS" + sp + "STRING": n = n + 2: GOTO definetype
+ IF firstelement$ = "_DEFINE" THEN
+ asreq = 1
+ definetype:
+ l$ = firstelement$
+ 'get type from rhs
+ typ$ = ""
+ typ2$ = ""
+ t$ = ""
+ FOR i = n TO 2 STEP -1
+ t$ = getelement$(a$, i)
+ IF t$ = "AS" THEN EXIT FOR
+ typ$ = t$ + " " + typ$
+ typ2$ = t$ + sp + typ2$
+ NEXT
+ typ$ = RTRIM$(typ$)
+ IF t$ <> "AS" THEN a$ = "_DEFINE: Expected ... AS ...": GOTO errmes
+ IF i = n OR i = 2 THEN a$ = "_DEFINE: Expected ... AS ...": GOTO errmes
+
+
+ n = i - 1
+ 'the data is from element 2 to element n
+ i = 2 - 1
+ definenext:
+ 'expects an alphabet letter or underscore
+ i = i + 1: e$ = getelement$(a$, i): E = ASC(UCASE$(e$))
+ IF LEN(e$) > 1 THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
+ IF E <> 95 AND (E > 90 OR E < 65) THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
+ IF E = 95 THEN E = 27 ELSE E = E - 64
+ defineaz(E) = typ$
+ defineextaz(E) = type2symbol(typ$)
+ IF Error_Happened THEN GOTO errmes
+ firste = E
+ l$ = l$ + sp + e$
+
+ IF i = n THEN
+ IF predefining = 1 THEN GOTO predefined
+ IF asreq THEN l$ = l$ + sp + "AS" + sp + typ2$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec
+ END IF
+
+ 'expects "-" or ","
+ i = i + 1: e$ = getelement$(a$, i)
+ IF e$ <> "-" AND e$ <> "," THEN a$ = "_DEFINE: Expected - or ,": GOTO errmes
+ IF e$ = "-" THEN
+ l$ = l$ + sp2 + "-"
+ IF i = n THEN a$ = "_DEFINE: Syntax incomplete": GOTO errmes
+ 'expects an alphabet letter or underscore
+ i = i + 1: e$ = getelement$(a$, i): E = ASC(UCASE$(e$))
+ IF LEN(e$) > 1 THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
+ IF E <> 95 AND (E > 90 OR E < 65) THEN a$ = "_DEFINE: Expected an alphabet letter or the underscore character (_)": GOTO errmes
+ IF E = 95 THEN E = 27 ELSE E = E - 64
+ IF firste > E THEN SWAP E, firste
+ FOR e2 = firste TO E
+ defineaz(e2) = typ$
+ defineextaz(e2) = type2symbol(typ$)
+ IF Error_Happened THEN GOTO errmes
+ NEXT
+ l$ = l$ + sp2 + e$
+ IF i = n THEN
+ IF predefining = 1 THEN GOTO predefined
+ IF asreq THEN l$ = l$ + sp + "AS" + sp + typ2$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec
+ END IF
+ 'expects ","
+ i = i + 1: e$ = getelement$(a$, i)
+ IF e$ <> "," THEN a$ = "_DEFINE: Expected ,": GOTO errmes
+ END IF
+ l$ = l$ + sp2 + ","
+ GOTO definenext
+ END IF '_DEFINE
+ END IF '2
+ IF predefining = 1 THEN GOTO predefined
+
+ IF closedmain <> 0 AND subfunc = "" THEN a$ = "Statement cannot be placed between SUB/FUNCTIONs": GOTO errmes
+
+ 'executable section:
+
+ statementn = statementn + 1
+
+
+ IF n >= 1 THEN
+ IF firstelement$ = "NEXT" THEN
+
+ l$ = "NEXT"
+ IF n = 1 THEN GOTO simplenext
+ v$ = ""
+ FOR i = 2 TO n
+ a2$ = getelement(ca$, i)
+
+ IF a2$ = "," THEN
+
+ lastnextele:
+ e$ = fixoperationorder(v$)
+ IF Error_Happened THEN GOTO errmes
+ IF LEN(l$) = 4 THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp2 + "," + sp + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN
+ getid VAL(e$)
+ IF Error_Happened THEN GOTO errmes
+ IF (id.t AND ISPOINTER) THEN
+ IF (id.t AND ISSTRING) = 0 THEN
+ IF (id.t AND ISOFFSETINBITS) = 0 THEN
+ IF (id.t AND ISARRAY) = 0 THEN
+ GOTO fornextfoundvar2
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ a$ = "Unsupported variable after NEXT": GOTO errmes
+ fornextfoundvar2:
+ simplenext:
+ IF controltype(controllevel) <> 2 THEN a$ = "NEXT without FOR": GOTO errmes
+ IF n <> 1 AND controlvalue(controllevel) <> currentid THEN a$ = "Incorrect variable after NEXT": GOTO errmes
+ PRINT #12, "}"
+ PRINT #12, "fornext_exit_" + str2$(controlid(controllevel)) + ":;"
+ controllevel = controllevel - 1
+ IF n = 1 THEN EXIT FOR
+ v$ = ""
+
+ ELSE
+
+ IF LEN(v$) THEN v$ = v$ + sp + a2$ ELSE v$ = a2$
+ IF i = n THEN GOTO lastnextele
+
+ END IF
+
+ NEXT
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec '***no error causing code, event checking done by FOR***
+ END IF
+ END IF
+
+
+
+ IF n >= 1 THEN
+ IF firstelement$ = "WHILE" THEN
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+
+ controllevel = controllevel + 1
+ controlref(controllevel) = linenumber
+ controltype(controllevel) = 5
+ controlid(controllevel) = uniquenumber
+ IF n >= 2 THEN
+ e$ = fixoperationorder(getelements$(ca$, 2, n))
+ IF Error_Happened THEN GOTO errmes
+ l$ = "WHILE" + sp + tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")"
+ IF (typ AND ISSTRING) THEN a$ = "WHILE ERROR! Cannot accept a STRING type.": GOTO errmes
+ PRINT #12, "while((" + e$ + ")||new_error){"
+ ELSE
+ a$ = "WHILE ERROR! Expected expression after WHILE.": GOTO errmes
+ END IF
+
+ GOTO finishedline
+ END IF
+ END IF
+
+ IF n = 1 THEN
+ IF firstelement$ = "WEND" THEN
+
+
+ IF controltype(controllevel) <> 5 THEN a$ = "WEND without WHILE": GOTO errmes
+ PRINT #12, "}"
+ PRINT #12, "ww_exit_" + str2$(controlid(controllevel)) + ":;"
+ controllevel = controllevel - 1
+ l$ = "WEND"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec '***no error causing code, event checking done by WHILE***
+ END IF
+ END IF
+
+
+
+
+
+ IF n >= 1 THEN
+ IF firstelement$ = "DO" THEN
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+ controllevel = controllevel + 1
+ controlref(controllevel) = linenumber
+ l$ = "DO"
+ IF n >= 2 THEN
+ whileuntil = 0
+ IF secondelement$ = "WHILE" THEN whileuntil = 1: l$ = l$ + sp + "WHILE"
+ IF secondelement$ = "UNTIL" THEN whileuntil = 2: l$ = l$ + sp + "UNTIL"
+ IF whileuntil = 0 THEN a$ = "DO ERROR! Expected WHILE or UNTIL after DO.": GOTO errmes
+ e$ = fixoperationorder(getelements$(ca$, 3, n))
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")"
+ IF (typ AND ISSTRING) THEN a$ = "DO ERROR! Cannot accept a STRING type.": GOTO errmes
+ IF whileuntil = 1 THEN PRINT #12, "while((" + e$ + ")||new_error){" ELSE PRINT #12, "while((!(" + e$ + "))||new_error){"
+ controltype(controllevel) = 4
+ ELSE
+ controltype(controllevel) = 3
+ PRINT #12, "do{"
+ END IF
+ controlid(controllevel) = uniquenumber
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+
+ IF n >= 1 THEN
+ IF firstelement$ = "LOOP" THEN
+ l$ = "LOOP"
+ IF controltype(controllevel) <> 3 AND controltype(controllevel) <> 4 THEN a$ = "PROGRAM FLOW ERROR!": GOTO errmes
+ IF n >= 2 THEN
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+ IF controltype(controllevel) = 4 THEN a$ = "PROGRAM FLOW ERROR!": GOTO errmes
+ whileuntil = 0
+ IF secondelement$ = "WHILE" THEN whileuntil = 1: l$ = l$ + sp + "WHILE"
+ IF secondelement$ = "UNTIL" THEN whileuntil = 2: l$ = l$ + sp + "UNTIL"
+ IF whileuntil = 0 THEN a$ = "LOOP ERROR! Expected WHILE or UNTIL after LOOP.": GOTO errmes
+ e$ = fixoperationorder(getelements$(ca$, 3, n))
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ IF stringprocessinghappened THEN e$ = cleanupstringprocessingcall$ + e$ + ")"
+ IF (typ AND ISSTRING) THEN a$ = "LOOP ERROR! Cannot accept a STRING type.": GOTO errmes
+ IF whileuntil = 1 THEN PRINT #12, "}while((" + e$ + ")&&(!new_error));" ELSE PRINT #12, "}while((!(" + e$ + "))&&(!new_error));"
+ ELSE
+ IF controltype(controllevel) = 4 THEN
+ PRINT #12, "}"
+ ELSE
+ PRINT #12, "}while(1);" 'infinite loop!
+ END IF
+ END IF
+ PRINT #12, "dl_exit_" + str2$(controlid(controllevel)) + ":;"
+ controllevel = controllevel - 1
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ IF n = 1 THEN GOTO finishednonexec '***no error causing code, event checking done by DO***
+ GOTO finishedline
+ END IF
+ END IF
+
+
+
+
+
+
+
+
+
+ IF n >= 1 THEN
+ IF firstelement$ = "FOR" THEN
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+
+ l$ = "FOR"
+ controllevel = controllevel + 1
+ controlref(controllevel) = linenumber
+ controltype(controllevel) = 2
+ controlid(controllevel) = uniquenumber
+
+ v$ = ""
+ startvalue$ = ""
+ p3$ = "1": stepused = 0
+ p2$ = ""
+ mode = 0
+ E = 0
+ FOR i = 2 TO n
+ e$ = getelement$(a$, i)
+ IF e$ = "=" THEN
+ IF mode <> 0 THEN E = 1: EXIT FOR
+ mode = 1
+ v$ = getelements$(ca$, 2, i - 1)
+ equpos = i
+ END IF
+ IF e$ = "TO" THEN
+ IF mode <> 1 THEN E = 1: EXIT FOR
+ mode = 2
+ startvalue$ = getelements$(ca$, equpos + 1, i - 1)
+ topos = i
+ END IF
+ IF e$ = "STEP" THEN
+ IF mode <> 2 THEN E = 1: EXIT FOR
+ mode = 3
+ stepused = 1
+ p2$ = getelements$(ca$, topos + 1, i - 1)
+ p3$ = getelements$(ca$, i + 1, n)
+ EXIT FOR
+ END IF
+ NEXT
+ IF mode < 2 THEN E = 1
+ IF p2$ = "" THEN p2$ = getelements$(ca$, topos + 1, n)
+ IF LEN(v$) = 0 OR LEN(startvalue$) = 0 OR LEN(p2$) = 0 THEN E = 1
+ IF E <> 0 AND mode < 3 THEN a$ = "Expected FOR name = start TO end": GOTO errmes
+ IF E THEN a$ = "Expected FOR name = start TO end STEP increment": GOTO errmes
+
+ e$ = fixoperationorder(v$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN
+ getid VAL(e$)
+ IF Error_Happened THEN GOTO errmes
+ IF (id.t AND ISPOINTER) THEN
+ IF (id.t AND ISSTRING) = 0 THEN
+ IF (id.t AND ISOFFSETINBITS) = 0 THEN
+ IF (id.t AND ISARRAY) = 0 THEN
+ GOTO fornextfoundvar
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ a$ = "Unsupported variable used in FOR statement": GOTO errmes
+ fornextfoundvar:
+ controlvalue(controllevel) = currentid
+ v$ = e$
+
+ 'find C++ datatype to match variable
+ 'markup to cater for greater range/accuracy
+ ctype$ = ""
+ ctyp = typ - ISPOINTER
+ bits = typ AND 511
+ IF (typ AND ISFLOAT) THEN
+ IF bits = 32 THEN ctype$ = "double": ctyp = 64& + ISFLOAT
+ IF bits = 64 THEN ctype$ = "long double": ctyp = 256& + ISFLOAT
+ IF bits = 256 THEN ctype$ = "long double": ctyp = 256& + ISFLOAT
+ ELSE
+ IF bits = 8 THEN ctype$ = "int16": ctyp = 16&
+ IF bits = 16 THEN ctype$ = "int32": ctyp = 32&
+ IF bits = 32 THEN ctype$ = "int64": ctyp = 64&
+ IF bits = 64 THEN ctype$ = "int64": ctyp = 64&
+ END IF
+ IF ctype$ = "" THEN a$ = "Unsupported variable used in FOR statement": GOTO errmes
+ u$ = str2(uniquenumber)
+
+ IF subfunc = "" THEN
+ PRINT #13, "static " + ctype$ + " fornext_value" + u$ + ";"
+ PRINT #13, "static " + ctype$ + " fornext_finalvalue" + u$ + ";"
+ PRINT #13, "static " + ctype$ + " fornext_step" + u$ + ";"
+ PRINT #13, "static uint8 fornext_step_negative" + u$ + ";"
+ ELSE
+ PRINT #13, ctype$ + " fornext_value" + u$ + ";"
+ PRINT #13, ctype$ + " fornext_finalvalue" + u$ + ";"
+ PRINT #13, ctype$ + " fornext_step" + u$ + ";"
+ PRINT #13, "uint8 fornext_step_negative" + u$ + ";"
+ END IF
+
+ 'calculate start
+ e$ = fixoperationorder$(startvalue$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + "=" + sp + tlayout$
+ e$ = evaluatetotyp$(e$, ctyp)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "fornext_value" + u$ + "=" + e$ + ";"
+
+ 'final
+ e$ = fixoperationorder$(p2$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + "TO" + sp + tlayout$
+ e$ = evaluatetotyp(e$, ctyp)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "fornext_finalvalue" + u$ + "=" + e$ + ";"
+
+ 'step
+ e$ = fixoperationorder$(p3$)
+ IF Error_Happened THEN GOTO errmes
+ IF stepused = 1 THEN l$ = l$ + sp + "STEP" + sp + tlayout$
+ e$ = evaluatetotyp(e$, ctyp)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "fornext_step" + u$ + "=" + e$ + ";"
+ PRINT #12, "if (fornext_step" + u$ + "<0) fornext_step_negative" + u$ + "=1; else fornext_step_negative" + u$ + "=0;"
+
+ PRINT #12, "if (new_error) goto fornext_error" + u$ + ";"
+ PRINT #12, "goto fornext_entrylabel" + u$ + ";"
+ PRINT #12, "while(1){"
+ typbak = typ
+ PRINT #12, "fornext_value" + u$ + "=fornext_step" + u$ + "+(" + refer$(v$, typ, 0) + ");"
+ IF Error_Happened THEN GOTO errmes
+ typ = typbak
+ PRINT #12, "fornext_entrylabel" + u$ + ":"
+ setrefer v$, typ, "fornext_value" + u$, 1
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "if (fornext_step_negative" + u$ + "){"
+ PRINT #12, "if (fornext_value" + u$ + "fornext_finalvalue" + u$ + ") break;"
+ PRINT #12, "}"
+ PRINT #12, "fornext_error" + u$ + ":;"
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+
+ GOTO finishedline
+ END IF
+ END IF
+
+
+ IF n = 1 THEN
+ IF firstelement$ = "ELSE" THEN
+
+ 'Routine to add error checking for ELSE so we'll no longer be able to do things like the following:
+ 'IF x = 1 THEN
+ ' SELECT CASE s
+ ' CASE 1
+ ' END SELECT ELSE y = 2
+ 'END IF
+ 'Notice the ELSE with the SELECT CASE? Before this patch, commands like those were considered valid QB64 code.
+ temp$ = UCASE$(LTRIM$(RTRIM$(wholeline)))
+ goodelse = 0 'a check to see if it's a good else
+ IF LEFT$(temp$, 2) = "IF" THEN goodelse = -1: GOTO skipelsecheck 'If we have an IF, the else is probably good
+ IF LEFT$(temp$, 4) = "ELSE" THEN goodelse = -1: GOTO skipelsecheck 'If it's an else by itself,then we'll call it good too at this point and let the rest of the syntax checking check for us
+ DO
+ spacelocation = INSTR(temp$, " ")
+ IF spacelocation THEN temp$ = LEFT$(temp$, spacelocation - 1) + MID$(temp$, spacelocation + 1)
+ LOOP UNTIL spacelocation = 0
+ IF INSTR(temp$, ":ELSE") OR INSTR(temp$, ":IF") THEN goodelse = -1: GOTO skipelsecheck 'I personally don't like the idea of a :ELSE statement, but this checks for that and validates it as well. YUCK! (I suppose this might be useful if there's a label where the ELSE is, like thisline: ELSE
+ count = 0
+ DO
+ count = count + 1
+ SELECT CASE MID$(temp$, count, 1)
+ CASE IS = "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ":"
+ CASE ELSE: EXIT DO
+ END SELECT
+ LOOP UNTIL count >= LEN(temp$)
+ IF MID$(temp$, count, 4) = "ELSE" OR MID$(temp$, count, 2) = "IF" THEN goodelse = -1 'We only had numbers before our else
+ IF NOT goodelse THEN a$ = "Invalid Syntax for ELSE": GOTO errmes
+ skipelsecheck:
+ 'End of ELSE Error checking
+ FOR i = controllevel TO 1 STEP -1
+ t = controltype(i)
+ IF t = 1 THEN
+ IF controlstate(controllevel) = 2 THEN a$ = "IF-THEN already contains an ELSE statement": GOTO errmes
+ PRINT #12, "}else{"
+ controlstate(controllevel) = 2
+ IF lineelseused = 0 THEN lhscontrollevel = lhscontrollevel - 1
+ l$ = "ELSE"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec '***no error causing code, event checking done by IF***
+ END IF
+ NEXT
+ a$ = "ELSE without IF": GOTO errmes
+ END IF
+ END IF
+
+ IF n >= 3 THEN
+ IF firstelement$ = "ELSEIF" THEN
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+
+ FOR i = controllevel TO 1 STEP -1
+ t = controltype(i)
+ IF t = 1 THEN
+ IF controlstate(controllevel) = 2 THEN a$ = "ELSEIF invalid after ELSE": GOTO errmes
+ controlstate(controllevel) = 1
+ controlvalue(controllevel) = controlvalue(controllevel) + 1
+ e$ = getelement$(a$, n)
+ IF e$ <> "THEN" THEN a$ = "Expected ELSEIF expression THEN": GOTO errmes
+ PRINT #12, "}else{"
+ e$ = fixoperationorder$(getelements$(ca$, 2, n - 1))
+ IF Error_Happened THEN GOTO errmes
+ l$ = "ELSEIF" + sp + tlayout$ + sp + "THEN"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ IF typ AND ISSTRING THEN
+ a$ = "Expected ELSEIF LEN(stringexpression) THEN": GOTO errmes
+ END IF
+ IF stringprocessinghappened THEN
+ PRINT #12, "if (" + cleanupstringprocessingcall$ + e$ + ")){"
+ ELSE
+ PRINT #12, "if (" + e$ + "){"
+ END IF
+ lhscontrollevel = lhscontrollevel - 1
+ GOTO finishedline
+ END IF
+ NEXT
+ a$ = "ELSEIF without IF": GOTO errmes
+ END IF
+ END IF
+
+ IF n >= 3 THEN
+ IF firstelement$ = "IF" THEN
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+
+ e$ = getelement(a$, n)
+ iftype = 0
+ IF e$ = "THEN" THEN iftype = 1
+ IF e$ = "GOTO" THEN iftype = 2
+ IF iftype = 0 THEN a$ = "Expected IF expression THEN/GOTO": GOTO errmes
+
+ controllevel = controllevel + 1
+ controlref(controllevel) = linenumber
+ controltype(controllevel) = 1
+ controlvalue(controllevel) = 0 'number of extra closing } required at END IF
+ controlstate(controllevel) = 0
+
+ e$ = fixoperationorder$(getelements(ca$, 2, n - 1))
+ IF Error_Happened THEN GOTO errmes
+ l$ = "IF" + sp + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN e$ = refer$(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+
+ IF typ AND ISSTRING THEN
+ a$ = "Expected IF LEN(stringexpression) THEN": GOTO errmes
+ END IF
+
+ IF stringprocessinghappened THEN
+ PRINT #12, "if ((" + cleanupstringprocessingcall$ + e$ + "))||new_error){"
+ ELSE
+ PRINT #12, "if ((" + e$ + ")||new_error){"
+ END IF
+
+ IF iftype = 1 THEN l$ = l$ + sp + "THEN" 'note: 'GOTO' will be added when iftype=2
+ layoutdone = 1: IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+
+ IF iftype = 2 THEN 'IF ... GOTO
+ GOTO finishedline
+ END IF
+
+ THENGOTO = 1 'possible: IF a=1 THEN 10
+ GOTO finishedline2
+ END IF
+ END IF
+
+ 'ENDIF
+ IF n = 1 AND getelement(a$, 1) = "ENDIF" THEN
+ IF controltype(controllevel) <> 1 THEN a$ = "END IF without IF": GOTO errmes
+ layoutdone = 1
+ IF impliedendif = 0 THEN
+ l$ = "END IF"
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ END IF
+
+ PRINT #12, "}"
+ FOR i = 1 TO controlvalue(controllevel)
+ PRINT #12, "}"
+ NEXT
+ controllevel = controllevel - 1
+ GOTO finishednonexec '***no error causing code, event checking done by IF***
+ END IF
+
+
+ 'END IF
+ IF n = 2 THEN
+ IF getelement(a$, 1) = "END" AND getelement(a$, 2) = "IF" THEN
+
+
+ IF controltype(controllevel) <> 1 THEN a$ = "END IF without IF": GOTO errmes
+ layoutdone = 1
+ IF impliedendif = 0 THEN
+ l$ = "END" + sp + "IF"
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ END IF
+
+ PRINT #12, "}"
+ FOR i = 1 TO controlvalue(controllevel)
+ PRINT #12, "}"
+ NEXT
+ controllevel = controllevel - 1
+ GOTO finishednonexec '***no error causing code, event checking done by IF***
+ END IF
+ END IF
+
+
+
+ 'SELECT CASE
+ IF n >= 1 THEN
+ IF firstelement$ = "SELECT" THEN
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+ SelectCaseCounter = SelectCaseCounter + 1
+ IF UBOUND(EveryCaseSet) <= SelectCaseCounter THEN REDIM _PRESERVE EveryCaseSet(SelectCaseCounter)
+
+ IF secondelement$ = "EVERYCASE" THEN
+ EveryCaseSet(SelectCaseCounter) = -1
+ IF n = 2 THEN a$ = "Expected SELECT CASE expression": GOTO errmes
+ e$ = fixoperationorder(getelements$(ca$, 3, n))
+ IF Error_Happened THEN GOTO errmes
+ l$ = "SELECT EVERYCASE " + tlayout$
+ ELSE
+ EveryCaseSet(SelectCaseCounter) = 0
+ IF n = 1 OR secondelement$ <> "CASE" THEN a$ = "Expected CASE or EVERYCASE": GOTO errmes
+ IF n = 2 THEN a$ = "Expected SELECT CASE expression": GOTO errmes
+ e$ = fixoperationorder(getelements$(ca$, 3, n))
+ IF Error_Happened THEN GOTO errmes
+ l$ = "SELECT CASE " + tlayout$
+ END IF
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ u = uniquenumber
+
+ controllevel = controllevel + 1
+ controlvalue(controllevel) = 0 'id
+
+ t$ = ""
+ IF (typ AND ISSTRING) THEN
+ t = 0
+ IF (typ AND ISUDT) = 0 AND (typ AND ISARRAY) = 0 AND (typ AND ISREFERENCE) <> 0 THEN
+ controlvalue(controllevel) = VAL(e$)
+ ELSE
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #13, "static qbs *sc_" + str2$(u) + "=qbs_new(0,0);"
+ PRINT #12, "qbs_set(sc_" + str2$(u) + "," + e$ + ");"
+ IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
+ END IF
+
+ ELSE
+
+ IF (typ AND ISFLOAT) THEN
+
+ IF (typ AND 511) > 64 THEN t = 3: t$ = "long double"
+ IF (typ AND 511) = 32 THEN t = 4: t$ = "float"
+ IF (typ AND 511) = 64 THEN t = 5: t$ = "double"
+ IF (typ AND ISUDT) = 0 AND (typ AND ISARRAY) = 0 AND (typ AND ISREFERENCE) <> 0 THEN
+ controlvalue(controllevel) = VAL(e$)
+ ELSE
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+
+ PRINT #13, "static " + t$ + " sc_" + str2$(u) + ";"
+ PRINT #12, "sc_" + str2$(u) + "=" + e$ + ";"
+ IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
+ END IF
+
+ ELSE
+
+ 'non-float
+ t = 1: t$ = "int64"
+ IF (typ AND ISUNSIGNED) THEN
+ IF (typ AND 511) <= 32 THEN t = 7: t$ = "uint32"
+ IF (typ AND 511) > 32 THEN t = 2: t$ = "uint64"
+ ELSE
+ IF (typ AND 511) <= 32 THEN t = 6: t$ = "int32"
+ IF (typ AND 511) > 32 THEN t = 1: t$ = "int64"
+ END IF
+ IF (typ AND ISUDT) = 0 AND (typ AND ISARRAY) = 0 AND (typ AND ISREFERENCE) <> 0 THEN
+ controlvalue(controllevel) = VAL(e$)
+ ELSE
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #13, "static " + t$ + " sc_" + str2$(u) + ";"
+ PRINT #12, "sc_" + str2$(u) + "=" + e$ + ";"
+ IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
+ END IF
+
+ END IF
+ END IF
+
+
+
+ controlref(controllevel) = linenumber
+ controltype(controllevel) = 10 + t
+ controlid(controllevel) = u
+ IF EveryCaseSet(SelectCaseCounter) THEN PRINT #13, "int32 sc_" + str2$(controlid(controllevel)) + "_var;"
+ IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_var=0;"
+ GOTO finishedline
+ END IF
+ END IF
+
+
+ 'END SELECT
+ IF n = 2 THEN
+ IF firstelement$ = "END" AND secondelement$ = "SELECT" THEN
+ 'complete current case if necessary
+ '18=CASE (awaiting END SELECT/CASE/CASE ELSE)
+ '19=CASE ELSE (awaiting END SELECT)
+ IF controltype(controllevel) = 18 THEN
+ controllevel = controllevel - 1
+ IF EveryCaseSet(SelectCaseCounter) = 0 THEN PRINT #12, "goto sc_" + str2$(controlid(controllevel)) + "_end;"
+ PRINT #12, "}"
+ END IF
+ IF controltype(controllevel) = 19 THEN
+ controllevel = controllevel - 1
+ IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "} /* End of SELECT EVERYCASE ELSE */"
+ END IF
+ PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_end:;"
+ IF controltype(controllevel) < 10 OR controltype(controllevel) > 17 THEN a$ = "END SELECT without SELECT CASE": GOTO errmes
+ controllevel = controllevel - 1
+ SelectCaseCounter = SelectCaseCounter - 1
+ l$ = "END" + sp + "SELECT"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec '***no error causing code, event checking done by SELECT CASE***
+ END IF
+ END IF
+
+ 'Steve Edit on 07-05-2014 to generate an error message if someone inserts code between SELECT CASE and CASE such as:
+ 'SELECT CASE x
+ 'm = 3
+ 'CASE 1
+ 'END SELECT
+ 'The above used to give no errors, but this one line fix should correct that. (I hope)
+ IF n >= 1 AND firstelement$ <> "CASE" AND controltype(controllevel) >= 10 AND controltype(controllevel) < 17 THEN a$ = "Expected CASE expression": GOTO errmes
+ 'End of Edit
+
+
+ 'CASE
+ IF n >= 1 THEN
+ IF firstelement$ = "CASE" THEN
+
+ l$ = "CASE"
+ 'complete current case if necessary
+ '18=CASE (awaiting END SELECT/CASE/CASE ELSE)
+ '19=CASE ELSE (awaiting END SELECT)
+ IF controltype(controllevel) = 19 THEN a$ = "Expected END SELECT": GOTO errmes
+ IF controltype(controllevel) = 18 THEN
+ lhscontrollevel = lhscontrollevel - 1
+ controllevel = controllevel - 1
+ IF EveryCaseSet(SelectCaseCounter) = 0 THEN
+ PRINT #12, "goto sc_" + str2$(controlid(controllevel)) + "_end;"
+ ELSE
+ PRINT #12, "sc_" + str2$(controlid(controllevel)) + "_var=-1;"
+ END IF
+ PRINT #12, "}"
+ 'following line fixes problem related to RESUME after error
+ 'statementn = statementn + 1
+ 'if nochecks=0 then PRINT #12, "S_" + str2$(statementn) + ":;"
+ END IF
+
+ IF controltype(controllevel) < 10 OR controltype(controllevel) > 17 THEN a$ = "CASE without SELECT CASE": GOTO errmes
+ IF n = 1 THEN a$ = "Expected CASE expression": GOTO errmes
+
+
+
+ 'upgrade:
+ '#1: variables can be referred to directly by storing an id in 'controlref'
+ ' (but not if part of an array etc.)
+ 'DIM controlvalue(1000) AS LONG
+ '#2: more types will be available
+ ' +SINGLE
+ ' +DOUBLE
+ ' -LONG DOUBLE
+ ' +INT32
+ ' +UINT32
+ '14=SELECT CASE float ...
+ '15=SELECT CASE double
+ '16=SELECT CASE int32
+ '17=SELECT CASE uint32
+
+ '10=SELECT CASE qbs (awaiting END SELECT/CASE)
+ '11=SELECT CASE int64 (awaiting END SELECT/CASE)
+ '12=SELECT CASE uint64 (awaiting END SELECT/CASE)
+ '13=SELECT CASE LONG double (awaiting END SELECT/CASE/CASE ELSE)
+ '14=SELECT CASE float ...
+ '15=SELECT CASE double
+ '16=SELECT CASE int32
+ '17=SELECT CASE uint32
+
+ ' bits = targettyp AND 511
+ ' IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
+ ' IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
+ ' IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
+
+
+ t = controltype(controllevel) - 10
+ 'get required type cast, and float options
+ flt = 0
+ IF t = 0 THEN tc$ = ""
+ IF t = 1 THEN tc$ = ""
+ IF t = 2 THEN tc$ = ""
+ IF t = 3 THEN tc$ = "": flt = 1
+ IF t = 4 THEN tc$ = "(float)": flt = 1
+ IF t = 5 THEN tc$ = "(double)": flt = 1
+ IF t = 6 THEN tc$ = ""
+ IF t = 7 THEN tc$ = ""
+
+ n$ = "sc_" + str2$(controlid(controllevel))
+ cv = controlvalue(controllevel)
+ IF cv THEN
+ n$ = refer$(str2$(cv), 0, 0)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+
+ 'CASE ELSE
+ IF n = 2 THEN
+ IF getelement$(a$, 2) = "C-EL" THEN
+ IF EveryCaseSet(SelectCaseCounter) THEN PRINT #12, "if (sc_" + str2$(controlid(controllevel)) + "_var==0) {"
+ controllevel = controllevel + 1: controltype(controllevel) = 19
+ controlref(controllevel) = controlref(controllevel - 1)
+ l$ = l$ + sp + "ELSE"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishednonexec '***no error causing code, event checking done by SELECT CASE***
+ END IF
+ END IF
+
+ IF NoChecks = 0 THEN PRINT #12, "S_" + str2$(statementn) + ":;": dynscope = 1
+
+
+
+ f12$ = ""
+
+ nexp = 0
+ B = 0
+ e$ = ""
+ FOR i = 2 TO n
+ e2$ = getelement$(ca$, i)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF i = n THEN e$ = e$ + sp + e2$
+ IF i = n OR (e2$ = "," AND B = 0) THEN
+ IF nexp <> 0 THEN l$ = l$ + sp2 + ",": f12$ = f12$ + "||"
+ IF e$ = "" THEN a$ = "Expected expression": GOTO errmes
+ e$ = RIGHT$(e$, LEN(e$) - 1)
+
+
+
+ 'TYPE 1? ... TO ...
+ n2 = numelements(e$)
+ b2 = 0
+ el$ = "": er$ = ""
+ usedto = 0
+ FOR i2 = 1 TO n2
+ e3$ = getelement$(e$, i2)
+ IF e3$ = "(" THEN b2 = b2 + 1
+ IF e3$ = ")" THEN b2 = b2 - 1
+ IF b2 = 0 AND UCASE$(e3$) = "TO" THEN
+ usedto = 1
+ ELSE
+ IF usedto = 0 THEN el$ = el$ + sp + e3$ ELSE er$ = er$ + sp + e3$
+ END IF
+ NEXT
+ IF usedto = 1 THEN
+ IF el$ = "" OR er$ = "" THEN a$ = "Expected expression TO expression": GOTO errmes
+ el$ = RIGHT$(el$, LEN(el$) - 1): er$ = RIGHT$(er$, LEN(er$) - 1)
+ 'evaluate each side
+ FOR i2 = 1 TO 2
+ IF i2 = 1 THEN e$ = el$ ELSE e$ = er$
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ IF i2 = 1 THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + "TO" + sp + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ IF t = 0 THEN
+ IF (typ AND ISSTRING) = 0 THEN a$ = "Expected string expression": GOTO errmes
+ IF i2 = 1 THEN f12$ = f12$ + "(qbs_greaterorequal(" + n$ + "," + e$ + ")&&qbs_lessorequal(" + n$ + ","
+ IF i2 = 2 THEN f12$ = f12$ + e$ + "))"
+ ELSE
+ IF (typ AND ISSTRING) THEN a$ = "Expected numeric expression": GOTO errmes
+ 'round to integer?
+ IF (typ AND ISFLOAT) THEN
+ IF t = 1 THEN e$ = "qbr(" + e$ + ")"
+ IF t = 2 THEN e$ = "qbr_longdouble_to_uint64(" + e$ + ")"
+ IF t = 6 OR t = 7 THEN e$ = "qbr_double_to_long(" + e$ + ")"
+ END IF
+ 'cast result?
+ IF LEN(tc$) THEN e$ = tc$ + "(" + e$ + ")"
+ IF i2 = 1 THEN f12$ = f12$ + "((" + n$ + ">=(" + e$ + "))&&(" + n$ + "<=("
+ IF i2 = 2 THEN f12$ = f12$ + e$ + ")))"
+ END IF
+ NEXT
+ GOTO addedexp
+ END IF
+
+ '10=SELECT CASE qbs (awaiting END SELECT/CASE)
+ '11=SELECT CASE int64 (awaiting END SELECT/CASE)
+ '12=SELECT CASE uint64 (awaiting END SELECT/CASE)
+ '13=SELECT CASE LONG double (awaiting END SELECT/CASE/CASE ELSE)
+ '14=SELECT CASE float ...
+ '15=SELECT CASE double
+ '16=SELECT CASE int32
+ '17=SELECT CASE uint32
+
+ ' bits = targettyp AND 511
+ ' IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
+ ' IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
+ ' IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
+
+
+
+
+
+
+ o$ = "==" 'used by type 3
+
+ 'TYPE 2?
+ x$ = getelement$(e$, 1)
+ IF isoperator(x$) THEN 'non-standard usage correction
+ IF x$ = "=" OR x$ = "<>" OR x$ = ">" OR x$ = "<" OR x$ = ">=" OR x$ = "<=" THEN
+ e$ = "IS" + sp + e$
+ x$ = "IS"
+ END IF
+ END IF
+ IF UCASE$(x$) = "IS" THEN
+ n2 = numelements(e$)
+ IF n2 < 3 THEN a$ = "Expected IS =,<>,>,<,>=,<= expression": GOTO errmes
+ o$ = getelement$(e$, 2)
+ o2$ = o$
+ o = 0
+ IF o$ = "=" THEN o$ = "==": o = 1
+ IF o$ = "<>" THEN o$ = "!=": o = 1
+ IF o$ = ">" THEN o = 1
+ IF o$ = "<" THEN o = 1
+ IF o$ = ">=" THEN o = 1
+ IF o$ = "<=" THEN o = 1
+ IF o <> 1 THEN a$ = "Expected IS =,<>,>,<,>=,<= expression": GOTO errmes
+ l$ = l$ + sp + "IS" + sp + o2$
+ e$ = getelements$(e$, 3, n2)
+ 'fall through to type 3 using modified e$ & o$
+ END IF
+
+ 'TYPE 3? simple expression
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ IF t = 0 THEN
+ 'string comparison
+ IF (typ AND ISSTRING) = 0 THEN a$ = "Expected string expression": GOTO errmes
+ IF o$ = "==" THEN o$ = "qbs_equal"
+ IF o$ = "!=" THEN o$ = "qbs_notequal"
+ IF o$ = ">" THEN o$ = "qbs_greaterthan"
+ IF o$ = "<" THEN o$ = "qbs_lessthan"
+ IF o$ = ">=" THEN o$ = "qbs_greaterorequal"
+ IF o$ = "<=" THEN o$ = "qbs_lessorequal"
+ f12$ = f12$ + o$ + "(" + n$ + "," + e$ + ")"
+ ELSE
+ 'numeric
+ IF (typ AND ISSTRING) THEN a$ = "Expected numeric expression": GOTO errmes
+ 'round to integer?
+ IF (typ AND ISFLOAT) THEN
+ IF t = 1 THEN e$ = "qbr(" + e$ + ")"
+ IF t = 2 THEN e$ = "qbr_longdouble_to_uint64(" + e$ + ")"
+ IF t = 6 OR t = 7 THEN e$ = "qbr_double_to_long(" + e$ + ")"
+ END IF
+ 'cast result?
+ IF LEN(tc$) THEN e$ = tc$ + "(" + e$ + ")"
+ f12$ = f12$ + "(" + n$ + o$ + "(" + e$ + "))"
+ END IF
+
+ addedexp:
+ e$ = ""
+ nexp = nexp + 1
+ ELSE
+ e$ = e$ + sp + e2$
+ END IF
+ NEXT
+
+ IF stringprocessinghappened THEN
+ PRINT #12, "if ((" + cleanupstringprocessingcall$ + f12$ + "))||new_error){"
+ ELSE
+ PRINT #12, "if ((" + f12$ + ")||new_error){"
+ END IF
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ controllevel = controllevel + 1
+ controlref(controllevel) = controlref(controllevel - 1)
+ controltype(controllevel) = 18
+ GOTO finishedline
+ END IF
+ END IF
+
+
+
+
+
+
+
+
+
+
+
+
+ 'static scope commands:
+
+ IF NoChecks = 0 THEN
+ PRINT #12, "do{"
+ 'PRINT #12, "S_" + str2$(statementn) + ":;"
+ END IF
+
+
+ IF n > 1 THEN
+ IF firstelement$ = "PALETTE" THEN
+ IF secondelement$ = "USING" THEN
+ l$ = "PALETTE" + sp + "USING" + sp
+ IF n < 3 THEN a$ = "Expected PALETTE USING array-name": GOTO errmes
+ 'check array
+ e$ = getelement$(ca$, 3)
+ IF FindArray(e$) THEN
+ IF Error_Happened THEN GOTO errmes
+ z = 1
+ t = id.arraytype
+ IF (t AND 511) <> 16 AND (t AND 511) <> 32 THEN z = 0
+ IF t AND ISFLOAT THEN z = 0
+ IF t AND ISOFFSETINBITS THEN z = 0
+ IF t AND ISSTRING THEN z = 0
+ IF t AND ISUDT THEN z = 0
+ IF t AND ISUNSIGNED THEN z = 0
+ IF z = 0 THEN a$ = "Array must be of type INTEGER or LONG": GOTO errmes
+ bits = t AND 511
+ GOTO pu_gotarray
+ END IF
+ IF Error_Happened THEN GOTO errmes
+ a$ = "Expected PALETTE USING array-name": GOTO errmes
+ pu_gotarray:
+ 'add () if index not specified
+ IF n = 3 THEN
+ e$ = e$ + sp + "(" + sp + ")"
+ ELSE
+ IF n = 4 OR getelement$(a$, 4) <> "(" OR getelement$(a$, n) <> ")" THEN a$ = "Expected PALETTE USING array-name(...)": GOTO errmes
+ e$ = e$ + sp + getelements$(ca$, 4, n)
+ END IF
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$
+ e$ = evaluatetotyp(e$, -2)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_paletteusing(" + e$ + "," + str2(bits) + ");"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF 'using
+ END IF 'palette
+ END IF 'n>1
+
+
+ IF firstelement$ = "KEY" THEN
+ IF n = 1 THEN a$ = "Expected KEY ...": GOTO errmes
+ l$ = "KEY" + sp
+ IF secondelement$ = "OFF" THEN
+ IF n > 2 THEN a$ = "Expected KEY OFF only": GOTO errmes
+ l$ = l$ + "OFF": layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ PRINT #12, "key_off();"
+ GOTO finishedline
+ END IF
+ IF secondelement$ = "ON" THEN
+ IF n > 2 THEN a$ = "Expected KEY ON only": GOTO errmes
+ l$ = l$ + "ON": layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ PRINT #12, "key_on();"
+ GOTO finishedline
+ END IF
+ IF secondelement$ = "LIST" THEN
+ IF n > 2 THEN a$ = "Expected KEY LIST only": GOTO errmes
+ l$ = l$ + "LIST": layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ PRINT #12, "key_list();"
+ GOTO finishedline
+ END IF
+ 'search for comma to indicate assignment
+ B = 0: e$ = ""
+ FOR i = 2 TO n
+ e2$ = getelement(ca$, i)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF e2$ = "," AND B = 0 THEN
+ i = i + 1: GOTO key_assignment
+ END IF
+ IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
+ NEXT
+ 'assume KEY(x) ON/OFF/STOP and handle as a sub
+ GOTO key_fallthrough
+ key_assignment:
+ 'KEY x, "string"
+ 'index
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$ + sp2 + "," + sp
+ e$ = evaluatetotyp(e$, 32&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "key_assign(" + e$ + ",";
+ 'string
+ e$ = getelements$(ca$, i, n)
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$
+ e$ = evaluatetotyp(e$, ISSTRING)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, e$ + ");"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF 'KEY
+ key_fallthrough:
+
+
+
+
+ IF firstelement$ = "FIELD" THEN
+
+ 'get filenumber
+ B = 0: e$ = ""
+ FOR i = 2 TO n
+ e2$ = getelement(ca$, i)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF e2$ = "," AND B = 0 THEN
+ i = i + 1: GOTO fieldgotfn
+ END IF
+ IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
+ NEXT
+ GOTO fielderror
+ fieldgotfn:
+ IF e$ = "#" OR LEN(e$) = 0 THEN GOTO fielderror
+ IF LEFT$(e$, 2) = "#" + sp THEN e$ = RIGHT$(e$, LEN(e$) - 2): l$ = "FIELD" + sp + "#" + sp2 ELSE l$ = "FIELD" + sp
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$ + sp2 + "," + sp
+ e$ = evaluatetotyp(e$, 32&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "field_new(" + e$ + ");"
+
+ fieldnext:
+
+ 'get fieldwidth
+ IF i > n THEN GOTO fielderror
+ B = 0: e$ = ""
+ FOR i = i TO n
+ e2$ = getelement(ca$, i)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF UCASE$(e2$) = "AS" AND B = 0 THEN
+ i = i + 1: GOTO fieldgotfw
+ END IF
+ IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
+ NEXT
+ GOTO fielderror
+ fieldgotfw:
+ IF LEN(e$) = 0 THEN GOTO fielderror
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$ + sp + "AS" + sp
+ sizee$ = evaluatetotyp(e$, 32&)
+ IF Error_Happened THEN GOTO errmes
+
+ 'get variable name
+ IF i > n THEN GOTO fielderror
+ B = 0: e$ = ""
+ FOR i = i TO n
+ e2$ = getelement(ca$, i)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF (i = n OR e2$ = ",") AND B = 0 THEN
+ IF e2$ = "," THEN i = i - 1
+ IF i = n THEN
+ IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
+ END IF
+ GOTO fieldgotfname
+ END IF
+ IF LEN(e$) THEN e$ = e$ + sp + e2$ ELSE e$ = e2$
+ NEXT
+ GOTO fielderror
+ fieldgotfname:
+ IF LEN(e$) = 0 THEN GOTO fielderror
+ 'evaluate it to check it is a STRING
+ e$ = fixoperationorder(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISSTRING) = 0 THEN GOTO fielderror
+ IF typ AND ISFIXEDLENGTH THEN a$ = "Fixed length strings cannot be used in a FIELD statement": GOTO errmes
+ IF (typ AND ISREFERENCE) = 0 THEN GOTO fielderror
+ e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "field_add(" + e$ + "," + sizee$ + ");"
+
+ IF i < n THEN
+ i = i + 1
+ e$ = getelement(a$, i)
+ IF e$ <> "," THEN a$ = "Expected ,": GOTO errmes
+ l$ = l$ + sp2 + "," + sp
+ i = i + 1
+ GOTO fieldnext
+ END IF
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+
+ fielderror: a$ = "Expected FIELD #filenumber, characters AS variable$, ...": GOTO errmes
+ END IF
+
+
+
+
+
+ '1=IF (awaiting END IF)
+ '2=FOR (awaiting NEXT)
+ '3=DO (awaiting LOOP [UNTIL|WHILE param])
+ '4=DO WHILE/UNTIL (awaiting LOOP)
+ '5=WHILE (awaiting WEND)
+
+ IF n = 2 THEN
+ IF firstelement$ = "EXIT" THEN
+
+ l$ = firstelement$ + sp + secondelement$
+
+ IF secondelement$ = "DO" THEN
+ 'scan backwards until previous control level reached
+ FOR i = controllevel TO 1 STEP -1
+ t = controltype(i)
+ IF t = 3 OR t = 4 THEN
+ PRINT #12, "goto dl_exit_" + str2$(controlid(i)) + ";"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ NEXT
+ a$ = "EXIT DO without DO": GOTO errmes
+ END IF
+
+ IF secondelement$ = "FOR" THEN
+ 'scan backwards until previous control level reached
+ FOR i = controllevel TO 1 STEP -1
+ t = controltype(i)
+ IF t = 2 THEN
+ PRINT #12, "goto fornext_exit_" + str2$(controlid(i)) + ";"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ NEXT
+ a$ = "EXIT FOR without FOR": GOTO errmes
+ END IF
+
+ IF secondelement$ = "WHILE" THEN
+ 'scan backwards until previous control level reached
+ FOR i = controllevel TO 1 STEP -1
+ t = controltype(i)
+ IF t = 5 THEN
+ PRINT #12, "goto ww_exit_" + str2$(controlid(i)) + ";"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ NEXT
+ a$ = "EXIT WHILE without WHILE": GOTO errmes
+ END IF
+
+ END IF
+ END IF
+
+
+
+
+
+
+
+
+ IF n >= 2 THEN
+ IF firstelement$ = "ON" AND secondelement$ = "STRIG" THEN
+ DEPENDENCY(DEPENDENCY_DEVICEINPUT) = 1
+ i = 3
+ IF i > n THEN a$ = "Expected (": GOTO errmes
+ a2$ = getelement$(ca$, i): i = i + 1
+ IF a2$ <> "(" THEN a$ = "Expected (": GOTO errmes
+ l$ = "ON" + sp + "STRIG" + sp2 + "("
+ IF i > n THEN a$ = "Expected ...": GOTO errmes
+ B = 0
+ x = 0
+ e2$ = ""
+ e3$ = ""
+ FOR i = i TO n
+ e$ = getelement$(ca$, i)
+ a = ASC(e$)
+ IF a = 40 THEN B = B + 1
+ IF a = 41 THEN B = B - 1
+ IF B = -1 THEN GOTO onstriggotarg
+ IF a = 44 AND B = 0 THEN
+ x = x + 1
+ IF x > 1 THEN a$ = "Expected )": GOTO errmes
+ IF e2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
+ e3$ = e2$
+ e2$ = ""
+ ELSE
+ IF LEN(e2$) THEN e2$ = e2$ + sp + e$ ELSE e2$ = e$
+ END IF
+ NEXT
+ a$ = "Expected )": GOTO errmes
+ onstriggotarg:
+ IF e2$ = "" THEN a$ = "Expected ... )": GOTO errmes
+ PRINT #12, "onstrig_setup(";
+
+ 'sort scanned results
+ IF LEN(e3$) THEN
+ optI$ = e3$
+ optController$ = e2$
+ optPassed$ = "1"
+ ELSE
+ optI$ = e2$
+ optController$ = "0"
+ optPassed$ = "0"
+ END IF
+
+ 'i
+ e$ = fixoperationorder$(optI$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + tlayout$
+ e$ = evaluatetotyp(e$, 32&): IF Error_Happened THEN GOTO errmes
+ PRINT #12, e$ + ",";
+
+ 'controller , passed
+ IF optPassed$ = "1" THEN
+ e$ = fixoperationorder$(optController$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ e$ = evaluatetotyp(e$, 32&): IF Error_Happened THEN GOTO errmes
+ ELSE
+ e$ = optController$
+ END IF
+ PRINT #12, e$ + "," + optPassed$ + ",";
+
+ l$ = l$ + sp2 + ")" + sp 'close brackets
+
+ i = i + 1
+ IF i > n THEN a$ = "Expected GOSUB/sub-name": GOTO errmes
+ a2$ = getelement$(a$, i): i = i + 1
+ onstrigid = onstrigid + 1
+ PRINT #12, str2$(onstrigid) + ",";
+
+ IF a2$ = "GOSUB" THEN
+ IF i > n THEN a$ = "Expected linenumber/label": GOTO errmes
+ a2$ = getelement$(ca$, i): i = i + 1
+
+ PRINT #12, "0);"
+
+ IF validlabel(a2$) = 0 THEN a$ = "Invalid label": GOTO errmes
+
+ v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk60z:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = 0 OR s = -1 THEN 'main scope?
+ IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ Labels(r).Scope_Restriction = subfuncn
+ Labels(r).Error_Line = linenumber
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk60z
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd a2$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = 0
+ Labels(r).Error_Line = linenumber
+ Labels(r).Scope_Restriction = subfuncn
+ END IF 'x
+ l$ = l$ + "GOSUB" + sp + tlayout$
+
+ PRINT #30, "if(strig_event_id==" + str2$(onstrigid) + ")goto LABEL_" + a2$ + ";"
+
+ PRINT #29, "case " + str2$(onstrigid) + ":"
+ PRINT #29, "strig_event_occurred++;"
+ PRINT #29, "strig_event_id=" + str2$(onstrigid) + ";"
+ PRINT #29, "strig_event_occurred++;"
+ PRINT #29, "return_point[next_return_point++]=0;"
+ PRINT #29, "if (next_return_point>=return_points) more_return_points();"
+ PRINT #29, "QBMAIN(NULL);"
+ PRINT #29, "break;"
+
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ layoutdone = 1
+ GOTO finishedline
+
+ ELSE
+
+ 'establish whether sub a2$ exists using try
+ x = 0
+ try = findid(a2$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.subfunc = 2 THEN x = 1: EXIT DO
+ IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ IF x = 0 THEN a$ = "Expected GOSUB/sub": GOTO errmes
+
+ l$ = l$ + RTRIM$(id.cn)
+
+ PRINT #29, "case " + str2$(onstrigid) + ":"
+ PRINT #29, RTRIM$(id.callname) + "(";
+
+ IF id.args > 1 THEN a$ = "SUB requires more than one argument": GOTO errmes
+
+ IF i > n THEN
+
+ IF id.args = 1 THEN a$ = "Expected argument after SUB": GOTO errmes
+ PRINT #12, "0);"
+ PRINT #29, ");"
+
+ ELSE
+
+ IF id.args = 0 THEN a$ = "SUB has no arguments": GOTO errmes
+
+ t = CVL(id.arg)
+ B = t AND 511
+ IF B = 0 OR (t AND ISARRAY) <> 0 OR (t AND ISFLOAT) <> 0 OR (t AND ISSTRING) <> 0 OR (t AND ISOFFSETINBITS) <> 0 THEN a$ = "Only SUB arguments of integer-type allowed": GOTO errmes
+ IF B = 8 THEN ct$ = "int8"
+ IF B = 16 THEN ct$ = "int16"
+ IF B = 32 THEN ct$ = "int32"
+ IF B = 64 THEN ct$ = "int64"
+ IF t AND ISOFFSET THEN ct$ = "ptrszint"
+ IF t AND ISUNSIGNED THEN ct$ = "u" + ct$
+ PRINT #29, "(" + ct$ + "*)&i64);"
+
+ e$ = getelements$(ca$, i, n)
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluatetotyp(e$, INTEGER64TYPE - ISPOINTER)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, e$ + ");"
+
+ END IF
+
+ PRINT #29, "break;"
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ layoutdone = 1
+ GOTO finishedline
+ END IF
+
+ END IF
+ END IF
+
+
+
+
+
+
+
+
+
+
+
+
+ IF n >= 2 THEN
+ IF firstelement$ = "ON" AND secondelement$ = "TIMER" THEN
+ i = 3
+ IF i > n THEN a$ = "Expected (": GOTO errmes
+ a2$ = getelement$(ca$, i): i = i + 1
+ IF a2$ <> "(" THEN a$ = "Expected (": GOTO errmes
+ l$ = "ON" + sp + "TIMER" + sp2 + "("
+ IF i > n THEN a$ = "Expected ...": GOTO errmes
+ B = 0
+ x = 0
+ e2$ = ""
+ e3$ = ""
+ FOR i = i TO n
+ e$ = getelement$(ca$, i)
+ a = ASC(e$)
+ IF a = 40 THEN B = B + 1
+ IF a = 41 THEN B = B - 1
+ IF B = -1 THEN GOTO ontimgotarg
+ IF a = 44 AND B = 0 THEN
+ x = x + 1
+ IF x > 1 THEN a$ = "Expected )": GOTO errmes
+ IF e2$ = "" THEN a$ = "Expected ... ,": GOTO errmes
+ e3$ = e2$
+ e2$ = ""
+ ELSE
+ IF LEN(e2$) THEN e2$ = e2$ + sp + e$ ELSE e2$ = e$
+ END IF
+ NEXT
+ a$ = "Expected )": GOTO errmes
+ ontimgotarg:
+ IF e2$ = "" THEN a$ = "Expected ... )": GOTO errmes
+ PRINT #12, "ontimer_setup(";
+ 'i
+ IF LEN(e3$) THEN
+ e$ = fixoperationorder$(e3$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + tlayout$ + "," + sp
+ e$ = evaluatetotyp(e$, 32&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, e$ + ",";
+ ELSE
+ PRINT #12, "0,";
+ l$ = l$ + sp2
+ END IF
+ 'sec
+ e$ = fixoperationorder$(e2$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$ + sp2 + ")" + sp
+ e$ = evaluatetotyp(e$, DOUBLETYPE - ISPOINTER)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, e$ + ",";
+ i = i + 1
+ IF i > n THEN a$ = "Expected GOSUB/sub-name": GOTO errmes
+ a2$ = getelement$(a$, i): i = i + 1
+ ontimerid = ontimerid + 1
+ PRINT #12, str2$(ontimerid) + ",";
+
+ IF a2$ = "GOSUB" THEN
+ IF i > n THEN a$ = "Expected linenumber/label": GOTO errmes
+ a2$ = getelement$(ca$, i): i = i + 1
+
+ PRINT #12, "0);"
+
+ IF validlabel(a2$) = 0 THEN a$ = "Invalid label": GOTO errmes
+
+ v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk60:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = 0 OR s = -1 THEN 'main scope?
+ IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ Labels(r).Scope_Restriction = subfuncn
+ Labels(r).Error_Line = linenumber
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk60
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd a2$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = 0
+ Labels(r).Error_Line = linenumber
+ Labels(r).Scope_Restriction = subfuncn
+ END IF 'x
+ l$ = l$ + "GOSUB" + sp + tlayout$
+
+ PRINT #25, "if(timer_event_id==" + str2$(ontimerid) + ")goto LABEL_" + a2$ + ";"
+
+ PRINT #24, "case " + str2$(ontimerid) + ":"
+ PRINT #24, "timer_event_occurred++;"
+ PRINT #24, "timer_event_id=" + str2$(ontimerid) + ";"
+ PRINT #24, "timer_event_occurred++;"
+ PRINT #24, "return_point[next_return_point++]=0;"
+ PRINT #24, "if (next_return_point>=return_points) more_return_points();"
+ PRINT #24, "QBMAIN(NULL);"
+ PRINT #24, "break;"
+
+
+
+ 'call validlabel (to validate the label) [see goto]
+ 'increment ontimerid
+ 'use ontimerid to generate the jumper routine
+ 'etc.
+
+
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ layoutdone = 1
+ GOTO finishedline
+ ELSE
+
+ 'establish whether sub a2$ exists using try
+ x = 0
+ try = findid(a2$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.subfunc = 2 THEN x = 1: EXIT DO
+ IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ IF x = 0 THEN a$ = "Expected GOSUB/sub": GOTO errmes
+
+ l$ = l$ + RTRIM$(id.cn)
+
+ PRINT #24, "case " + str2$(ontimerid) + ":"
+ PRINT #24, RTRIM$(id.callname) + "(";
+
+ IF id.args > 1 THEN a$ = "SUB requires more than one argument": GOTO errmes
+
+ IF i > n THEN
+
+ IF id.args = 1 THEN a$ = "Expected argument after SUB": GOTO errmes
+ PRINT #12, "0);"
+ PRINT #24, ");"
+
+ ELSE
+
+ IF id.args = 0 THEN a$ = "SUB has no arguments": GOTO errmes
+
+ t = CVL(id.arg)
+ B = t AND 511
+ IF B = 0 OR (t AND ISARRAY) <> 0 OR (t AND ISFLOAT) <> 0 OR (t AND ISSTRING) <> 0 OR (t AND ISOFFSETINBITS) <> 0 THEN a$ = "Only SUB arguments of integer-type allowed": GOTO errmes
+ IF B = 8 THEN ct$ = "int8"
+ IF B = 16 THEN ct$ = "int16"
+ IF B = 32 THEN ct$ = "int32"
+ IF B = 64 THEN ct$ = "int64"
+ IF t AND ISOFFSET THEN ct$ = "ptrszint"
+ IF t AND ISUNSIGNED THEN ct$ = "u" + ct$
+ PRINT #24, "(" + ct$ + "*)&i64);"
+
+ e$ = getelements$(ca$, i, n)
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluatetotyp(e$, INTEGER64TYPE - ISPOINTER)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, e$ + ");"
+
+ END IF
+
+ PRINT #24, "break;"
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ layoutdone = 1
+ GOTO finishedline
+ END IF
+
+ END IF
+ END IF
+
+
+
+
+ IF n >= 2 THEN
+ IF firstelement$ = "ON" AND secondelement$ = "KEY" THEN
+ i = 3
+ IF i > n THEN a$ = "Expected (": GOTO errmes
+ a2$ = getelement$(ca$, i): i = i + 1
+ IF a2$ <> "(" THEN a$ = "Expected (": GOTO errmes
+ l$ = "ON" + sp + "KEY" + sp2 + "("
+ IF i > n THEN a$ = "Expected ...": GOTO errmes
+ B = 0
+ x = 0
+ e2$ = ""
+ FOR i = i TO n
+ e$ = getelement$(ca$, i)
+ a = ASC(e$)
+
+
+ IF a = 40 THEN B = B + 1
+ IF a = 41 THEN B = B - 1
+ IF B = -1 THEN EXIT FOR
+ IF LEN(e2$) THEN e2$ = e2$ + sp + e$ ELSE e2$ = e$
+ NEXT
+ IF i = n + 1 THEN a$ = "Expected )": GOTO errmes
+ IF e2$ = "" THEN a$ = "Expected ... )": GOTO errmes
+
+ e$ = fixoperationorder$(e2$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$ + sp2 + ")" + sp
+ e$ = evaluatetotyp(e$, DOUBLETYPE - ISPOINTER)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "onkey_setup(" + e$ + ",";
+
+ i = i + 1
+ IF i > n THEN a$ = "Expected GOSUB/sub-name": GOTO errmes
+ a2$ = getelement$(a$, i): i = i + 1
+ onkeyid = onkeyid + 1
+ PRINT #12, str2$(onkeyid) + ",";
+
+ IF a2$ = "GOSUB" THEN
+ IF i > n THEN a$ = "Expected linenumber/label": GOTO errmes
+ a2$ = getelement$(ca$, i): i = i + 1
+
+ PRINT #12, "0);"
+
+ IF validlabel(a2$) = 0 THEN a$ = "Invalid label": GOTO errmes
+
+ v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk61:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = 0 OR s = -1 THEN 'main scope?
+ IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ Labels(r).Scope_Restriction = subfuncn
+ Labels(r).Error_Line = linenumber
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk61
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd a2$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = 0
+ Labels(r).Error_Line = linenumber
+ Labels(r).Scope_Restriction = subfuncn
+ END IF 'x
+ l$ = l$ + "GOSUB" + sp + tlayout$
-PRINT #28, "if(key_event_id==" + str2$(onkeyid) + ")goto LABEL_" + a2$ + ";"
+ PRINT #28, "if(key_event_id==" + str2$(onkeyid) + ")goto LABEL_" + a2$ + ";"
-PRINT #27, "case " + str2$(onkeyid) + ":"
-PRINT #27, "key_event_occurred++;"
-PRINT #27, "key_event_id=" + str2$(onkeyid) + ";"
-PRINT #27, "key_event_occurred++;"
-PRINT #27, "return_point[next_return_point++]=0;"
-PRINT #27, "if (next_return_point>=return_points) more_return_points();"
-PRINT #27, "QBMAIN(NULL);"
-PRINT #27, "break;"
+ PRINT #27, "case " + str2$(onkeyid) + ":"
+ PRINT #27, "key_event_occurred++;"
+ PRINT #27, "key_event_id=" + str2$(onkeyid) + ";"
+ PRINT #27, "key_event_occurred++;"
+ PRINT #27, "return_point[next_return_point++]=0;"
+ PRINT #27, "if (next_return_point>=return_points) more_return_points();"
+ PRINT #27, "QBMAIN(NULL);"
+ PRINT #27, "break;"
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-layoutdone = 1
-GOTO finishedline
-ELSE
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ layoutdone = 1
+ GOTO finishedline
+ ELSE
-'establish whether sub a2$ exists using try
-x = 0
-try = findid(a2$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.subfunc = 2 THEN x = 1: EXIT DO
-IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-IF x = 0 THEN a$ = "Expected GOSUB/sub": GOTO errmes
+ 'establish whether sub a2$ exists using try
+ x = 0
+ try = findid(a2$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.subfunc = 2 THEN x = 1: EXIT DO
+ IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ IF x = 0 THEN a$ = "Expected GOSUB/sub": GOTO errmes
-l$ = l$ + RTRIM$(id.cn)
+ l$ = l$ + RTRIM$(id.cn)
-PRINT #27, "case " + str2$(onkeyid) + ":"
-PRINT #27, RTRIM$(id.callname) + "(";
+ PRINT #27, "case " + str2$(onkeyid) + ":"
+ PRINT #27, RTRIM$(id.callname) + "(";
-IF id.args > 1 THEN a$ = "SUB requires more than one argument": GOTO errmes
+ IF id.args > 1 THEN a$ = "SUB requires more than one argument": GOTO errmes
-IF i > n THEN
+ IF i > n THEN
-IF id.args = 1 THEN a$ = "Expected argument after SUB": GOTO errmes
-PRINT #12, "0);"
-PRINT #27, ");"
+ IF id.args = 1 THEN a$ = "Expected argument after SUB": GOTO errmes
+ PRINT #12, "0);"
+ PRINT #27, ");"
-ELSE
+ ELSE
-IF id.args = 0 THEN a$ = "SUB has no arguments": GOTO errmes
+ IF id.args = 0 THEN a$ = "SUB has no arguments": GOTO errmes
-t = CVL(id.arg)
-B = t AND 511
-IF B = 0 OR (t AND ISARRAY) <> 0 OR (t AND ISFLOAT) <> 0 OR (t AND ISSTRING) <> 0 OR (t AND ISOFFSETINBITS) <> 0 THEN a$ = "Only SUB arguments of integer-type allowed": GOTO errmes
-IF B = 8 THEN ct$ = "int8"
-IF B = 16 THEN ct$ = "int16"
-IF B = 32 THEN ct$ = "int32"
-IF B = 64 THEN ct$ = "int64"
-IF t AND ISOFFSET THEN ct$ = "ptrszint"
-IF t AND ISUNSIGNED THEN ct$ = "u" + ct$
-PRINT #27, "(" + ct$ + "*)&i64);"
+ t = CVL(id.arg)
+ B = t AND 511
+ IF B = 0 OR (t AND ISARRAY) <> 0 OR (t AND ISFLOAT) <> 0 OR (t AND ISSTRING) <> 0 OR (t AND ISOFFSETINBITS) <> 0 THEN a$ = "Only SUB arguments of integer-type allowed": GOTO errmes
+ IF B = 8 THEN ct$ = "int8"
+ IF B = 16 THEN ct$ = "int16"
+ IF B = 32 THEN ct$ = "int32"
+ IF B = 64 THEN ct$ = "int64"
+ IF t AND ISOFFSET THEN ct$ = "ptrszint"
+ IF t AND ISUNSIGNED THEN ct$ = "u" + ct$
+ PRINT #27, "(" + ct$ + "*)&i64);"
-e$ = getelements$(ca$, i, n)
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluatetotyp(e$, INTEGER64TYPE - ISPOINTER)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, e$ + ");"
+ e$ = getelements$(ca$, i, n)
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluatetotyp(e$, INTEGER64TYPE - ISPOINTER)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, e$ + ");"
-END IF
+ END IF
-PRINT #27, "break;"
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-layoutdone = 1
-GOTO finishedline
-END IF
+ PRINT #27, "break;"
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ layoutdone = 1
+ GOTO finishedline
+ END IF
-END IF
-END IF
+ END IF
+ END IF
@@ -6325,2157 +6530,2157 @@ END IF
-'SHARED (SUB)
-IF n >= 1 THEN
-IF firstelement$ = "SHARED" THEN
-IF n = 1 THEN a$ = "Expected SHARED ...": GOTO errmes
-i = 2
-IF subfuncn = 0 THEN a$ = "SHARED must be used within a SUB/FUNCTION": GOTO errmes
+ 'SHARED (SUB)
+ IF n >= 1 THEN
+ IF firstelement$ = "SHARED" THEN
+ IF n = 1 THEN a$ = "Expected SHARED ...": GOTO errmes
+ i = 2
+ IF subfuncn = 0 THEN a$ = "SHARED must be used within a SUB/FUNCTION": GOTO errmes
-l$ = "SHARED"
-subfuncshr:
+ l$ = "SHARED"
+ subfuncshr:
-'get variable name
-n$ = getelement$(ca$, i): i = i + 1
+ 'get variable name
+ n$ = getelement$(ca$, i): i = i + 1
-IF n$ = "" THEN a$ = "Expected SHARED variable-name": GOTO errmes
+ IF n$ = "" THEN a$ = "Expected SHARED variable-name": GOTO errmes
-s$ = removesymbol(n$)
-IF Error_Happened THEN GOTO errmes
-l2$ = s$ 'either symbol or nothing
+ s$ = removesymbol(n$)
+ IF Error_Happened THEN GOTO errmes
+ l2$ = s$ 'either symbol or nothing
-'array?
-a = 0
-IF getelement$(a$, i) = "(" THEN
-IF getelement$(a$, i + 1) <> ")" THEN a$ = "Expected ()": GOTO errmes
-i = i + 2
-a = 1
-l2$ = l2$ + sp2 + "(" + sp2 + ")"
-END IF
+ 'array?
+ a = 0
+ IF getelement$(a$, i) = "(" THEN
+ IF getelement$(a$, i + 1) <> ")" THEN a$ = "Expected ()": GOTO errmes
+ i = i + 2
+ a = 1
+ l2$ = l2$ + sp2 + "(" + sp2 + ")"
+ END IF
-method = 1
+ method = 1
-'specific type?
-t$ = ""
-ts$ = ""
-t3$ = ""
-IF getelement$(a$, i) = "AS" THEN
-l2$ = l2$ + sp + "AS"
-getshrtyp:
-i = i + 1
-t2$ = getelement$(a$, i)
-IF t2$ <> "," AND t2$ <> "" THEN
-IF t$ = "" THEN t$ = t2$ ELSE t$ = t$ + " " + t2$
-IF t3$ = "" THEN t3$ = t2$ ELSE t3$ = t3$ + sp + t2$
-GOTO getshrtyp
-END IF
-IF t$ = "" THEN a$ = "Expected AS type": GOTO errmes
+ 'specific type?
+ t$ = ""
+ ts$ = ""
+ t3$ = ""
+ IF getelement$(a$, i) = "AS" THEN
+ l2$ = l2$ + sp + "AS"
+ getshrtyp:
+ i = i + 1
+ t2$ = getelement$(a$, i)
+ IF t2$ <> "," AND t2$ <> "" THEN
+ IF t$ = "" THEN t$ = t2$ ELSE t$ = t$ + " " + t2$
+ IF t3$ = "" THEN t3$ = t2$ ELSE t3$ = t3$ + sp + t2$
+ GOTO getshrtyp
+ END IF
+ IF t$ = "" THEN a$ = "Expected AS type": GOTO errmes
-t = typname2typ(t$)
-IF Error_Happened THEN GOTO errmes
-IF t AND ISINCONVENTIONALMEMORY THEN t = t - ISINCONVENTIONALMEMORY
-IF t AND ISPOINTER THEN t = t - ISPOINTER
-IF t AND ISREFERENCE THEN t = t - ISREFERENCE
-tsize = typname2typsize
-method = 0
-IF (t AND ISUDT) = 0 THEN ts$ = type2symbol$(t$) ELSE t3$ = RTRIM$(udtxcname(t AND 511))
-IF Error_Happened THEN GOTO errmes
-l2$ = l2$ + sp + t3$
+ t = typname2typ(t$)
+ IF Error_Happened THEN GOTO errmes
+ IF t AND ISINCONVENTIONALMEMORY THEN t = t - ISINCONVENTIONALMEMORY
+ IF t AND ISPOINTER THEN t = t - ISPOINTER
+ IF t AND ISREFERENCE THEN t = t - ISREFERENCE
+ tsize = typname2typsize
+ method = 0
+ IF (t AND ISUDT) = 0 THEN ts$ = type2symbol$(t$) ELSE t3$ = RTRIM$(udtxcname(t AND 511))
+ IF Error_Happened THEN GOTO errmes
+ l2$ = l2$ + sp + t3$
-END IF 'as
+ END IF 'as
-IF LEN(s$) <> 0 AND LEN(t$) <> 0 THEN a$ = "Expected symbol or AS type after variable name": GOTO errmes
+ IF LEN(s$) <> 0 AND LEN(t$) <> 0 THEN a$ = "Expected symbol or AS type after variable name": GOTO errmes
-'no symbol of type specified, apply default
-IF s$ = "" AND t$ = "" THEN
-IF LEFT$(n$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n$)) - 64
-s$ = defineextaz(v)
-END IF
+ 'no symbol of type specified, apply default
+ IF s$ = "" AND t$ = "" THEN
+ IF LEFT$(n$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(n$)) - 64
+ s$ = defineextaz(v)
+ END IF
-'switch to main module
-oldsubfunc$ = subfunc$
-subfunc$ = ""
-defdatahandle = 18
-CLOSE #13: OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #13
-CLOSE #19: OPEN tmpdir$ + "mainfree.txt" FOR APPEND AS #19
+ 'switch to main module
+ oldsubfunc$ = subfunc$
+ subfunc$ = ""
+ defdatahandle = 18
+ CLOSE #13: OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #13
+ CLOSE #19: OPEN tmpdir$ + "mainfree.txt" FOR APPEND AS #19
-'use 'try' to locate the variable (if it already exists)
-n2$ = n$ + s$ + ts$ 'note: either ts$ or s$ will exist unless it is a UDT
-try = findid(n2$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF a THEN
-'an array
+ 'use 'try' to locate the variable (if it already exists)
+ n2$ = n$ + s$ + ts$ 'note: either ts$ or s$ will exist unless it is a UDT
+ try = findid(n2$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF a THEN
+ 'an array
-IF id.arraytype THEN
-IF LEN(t$) = 0 THEN GOTO shrfound
-t2 = id.arraytype: t2size = id.tsize
-IF t2 AND ISINCONVENTIONALMEMORY THEN t2 = t2 - ISINCONVENTIONALMEMORY
-IF t2 AND ISPOINTER THEN t2 = t2 - ISPOINTER
-IF t2 AND ISREFERENCE THEN t2 = t2 - ISREFERENCE
-IF t = t2 AND tsize = t2size THEN GOTO shrfound
-END IF
-
-ELSE
-'not an array
-
-IF id.t THEN
-IF LEN(t$) = 0 THEN GOTO shrfound
-t2 = id.t: t2size = id.tsize
-IF t2 AND ISINCONVENTIONALMEMORY THEN t2 = t2 - ISINCONVENTIONALMEMORY
-IF t2 AND ISPOINTER THEN t2 = t2 - ISPOINTER
-IF t2 AND ISREFERENCE THEN t2 = t2 - ISREFERENCE
-
-IF Debug THEN PRINT #9, "SHARED:comparing:"; t; t2, tsize; t2size
-
-IF t = t2 AND tsize = t2size THEN GOTO shrfound
-END IF
-
-END IF
-
-IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-'unknown variable
-IF a THEN a$ = "Array not defined": GOTO errmes
-'create variable
-IF LEN(s$) THEN typ$ = s$ ELSE typ$ = t$
-retval = dim2(n$, typ$, method, "")
-IF Error_Happened THEN GOTO errmes
-'note: variable created!
-
-shrfound:
-l$ = l$ + sp + RTRIM$(id.cn) + l2$
-
-ids(currentid).share = ids(currentid).share OR 2 'set as temporarily shared
-
-'method must apply to the current sub/function regardless of how the variable was defined in 'main'
-lmay = LEN(RTRIM$(id.mayhave)): lmust = LEN(RTRIM$(id.musthave))
-IF lmay <> 0 OR lmust <> 0 THEN
-IF (method = 1 AND lmust = 0) OR (method = 0 AND lmay = 0) THEN
-revertmaymusthaven = revertmaymusthaven + 1
-revertmaymusthave(revertmaymusthaven) = currentid
-SWAP ids(currentid).musthave, ids(currentid).mayhave
-END IF
-END IF
-
-'switch back to sub/func
-subfunc$ = oldsubfunc$
-defdatahandle = 13
-CLOSE #13: OPEN tmpdir$ + "data" + str2$(subfuncn) + ".txt" FOR APPEND AS #13
-CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR APPEND AS #19
-
-IF getelement$(a$, i) = "," THEN i = i + 1: l$ = l$ + sp2 + ",": GOTO subfuncshr
-IF getelement$(a$, i) <> "" THEN a$ = "Expected ,": GOTO errmes
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-
-'EXIT SUB/FUNCTION
-IF n = 2 THEN
-IF firstelement$ = "EXIT" THEN
-sf = 0
-IF secondelement$ = "FUNCTION" THEN sf = 1
-IF secondelement$ = "SUB" THEN sf = 2
-IF sf THEN
-
-IF LEN(subfunc) = 0 THEN a$ = "EXIT " + secondelement$ + " must be used within a SUB/FUNCTION": GOTO errmes
-
-PRINT #12, "goto exit_subfunc;"
-l$ = firstelement$ + sp + secondelement$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-END IF
-
-
-
-
-
-'ASC statement (fully inline)
-IF n >= 1 THEN
-IF firstelement$ = "ASC" THEN
-IF getelement$(a$, 2) <> "(" THEN a$ = "Expected ( after ASC": GOTO errmes
-
-'calculate 3 parts
-useposition = 0
-part = 1
-i = 3
-a3$ = ""
-stringvariable$ = ""
-position$ = ""
-B = 0
-DO
-
-IF i > n THEN 'got part 3
-IF part <> 3 OR LEN(a3$) = 0 THEN a$ = "Expected ASC ( ... , ... ) = ...": GOTO errmes
-expression$ = a3$
-EXIT DO
-END IF
-
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN B = B + 1
-IF a2$ = ")" THEN B = B - 1
-
-IF B = -1 THEN
-
-IF part = 1 THEN 'eg. ASC(a$)=65
-IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected =": GOTO errmes
-stringvariable$ = a3$
-position$ = "1"
-part = 3: a3$ = "": i = i + 1: GOTO ascgotpart
-END IF
-
-IF part = 2 THEN 'eg. ASC(a$,i)=65
-IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected =": GOTO errmes
-useposition = 1
-position$ = a3$
-part = 3: a3$ = "": i = i + 1: GOTO ascgotpart
-END IF
-
-'fall through, already in part 3
-
-END IF
-
-IF a2$ = "," AND B = 0 THEN
-IF part = 1 THEN stringvariable$ = a3$: part = 2: a3$ = "": GOTO ascgotpart
-END IF
-
-IF LEN(a3$) THEN a3$ = a3$ + sp + a2$ ELSE a3$ = a2$
-ascgotpart:
-i = i + 1
-LOOP
-IF LEN(stringvariable$) = 0 OR LEN(position$) = 0 THEN a$ = "Expected ASC ( ... , ... ) = ...": GOTO errmes
-
-'validate stringvariable$
-stringvariable$ = fixoperationorder$(stringvariable$)
-IF Error_Happened THEN GOTO errmes
-l$ = "ASC" + sp2 + "(" + sp2 + tlayout$
-
-e$ = evaluate(stringvariable$, sourcetyp)
-IF Error_Happened THEN GOTO errmes
-IF (sourcetyp AND ISREFERENCE) = 0 OR (sourcetyp AND ISSTRING) = 0 THEN a$ = "Expected ASC ( string-variable , ...": GOTO errmes
-stringvariable$ = evaluatetotyp(stringvariable$, ISSTRING)
-IF Error_Happened THEN GOTO errmes
-
-
-
-IF position$ = "1" THEN
-IF useposition THEN l$ = l$ + sp2 + "," + sp + "1" + sp2 + ")" + sp + "=" ELSE l$ = l$ + sp2 + ")" + sp + "="
-
-PRINT #12, "tqbs=" + stringvariable$ + "; if (!new_error){"
-e$ = fixoperationorder$(expression$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluatetotyp(e$, 32&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "tmp_long=" + e$ + "; if (!new_error){"
-PRINT #12, "if (tqbs->len){tqbs->chr[0]=tmp_long;}else{error(5);}"
-PRINT #12, "}}"
-
-ELSE
-
-PRINT #12, "tqbs=" + stringvariable$ + "; if (!new_error){"
-e$ = fixoperationorder$(position$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$ + sp2 + ")" + sp + "="
-e$ = evaluatetotyp(e$, 32&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "tmp_fileno=" + e$ + "; if (!new_error){"
-e$ = fixoperationorder$(expression$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-e$ = evaluatetotyp(e$, 32&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "tmp_long=" + e$ + "; if (!new_error){"
-PRINT #12, "if ((tmp_fileno>0)&&(tmp_fileno<=tqbs->len)){tqbs->chr[tmp_fileno-1]=tmp_long;}else{error(5);}"
-PRINT #12, "}}}"
-
-END IF
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-
-
-
-
-'MID$ statement
-IF n >= 1 THEN
-IF firstelement$ = "MID$" THEN
-IF getelement$(a$, 2) <> "(" THEN a$ = "Expected ( after MID$": GOTO errmes
-'calculate 4 parts
-length$ = ""
-part = 1
-i = 3
-a3$ = ""
-stringvariable$ = ""
-start$ = ""
-B = 0
-DO
-IF i > n THEN
-IF part <> 4 OR a3$ = "" THEN a$ = "Expected MID$(...)=...": GOTO errmes
-stringexpression$ = a3$
-EXIT DO
-END IF
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN B = B + 1
-IF a2$ = ")" THEN B = B - 1
-IF B = -1 THEN
-IF part = 2 THEN
-IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected = after )": GOTO errmes
-start$ = a3$: part = 4: a3$ = "": i = i + 1: GOTO midgotpart
-END IF
-IF part = 3 THEN
-IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected = after )": GOTO errmes
-IF a3$ = "" THEN a$ = "Omit , before ) if omitting length in MID$ statement": GOTO errmes
-length$ = a3$: part = 4: a3$ = "": i = i + 1: GOTO midgotpart
-END IF
-END IF
-IF a2$ = "," AND B = 0 THEN
-IF part = 1 THEN stringvariable$ = a3$: part = 2: a3$ = "": GOTO midgotpart
-IF part = 2 THEN start$ = a3$: part = 3: a3$ = "": GOTO midgotpart
-END IF
-IF LEN(a3$) THEN a3$ = a3$ + sp + a2$ ELSE a3$ = a2$
-midgotpart:
-i = i + 1
-LOOP
-IF stringvariable$ = "" THEN a$ = "Syntax error": GOTO errmes
-IF start$ = "" THEN a$ = "Syntax error": GOTO errmes
-'check if it is a valid source string
-stringvariable$ = fixoperationorder$(stringvariable$)
-IF Error_Happened THEN GOTO errmes
-l$ = "MID$" + sp2 + "(" + sp2 + tlayout$
-e$ = evaluate(stringvariable$, sourcetyp)
-IF Error_Happened THEN GOTO errmes
-IF (sourcetyp AND ISREFERENCE) = 0 OR (sourcetyp AND ISSTRING) = 0 THEN a$ = "MID$ expects a string variable/array-element as its first argument": GOTO errmes
-stringvariable$ = evaluatetotyp(stringvariable$, ISSTRING)
-IF Error_Happened THEN GOTO errmes
-
-start$ = fixoperationorder$(start$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-start$ = evaluatetotyp((start$), 32&)
-
-stringexpression$ = fixoperationorder$(stringexpression$)
-IF Error_Happened THEN GOTO errmes
-l2$ = tlayout$
-stringexpression$ = evaluatetotyp(stringexpression$, ISSTRING)
-IF Error_Happened THEN GOTO errmes
-
-IF LEN(length$) THEN
-length$ = fixoperationorder$(length$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-length$ = evaluatetotyp(length$, 32&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_mid(" + stringvariable$ + "," + start$ + "," + length$ + "," + stringexpression$ + ",1);"
-ELSE
-PRINT #12, "sub_mid(" + stringvariable$ + "," + start$ + ",0," + stringexpression$ + ",0);"
-END IF
-
-l$ = l$ + sp2 + ")" + sp + "=" + sp + l2$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-
-
-IF n >= 2 THEN
-IF firstelement$ = "ERASE" THEN
-i = 2
-l$ = "ERASE"
-erasenextarray:
-var$ = getelement$(ca$, i)
-x$ = var$: ls$ = removesymbol(x$)
-IF Error_Happened THEN GOTO errmes
-
-IF FindArray(var$) THEN
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + RTRIM$(id.cn) + ls$
-'erase the array
-clearerase:
-n$ = RTRIM$(id.callname)
-bytesperelement$ = str2((id.arraytype AND 511) \ 8)
-IF id.arraytype AND ISSTRING THEN bytesperelement$ = str2(id.tsize)
-IF id.arraytype AND ISOFFSETINBITS THEN bytesperelement$ = str2((id.arraytype AND 511)) + "/8+1"
-IF id.arraytype AND ISUDT THEN
-bytesperelement$ = str2(udtxsize(id.arraytype AND 511) \ 8)
-END IF
-PRINT #12, "if (" + n$ + "[2]&1){" 'array is defined
-PRINT #12, "if (" + n$ + "[2]&2){" 'array is static
-IF (id.arraytype AND ISSTRING) <> 0 AND (id.arraytype AND ISFIXEDLENGTH) = 0 THEN
-PRINT #12, "tmp_long=";
-FOR i2 = 1 TO ABS(id.arrayelements)
-IF i2 <> 1 THEN PRINT #12, "*";
-PRINT #12, n$ + "[" + str2(i2 * 4 - 4 + 5) + "]";
-NEXT
-PRINT #12, ";"
-PRINT #12, "while(tmp_long--){"
-PRINT #12, "((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]))->len=0;"
-PRINT #12, "}"
-ELSE
-'numeric
-'clear array
-PRINT #12, "memset((void*)(" + n$ + "[0]),0,";
-FOR i2 = 1 TO ABS(id.arrayelements)
-IF i2 <> 1 THEN PRINT #12, "*";
-PRINT #12, n$ + "[" + str2(i2 * 4 - 4 + 5) + "]";
-NEXT
-PRINT #12, "*" + bytesperelement$ + ");"
-END IF
-PRINT #12, "}else{" 'array is dynamic
-'1. free memory & any allocated strings
-IF (id.arraytype AND ISSTRING) <> 0 AND (id.arraytype AND ISFIXEDLENGTH) = 0 THEN
-'free strings
-PRINT #12, "tmp_long=";
-FOR i2 = 1 TO ABS(id.arrayelements)
-IF i2 <> 1 THEN PRINT #12, "*";
-PRINT #12, n$ + "[" + str2(i2 * 4 - 4 + 5) + "]";
-NEXT
-PRINT #12, ";"
-PRINT #12, "while(tmp_long--){"
-PRINT #12, "qbs_free((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]));"
-PRINT #12, "}"
-'free memory
-PRINT #12, "free((void*)(" + n$ + "[0]));"
-ELSE
-'free memory
-PRINT #12, "if (" + n$ + "[2]&4){" 'cmem array
-PRINT #12, "cmem_dynamic_free((uint8*)(" + n$ + "[0]));"
-PRINT #12, "}else{" 'non-cmem array
-PRINT #12, "free((void*)(" + n$ + "[0]));"
-PRINT #12, "}"
-END IF
-'2. set array (and its elements) as undefined
-PRINT #12, n$ + "[2]^=1;" 'remove defined flag, keeping other flags (such as cmem)
-'set dimensions as undefined
-FOR i2 = 1 TO ABS(id.arrayelements)
-B = i2 * 4
-PRINT #12, n$ + "[" + str2(B) + "]=2147483647;" 'base
-PRINT #12, n$ + "[" + str2(B + 1) + "]=0;" 'num. index
-PRINT #12, n$ + "[" + str2(B + 2) + "]=0;" 'multiplier
-NEXT
-IF (id.arraytype AND ISSTRING) <> 0 AND (id.arraytype AND ISFIXEDLENGTH) = 0 THEN
-PRINT #12, n$ + "[0]=(ptrszint)¬hingstring;"
-ELSE
-PRINT #12, n$ + "[0]=(ptrszint)nothingvalue;"
-END IF
-PRINT #12, "}" 'static/dynamic
-PRINT #12, "}" 'array is defined
-IF clearerasereturn = 1 THEN clearerasereturn = 0: GOTO clearerasereturned
-GOTO erasedarray
-END IF
-IF Error_Happened THEN GOTO errmes
-a$ = "Undefined array passed to ERASE": GOTO errmes
-
-erasedarray:
-IF i < n THEN
-i = i + 1: n$ = getelement$(a$, i): IF n$ <> "," THEN a$ = "Expected ,": GOTO errmes
-l$ = l$ + sp2 + ","
-i = i + 1: IF i > n THEN a$ = "Expected , ...": GOTO errmes
-GOTO erasenextarray
-END IF
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-
-
-'DIM/REDIM/STATIC
-IF n >= 2 THEN
-dimoption = 0: redimoption = 0: commonoption = 0
-IF firstelement$ = "DIM" THEN dimoption = 1
-IF firstelement$ = "REDIM" THEN
-dimoption = 2: redimoption = 1
-IF secondelement$ = "_PRESERVE" THEN
-redimoption = 2
-IF n = 2 THEN a$ = "Expected REDIM _PRESERVE ...": GOTO errmes
-END IF
-END IF
-IF firstelement$ = "STATIC" THEN dimoption = 3
-IF firstelement$ = "COMMON" THEN dimoption = 1: commonoption = 1
-IF dimoption THEN
-
-l$ = firstelement$
-
-IF dimoption = 3 AND subfuncn = 0 THEN a$ = "STATIC must be used within a SUB/FUNCTION": GOTO errmes
-IF commonoption = 1 AND subfuncn <> 0 THEN a$ = "COMMON cannot be used within a SUB/FUNCTION": GOTO errmes
-
-i = 2
-IF redimoption = 2 THEN i = 3: l$ = l$ + sp + "_PRESERVE"
-
-IF dimoption <> 3 THEN 'shared cannot be static
-a2$ = getelement(a$, i)
-IF a2$ = "SHARED" THEN
-IF subfuncn <> 0 THEN a$ = "DIM/REDIM SHARED invalid within a SUB/FUNCTION": GOTO errmes
-dimshared = 1
-i = i + 1
-l$ = l$ + sp + a2$
-END IF
-END IF
-
-IF dimoption = 3 THEN dimstatic = 1: AllowLocalName = 1
-
-dimnext:
-notype = 0
-listarray = 0
-
-
-'old chain code
-'chaincommonarray=0
-
-varname$ = getelement(ca$, i): i = i + 1
-IF varname$ = "" THEN a$ = "Expected variable-name": GOTO errmes
-
-'get the next element
-IF i >= n + 1 THEN e$ = "" ELSE e$ = getelement(a$, i): i = i + 1
-
-'check if next element is a ( to create an array
-elements$ = ""
-
-IF e$ = "(" THEN
-B = 1
-FOR i = i TO n
-e$ = getelement(ca$, i)
-IF e$ = "(" THEN B = B + 1
-IF e$ = ")" THEN B = B - 1
-IF B = 0 THEN EXIT FOR
-IF LEN(elements$) THEN elements$ = elements$ + sp + e$ ELSE elements$ = e$
-NEXT
-IF B <> 0 THEN a$ = "Expected )": GOTO errmes
-i = i + 1 'set i to point to the next element
-
-IF commonoption THEN elements$ = "?"
-
-
-IF Debug THEN PRINT #9, "DIM2:array:elements$:[" + elements$ + "]"
-
-'arrayname() means list array to it will automatically be static when it is formally dimensioned later
-'note: listed arrays are always created in dynamic memory, but their contents are not erased
-' this differs from static arrays from SUB...STATIC and the unique QB64 method -> STATIC arrayname(100)
-IF dimoption = 3 THEN 'STATIC used
-IF LEN(elements$) = 0 THEN 'nothing between brackets
-listarray = 1 'add to static list
-END IF
-END IF
-
-'last element was ")"
-'get next element
-IF i >= n + 1 THEN e$ = "" ELSE e$ = getelement(a$, i): i = i + 1
-END IF 'e$="("
-d$ = e$
-
-dimmethod = 0
-
-appendname$ = "" 'the symbol to append to name returned by dim2
-appendtype$ = "" 'eg. sp+AS+spINTEGER
-dim2typepassback$ = ""
-
-'does varname have an appended symbol?
-s$ = removesymbol$(varname$)
-IF Error_Happened THEN GOTO errmes
-IF validname(varname$) = 0 THEN a$ = "Invalid variable name": GOTO errmes
-
-IF s$ <> "" THEN
-typ$ = s$
-dimmethod = 1
-appendname$ = typ$
-GOTO dimgottyp
-END IF
-
-IF d$ = "AS" THEN
-appendtype$ = sp + "AS"
-typ$ = ""
-FOR i = i TO n
-d$ = getelement(a$, i)
-IF d$ = "," THEN i = i + 1: EXIT FOR
-typ$ = typ$ + d$ + " "
-appendtype$ = appendtype$ + sp + d$
-d$ = ""
-NEXT
-appendtype$ = UCASE$(appendtype$) 'capitalise default types (udt override this later if necessary)
-typ$ = RTRIM$(typ$)
-GOTO dimgottyp
-END IF
-
-'auto-define type based on name
-notype = 1
-IF LEFT$(varname$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(varname$)) - 64
-typ$ = defineaz(v)
-dimmethod = 1
-GOTO dimgottyp
-
-dimgottyp:
-IF d$ <> "" AND d$ <> "," THEN a$ = "DIM: Expected comma!": GOTO errmes
-
-'In QBASIC, if no type info is given it can refer to an expeicit/formally defined array
-IF notype <> 0 AND dimoption <> 3 AND dimoption <> 1 THEN 'not DIM or STATIC which only create new content
-IF LEN(elements$) THEN 'an array
-IF FindArray(varname$) THEN
-IF LEN(RTRIM$(id.mayhave)) THEN 'explict/formally defined
-typ$ = id2fulltypename$ 'adopt type
-dimmethod = 0 'set as formally defined
-END IF
-END IF
-END IF
-END IF
-
-IF dimoption = 3 AND LEN(elements$) THEN 'eg. STATIC a(100)
-'does a conflicting array exist? (use findarray) if so again this should lead to duplicate definition
-typ2$ = symbol2fulltypename$(typ$)
-t = typname2typ(typ2$): ts = typname2typsize
-'try name without any extension
-IF FindArray(varname$) THEN 'name without any symbol
-IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
-IF LEN(RTRIM$(id.musthave)) THEN
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-ELSE
-IF dimmethod = 0 THEN
-a$ = "Name already in use": GOTO errmes 'explicit over explicit
-ELSE
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-END IF
-END IF
-END IF
-END IF
-'add extension (if possible)
-IF (t AND ISUDT) = 0 THEN
-s2$ = type2symbol$(typ2$)
-IF Error_Happened THEN GOTO errmes
-IF FindArray(varname$ + s2$) THEN
-IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
-IF LEN(RTRIM$(id.musthave)) THEN
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-ELSE
-IF dimmethod = 0 THEN
-a$ = "Name already in use": GOTO errmes 'explicit over explicit
-ELSE
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-END IF
-END IF
-END IF
-END IF
-END IF 'not a UDT
-END IF
-
-IF listarray THEN 'eg. STATIC a()
-'note: list is cleared by END SUB/FUNCTION
-
-'is a conflicting array already listed? if so this should cause a duplicate definition error
-'check for conflict within list:
-xi = 1
-FOR x = 1 TO staticarraylistn
-varname2$ = getelement$(staticarraylist, xi): xi = xi + 1
-typ2$ = getelement$(staticarraylist, xi): xi = xi + 1
-dimmethod2 = VAL(getelement$(staticarraylist, xi)): xi = xi + 1
-'check if they are similar
-IF UCASE$(varname$) = UCASE$(varname2$) THEN
-IF dimmethod2 = 1 THEN
-'old using symbol
-IF symbol2fulltypename$(typ$) = typ2$ THEN a$ = "Name already in use": GOTO errmes
-ELSE
-'old using AS
-IF dimmethod = 0 THEN
-a$ = "Name already in use": GOTO errmes
-ELSE
-IF symbol2fulltypename$(typ$) = typ2$ THEN a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-END IF
-NEXT
-
-'does a conflicting array exist? (use findarray) if so again this should lead to duplicate definition
-typ2$ = symbol2fulltypename$(typ$)
-t = typname2typ(typ2$): ts = typname2typsize
-'try name without any extension
-IF FindArray(varname$) THEN 'name without any symbol
-IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
-IF LEN(RTRIM$(id.musthave)) THEN
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-ELSE
-IF dimmethod = 0 THEN
-a$ = "Name already in use": GOTO errmes 'explicit over explicit
-ELSE
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-END IF
-END IF
-END IF
-END IF
-'add extension (if possible)
-IF (t AND ISUDT) = 0 THEN
-s2$ = type2symbol$(typ2$)
-IF Error_Happened THEN GOTO errmes
-IF FindArray(varname$ + s2$) THEN
-IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
-IF LEN(RTRIM$(id.musthave)) THEN
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-ELSE
-IF dimmethod = 0 THEN
-a$ = "Name already in use": GOTO errmes 'explicit over explicit
-ELSE
-'if types match then fail
-IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
-IF ts = id.tsize THEN
-a$ = "Name already in use": GOTO errmes
-END IF
-END IF
-END IF
-END IF
-END IF
-END IF
-END IF 'not a UDT
-
-'note: static list arrays cannot be created until they are formally [or informally] (RE)DIM'd later
-IF LEN(staticarraylist) THEN staticarraylist = staticarraylist + sp
-staticarraylist = staticarraylist + varname$ + sp + symbol2fulltypename$(typ$) + sp + str2(dimmethod)
-IF Error_Happened THEN GOTO errmes
-staticarraylistn = staticarraylistn + 1
-l$ = l$ + sp + varname$ + appendname$ + sp2 + "(" + sp2 + ")" + appendtype$
-'note: none of the following code is run, dim2 call is also skipped
-
-ELSE
-
-olddimstatic = dimstatic
-
-'check if varname is on the static list
-IF LEN(elements$) THEN 'it's an array
-IF subfuncn THEN 'it's in a sub/function
-xi = 1
-FOR x = 1 TO staticarraylistn
-varname2$ = getelement$(staticarraylist, xi): xi = xi + 1
-typ2$ = getelement$(staticarraylist, xi): xi = xi + 1
-dimmethod2 = VAL(getelement$(staticarraylist, xi)): xi = xi + 1
-'check if they are similar
-IF UCASE$(varname$) = UCASE$(varname2$) THEN
-IF symbol2fulltypename$(typ$) = typ2$ THEN
-IF Error_Happened THEN GOTO errmes
-IF dimmethod = dimmethod2 THEN
-'match found!
-varname$ = varname2$
-dimstatic = 3
-IF dimoption = 3 THEN a$ = "Array already listed as STATIC": GOTO errmes
-END IF
-END IF 'typ
-END IF 'varname
-NEXT
-END IF
-END IF
-
-'COMMON exception
-'note: COMMON alone does not imply SHARED
-' if either(or both) COMMON & later DIM have SHARED, variable becomes shared
-IF commonoption THEN
-IF LEN(elements$) THEN
-
-'add array to list
-IF LEN(commonarraylist) THEN commonarraylist = commonarraylist + sp
-'note: dimmethod distinguishes between a%(...) vs a(...) AS INTEGER
-commonarraylist = commonarraylist + varname$ + sp + symbol2fulltypename$(typ$) + sp + str2(dimmethod) + sp + str2(dimshared)
-IF Error_Happened THEN GOTO errmes
-commonarraylistn = commonarraylistn + 1
-IF Debug THEN PRINT #9, "common listed:" + varname$ + sp + symbol2fulltypename$(typ$) + sp + str2(dimmethod) + sp + str2(dimshared)
-IF Error_Happened THEN GOTO errmes
-
-x = 0
-
-v$ = varname$
-IF dimmethod = 1 THEN v$ = v$ + typ$
-try = findid(v$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.arraytype THEN
-
-t = typname2typ(typ$)
-IF Error_Happened THEN GOTO errmes
-s = typname2typsize
-match = 1
-'note: dimmethod 2 is already matched
-IF dimmethod = 0 THEN
-t2 = id.arraytype
-s2 = id.tsize
-IF (t AND ISFLOAT) <> (t2 AND ISFLOAT) THEN match = 0
-IF (t AND ISUNSIGNED) <> (t2 AND ISUNSIGNED) THEN match = 0
-IF (t AND ISSTRING) <> (t2 AND ISSTRING) THEN match = 0
-IF (t AND ISFIXEDLENGTH) <> (t2 AND ISFIXEDLENGTH) THEN match = 0
-IF (t AND ISOFFSETINBITS) <> (t2 AND ISOFFSETINBITS) THEN match = 0
-IF (t AND ISUDT) <> (t2 AND ISUDT) THEN match = 0
-IF (t AND 511) <> (t2 AND 511) THEN match = 0
-IF s <> s2 THEN match = 0
-'check for implicit/explicit declaration match
-oldmethod = 0: IF LEN(RTRIM$(id.musthave)) THEN oldmethod = 1
-IF oldmethod <> dimmethod THEN match = 0
-END IF
-
-IF match THEN
-x = currentid
-IF dimshared THEN ids(x).share = 1 'share if necessary
-tlayout$ = RTRIM$(id.cn) + sp + "(" + sp2 + ")"
-
-IF dimmethod = 0 THEN
-IF t AND ISUDT THEN
-dim2typepassback$ = RTRIM$(udtxcname(t AND 511))
-ELSE
-dim2typepassback$ = typ$
-DO WHILE INSTR(dim2typepassback$, " ")
-ASC(dim2typepassback$, INSTR(dim2typepassback$, " ")) = ASC(sp)
-LOOP
-dim2typepassback$ = UCASE$(dim2typepassback$)
-END IF
-END IF 'method 0
-
-EXIT DO
-END IF 'match
-
-END IF 'arraytype
-IF try = 2 THEN findanotherid = 1: try = findid(v$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-
-IF x = 0 THEN x = idn + 1
-
-'note: the following code only adds include directives, everything else is defered
-OPEN tmpdir$ + "chain.txt" FOR APPEND AS #22
-'include directive
-PRINT #22, "#include " + CHR$(34) + "chain" + str2$(x) + ".txt" + CHR$(34)
-CLOSE #22
-'create/clear include file
-OPEN tmpdir$ + "chain" + str2$(x) + ".txt" FOR OUTPUT AS #22: CLOSE #22
-
-OPEN tmpdir$ + "inpchain.txt" FOR APPEND AS #22
-'include directive
-PRINT #22, "#include " + CHR$(34) + "inpchain" + str2$(x) + ".txt" + CHR$(34)
-CLOSE #22
-'create/clear include file
-OPEN tmpdir$ + "inpchain" + str2$(x) + ".txt" FOR OUTPUT AS #22: CLOSE #22
-
-'note: elements$="?"
-IF x <> idn + 1 THEN GOTO skipdim 'array already exists
-GOTO dimcommonarray
-
-END IF
-END IF
-
-'is varname on common list?
-'******
-IF LEN(elements$) THEN 'it's an array
-IF subfuncn = 0 THEN 'not in a sub/function
-
-IF Debug THEN PRINT #9, "common checking:" + varname$
-
-xi = 1
-FOR x = 1 TO commonarraylistn
-varname2$ = getelement$(commonarraylist, xi): xi = xi + 1
-typ2$ = getelement$(commonarraylist, xi): xi = xi + 1
-dimmethod2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
-dimshared2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
-IF Debug THEN PRINT #9, "common checking against:" + varname2$ + sp + typ2$ + sp + str2(dimmethod2) + sp + str2(dimshared2)
-'check if they are similar
-IF varname$ = varname2$ THEN
-IF symbol2fulltypename$(typ$) = typ2$ THEN
-IF Error_Happened THEN GOTO errmes
-IF dimmethod = dimmethod2 THEN
-
-'match found!
-'enforce shared status (if necessary)
-IF dimshared2 THEN dimshared = dimshared OR 2 'temp force SHARED
-
-'old chain code
-'chaincommonarray=x
-
-END IF 'method
-END IF 'typ
-END IF 'varname
-NEXT
-END IF
-END IF
-
-dimcommonarray:
-retval = dim2(varname$, typ$, dimmethod, elements$)
-IF Error_Happened THEN GOTO errmes
-skipdim:
-IF dimshared >= 2 THEN dimshared = dimshared - 2
-
-'non-array COMMON variable
-IF commonoption <> 0 AND LEN(elements$) = 0 THEN
-
-'CHAIN.TXT (save)
-
-use_global_byte_elements = 1
-
-'switch output from main.txt to chain.txt
-CLOSE #12
-OPEN tmpdir$ + "chain.txt" FOR APPEND AS #12
-l2$ = tlayout$
-
-PRINT #12, "int32val=1;" 'simple variable
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-
-t = id.t
-bits = t AND 511
-IF t AND ISUDT THEN bits = udtxsize(t AND 511)
-IF t AND ISSTRING THEN
-IF t AND ISFIXEDLENGTH THEN
-bits = id.tsize * 8
-ELSE
-PRINT #12, "int64val=__STRING_" + RTRIM$(id.n) + "->len*8;"
-bits = 0
-END IF
-END IF
-
-IF bits THEN
-PRINT #12, "int64val=" + str2$(bits) + ";" 'size in bits
-END IF
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-
-'put the variable
-e$ = RTRIM$(id.n)
-
-IF (t AND ISUDT) = 0 THEN
-IF t AND ISFIXEDLENGTH THEN
-e$ = e$ + "$" + str2$(id.tsize)
-ELSE
-e$ = e$ + typevalue2symbol$(t)
-IF Error_Happened THEN GOTO errmes
-END IF
-END IF
-e$ = evaluatetotyp(fixoperationorder$(e$), -4)
-IF Error_Happened THEN GOTO errmes
+ IF id.arraytype THEN
+ IF LEN(t$) = 0 THEN GOTO shrfound
+ t2 = id.arraytype: t2size = id.tsize
+ IF t2 AND ISINCONVENTIONALMEMORY THEN t2 = t2 - ISINCONVENTIONALMEMORY
+ IF t2 AND ISPOINTER THEN t2 = t2 - ISPOINTER
+ IF t2 AND ISREFERENCE THEN t2 = t2 - ISREFERENCE
+ IF t = t2 AND tsize = t2size THEN GOTO shrfound
+ END IF
+
+ ELSE
+ 'not an array
+
+ IF id.t THEN
+ IF LEN(t$) = 0 THEN GOTO shrfound
+ t2 = id.t: t2size = id.tsize
+ IF t2 AND ISINCONVENTIONALMEMORY THEN t2 = t2 - ISINCONVENTIONALMEMORY
+ IF t2 AND ISPOINTER THEN t2 = t2 - ISPOINTER
+ IF t2 AND ISREFERENCE THEN t2 = t2 - ISREFERENCE
+
+ IF Debug THEN PRINT #9, "SHARED:comparing:"; t; t2, tsize; t2size
+
+ IF t = t2 AND tsize = t2size THEN GOTO shrfound
+ END IF
+
+ END IF
+
+ IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ 'unknown variable
+ IF a THEN a$ = "Array not defined": GOTO errmes
+ 'create variable
+ IF LEN(s$) THEN typ$ = s$ ELSE typ$ = t$
+ retval = dim2(n$, typ$, method, "")
+ IF Error_Happened THEN GOTO errmes
+ 'note: variable created!
+
+ shrfound:
+ l$ = l$ + sp + RTRIM$(id.cn) + l2$
+
+ ids(currentid).share = ids(currentid).share OR 2 'set as temporarily shared
+
+ 'method must apply to the current sub/function regardless of how the variable was defined in 'main'
+ lmay = LEN(RTRIM$(id.mayhave)): lmust = LEN(RTRIM$(id.musthave))
+ IF lmay <> 0 OR lmust <> 0 THEN
+ IF (method = 1 AND lmust = 0) OR (method = 0 AND lmay = 0) THEN
+ revertmaymusthaven = revertmaymusthaven + 1
+ revertmaymusthave(revertmaymusthaven) = currentid
+ SWAP ids(currentid).musthave, ids(currentid).mayhave
+ END IF
+ END IF
+
+ 'switch back to sub/func
+ subfunc$ = oldsubfunc$
+ defdatahandle = 13
+ CLOSE #13: OPEN tmpdir$ + "data" + str2$(subfuncn) + ".txt" FOR APPEND AS #13
+ CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR APPEND AS #19
+
+ IF getelement$(a$, i) = "," THEN i = i + 1: l$ = l$ + sp2 + ",": GOTO subfuncshr
+ IF getelement$(a$, i) <> "" THEN a$ = "Expected ,": GOTO errmes
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+
+ 'EXIT SUB/FUNCTION
+ IF n = 2 THEN
+ IF firstelement$ = "EXIT" THEN
+ sf = 0
+ IF secondelement$ = "FUNCTION" THEN sf = 1
+ IF secondelement$ = "SUB" THEN sf = 2
+ IF sf THEN
+
+ IF LEN(subfunc) = 0 THEN a$ = "EXIT " + secondelement$ + " must be used within a SUB/FUNCTION": GOTO errmes
+
+ PRINT #12, "goto exit_subfunc;"
+ l$ = firstelement$ + sp + secondelement$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+ END IF
+
+
+
+
+
+ 'ASC statement (fully inline)
+ IF n >= 1 THEN
+ IF firstelement$ = "ASC" THEN
+ IF getelement$(a$, 2) <> "(" THEN a$ = "Expected ( after ASC": GOTO errmes
+
+ 'calculate 3 parts
+ useposition = 0
+ part = 1
+ i = 3
+ a3$ = ""
+ stringvariable$ = ""
+ position$ = ""
+ B = 0
+ DO
+
+ IF i > n THEN 'got part 3
+ IF part <> 3 OR LEN(a3$) = 0 THEN a$ = "Expected ASC ( ... , ... ) = ...": GOTO errmes
+ expression$ = a3$
+ EXIT DO
+ END IF
+
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN B = B + 1
+ IF a2$ = ")" THEN B = B - 1
+
+ IF B = -1 THEN
+
+ IF part = 1 THEN 'eg. ASC(a$)=65
+ IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected =": GOTO errmes
+ stringvariable$ = a3$
+ position$ = "1"
+ part = 3: a3$ = "": i = i + 1: GOTO ascgotpart
+ END IF
+
+ IF part = 2 THEN 'eg. ASC(a$,i)=65
+ IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected =": GOTO errmes
+ useposition = 1
+ position$ = a3$
+ part = 3: a3$ = "": i = i + 1: GOTO ascgotpart
+ END IF
+
+ 'fall through, already in part 3
+
+ END IF
+
+ IF a2$ = "," AND B = 0 THEN
+ IF part = 1 THEN stringvariable$ = a3$: part = 2: a3$ = "": GOTO ascgotpart
+ END IF
+
+ IF LEN(a3$) THEN a3$ = a3$ + sp + a2$ ELSE a3$ = a2$
+ ascgotpart:
+ i = i + 1
+ LOOP
+ IF LEN(stringvariable$) = 0 OR LEN(position$) = 0 THEN a$ = "Expected ASC ( ... , ... ) = ...": GOTO errmes
+
+ 'validate stringvariable$
+ stringvariable$ = fixoperationorder$(stringvariable$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = "ASC" + sp2 + "(" + sp2 + tlayout$
+
+ e$ = evaluate(stringvariable$, sourcetyp)
+ IF Error_Happened THEN GOTO errmes
+ IF (sourcetyp AND ISREFERENCE) = 0 OR (sourcetyp AND ISSTRING) = 0 THEN a$ = "Expected ASC ( string-variable , ...": GOTO errmes
+ stringvariable$ = evaluatetotyp(stringvariable$, ISSTRING)
+ IF Error_Happened THEN GOTO errmes
+
+
+
+ IF position$ = "1" THEN
+ IF useposition THEN l$ = l$ + sp2 + "," + sp + "1" + sp2 + ")" + sp + "=" ELSE l$ = l$ + sp2 + ")" + sp + "="
+
+ PRINT #12, "tqbs=" + stringvariable$ + "; if (!new_error){"
+ e$ = fixoperationorder$(expression$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluatetotyp(e$, 32&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "tmp_long=" + e$ + "; if (!new_error){"
+ PRINT #12, "if (tqbs->len){tqbs->chr[0]=tmp_long;}else{error(5);}"
+ PRINT #12, "}}"
+
+ ELSE
+
+ PRINT #12, "tqbs=" + stringvariable$ + "; if (!new_error){"
+ e$ = fixoperationorder$(position$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$ + sp2 + ")" + sp + "="
+ e$ = evaluatetotyp(e$, 32&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "tmp_fileno=" + e$ + "; if (!new_error){"
+ e$ = fixoperationorder$(expression$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ e$ = evaluatetotyp(e$, 32&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "tmp_long=" + e$ + "; if (!new_error){"
+ PRINT #12, "if ((tmp_fileno>0)&&(tmp_fileno<=tqbs->len)){tqbs->chr[tmp_fileno-1]=tmp_long;}else{error(5);}"
+ PRINT #12, "}}}"
+
+ END IF
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+
+
+
+
+ 'MID$ statement
+ IF n >= 1 THEN
+ IF firstelement$ = "MID$" THEN
+ IF getelement$(a$, 2) <> "(" THEN a$ = "Expected ( after MID$": GOTO errmes
+ 'calculate 4 parts
+ length$ = ""
+ part = 1
+ i = 3
+ a3$ = ""
+ stringvariable$ = ""
+ start$ = ""
+ B = 0
+ DO
+ IF i > n THEN
+ IF part <> 4 OR a3$ = "" THEN a$ = "Expected MID$(...)=...": GOTO errmes
+ stringexpression$ = a3$
+ EXIT DO
+ END IF
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN B = B + 1
+ IF a2$ = ")" THEN B = B - 1
+ IF B = -1 THEN
+ IF part = 2 THEN
+ IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected = after )": GOTO errmes
+ start$ = a3$: part = 4: a3$ = "": i = i + 1: GOTO midgotpart
+ END IF
+ IF part = 3 THEN
+ IF getelement$(a$, i + 1) <> "=" THEN a$ = "Expected = after )": GOTO errmes
+ IF a3$ = "" THEN a$ = "Omit , before ) if omitting length in MID$ statement": GOTO errmes
+ length$ = a3$: part = 4: a3$ = "": i = i + 1: GOTO midgotpart
+ END IF
+ END IF
+ IF a2$ = "," AND B = 0 THEN
+ IF part = 1 THEN stringvariable$ = a3$: part = 2: a3$ = "": GOTO midgotpart
+ IF part = 2 THEN start$ = a3$: part = 3: a3$ = "": GOTO midgotpart
+ END IF
+ IF LEN(a3$) THEN a3$ = a3$ + sp + a2$ ELSE a3$ = a2$
+ midgotpart:
+ i = i + 1
+ LOOP
+ IF stringvariable$ = "" THEN a$ = "Syntax error": GOTO errmes
+ IF start$ = "" THEN a$ = "Syntax error": GOTO errmes
+ 'check if it is a valid source string
+ stringvariable$ = fixoperationorder$(stringvariable$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = "MID$" + sp2 + "(" + sp2 + tlayout$
+ e$ = evaluate(stringvariable$, sourcetyp)
+ IF Error_Happened THEN GOTO errmes
+ IF (sourcetyp AND ISREFERENCE) = 0 OR (sourcetyp AND ISSTRING) = 0 THEN a$ = "MID$ expects a string variable/array-element as its first argument": GOTO errmes
+ stringvariable$ = evaluatetotyp(stringvariable$, ISSTRING)
+ IF Error_Happened THEN GOTO errmes
+
+ start$ = fixoperationorder$(start$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ start$ = evaluatetotyp((start$), 32&)
+
+ stringexpression$ = fixoperationorder$(stringexpression$)
+ IF Error_Happened THEN GOTO errmes
+ l2$ = tlayout$
+ stringexpression$ = evaluatetotyp(stringexpression$, ISSTRING)
+ IF Error_Happened THEN GOTO errmes
+
+ IF LEN(length$) THEN
+ length$ = fixoperationorder$(length$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ length$ = evaluatetotyp(length$, 32&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_mid(" + stringvariable$ + "," + start$ + "," + length$ + "," + stringexpression$ + ",1);"
+ ELSE
+ PRINT #12, "sub_mid(" + stringvariable$ + "," + start$ + ",0," + stringexpression$ + ",0);"
+ END IF
+
+ l$ = l$ + sp2 + ")" + sp + "=" + sp + l2$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+
+
+ IF n >= 2 THEN
+ IF firstelement$ = "ERASE" THEN
+ i = 2
+ l$ = "ERASE"
+ erasenextarray:
+ var$ = getelement$(ca$, i)
+ x$ = var$: ls$ = removesymbol(x$)
+ IF Error_Happened THEN GOTO errmes
+
+ IF FindArray(var$) THEN
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + RTRIM$(id.cn) + ls$
+ 'erase the array
+ clearerase:
+ n$ = RTRIM$(id.callname)
+ bytesperelement$ = str2((id.arraytype AND 511) \ 8)
+ IF id.arraytype AND ISSTRING THEN bytesperelement$ = str2(id.tsize)
+ IF id.arraytype AND ISOFFSETINBITS THEN bytesperelement$ = str2((id.arraytype AND 511)) + "/8+1"
+ IF id.arraytype AND ISUDT THEN
+ bytesperelement$ = str2(udtxsize(id.arraytype AND 511) \ 8)
+ END IF
+ PRINT #12, "if (" + n$ + "[2]&1){" 'array is defined
+ PRINT #12, "if (" + n$ + "[2]&2){" 'array is static
+ IF (id.arraytype AND ISSTRING) <> 0 AND (id.arraytype AND ISFIXEDLENGTH) = 0 THEN
+ PRINT #12, "tmp_long=";
+ FOR i2 = 1 TO ABS(id.arrayelements)
+ IF i2 <> 1 THEN PRINT #12, "*";
+ PRINT #12, n$ + "[" + str2(i2 * 4 - 4 + 5) + "]";
+ NEXT
+ PRINT #12, ";"
+ PRINT #12, "while(tmp_long--){"
+ PRINT #12, "((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]))->len=0;"
+ PRINT #12, "}"
+ ELSE
+ 'numeric
+ 'clear array
+ PRINT #12, "memset((void*)(" + n$ + "[0]),0,";
+ FOR i2 = 1 TO ABS(id.arrayelements)
+ IF i2 <> 1 THEN PRINT #12, "*";
+ PRINT #12, n$ + "[" + str2(i2 * 4 - 4 + 5) + "]";
+ NEXT
+ PRINT #12, "*" + bytesperelement$ + ");"
+ END IF
+ PRINT #12, "}else{" 'array is dynamic
+ '1. free memory & any allocated strings
+ IF (id.arraytype AND ISSTRING) <> 0 AND (id.arraytype AND ISFIXEDLENGTH) = 0 THEN
+ 'free strings
+ PRINT #12, "tmp_long=";
+ FOR i2 = 1 TO ABS(id.arrayelements)
+ IF i2 <> 1 THEN PRINT #12, "*";
+ PRINT #12, n$ + "[" + str2(i2 * 4 - 4 + 5) + "]";
+ NEXT
+ PRINT #12, ";"
+ PRINT #12, "while(tmp_long--){"
+ PRINT #12, "qbs_free((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]));"
+ PRINT #12, "}"
+ 'free memory
+ PRINT #12, "free((void*)(" + n$ + "[0]));"
+ ELSE
+ 'free memory
+ PRINT #12, "if (" + n$ + "[2]&4){" 'cmem array
+ PRINT #12, "cmem_dynamic_free((uint8*)(" + n$ + "[0]));"
+ PRINT #12, "}else{" 'non-cmem array
+ PRINT #12, "free((void*)(" + n$ + "[0]));"
+ PRINT #12, "}"
+ END IF
+ '2. set array (and its elements) as undefined
+ PRINT #12, n$ + "[2]^=1;" 'remove defined flag, keeping other flags (such as cmem)
+ 'set dimensions as undefined
+ FOR i2 = 1 TO ABS(id.arrayelements)
+ B = i2 * 4
+ PRINT #12, n$ + "[" + str2(B) + "]=2147483647;" 'base
+ PRINT #12, n$ + "[" + str2(B + 1) + "]=0;" 'num. index
+ PRINT #12, n$ + "[" + str2(B + 2) + "]=0;" 'multiplier
+ NEXT
+ IF (id.arraytype AND ISSTRING) <> 0 AND (id.arraytype AND ISFIXEDLENGTH) = 0 THEN
+ PRINT #12, n$ + "[0]=(ptrszint)¬hingstring;"
+ ELSE
+ PRINT #12, n$ + "[0]=(ptrszint)nothingvalue;"
+ END IF
+ PRINT #12, "}" 'static/dynamic
+ PRINT #12, "}" 'array is defined
+ IF clearerasereturn = 1 THEN clearerasereturn = 0: GOTO clearerasereturned
+ GOTO erasedarray
+ END IF
+ IF Error_Happened THEN GOTO errmes
+ a$ = "Undefined array passed to ERASE": GOTO errmes
+
+ erasedarray:
+ IF i < n THEN
+ i = i + 1: n$ = getelement$(a$, i): IF n$ <> "," THEN a$ = "Expected ,": GOTO errmes
+ l$ = l$ + sp2 + ","
+ i = i + 1: IF i > n THEN a$ = "Expected , ...": GOTO errmes
+ GOTO erasenextarray
+ END IF
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+
+
+ 'DIM/REDIM/STATIC
+ IF n >= 2 THEN
+ dimoption = 0: redimoption = 0: commonoption = 0
+ IF firstelement$ = "DIM" THEN dimoption = 1
+ IF firstelement$ = "REDIM" THEN
+ dimoption = 2: redimoption = 1
+ IF secondelement$ = "_PRESERVE" THEN
+ redimoption = 2
+ IF n = 2 THEN a$ = "Expected REDIM _PRESERVE ...": GOTO errmes
+ END IF
+ END IF
+ IF firstelement$ = "STATIC" THEN dimoption = 3
+ IF firstelement$ = "COMMON" THEN dimoption = 1: commonoption = 1
+ IF dimoption THEN
+
+ l$ = firstelement$
+
+ IF dimoption = 3 AND subfuncn = 0 THEN a$ = "STATIC must be used within a SUB/FUNCTION": GOTO errmes
+ IF commonoption = 1 AND subfuncn <> 0 THEN a$ = "COMMON cannot be used within a SUB/FUNCTION": GOTO errmes
+
+ i = 2
+ IF redimoption = 2 THEN i = 3: l$ = l$ + sp + "_PRESERVE"
+
+ IF dimoption <> 3 THEN 'shared cannot be static
+ a2$ = getelement(a$, i)
+ IF a2$ = "SHARED" THEN
+ IF subfuncn <> 0 THEN a$ = "DIM/REDIM SHARED invalid within a SUB/FUNCTION": GOTO errmes
+ dimshared = 1
+ i = i + 1
+ l$ = l$ + sp + a2$
+ END IF
+ END IF
+
+ IF dimoption = 3 THEN dimstatic = 1: AllowLocalName = 1
+
+ dimnext:
+ notype = 0
+ listarray = 0
+
+
+ 'old chain code
+ 'chaincommonarray=0
+
+ varname$ = getelement(ca$, i): i = i + 1
+ IF varname$ = "" THEN a$ = "Expected variable-name": GOTO errmes
+
+ 'get the next element
+ IF i >= n + 1 THEN e$ = "" ELSE e$ = getelement(a$, i): i = i + 1
+
+ 'check if next element is a ( to create an array
+ elements$ = ""
+
+ IF e$ = "(" THEN
+ B = 1
+ FOR i = i TO n
+ e$ = getelement(ca$, i)
+ IF e$ = "(" THEN B = B + 1
+ IF e$ = ")" THEN B = B - 1
+ IF B = 0 THEN EXIT FOR
+ IF LEN(elements$) THEN elements$ = elements$ + sp + e$ ELSE elements$ = e$
+ NEXT
+ IF B <> 0 THEN a$ = "Expected )": GOTO errmes
+ i = i + 1 'set i to point to the next element
+
+ IF commonoption THEN elements$ = "?"
+
+
+ IF Debug THEN PRINT #9, "DIM2:array:elements$:[" + elements$ + "]"
+
+ 'arrayname() means list array to it will automatically be static when it is formally dimensioned later
+ 'note: listed arrays are always created in dynamic memory, but their contents are not erased
+ ' this differs from static arrays from SUB...STATIC and the unique QB64 method -> STATIC arrayname(100)
+ IF dimoption = 3 THEN 'STATIC used
+ IF LEN(elements$) = 0 THEN 'nothing between brackets
+ listarray = 1 'add to static list
+ END IF
+ END IF
+
+ 'last element was ")"
+ 'get next element
+ IF i >= n + 1 THEN e$ = "" ELSE e$ = getelement(a$, i): i = i + 1
+ END IF 'e$="("
+ d$ = e$
+
+ dimmethod = 0
+
+ appendname$ = "" 'the symbol to append to name returned by dim2
+ appendtype$ = "" 'eg. sp+AS+spINTEGER
+ dim2typepassback$ = ""
+
+ 'does varname have an appended symbol?
+ s$ = removesymbol$(varname$)
+ IF Error_Happened THEN GOTO errmes
+ IF validname(varname$) = 0 THEN a$ = "Invalid variable name": GOTO errmes
+
+ IF s$ <> "" THEN
+ typ$ = s$
+ dimmethod = 1
+ appendname$ = typ$
+ GOTO dimgottyp
+ END IF
+
+ IF d$ = "AS" THEN
+ appendtype$ = sp + "AS"
+ typ$ = ""
+ FOR i = i TO n
+ d$ = getelement(a$, i)
+ IF d$ = "," THEN i = i + 1: EXIT FOR
+ typ$ = typ$ + d$ + " "
+ appendtype$ = appendtype$ + sp + d$
+ d$ = ""
+ NEXT
+ appendtype$ = UCASE$(appendtype$) 'capitalise default types (udt override this later if necessary)
+ typ$ = RTRIM$(typ$)
+ GOTO dimgottyp
+ END IF
+
+ 'auto-define type based on name
+ notype = 1
+ IF LEFT$(varname$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(varname$)) - 64
+ typ$ = defineaz(v)
+ dimmethod = 1
+ GOTO dimgottyp
+
+ dimgottyp:
+ IF d$ <> "" AND d$ <> "," THEN a$ = "DIM: Expected comma!": GOTO errmes
+
+ 'In QBASIC, if no type info is given it can refer to an expeicit/formally defined array
+ IF notype <> 0 AND dimoption <> 3 AND dimoption <> 1 THEN 'not DIM or STATIC which only create new content
+ IF LEN(elements$) THEN 'an array
+ IF FindArray(varname$) THEN
+ IF LEN(RTRIM$(id.mayhave)) THEN 'explict/formally defined
+ typ$ = id2fulltypename$ 'adopt type
+ dimmethod = 0 'set as formally defined
+ END IF
+ END IF
+ END IF
+ END IF
+
+ IF dimoption = 3 AND LEN(elements$) THEN 'eg. STATIC a(100)
+ 'does a conflicting array exist? (use findarray) if so again this should lead to duplicate definition
+ typ2$ = symbol2fulltypename$(typ$)
+ t = typname2typ(typ2$): ts = typname2typsize
+ 'try name without any extension
+ IF FindArray(varname$) THEN 'name without any symbol
+ IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
+ IF LEN(RTRIM$(id.musthave)) THEN
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ ELSE
+ IF dimmethod = 0 THEN
+ a$ = "Name already in use": GOTO errmes 'explicit over explicit
+ ELSE
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ 'add extension (if possible)
+ IF (t AND ISUDT) = 0 THEN
+ s2$ = type2symbol$(typ2$)
+ IF Error_Happened THEN GOTO errmes
+ IF FindArray(varname$ + s2$) THEN
+ IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
+ IF LEN(RTRIM$(id.musthave)) THEN
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ ELSE
+ IF dimmethod = 0 THEN
+ a$ = "Name already in use": GOTO errmes 'explicit over explicit
+ ELSE
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF 'not a UDT
+ END IF
+
+ IF listarray THEN 'eg. STATIC a()
+ 'note: list is cleared by END SUB/FUNCTION
+
+ 'is a conflicting array already listed? if so this should cause a duplicate definition error
+ 'check for conflict within list:
+ xi = 1
+ FOR x = 1 TO staticarraylistn
+ varname2$ = getelement$(staticarraylist, xi): xi = xi + 1
+ typ2$ = getelement$(staticarraylist, xi): xi = xi + 1
+ dimmethod2 = VAL(getelement$(staticarraylist, xi)): xi = xi + 1
+ 'check if they are similar
+ IF UCASE$(varname$) = UCASE$(varname2$) THEN
+ IF dimmethod2 = 1 THEN
+ 'old using symbol
+ IF symbol2fulltypename$(typ$) = typ2$ THEN a$ = "Name already in use": GOTO errmes
+ ELSE
+ 'old using AS
+ IF dimmethod = 0 THEN
+ a$ = "Name already in use": GOTO errmes
+ ELSE
+ IF symbol2fulltypename$(typ$) = typ2$ THEN a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ END IF
+ NEXT
+
+ 'does a conflicting array exist? (use findarray) if so again this should lead to duplicate definition
+ typ2$ = symbol2fulltypename$(typ$)
+ t = typname2typ(typ2$): ts = typname2typsize
+ 'try name without any extension
+ IF FindArray(varname$) THEN 'name without any symbol
+ IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
+ IF LEN(RTRIM$(id.musthave)) THEN
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ ELSE
+ IF dimmethod = 0 THEN
+ a$ = "Name already in use": GOTO errmes 'explicit over explicit
+ ELSE
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ 'add extension (if possible)
+ IF (t AND ISUDT) = 0 THEN
+ s2$ = type2symbol$(typ2$)
+ IF Error_Happened THEN GOTO errmes
+ IF FindArray(varname$ + s2$) THEN
+ IF id.insubfuncn = subfuncn THEN 'global cannot conflict with static
+ IF LEN(RTRIM$(id.musthave)) THEN
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ ELSE
+ IF dimmethod = 0 THEN
+ a$ = "Name already in use": GOTO errmes 'explicit over explicit
+ ELSE
+ 'if types match then fail
+ IF (id.arraytype AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) = (t AND (ISFLOAT + ISUDT + 511 + ISUNSIGNED + ISSTRING + ISFIXEDLENGTH)) THEN
+ IF ts = id.tsize THEN
+ a$ = "Name already in use": GOTO errmes
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF 'not a UDT
+
+ 'note: static list arrays cannot be created until they are formally [or informally] (RE)DIM'd later
+ IF LEN(staticarraylist) THEN staticarraylist = staticarraylist + sp
+ staticarraylist = staticarraylist + varname$ + sp + symbol2fulltypename$(typ$) + sp + str2(dimmethod)
+ IF Error_Happened THEN GOTO errmes
+ staticarraylistn = staticarraylistn + 1
+ l$ = l$ + sp + varname$ + appendname$ + sp2 + "(" + sp2 + ")" + appendtype$
+ 'note: none of the following code is run, dim2 call is also skipped
+
+ ELSE
+
+ olddimstatic = dimstatic
+
+ 'check if varname is on the static list
+ IF LEN(elements$) THEN 'it's an array
+ IF subfuncn THEN 'it's in a sub/function
+ xi = 1
+ FOR x = 1 TO staticarraylistn
+ varname2$ = getelement$(staticarraylist, xi): xi = xi + 1
+ typ2$ = getelement$(staticarraylist, xi): xi = xi + 1
+ dimmethod2 = VAL(getelement$(staticarraylist, xi)): xi = xi + 1
+ 'check if they are similar
+ IF UCASE$(varname$) = UCASE$(varname2$) THEN
+ IF symbol2fulltypename$(typ$) = typ2$ THEN
+ IF Error_Happened THEN GOTO errmes
+ IF dimmethod = dimmethod2 THEN
+ 'match found!
+ varname$ = varname2$
+ dimstatic = 3
+ IF dimoption = 3 THEN a$ = "Array already listed as STATIC": GOTO errmes
+ END IF
+ END IF 'typ
+ END IF 'varname
+ NEXT
+ END IF
+ END IF
+
+ 'COMMON exception
+ 'note: COMMON alone does not imply SHARED
+ ' if either(or both) COMMON & later DIM have SHARED, variable becomes shared
+ IF commonoption THEN
+ IF LEN(elements$) THEN
+
+ 'add array to list
+ IF LEN(commonarraylist) THEN commonarraylist = commonarraylist + sp
+ 'note: dimmethod distinguishes between a%(...) vs a(...) AS INTEGER
+ commonarraylist = commonarraylist + varname$ + sp + symbol2fulltypename$(typ$) + sp + str2(dimmethod) + sp + str2(dimshared)
+ IF Error_Happened THEN GOTO errmes
+ commonarraylistn = commonarraylistn + 1
+ IF Debug THEN PRINT #9, "common listed:" + varname$ + sp + symbol2fulltypename$(typ$) + sp + str2(dimmethod) + sp + str2(dimshared)
+ IF Error_Happened THEN GOTO errmes
+
+ x = 0
+
+ v$ = varname$
+ IF dimmethod = 1 THEN v$ = v$ + typ$
+ try = findid(v$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.arraytype THEN
+
+ t = typname2typ(typ$)
+ IF Error_Happened THEN GOTO errmes
+ s = typname2typsize
+ match = 1
+ 'note: dimmethod 2 is already matched
+ IF dimmethod = 0 THEN
+ t2 = id.arraytype
+ s2 = id.tsize
+ IF (t AND ISFLOAT) <> (t2 AND ISFLOAT) THEN match = 0
+ IF (t AND ISUNSIGNED) <> (t2 AND ISUNSIGNED) THEN match = 0
+ IF (t AND ISSTRING) <> (t2 AND ISSTRING) THEN match = 0
+ IF (t AND ISFIXEDLENGTH) <> (t2 AND ISFIXEDLENGTH) THEN match = 0
+ IF (t AND ISOFFSETINBITS) <> (t2 AND ISOFFSETINBITS) THEN match = 0
+ IF (t AND ISUDT) <> (t2 AND ISUDT) THEN match = 0
+ IF (t AND 511) <> (t2 AND 511) THEN match = 0
+ IF s <> s2 THEN match = 0
+ 'check for implicit/explicit declaration match
+ oldmethod = 0: IF LEN(RTRIM$(id.musthave)) THEN oldmethod = 1
+ IF oldmethod <> dimmethod THEN match = 0
+ END IF
+
+ IF match THEN
+ x = currentid
+ IF dimshared THEN ids(x).share = 1 'share if necessary
+ tlayout$ = RTRIM$(id.cn) + sp + "(" + sp2 + ")"
+
+ IF dimmethod = 0 THEN
+ IF t AND ISUDT THEN
+ dim2typepassback$ = RTRIM$(udtxcname(t AND 511))
+ ELSE
+ dim2typepassback$ = typ$
+ DO WHILE INSTR(dim2typepassback$, " ")
+ ASC(dim2typepassback$, INSTR(dim2typepassback$, " ")) = ASC(sp)
+ LOOP
+ dim2typepassback$ = UCASE$(dim2typepassback$)
+ END IF
+ END IF 'method 0
+
+ EXIT DO
+ END IF 'match
+
+ END IF 'arraytype
+ IF try = 2 THEN findanotherid = 1: try = findid(v$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+
+ IF x = 0 THEN x = idn + 1
+
+ 'note: the following code only adds include directives, everything else is defered
+ OPEN tmpdir$ + "chain.txt" FOR APPEND AS #22
+ 'include directive
+ PRINT #22, "#include " + CHR$(34) + "chain" + str2$(x) + ".txt" + CHR$(34)
+ CLOSE #22
+ 'create/clear include file
+ OPEN tmpdir$ + "chain" + str2$(x) + ".txt" FOR OUTPUT AS #22: CLOSE #22
+
+ OPEN tmpdir$ + "inpchain.txt" FOR APPEND AS #22
+ 'include directive
+ PRINT #22, "#include " + CHR$(34) + "inpchain" + str2$(x) + ".txt" + CHR$(34)
+ CLOSE #22
+ 'create/clear include file
+ OPEN tmpdir$ + "inpchain" + str2$(x) + ".txt" FOR OUTPUT AS #22: CLOSE #22
+
+ 'note: elements$="?"
+ IF x <> idn + 1 THEN GOTO skipdim 'array already exists
+ GOTO dimcommonarray
+
+ END IF
+ END IF
+
+ 'is varname on common list?
+ '******
+ IF LEN(elements$) THEN 'it's an array
+ IF subfuncn = 0 THEN 'not in a sub/function
+
+ IF Debug THEN PRINT #9, "common checking:" + varname$
+
+ xi = 1
+ FOR x = 1 TO commonarraylistn
+ varname2$ = getelement$(commonarraylist, xi): xi = xi + 1
+ typ2$ = getelement$(commonarraylist, xi): xi = xi + 1
+ dimmethod2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
+ dimshared2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
+ IF Debug THEN PRINT #9, "common checking against:" + varname2$ + sp + typ2$ + sp + str2(dimmethod2) + sp + str2(dimshared2)
+ 'check if they are similar
+ IF varname$ = varname2$ THEN
+ IF symbol2fulltypename$(typ$) = typ2$ THEN
+ IF Error_Happened THEN GOTO errmes
+ IF dimmethod = dimmethod2 THEN
+
+ 'match found!
+ 'enforce shared status (if necessary)
+ IF dimshared2 THEN dimshared = dimshared OR 2 'temp force SHARED
+
+ 'old chain code
+ 'chaincommonarray=x
+
+ END IF 'method
+ END IF 'typ
+ END IF 'varname
+ NEXT
+ END IF
+ END IF
+
+ dimcommonarray:
+ retval = dim2(varname$, typ$, dimmethod, elements$)
+ IF Error_Happened THEN GOTO errmes
+ skipdim:
+ IF dimshared >= 2 THEN dimshared = dimshared - 2
+
+ 'non-array COMMON variable
+ IF commonoption <> 0 AND LEN(elements$) = 0 THEN
+
+ 'CHAIN.TXT (save)
+
+ use_global_byte_elements = 1
+
+ 'switch output from main.txt to chain.txt
+ CLOSE #12
+ OPEN tmpdir$ + "chain.txt" FOR APPEND AS #12
+ l2$ = tlayout$
+
+ PRINT #12, "int32val=1;" 'simple variable
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+
+ t = id.t
+ bits = t AND 511
+ IF t AND ISUDT THEN bits = udtxsize(t AND 511)
+ IF t AND ISSTRING THEN
+ IF t AND ISFIXEDLENGTH THEN
+ bits = id.tsize * 8
+ ELSE
+ PRINT #12, "int64val=__STRING_" + RTRIM$(id.n) + "->len*8;"
+ bits = 0
+ END IF
+ END IF
+
+ IF bits THEN
+ PRINT #12, "int64val=" + str2$(bits) + ";" 'size in bits
+ END IF
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+
+ 'put the variable
+ e$ = RTRIM$(id.n)
+
+ IF (t AND ISUDT) = 0 THEN
+ IF t AND ISFIXEDLENGTH THEN
+ e$ = e$ + "$" + str2$(id.tsize)
+ ELSE
+ e$ = e$ + typevalue2symbol$(t)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+ END IF
+ e$ = evaluatetotyp(fixoperationorder$(e$), -4)
+ IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_put(FF,NULL," + e$ + ",0);"
+ PRINT #12, "sub_put(FF,NULL," + e$ + ",0);"
-tlayout$ = l2$
-'revert output to main.txt
-CLOSE #12
-OPEN tmpdir$ + "main.txt" FOR APPEND AS #12
+ tlayout$ = l2$
+ 'revert output to main.txt
+ CLOSE #12
+ OPEN tmpdir$ + "main.txt" FOR APPEND AS #12
-'INPCHAIN.TXT (load)
+ 'INPCHAIN.TXT (load)
-'switch output from main.txt to chain.txt
-CLOSE #12
-OPEN tmpdir$ + "inpchain.txt" FOR APPEND AS #12
-l2$ = tlayout$
+ 'switch output from main.txt to chain.txt
+ CLOSE #12
+ OPEN tmpdir$ + "inpchain.txt" FOR APPEND AS #12
+ l2$ = tlayout$
-PRINT #12, "if (int32val==1){"
-'get the size in bits
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-'***assume correct size***
+ PRINT #12, "if (int32val==1){"
+ 'get the size in bits
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ '***assume correct size***
-e$ = RTRIM$(id.n)
-t = id.t
-IF (t AND ISUDT) = 0 THEN
-IF t AND ISFIXEDLENGTH THEN
-e$ = e$ + "$" + str2$(id.tsize)
-ELSE
-e$ = e$ + typevalue2symbol$(t)
-IF Error_Happened THEN GOTO errmes
-END IF
-END IF
+ e$ = RTRIM$(id.n)
+ t = id.t
+ IF (t AND ISUDT) = 0 THEN
+ IF t AND ISFIXEDLENGTH THEN
+ e$ = e$ + "$" + str2$(id.tsize)
+ ELSE
+ e$ = e$ + typevalue2symbol$(t)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+ END IF
-IF t AND ISSTRING THEN
-IF (t AND ISFIXEDLENGTH) = 0 THEN
-PRINT #12, "tqbs=qbs_new(int64val>>3,1);"
-PRINT #12, "qbs_set(__STRING_" + RTRIM$(id.n) + ",tqbs);"
-'now that the string is the correct size, the following GET command will work correctly...
-END IF
-END IF
-
-e$ = evaluatetotyp(fixoperationorder$(e$), -4)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_get(FF,NULL," + e$ + ",0);"
-
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);" 'get next command
-PRINT #12, "}"
-
-tlayout$ = l2$
-'revert output to main.txt
-CLOSE #12
-OPEN tmpdir$ + "main.txt" FOR APPEND AS #12
+ IF t AND ISSTRING THEN
+ IF (t AND ISFIXEDLENGTH) = 0 THEN
+ PRINT #12, "tqbs=qbs_new(int64val>>3,1);"
+ PRINT #12, "qbs_set(__STRING_" + RTRIM$(id.n) + ",tqbs);"
+ 'now that the string is the correct size, the following GET command will work correctly...
+ END IF
+ END IF
+
+ e$ = evaluatetotyp(fixoperationorder$(e$), -4)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_get(FF,NULL," + e$ + ",0);"
+
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);" 'get next command
+ PRINT #12, "}"
+
+ tlayout$ = l2$
+ 'revert output to main.txt
+ CLOSE #12
+ OPEN tmpdir$ + "main.txt" FOR APPEND AS #12
-use_global_byte_elements = 0
+ use_global_byte_elements = 0
-END IF
-
-commonarraylisted:
-
-n2 = numelements(tlayout$)
-l$ = l$ + sp + getelement$(tlayout$, 1) + appendname$
-IF n2 > 1 THEN
-l$ = l$ + sp2 + getelements$(tlayout$, 2, n2)
-END IF
-
-IF LEN(appendtype$) THEN
-IF LEN(dim2typepassback$) THEN appendtype$ = sp + "AS" + sp + dim2typepassback$
-l$ = l$ + appendtype$
-END IF
-
-'modify first element name to include symbol
-
-dimstatic = olddimstatic
-
-END IF 'listarray=0
-
-IF d$ = "," THEN l$ = l$ + sp2 + ",": GOTO dimnext
-
-dimoption = 0
-dimshared = 0
-redimoption = 0
-IF dimstatic = 1 THEN dimstatic = 0
-AllowLocalName = 0
-
-layoutdone = 1
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-
-GOTO finishedline
-END IF
-END IF
-
-
-
-
-
-
-
-
-
-
-
-'THEN [GOTO] linenumber?
-IF THENGOTO = 1 THEN
-IF n = 1 THEN
-l$ = ""
-a = ASC(LEFT$(firstelement$, 1))
-IF a = 46 OR (a >= 48 AND a <= 57) THEN a2$ = ca$: GOTO THENGOTO
-END IF
-END IF
-
-'goto
-IF n = 2 THEN
-IF getelement$(a$, 1) = "GOTO" THEN
-l$ = "GOTO"
-a2$ = getelement$(ca$, 2)
-THENGOTO:
-IF validlabel(a2$) = 0 THEN a$ = "Invalid label!": GOTO errmes
-
-v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk2:
-IF v THEN
-s = Labels(r).Scope
-IF s = subfuncn OR s = -1 THEN 'same scope?
-IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk2
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd a2$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = subfuncn
-Labels(r).Error_Line = linenumber
-END IF 'x
-
-IF LEN(l$) THEN l$ = l$ + sp + tlayout$ ELSE l$ = tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-PRINT #12, "goto LABEL_" + a2$ + ";"
-GOTO finishedline
-END IF
-END IF
-
-
-
-IF firstelement$ = "RUN" THEN 'RUN
-l$ = "RUN"
-IF n = 1 THEN
-'no parameters
-PRINT #12, "sub_run_init();" 'note: called first to free up screen-locked image handles
-PRINT #12, "sub_clear(NULL,NULL,NULL,NULL);" 'use functionality of CLEAR
-IF LEN(subfunc$) THEN
-PRINT #12, "QBMAIN(NULL);"
-ELSE
-PRINT #12, "goto S_0;"
-END IF
-ELSE
-'parameter passed
-e$ = getelements$(ca$, 2, n)
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l2$ = tlayout$
-ignore$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-IF n = 2 AND ((typ AND ISSTRING) = 0) THEN
-'assume it's a label or line number
-lbl$ = getelement$(ca$, 2)
-IF validlabel(lbl$) = 0 THEN a$ = "Invalid label!": GOTO errmes 'invalid label
-
-v = HashFind(lbl$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk501:
-IF v THEN
-s = Labels(r).Scope
-IF s = 0 OR s = -1 THEN 'main scope?
-IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-Labels(r).Scope_Restriction = subfuncn
-Labels(r).Error_Line = linenumber
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk501
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd lbl$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = 0
-Labels(r).Error_Line = linenumber
-Labels(r).Scope_Restriction = subfuncn
-END IF 'x
-
-l$ = l$ + sp + tlayout$
-PRINT #12, "sub_run_init();" 'note: called first to free up screen-locked image handles
-PRINT #12, "sub_clear(NULL,NULL,NULL,NULL);" 'use functionality of CLEAR
-IF LEN(subfunc$) THEN
-PRINT #21, "if (run_from_line==" + str2(nextrunlineindex) + "){run_from_line=0;goto LABEL_" + lbl$ + ";}"
-PRINT #12, "run_from_line=" + str2(nextrunlineindex) + ";"
-nextrunlineindex = nextrunlineindex + 1
-PRINT #12, "QBMAIN(NULL);"
-ELSE
-PRINT #12, "goto LABEL_" + lbl$ + ";"
-END IF
-ELSE
-'assume it's a string containing a filename to execute
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-e$ = evaluatetotyp(e$, ISSTRING)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_run(" + e$ + ");"
-l$ = l$ + sp + l2$
-END IF 'isstring
-END IF 'n=1
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF 'run
-
-
-
-
-
-IF firstelement$ = "END" THEN
-l$ = "END"
-IF n > 1 THEN
-e$ = getelements$(ca$, 2, n)
-e$ = fixoperationorder$(e$): IF Error_Happened THEN GOTO errmes
-l2$ = tlayout$
-e$ = evaluatetotyp(e$, ISINTEGER64): IF Error_Happened THEN GOTO errmes
-PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");}" 'non-resumable error check (cannot exit without handling errors)
-PRINT #12, "exit_code=" + e$ + ";"
-l$ = l$ + sp + l2$
-END IF
-xend
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-
-IF firstelement$ = "SYSTEM" THEN
-l$ = "SYSTEM"
-IF n > 1 THEN
-e$ = getelements$(ca$, 2, n)
-e$ = fixoperationorder$(e$): IF Error_Happened THEN GOTO errmes
-l2$ = tlayout$
-e$ = evaluatetotyp(e$, ISINTEGER64): IF Error_Happened THEN GOTO errmes
-PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");}" 'non-resumable error check (cannot exit without handling errors)
-PRINT #12, "exit_code=" + e$ + ";"
-l$ = l$ + sp + l2$
-END IF
-
-
-PRINT #12, "if (sub_gl_called) error(271);"
-PRINT #12, "close_program=1;"
-PRINT #12, "end();"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-
-IF n >= 1 THEN
-IF firstelement$ = "STOP" THEN
-l$ = "STOP"
-IF n > 1 THEN
-e$ = getelements$(ca$, 2, n)
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = "STOP" + sp + tlayout$
-e$ = evaluatetotyp(e$, 64)
-IF Error_Happened THEN GOTO errmes
-'note: this value is currently ignored but evaluated for checking reasons
-END IF
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-PRINT #12, "close_program=1;"
-PRINT #12, "end();"
-GOTO finishedline
-END IF
-END IF
-
-IF n = 2 THEN
-IF firstelement$ = "GOSUB" THEN
-xgosub ca$, n
-IF Error_Happened THEN GOTO errmes
-'note: layout implemented in xgosub
-GOTO finishedline
-END IF
-END IF
-
-IF n >= 1 THEN
-IF firstelement$ = "RETURN" THEN
-IF n = 1 THEN
-PRINT #12, "#include " + CHR$(34) + "ret" + str2$(subfuncn) + ".txt" + CHR$(34)
-l$ = "RETURN"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-ELSE
-'label/linenumber follows
-IF subfuncn <> 0 THEN a$ = "RETURN linelabel/linenumber invalid within a SUB/FUNCTION": GOTO errmes
-IF n > 2 THEN a$ = "Expected linelabel/linenumber after RETURN": GOTO errmes
-PRINT #12, "if (!next_return_point) error(3);" 'check return point available
-PRINT #12, "next_return_point--;" 'destroy return point
-a2$ = getelement$(ca$, 2)
-IF validlabel(a2$) = 0 THEN a$ = "Invalid label!": GOTO errmes
-
-v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk505:
-IF v THEN
-s = Labels(r).Scope
-IF s = subfuncn OR s = -1 THEN 'same scope?
-IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk505
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd a2$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = subfuncn
-Labels(r).Error_Line = linenumber
-END IF 'x
-
-PRINT #12, "goto LABEL_" + a2$ + ";"
-l$ = "RETURN" + sp + tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-END IF
-
-IF n >= 1 THEN
-IF firstelement$ = "RESUME" THEN
-l$ = "RESUME"
-IF n = 1 THEN
-resumeprev:
-
-
-PRINT #12, "if (!error_handling){error(20);}else{error_retry=1; qbevent=1; error_handling=0; error_err=0; return;}"
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-IF n > 2 THEN a$ = "Too many parameters": GOTO errmes
-s$ = getelement$(ca$, 2)
-IF UCASE$(s$) = "NEXT" THEN
-
-
-PRINT #12, "if (!error_handling){error(20);}else{error_handling=0; error_err=0; return;}"
-
-l$ = l$ + sp + "NEXT"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-IF s$ = "0" THEN l$ = l$ + sp + "0": GOTO resumeprev
-IF validlabel(s$) = 0 THEN a$ = "Invalid label passed to RESUME": GOTO errmes
-
-v = HashFind(s$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk506:
-IF v THEN
-s = Labels(r).Scope
-IF s = subfuncn OR s = -1 THEN 'same scope?
-IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk506
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd s$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = subfuncn
-Labels(r).Error_Line = linenumber
-END IF 'x
-
-l$ = l$ + sp + tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-PRINT #12, "if (!error_handling){error(20);}else{error_handling=0; error_err=0; goto LABEL_" + s$ + ";}"
-GOTO finishedline
-END IF
-END IF
-
-IF n = 4 THEN
-IF getelements(a$, 1, 3) = "ON" + sp + "ERROR" + sp + "GOTO" THEN
-l$ = "ON" + sp + "ERROR" + sp + "GOTO"
-lbl$ = getelement$(ca$, 4)
-IF lbl$ = "0" THEN
-PRINT #12, "error_goto_line=0;"
-l$ = l$ + sp + "0"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-IF validlabel(lbl$) = 0 THEN a$ = "Invalid label": GOTO errmes
-
-v = HashFind(lbl$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk6:
-IF v THEN
-s = Labels(r).Scope
-IF s = 0 OR s = -1 THEN 'main scope?
-IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-Labels(r).Scope_Restriction = subfuncn
-Labels(r).Error_Line = linenumber
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk6
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd lbl$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = 0
-Labels(r).Error_Line = linenumber
-Labels(r).Scope_Restriction = subfuncn
-END IF 'x
-
-
-l$ = l$ + sp + tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-errorlabels = errorlabels + 1
-PRINT #12, "error_goto_line=" + str2(errorlabels) + ";"
-PRINT #14, "if (error_goto_line==" + str2(errorlabels) + "){error_handling=1; goto LABEL_" + lbl$ + ";}"
-GOTO finishedline
-END IF
-END IF
-
-IF n >= 1 THEN
-IF firstelement$ = "RESTORE" THEN
-l$ = "RESTORE"
-IF n = 1 THEN
-PRINT #12, "data_offset=0;"
-ELSE
-IF n > 2 THEN a$ = "Syntax error": GOTO errmes
-lbl$ = getelement$(ca$, 2)
-IF validlabel(lbl$) = 0 THEN a$ = "Invalid label": GOTO errmes
-
-'rule: a RESTORE label has no scope, therefore, only one instance of that label may exist
-'how: enforced by a post check for duplicates
-v = HashFind(lbl$, HASHFLAG_LABEL, ignore, r)
-x = 1
-IF v THEN 'already defined
-x = 0
-tlayout$ = RTRIM$(Labels(r).cn)
-Labels(r).Data_Referenced = 1 'make sure the data referenced flag is set
-IF Labels(r).Error_Line = 0 THEN Labels(r).Error_Line = linenumber
-END IF
-IF x THEN
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd lbl$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = -1 'modifyable scope
-Labels(r).Error_Line = linenumber
-Labels(r).Data_Referenced = 1
-END IF 'x
-
-l$ = l$ + sp + tlayout$
-PRINT #12, "data_offset=data_at_LABEL_" + lbl$ + ";"
-END IF
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-
-
-
-'ON ... GOTO/GOSUB
-IF n >= 1 THEN
-IF firstelement$ = "ON" THEN
-xongotogosub a$, ca$, n
-IF Error_Happened THEN GOTO errmes
-GOTO finishedline
-END IF
-END IF
-
-
-'(_MEM) _MEMPUT _MEMGET
-IF n >= 1 THEN
-IF firstelement$ = "_MEMGET" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-'get expressions
-e$ = ""
-B = 0
-ne = 0
-FOR i2 = 2 TO n
-e2$ = getelement$(ca$, i2)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF e2$ = "," AND B = 0 THEN
-ne = ne + 1
-IF ne = 1 THEN blk$ = e$: e$ = ""
-IF ne = 2 THEN offs$ = e$: e$ = ""
-IF ne = 3 THEN a$ = "Syntax error": GOTO errmes
-ELSE
-IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
-END IF
-NEXT
-var$ = e$
-IF e$ = "" OR ne <> 2 THEN a$ = "Expected _MEMGET mem-reference,offset,variable": GOTO errmes
-
-l$ = "_MEMGET" + sp
-
-e$ = fixoperationorder$(blk$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$
-
-test$ = evaluate(e$, typ): IF Error_Happened THEN GOTO errmes
-IF (typ AND ISUDT) = 0 OR (typ AND 511) <> 1 THEN a$ = "Expected _MEM type": GOTO errmes
-blkoffs$ = evaluatetotyp(e$, -6)
-
-' IF typ AND ISREFERENCE THEN e$ = refer(e$, typ, 0)
-
-
-'PRINT #12, blkoffs$ '???
-
-e$ = fixoperationorder$(offs$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
-offs$ = e$
-'PRINT #12, e$ '???
-
-e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-varsize$ = evaluatetotyp(e$, -5): IF Error_Happened THEN GOTO errmes
-varoffs$ = evaluatetotyp(e$, -6): IF Error_Happened THEN GOTO errmes
-
-
-'PRINT #12, varoffs$ '???
-'PRINT #12, varsize$ '???
-
-'what do we do next
-'need to know offset of variable and its size
-
-'known sizes will be handled by designated command casts, otherwise use memmove
-s = 0
-IF varsize$ = "1" THEN s = 1: st$ = "int8"
-IF varsize$ = "2" THEN s = 2: st$ = "int16"
-IF varsize$ = "4" THEN s = 4: st$ = "int32"
-IF varsize$ = "8" THEN s = 8: st$ = "int64"
-
-IF NoChecks THEN
-'fast version:
-IF s THEN
-PRINT #12, "*(" + st$ + "*)" + varoffs$ + "=*(" + st$ + "*)(" + offs$ + ");"
-ELSE
-PRINT #12, "memmove(" + varoffs$ + ",(void*)" + offs$ + "," + varsize$ + ");"
-END IF
-ELSE
-'safe version:
-PRINT #12, "tmp_long=" + offs$ + ";"
-'is mem block init?
-PRINT #12, "if ( ((mem_block*)(" + blkoffs$ + "))->lock_offset ){"
-'are region and id valid?
-PRINT #12, "if ("
-PRINT #12, "tmp_long < ((mem_block*)(" + blkoffs$ + "))->offset ||"
-PRINT #12, "(tmp_long+(" + varsize$ + ")) > ( ((mem_block*)(" + blkoffs$ + "))->offset + ((mem_block*)(" + blkoffs$ + "))->size) ||"
-PRINT #12, "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id ){"
-'diagnose error
-PRINT #12, "if (" + "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id" + ") error(308); else error(300);"
-PRINT #12, "}else{"
-IF s THEN
-PRINT #12, "*(" + st$ + "*)" + varoffs$ + "=*(" + st$ + "*)tmp_long;"
-ELSE
-PRINT #12, "memmove(" + varoffs$ + ",(void*)tmp_long," + varsize$ + ");"
-END IF
-PRINT #12, "}"
-PRINT #12, "}else error(309);"
-END IF
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-
-END IF
-END IF
-
-
-
-
-IF n >= 1 THEN
-IF firstelement$ = "_MEMPUT" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-'get expressions
-typ$ = ""
-e$ = ""
-B = 0
-ne = 0
-FOR i2 = 2 TO n
-e2$ = getelement$(ca$, i2)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF (e2$ = "," OR UCASE$(e2$) = "AS") AND B = 0 THEN
-ne = ne + 1
-IF ne = 1 THEN blk$ = e$: e$ = ""
-IF ne = 2 THEN offs$ = e$: e$ = ""
-IF ne = 3 THEN var$ = e$: e$ = ""
-IF (UCASE$(e2$) = "AS" AND ne <> 3) OR (ne = 3 AND UCASE$(e2$) <> "AS") OR ne = 4 THEN a$ = "Expected _MEMPUT mem-reference,offset,variable|value[AS type]": GOTO errmes
-ELSE
-IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
-END IF
-NEXT
-IF ne < 2 OR e$ = "" THEN a$ = "Expected _MEMPUT mem-reference,offset,variable|value[AS type]": GOTO errmes
-IF ne = 2 THEN var$ = e$ ELSE typ$ = UCASE$(e$)
-
-l$ = "_MEMPUT" + sp
-
-e$ = fixoperationorder$(blk$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$
-
-test$ = evaluate(e$, typ): IF Error_Happened THEN GOTO errmes
-IF (typ AND ISUDT) = 0 OR (typ AND 511) <> 1 THEN a$ = "Expected _MEM type": GOTO errmes
-blkoffs$ = evaluatetotyp(e$, -6)
-
-e$ = fixoperationorder$(offs$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
-offs$ = e$
-
-IF ne = 2 THEN
-e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-
-test$ = evaluate(e$, t): IF Error_Happened THEN GOTO errmes
-IF (t AND ISREFERENCE) = 0 AND (t AND ISSTRING) THEN
-PRINT #12, "g_tmp_str=" + test$ + ";"
-varsize$ = "g_tmp_str->len"
-varoffs$ = "g_tmp_str->chr"
-ELSE
-varsize$ = evaluatetotyp(e$, -5): IF Error_Happened THEN GOTO errmes
-varoffs$ = evaluatetotyp(e$, -6): IF Error_Happened THEN GOTO errmes
-END IF
-
-'known sizes will be handled by designated command casts, otherwise use memmove
-s = 0
-IF varsize$ = "1" THEN s = 1: st$ = "int8"
-IF varsize$ = "2" THEN s = 2: st$ = "int16"
-IF varsize$ = "4" THEN s = 4: st$ = "int32"
-IF varsize$ = "8" THEN s = 8: st$ = "int64"
-
-IF NoChecks THEN
-'fast version:
-IF s THEN
-PRINT #12, "*(" + st$ + "*)(" + offs$ + ")=*(" + st$ + "*)" + varoffs$ + ";"
-ELSE
-PRINT #12, "memmove((void*)" + offs$ + "," + varoffs$ + "," + varsize$ + ");"
-END IF
-ELSE
-'safe version:
-PRINT #12, "tmp_long=" + offs$ + ";"
-'is mem block init?
-PRINT #12, "if ( ((mem_block*)(" + blkoffs$ + "))->lock_offset ){"
-'are region and id valid?
-PRINT #12, "if ("
-PRINT #12, "tmp_long < ((mem_block*)(" + blkoffs$ + "))->offset ||"
-PRINT #12, "(tmp_long+(" + varsize$ + ")) > ( ((mem_block*)(" + blkoffs$ + "))->offset + ((mem_block*)(" + blkoffs$ + "))->size) ||"
-PRINT #12, "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id ){"
-'diagnose error
-PRINT #12, "if (" + "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id" + ") error(308); else error(300);"
-PRINT #12, "}else{"
-IF s THEN
-PRINT #12, "*(" + st$ + "*)tmp_long=*(" + st$ + "*)" + varoffs$ + ";"
-ELSE
-PRINT #12, "memmove((void*)tmp_long," + varoffs$ + "," + varsize$ + ");"
-END IF
-PRINT #12, "}"
-PRINT #12, "}else error(309);"
-END IF
-
-ELSE
-
-'... AS type method
-'FUNCTION typname2typ& (t2$)
-'typname2typsize = 0 'the default
-t = typname2typ(typ$)
-IF t = 0 THEN a$ = "Invalid type": GOTO errmes
-IF (t AND ISOFFSETINBITS) <> 0 OR (t AND ISUDT) <> 0 OR (t AND ISSTRING) THEN a$ = "_MEMPUT requires numeric type": GOTO errmes
-IF (t AND ISPOINTER) THEN t = t - ISPOINTER
-'attempt conversion...
-e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$ + sp + "AS" + sp + typ$
-e$ = evaluatetotyp(e$, t): IF Error_Happened THEN GOTO errmes
-st$ = typ2ctyp$(t, "")
-varsize$ = str2((t AND 511) \ 8)
-IF NoChecks THEN
-'fast version:
-PRINT #12, "*(" + st$ + "*)(" + offs$ + ")=" + e$ + ";"
-ELSE
-'safe version:
-PRINT #12, "tmp_long=" + offs$ + ";"
-'is mem block init?
-PRINT #12, "if ( ((mem_block*)(" + blkoffs$ + "))->lock_offset ){"
-'are region and id valid?
-PRINT #12, "if ("
-PRINT #12, "tmp_long < ((mem_block*)(" + blkoffs$ + "))->offset ||"
-PRINT #12, "(tmp_long+(" + varsize$ + ")) > ( ((mem_block*)(" + blkoffs$ + "))->offset + ((mem_block*)(" + blkoffs$ + "))->size) ||"
-PRINT #12, "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id ){"
-'diagnose error
-PRINT #12, "if (" + "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id" + ") error(308); else error(300);"
-PRINT #12, "}else{"
-PRINT #12, "*(" + st$ + "*)tmp_long=" + e$ + ";"
-PRINT #12, "}"
-PRINT #12, "}else error(309);"
-END IF
-
-END IF
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-
-END IF
-END IF
-
-
-
-
-
-IF n >= 1 THEN
-IF firstelement$ = "_MEMFILL" THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-'get expressions
-typ$ = ""
-e$ = ""
-B = 0
-ne = 0
-FOR i2 = 2 TO n
-e2$ = getelement$(ca$, i2)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF (e2$ = "," OR UCASE$(e2$) = "AS") AND B = 0 THEN
-ne = ne + 1
-IF ne = 1 THEN blk$ = e$: e$ = ""
-IF ne = 2 THEN offs$ = e$: e$ = ""
-IF ne = 3 THEN bytes$ = e$: e$ = ""
-IF ne = 4 THEN var$ = e$: e$ = ""
-IF (UCASE$(e2$) = "AS" AND ne <> 4) OR (ne = 4 AND UCASE$(e2$) <> "AS") OR ne = 5 THEN a$ = "Expected _MEMFILL mem-reference,offset,bytes,variable|value[AS type]": GOTO errmes
-ELSE
-IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
-END IF
-NEXT
-IF ne < 3 OR e$ = "" THEN a$ = "Expected _MEMFILL mem-reference,offset,bytes,variable|value[AS type]": GOTO errmes
-IF ne = 3 THEN var$ = e$ ELSE typ$ = UCASE$(e$)
-
-l$ = "_MEMFILL" + sp
-
-e$ = fixoperationorder$(blk$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$
-
-test$ = evaluate(e$, typ): IF Error_Happened THEN GOTO errmes
-IF (typ AND ISUDT) = 0 OR (typ AND 511) <> 1 THEN a$ = "Expected _MEM type": GOTO errmes
-blkoffs$ = evaluatetotyp(e$, -6)
-
-e$ = fixoperationorder$(offs$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
-offs$ = e$
-
-e$ = fixoperationorder$(bytes$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
-bytes$ = e$
-
-IF ne = 3 THEN 'no AS
-e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-test$ = evaluate(e$, t)
-IF (t AND ISREFERENCE) = 0 AND (t AND ISSTRING) THEN
-PRINT #12, "tmp_long=(ptrszint)" + test$ + ";"
-varsize$ = "((qbs*)tmp_long)->len"
-varoffs$ = "((qbs*)tmp_long)->chr"
-ELSE
-varsize$ = evaluatetotyp(e$, -5): IF Error_Happened THEN GOTO errmes
-varoffs$ = evaluatetotyp(e$, -6): IF Error_Happened THEN GOTO errmes
-END IF
-
-IF NoChecks THEN
-PRINT #12, "sub__memfill_nochecks(" + offs$ + "," + bytes$ + ",(ptrszint)" + varoffs$ + "," + varsize$ + ");"
-ELSE
-PRINT #12, "sub__memfill((mem_block*)" + blkoffs$ + "," + offs$ + "," + bytes$ + ",(ptrszint)" + varoffs$ + "," + varsize$ + ");"
-END IF
-
-ELSE
-
-'... AS type method
-t = typname2typ(typ$)
-IF t = 0 THEN a$ = "Invalid type": GOTO errmes
-IF (t AND ISOFFSETINBITS) <> 0 OR (t AND ISUDT) <> 0 OR (t AND ISSTRING) THEN a$ = "_MEMFILL requires numeric type": GOTO errmes
-IF (t AND ISPOINTER) THEN t = t - ISPOINTER
-'attempt conversion...
-e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$ + sp + "AS" + sp + typ$
-e$ = evaluatetotyp(e$, t): IF Error_Happened THEN GOTO errmes
-
-c$ = "sub__memfill_"
-IF NoChecks THEN c$ = "sub__memfill_nochecks_"
-IF t AND ISOFFSET THEN
-c$ = c$ + "OFFSET"
-ELSE
-IF t AND ISFLOAT THEN
-IF (t AND 511) = 32 THEN c$ = c$ + "SINGLE"
-IF (t AND 511) = 64 THEN c$ = c$ + "DOUBLE"
-IF (t AND 511) = 256 THEN c$ = c$ + "FLOAT" 'padded variable
-ELSE
-c$ = c$ + str2((t AND 511) \ 8)
-END IF
-END IF
-c$ = c$ + "("
-IF NoChecks = 0 THEN c$ = c$ + "(mem_block*)" + blkoffs$ + ","
-PRINT #12, c$ + offs$ + "," + bytes$ + "," + e$ + ");"
-END IF
-
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-
-END IF
-END IF
-
-
-
-
-
-
-
-
-
-
-
-
-
-'note: ABSOLUTE cannot be used without CALL
-cispecial = 0
-IF n > 1 THEN
-IF firstelement$ = "INTERRUPT" OR firstelement$ = "INTERRUPTX" THEN
-a$ = "CALL" + sp + firstelement$ + sp + "(" + sp + getelements$(a$, 2, n) + sp + ")"
-ca$ = "CALL" + sp + firstelement$ + sp + "(" + sp + getelements$(ca$, 2, n) + sp + ")"
-n = n + 3
-firstelement$ = "CALL"
-cispecial = 1
-'fall through
-END IF
-END IF
-
-usecall = 0
-IF firstelement$ = "CALL" THEN
-usecall = 1
-IF n = 1 THEN a$ = "Expected CALL sub-name [(...)]": GOTO errmes
-cn$ = getelement$(ca$, 2): n$ = UCASE$(cn$)
-
-IF n > 2 THEN
-
-IF n <= 4 THEN a$ = "Expected CALL sub-name (...)": GOTO errmes
-IF getelement$(a$, 3) <> "(" OR getelement$(a$, n) <> ")" THEN a$ = "Expected CALL sub-name (...)": GOTO errmes
-a$ = n$ + sp + getelements$(a$, 4, n - 1)
-ca$ = cn$ + sp + getelements$(ca$, 4, n - 1)
-
-
-IF n$ = "INTERRUPT" OR n$ = "INTERRUPTX" THEN 'assume CALL INTERRUPT[X] request
-'print "CI: call interrupt command reached":sleep 1
-IF n$ = "INTERRUPT" THEN PRINT #12, "call_interrupt("; ELSE PRINT #12, "call_interruptx(";
-argn = 0
-n = numelements(a$)
-B = 0
-e$ = ""
-FOR i = 2 TO n
-e2$ = getelement$(ca$, i)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF (e2$ = "," AND B = 0) OR i = n THEN
-IF i = n THEN
-IF e$ = "" THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
-END IF
-argn = argn + 1
-IF argn = 1 THEN 'interrupt number
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = "CALL" + sp + n$ + sp2 + "(" + sp2 + tlayout$
-IF cispecial = 1 THEN l$ = n$ + sp + tlayout$
-e$ = evaluatetotyp(e$, 64&)
-IF Error_Happened THEN GOTO errmes
-'print "CI: evaluated interrupt number as ["+e$+"]":sleep 1
-PRINT #12, e$;
-END IF
-IF argn = 2 OR argn = 3 THEN 'inregs, outregs
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-e2$ = e$
-e$ = evaluatetotyp(e$, -2) 'offset+size
-IF Error_Happened THEN GOTO errmes
-'print "CI: evaluated in/out regs ["+e2$+"] as ["+e$+"]":sleep 1
-PRINT #12, "," + e$;
-END IF
-e$ = ""
-ELSE
-IF e$ = "" THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
-END IF
-NEXT
-IF argn <> 3 THEN a$ = "Expected CALL INTERRUPT (interrupt-no, inregs, outregs)": GOTO errmes
-PRINT #12, ");"
-IF cispecial = 0 THEN l$ = l$ + sp2 + ")"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-'print "CI: done":sleep 1
-GOTO finishedline
-END IF 'call interrupt
-
-
-
-
-
-
-
-
-'call to CALL ABSOLUTE beyond reasonable doubt
-IF n$ = "ABSOLUTE" THEN
-l$ = "CALL" + sp + "ABSOLUTE" + sp2 + "(" + sp2
-argn = 0
-n = numelements(a$)
-B = 0
-e$ = ""
-FOR i = 2 TO n
-e2$ = getelement$(ca$, i)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF (e2$ = "," AND B = 0) OR i = n THEN
-IF i < n THEN
-IF e$ = "" THEN a$ = "Expected expression before , or )": GOTO errmes
-'1. variable or value?
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$ + sp2 + "," + sp
-ignore$ = evaluate(e$, typ)
-IF Error_Happened THEN GOTO errmes
-
-IF (typ AND ISPOINTER) <> 0 AND (typ AND ISREFERENCE) <> 0 THEN
-
-'assume standard variable
-'assume not string/array/udt/etc
-e$ = "VARPTR" + sp + "(" + sp + e$ + sp + ")"
-e$ = evaluatetotyp(e$, UINTEGERTYPE - ISPOINTER)
-IF Error_Happened THEN GOTO errmes
-
-ELSE
-
-'assume not string
-'single, double or integer64?
-IF typ AND ISFLOAT THEN
-IF (typ AND 511) = 32 THEN
-e$ = evaluatetotyp(e$, SINGLETYPE - ISPOINTER)
-IF Error_Happened THEN GOTO errmes
-v$ = "pass" + str2$(uniquenumber)
-PRINT #defdatahandle, "float *" + v$ + "=NULL;"
-PRINT #13, "if(" + v$ + "==NULL){"
-PRINT #13, "cmem_sp-=4;"
-PRINT #13, v$ + "=(float*)(dblock+cmem_sp);"
-PRINT #13, "if (cmem_sp2
-
-a$ = n$
-ca$ = cn$
-usecall = 2
-
-END IF 'n>2
-
-n = numelements(a$)
-firstelement$ = getelement$(a$, 1)
-
-'valid SUB name
-validsub = 0
-findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
-try = findid(firstelement$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.subfunc = 2 THEN validsub = 1: EXIT DO
-IF try = 2 THEN
-findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
-findanotherid = 1
-try = findid(firstelement$)
-IF Error_Happened THEN GOTO errmes
-ELSE
-try = 0
-END IF
-LOOP
-IF validsub = 0 THEN a$ = "Expected CALL sub-name [(...)]": GOTO errmes
-END IF
-
-'sub?
-IF n >= 1 THEN
-
-IF firstelement$ = "?" THEN firstelement$ = "PRINT"
-
-findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
-try = findid(firstelement$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.subfunc = 2 THEN
-
-'check symbol
-s$ = removesymbol$(firstelement$ + "")
-IF Error_Happened THEN GOTO errmes
-IF ASC(id.musthave) = 36 THEN '="$"
-IF s$ <> "$" THEN GOTO notsubcall 'missing musthave "$"
-ELSE
-IF LEN(s$) THEN GOTO notsubcall 'unrequired symbol added
-END IF
-'check for variable assignment
-IF n > 1 THEN
-IF ASC(id.specialformat) <> 61 THEN '<>"="
-IF ASC(getelement$(a$, 2)) = 61 THEN GOTO notsubcall 'assignment, not sub call
-END IF
-END IF
-'check for array assignment
-IF n > 2 THEN
-IF firstelement$ <> "PRINT" AND firstelement$ <> "LPRINT" THEN
-IF getelement$(a$, 2) = "(" THEN
-B = 1
-FOR i = 3 TO n
-e$ = getelement$(a$, i)
-IF e$ = "(" THEN B = B + 1
-IF e$ = ")" THEN
-B = B - 1
-IF B = 0 THEN
-IF i = n THEN EXIT FOR
-IF getelement$(a$, i + 1) = "=" THEN GOTO notsubcall
-END IF
-END IF
-NEXT
-END IF
-END IF
-END IF
-
-
-IF id.NoCloud THEN
-IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
-END IF
-
-'generate error on driect _GL call
-IF firstelement$ = "_GL" THEN a$ = "Cannot call SUB _GL directly": GOTO errmes
-
-IF firstelement$ = "OPEN" THEN
-'gwbasic or qbasic version?
-B = 0
-FOR x = 2 TO n
-a2$ = getelement$(a$, x)
-IF a2$ = "(" THEN B = B + 1
-IF a2$ = ")" THEN B = B - 1
-IF a2$ = "FOR" OR a2$ = "AS" THEN EXIT FOR 'qb style open verified
-IF B = 0 AND a2$ = "," THEN 'the gwbasic version includes a comma after the first string expression
-findanotherid = 1
-try = findid(firstelement$) 'id of sub_open_gwbasic
-IF Error_Happened THEN GOTO errmes
-EXIT FOR
-END IF
-NEXT
-END IF
+ END IF
+
+ commonarraylisted:
+
+ n2 = numelements(tlayout$)
+ l$ = l$ + sp + getelement$(tlayout$, 1) + appendname$
+ IF n2 > 1 THEN
+ l$ = l$ + sp2 + getelements$(tlayout$, 2, n2)
+ END IF
+
+ IF LEN(appendtype$) THEN
+ IF LEN(dim2typepassback$) THEN appendtype$ = sp + "AS" + sp + dim2typepassback$
+ l$ = l$ + appendtype$
+ END IF
+
+ 'modify first element name to include symbol
+
+ dimstatic = olddimstatic
+
+ END IF 'listarray=0
+
+ IF d$ = "," THEN l$ = l$ + sp2 + ",": GOTO dimnext
+
+ dimoption = 0
+ dimshared = 0
+ redimoption = 0
+ IF dimstatic = 1 THEN dimstatic = 0
+ AllowLocalName = 0
+
+ layoutdone = 1
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+
+ GOTO finishedline
+ END IF
+ END IF
+
+
+
+
+
+
+
+
+
+
+
+ 'THEN [GOTO] linenumber?
+ IF THENGOTO = 1 THEN
+ IF n = 1 THEN
+ l$ = ""
+ a = ASC(LEFT$(firstelement$, 1))
+ IF a = 46 OR (a >= 48 AND a <= 57) THEN a2$ = ca$: GOTO THENGOTO
+ END IF
+ END IF
+
+ 'goto
+ IF n = 2 THEN
+ IF getelement$(a$, 1) = "GOTO" THEN
+ l$ = "GOTO"
+ a2$ = getelement$(ca$, 2)
+ THENGOTO:
+ IF validlabel(a2$) = 0 THEN a$ = "Invalid label!": GOTO errmes
+
+ v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk2:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = subfuncn OR s = -1 THEN 'same scope?
+ IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk2
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd a2$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = subfuncn
+ Labels(r).Error_Line = linenumber
+ END IF 'x
+
+ IF LEN(l$) THEN l$ = l$ + sp + tlayout$ ELSE l$ = tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ PRINT #12, "goto LABEL_" + a2$ + ";"
+ GOTO finishedline
+ END IF
+ END IF
+
+
+
+ IF firstelement$ = "RUN" THEN 'RUN
+ l$ = "RUN"
+ IF n = 1 THEN
+ 'no parameters
+ PRINT #12, "sub_run_init();" 'note: called first to free up screen-locked image handles
+ PRINT #12, "sub_clear(NULL,NULL,NULL,NULL);" 'use functionality of CLEAR
+ IF LEN(subfunc$) THEN
+ PRINT #12, "QBMAIN(NULL);"
+ ELSE
+ PRINT #12, "goto S_0;"
+ END IF
+ ELSE
+ 'parameter passed
+ e$ = getelements$(ca$, 2, n)
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l2$ = tlayout$
+ ignore$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+ IF n = 2 AND ((typ AND ISSTRING) = 0) THEN
+ 'assume it's a label or line number
+ lbl$ = getelement$(ca$, 2)
+ IF validlabel(lbl$) = 0 THEN a$ = "Invalid label!": GOTO errmes 'invalid label
+
+ v = HashFind(lbl$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk501:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = 0 OR s = -1 THEN 'main scope?
+ IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ Labels(r).Scope_Restriction = subfuncn
+ Labels(r).Error_Line = linenumber
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk501
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd lbl$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = 0
+ Labels(r).Error_Line = linenumber
+ Labels(r).Scope_Restriction = subfuncn
+ END IF 'x
+
+ l$ = l$ + sp + tlayout$
+ PRINT #12, "sub_run_init();" 'note: called first to free up screen-locked image handles
+ PRINT #12, "sub_clear(NULL,NULL,NULL,NULL);" 'use functionality of CLEAR
+ IF LEN(subfunc$) THEN
+ PRINT #21, "if (run_from_line==" + str2(nextrunlineindex) + "){run_from_line=0;goto LABEL_" + lbl$ + ";}"
+ PRINT #12, "run_from_line=" + str2(nextrunlineindex) + ";"
+ nextrunlineindex = nextrunlineindex + 1
+ PRINT #12, "QBMAIN(NULL);"
+ ELSE
+ PRINT #12, "goto LABEL_" + lbl$ + ";"
+ END IF
+ ELSE
+ 'assume it's a string containing a filename to execute
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ e$ = evaluatetotyp(e$, ISSTRING)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_run(" + e$ + ");"
+ l$ = l$ + sp + l2$
+ END IF 'isstring
+ END IF 'n=1
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF 'run
+
+
+
+
+
+ IF firstelement$ = "END" THEN
+ l$ = "END"
+ IF n > 1 THEN
+ e$ = getelements$(ca$, 2, n)
+ e$ = fixoperationorder$(e$): IF Error_Happened THEN GOTO errmes
+ l2$ = tlayout$
+ e$ = evaluatetotyp(e$, ISINTEGER64): IF Error_Happened THEN GOTO errmes
+ PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");}" 'non-resumable error check (cannot exit without handling errors)
+ PRINT #12, "exit_code=" + e$ + ";"
+ l$ = l$ + sp + l2$
+ END IF
+ xend
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+
+ IF firstelement$ = "SYSTEM" THEN
+ l$ = "SYSTEM"
+ IF n > 1 THEN
+ e$ = getelements$(ca$, 2, n)
+ e$ = fixoperationorder$(e$): IF Error_Happened THEN GOTO errmes
+ l2$ = tlayout$
+ e$ = evaluatetotyp(e$, ISINTEGER64): IF Error_Happened THEN GOTO errmes
+ PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");}" 'non-resumable error check (cannot exit without handling errors)
+ PRINT #12, "exit_code=" + e$ + ";"
+ l$ = l$ + sp + l2$
+ END IF
+
+
+ PRINT #12, "if (sub_gl_called) error(271);"
+ PRINT #12, "close_program=1;"
+ PRINT #12, "end();"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+
+ IF n >= 1 THEN
+ IF firstelement$ = "STOP" THEN
+ l$ = "STOP"
+ IF n > 1 THEN
+ e$ = getelements$(ca$, 2, n)
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = "STOP" + sp + tlayout$
+ e$ = evaluatetotyp(e$, 64)
+ IF Error_Happened THEN GOTO errmes
+ 'note: this value is currently ignored but evaluated for checking reasons
+ END IF
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ PRINT #12, "close_program=1;"
+ PRINT #12, "end();"
+ GOTO finishedline
+ END IF
+ END IF
+
+ IF n = 2 THEN
+ IF firstelement$ = "GOSUB" THEN
+ xgosub ca$, n
+ IF Error_Happened THEN GOTO errmes
+ 'note: layout implemented in xgosub
+ GOTO finishedline
+ END IF
+ END IF
+
+ IF n >= 1 THEN
+ IF firstelement$ = "RETURN" THEN
+ IF n = 1 THEN
+ PRINT #12, "#include " + CHR$(34) + "ret" + str2$(subfuncn) + ".txt" + CHR$(34)
+ l$ = "RETURN"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ ELSE
+ 'label/linenumber follows
+ IF subfuncn <> 0 THEN a$ = "RETURN linelabel/linenumber invalid within a SUB/FUNCTION": GOTO errmes
+ IF n > 2 THEN a$ = "Expected linelabel/linenumber after RETURN": GOTO errmes
+ PRINT #12, "if (!next_return_point) error(3);" 'check return point available
+ PRINT #12, "next_return_point--;" 'destroy return point
+ a2$ = getelement$(ca$, 2)
+ IF validlabel(a2$) = 0 THEN a$ = "Invalid label!": GOTO errmes
+
+ v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk505:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = subfuncn OR s = -1 THEN 'same scope?
+ IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk505
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd a2$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = subfuncn
+ Labels(r).Error_Line = linenumber
+ END IF 'x
+
+ PRINT #12, "goto LABEL_" + a2$ + ";"
+ l$ = "RETURN" + sp + tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+ END IF
+
+ IF n >= 1 THEN
+ IF firstelement$ = "RESUME" THEN
+ l$ = "RESUME"
+ IF n = 1 THEN
+ resumeprev:
+
+
+ PRINT #12, "if (!error_handling){error(20);}else{error_retry=1; qbevent=1; error_handling=0; error_err=0; return;}"
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ IF n > 2 THEN a$ = "Too many parameters": GOTO errmes
+ s$ = getelement$(ca$, 2)
+ IF UCASE$(s$) = "NEXT" THEN
+
+
+ PRINT #12, "if (!error_handling){error(20);}else{error_handling=0; error_err=0; return;}"
+
+ l$ = l$ + sp + "NEXT"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ IF s$ = "0" THEN l$ = l$ + sp + "0": GOTO resumeprev
+ IF validlabel(s$) = 0 THEN a$ = "Invalid label passed to RESUME": GOTO errmes
+
+ v = HashFind(s$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk506:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = subfuncn OR s = -1 THEN 'same scope?
+ IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk506
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd s$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = subfuncn
+ Labels(r).Error_Line = linenumber
+ END IF 'x
+
+ l$ = l$ + sp + tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ PRINT #12, "if (!error_handling){error(20);}else{error_handling=0; error_err=0; goto LABEL_" + s$ + ";}"
+ GOTO finishedline
+ END IF
+ END IF
+
+ IF n = 4 THEN
+ IF getelements(a$, 1, 3) = "ON" + sp + "ERROR" + sp + "GOTO" THEN
+ l$ = "ON" + sp + "ERROR" + sp + "GOTO"
+ lbl$ = getelement$(ca$, 4)
+ IF lbl$ = "0" THEN
+ PRINT #12, "error_goto_line=0;"
+ l$ = l$ + sp + "0"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ IF validlabel(lbl$) = 0 THEN a$ = "Invalid label": GOTO errmes
+
+ v = HashFind(lbl$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk6:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = 0 OR s = -1 THEN 'main scope?
+ IF s = -1 THEN Labels(r).Scope = 0 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ Labels(r).Scope_Restriction = subfuncn
+ Labels(r).Error_Line = linenumber
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk6
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd lbl$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = 0
+ Labels(r).Error_Line = linenumber
+ Labels(r).Scope_Restriction = subfuncn
+ END IF 'x
+
+
+ l$ = l$ + sp + tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ errorlabels = errorlabels + 1
+ PRINT #12, "error_goto_line=" + str2(errorlabels) + ";"
+ PRINT #14, "if (error_goto_line==" + str2(errorlabels) + "){error_handling=1; goto LABEL_" + lbl$ + ";}"
+ GOTO finishedline
+ END IF
+ END IF
+
+ IF n >= 1 THEN
+ IF firstelement$ = "RESTORE" THEN
+ l$ = "RESTORE"
+ IF n = 1 THEN
+ PRINT #12, "data_offset=0;"
+ ELSE
+ IF n > 2 THEN a$ = "Syntax error": GOTO errmes
+ lbl$ = getelement$(ca$, 2)
+ IF validlabel(lbl$) = 0 THEN a$ = "Invalid label": GOTO errmes
+
+ 'rule: a RESTORE label has no scope, therefore, only one instance of that label may exist
+ 'how: enforced by a post check for duplicates
+ v = HashFind(lbl$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ IF v THEN 'already defined
+ x = 0
+ tlayout$ = RTRIM$(Labels(r).cn)
+ Labels(r).Data_Referenced = 1 'make sure the data referenced flag is set
+ IF Labels(r).Error_Line = 0 THEN Labels(r).Error_Line = linenumber
+ END IF
+ IF x THEN
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd lbl$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = -1 'modifyable scope
+ Labels(r).Error_Line = linenumber
+ Labels(r).Data_Referenced = 1
+ END IF 'x
+
+ l$ = l$ + sp + tlayout$
+ PRINT #12, "data_offset=data_at_LABEL_" + lbl$ + ";"
+ END IF
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+
+
+
+ 'ON ... GOTO/GOSUB
+ IF n >= 1 THEN
+ IF firstelement$ = "ON" THEN
+ xongotogosub a$, ca$, n
+ IF Error_Happened THEN GOTO errmes
+ GOTO finishedline
+ END IF
+ END IF
+
+
+ '(_MEM) _MEMPUT _MEMGET
+ IF n >= 1 THEN
+ IF firstelement$ = "_MEMGET" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ 'get expressions
+ e$ = ""
+ B = 0
+ ne = 0
+ FOR i2 = 2 TO n
+ e2$ = getelement$(ca$, i2)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF e2$ = "," AND B = 0 THEN
+ ne = ne + 1
+ IF ne = 1 THEN blk$ = e$: e$ = ""
+ IF ne = 2 THEN offs$ = e$: e$ = ""
+ IF ne = 3 THEN a$ = "Syntax error": GOTO errmes
+ ELSE
+ IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
+ END IF
+ NEXT
+ var$ = e$
+ IF e$ = "" OR ne <> 2 THEN a$ = "Expected _MEMGET mem-reference,offset,variable": GOTO errmes
+
+ l$ = "_MEMGET" + sp
+
+ e$ = fixoperationorder$(blk$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$
+
+ test$ = evaluate(e$, typ): IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISUDT) = 0 OR (typ AND 511) <> 1 THEN a$ = "Expected _MEM type": GOTO errmes
+ blkoffs$ = evaluatetotyp(e$, -6)
+
+ ' IF typ AND ISREFERENCE THEN e$ = refer(e$, typ, 0)
+
+
+ 'PRINT #12, blkoffs$ '???
+
+ e$ = fixoperationorder$(offs$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
+ offs$ = e$
+ 'PRINT #12, e$ '???
+
+ e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ varsize$ = evaluatetotyp(e$, -5): IF Error_Happened THEN GOTO errmes
+ varoffs$ = evaluatetotyp(e$, -6): IF Error_Happened THEN GOTO errmes
+
+
+ 'PRINT #12, varoffs$ '???
+ 'PRINT #12, varsize$ '???
+
+ 'what do we do next
+ 'need to know offset of variable and its size
+
+ 'known sizes will be handled by designated command casts, otherwise use memmove
+ s = 0
+ IF varsize$ = "1" THEN s = 1: st$ = "int8"
+ IF varsize$ = "2" THEN s = 2: st$ = "int16"
+ IF varsize$ = "4" THEN s = 4: st$ = "int32"
+ IF varsize$ = "8" THEN s = 8: st$ = "int64"
+
+ IF NoChecks THEN
+ 'fast version:
+ IF s THEN
+ PRINT #12, "*(" + st$ + "*)" + varoffs$ + "=*(" + st$ + "*)(" + offs$ + ");"
+ ELSE
+ PRINT #12, "memmove(" + varoffs$ + ",(void*)" + offs$ + "," + varsize$ + ");"
+ END IF
+ ELSE
+ 'safe version:
+ PRINT #12, "tmp_long=" + offs$ + ";"
+ 'is mem block init?
+ PRINT #12, "if ( ((mem_block*)(" + blkoffs$ + "))->lock_offset ){"
+ 'are region and id valid?
+ PRINT #12, "if ("
+ PRINT #12, "tmp_long < ((mem_block*)(" + blkoffs$ + "))->offset ||"
+ PRINT #12, "(tmp_long+(" + varsize$ + ")) > ( ((mem_block*)(" + blkoffs$ + "))->offset + ((mem_block*)(" + blkoffs$ + "))->size) ||"
+ PRINT #12, "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id ){"
+ 'diagnose error
+ PRINT #12, "if (" + "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id" + ") error(308); else error(300);"
+ PRINT #12, "}else{"
+ IF s THEN
+ PRINT #12, "*(" + st$ + "*)" + varoffs$ + "=*(" + st$ + "*)tmp_long;"
+ ELSE
+ PRINT #12, "memmove(" + varoffs$ + ",(void*)tmp_long," + varsize$ + ");"
+ END IF
+ PRINT #12, "}"
+ PRINT #12, "}else error(309);"
+ END IF
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+
+ END IF
+ END IF
+
+
+
+
+ IF n >= 1 THEN
+ IF firstelement$ = "_MEMPUT" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ 'get expressions
+ typ$ = ""
+ e$ = ""
+ B = 0
+ ne = 0
+ FOR i2 = 2 TO n
+ e2$ = getelement$(ca$, i2)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF (e2$ = "," OR UCASE$(e2$) = "AS") AND B = 0 THEN
+ ne = ne + 1
+ IF ne = 1 THEN blk$ = e$: e$ = ""
+ IF ne = 2 THEN offs$ = e$: e$ = ""
+ IF ne = 3 THEN var$ = e$: e$ = ""
+ IF (UCASE$(e2$) = "AS" AND ne <> 3) OR (ne = 3 AND UCASE$(e2$) <> "AS") OR ne = 4 THEN a$ = "Expected _MEMPUT mem-reference,offset,variable|value[AS type]": GOTO errmes
+ ELSE
+ IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
+ END IF
+ NEXT
+ IF ne < 2 OR e$ = "" THEN a$ = "Expected _MEMPUT mem-reference,offset,variable|value[AS type]": GOTO errmes
+ IF ne = 2 THEN var$ = e$ ELSE typ$ = UCASE$(e$)
+
+ l$ = "_MEMPUT" + sp
+
+ e$ = fixoperationorder$(blk$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$
+
+ test$ = evaluate(e$, typ): IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISUDT) = 0 OR (typ AND 511) <> 1 THEN a$ = "Expected _MEM type": GOTO errmes
+ blkoffs$ = evaluatetotyp(e$, -6)
+
+ e$ = fixoperationorder$(offs$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
+ offs$ = e$
+
+ IF ne = 2 THEN
+ e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+
+ test$ = evaluate(e$, t): IF Error_Happened THEN GOTO errmes
+ IF (t AND ISREFERENCE) = 0 AND (t AND ISSTRING) THEN
+ PRINT #12, "g_tmp_str=" + test$ + ";"
+ varsize$ = "g_tmp_str->len"
+ varoffs$ = "g_tmp_str->chr"
+ ELSE
+ varsize$ = evaluatetotyp(e$, -5): IF Error_Happened THEN GOTO errmes
+ varoffs$ = evaluatetotyp(e$, -6): IF Error_Happened THEN GOTO errmes
+ END IF
+
+ 'known sizes will be handled by designated command casts, otherwise use memmove
+ s = 0
+ IF varsize$ = "1" THEN s = 1: st$ = "int8"
+ IF varsize$ = "2" THEN s = 2: st$ = "int16"
+ IF varsize$ = "4" THEN s = 4: st$ = "int32"
+ IF varsize$ = "8" THEN s = 8: st$ = "int64"
+
+ IF NoChecks THEN
+ 'fast version:
+ IF s THEN
+ PRINT #12, "*(" + st$ + "*)(" + offs$ + ")=*(" + st$ + "*)" + varoffs$ + ";"
+ ELSE
+ PRINT #12, "memmove((void*)" + offs$ + "," + varoffs$ + "," + varsize$ + ");"
+ END IF
+ ELSE
+ 'safe version:
+ PRINT #12, "tmp_long=" + offs$ + ";"
+ 'is mem block init?
+ PRINT #12, "if ( ((mem_block*)(" + blkoffs$ + "))->lock_offset ){"
+ 'are region and id valid?
+ PRINT #12, "if ("
+ PRINT #12, "tmp_long < ((mem_block*)(" + blkoffs$ + "))->offset ||"
+ PRINT #12, "(tmp_long+(" + varsize$ + ")) > ( ((mem_block*)(" + blkoffs$ + "))->offset + ((mem_block*)(" + blkoffs$ + "))->size) ||"
+ PRINT #12, "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id ){"
+ 'diagnose error
+ PRINT #12, "if (" + "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id" + ") error(308); else error(300);"
+ PRINT #12, "}else{"
+ IF s THEN
+ PRINT #12, "*(" + st$ + "*)tmp_long=*(" + st$ + "*)" + varoffs$ + ";"
+ ELSE
+ PRINT #12, "memmove((void*)tmp_long," + varoffs$ + "," + varsize$ + ");"
+ END IF
+ PRINT #12, "}"
+ PRINT #12, "}else error(309);"
+ END IF
+
+ ELSE
+
+ '... AS type method
+ 'FUNCTION typname2typ& (t2$)
+ 'typname2typsize = 0 'the default
+ t = typname2typ(typ$)
+ IF t = 0 THEN a$ = "Invalid type": GOTO errmes
+ IF (t AND ISOFFSETINBITS) <> 0 OR (t AND ISUDT) <> 0 OR (t AND ISSTRING) THEN a$ = "_MEMPUT requires numeric type": GOTO errmes
+ IF (t AND ISPOINTER) THEN t = t - ISPOINTER
+ 'attempt conversion...
+ e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$ + sp + "AS" + sp + typ$
+ e$ = evaluatetotyp(e$, t): IF Error_Happened THEN GOTO errmes
+ st$ = typ2ctyp$(t, "")
+ varsize$ = str2((t AND 511) \ 8)
+ IF NoChecks THEN
+ 'fast version:
+ PRINT #12, "*(" + st$ + "*)(" + offs$ + ")=" + e$ + ";"
+ ELSE
+ 'safe version:
+ PRINT #12, "tmp_long=" + offs$ + ";"
+ 'is mem block init?
+ PRINT #12, "if ( ((mem_block*)(" + blkoffs$ + "))->lock_offset ){"
+ 'are region and id valid?
+ PRINT #12, "if ("
+ PRINT #12, "tmp_long < ((mem_block*)(" + blkoffs$ + "))->offset ||"
+ PRINT #12, "(tmp_long+(" + varsize$ + ")) > ( ((mem_block*)(" + blkoffs$ + "))->offset + ((mem_block*)(" + blkoffs$ + "))->size) ||"
+ PRINT #12, "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id ){"
+ 'diagnose error
+ PRINT #12, "if (" + "((mem_lock*)((mem_block*)(" + blkoffs$ + "))->lock_offset)->id != ((mem_block*)(" + blkoffs$ + "))->lock_id" + ") error(308); else error(300);"
+ PRINT #12, "}else{"
+ PRINT #12, "*(" + st$ + "*)tmp_long=" + e$ + ";"
+ PRINT #12, "}"
+ PRINT #12, "}else error(309);"
+ END IF
+
+ END IF
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+
+ END IF
+ END IF
+
+
+
+
+
+ IF n >= 1 THEN
+ IF firstelement$ = "_MEMFILL" THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ 'get expressions
+ typ$ = ""
+ e$ = ""
+ B = 0
+ ne = 0
+ FOR i2 = 2 TO n
+ e2$ = getelement$(ca$, i2)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF (e2$ = "," OR UCASE$(e2$) = "AS") AND B = 0 THEN
+ ne = ne + 1
+ IF ne = 1 THEN blk$ = e$: e$ = ""
+ IF ne = 2 THEN offs$ = e$: e$ = ""
+ IF ne = 3 THEN bytes$ = e$: e$ = ""
+ IF ne = 4 THEN var$ = e$: e$ = ""
+ IF (UCASE$(e2$) = "AS" AND ne <> 4) OR (ne = 4 AND UCASE$(e2$) <> "AS") OR ne = 5 THEN a$ = "Expected _MEMFILL mem-reference,offset,bytes,variable|value[AS type]": GOTO errmes
+ ELSE
+ IF LEN(e$) = 0 THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
+ END IF
+ NEXT
+ IF ne < 3 OR e$ = "" THEN a$ = "Expected _MEMFILL mem-reference,offset,bytes,variable|value[AS type]": GOTO errmes
+ IF ne = 3 THEN var$ = e$ ELSE typ$ = UCASE$(e$)
+
+ l$ = "_MEMFILL" + sp
+
+ e$ = fixoperationorder$(blk$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$
+
+ test$ = evaluate(e$, typ): IF Error_Happened THEN GOTO errmes
+ IF (typ AND ISUDT) = 0 OR (typ AND 511) <> 1 THEN a$ = "Expected _MEM type": GOTO errmes
+ blkoffs$ = evaluatetotyp(e$, -6)
+
+ e$ = fixoperationorder$(offs$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
+ offs$ = e$
+
+ e$ = fixoperationorder$(bytes$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ e$ = evaluatetotyp(e$, OFFSETTYPE - ISPOINTER): IF Error_Happened THEN GOTO errmes
+ bytes$ = e$
+
+ IF ne = 3 THEN 'no AS
+ e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ test$ = evaluate(e$, t)
+ IF (t AND ISREFERENCE) = 0 AND (t AND ISSTRING) THEN
+ PRINT #12, "tmp_long=(ptrszint)" + test$ + ";"
+ varsize$ = "((qbs*)tmp_long)->len"
+ varoffs$ = "((qbs*)tmp_long)->chr"
+ ELSE
+ varsize$ = evaluatetotyp(e$, -5): IF Error_Happened THEN GOTO errmes
+ varoffs$ = evaluatetotyp(e$, -6): IF Error_Happened THEN GOTO errmes
+ END IF
+
+ IF NoChecks THEN
+ PRINT #12, "sub__memfill_nochecks(" + offs$ + "," + bytes$ + ",(ptrszint)" + varoffs$ + "," + varsize$ + ");"
+ ELSE
+ PRINT #12, "sub__memfill((mem_block*)" + blkoffs$ + "," + offs$ + "," + bytes$ + ",(ptrszint)" + varoffs$ + "," + varsize$ + ");"
+ END IF
+
+ ELSE
+
+ '... AS type method
+ t = typname2typ(typ$)
+ IF t = 0 THEN a$ = "Invalid type": GOTO errmes
+ IF (t AND ISOFFSETINBITS) <> 0 OR (t AND ISUDT) <> 0 OR (t AND ISSTRING) THEN a$ = "_MEMFILL requires numeric type": GOTO errmes
+ IF (t AND ISPOINTER) THEN t = t - ISPOINTER
+ 'attempt conversion...
+ e$ = fixoperationorder$(var$): IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$ + sp + "AS" + sp + typ$
+ e$ = evaluatetotyp(e$, t): IF Error_Happened THEN GOTO errmes
+
+ c$ = "sub__memfill_"
+ IF NoChecks THEN c$ = "sub__memfill_nochecks_"
+ IF t AND ISOFFSET THEN
+ c$ = c$ + "OFFSET"
+ ELSE
+ IF t AND ISFLOAT THEN
+ IF (t AND 511) = 32 THEN c$ = c$ + "SINGLE"
+ IF (t AND 511) = 64 THEN c$ = c$ + "DOUBLE"
+ IF (t AND 511) = 256 THEN c$ = c$ + "FLOAT" 'padded variable
+ ELSE
+ c$ = c$ + str2((t AND 511) \ 8)
+ END IF
+ END IF
+ c$ = c$ + "("
+ IF NoChecks = 0 THEN c$ = c$ + "(mem_block*)" + blkoffs$ + ","
+ PRINT #12, c$ + offs$ + "," + bytes$ + "," + e$ + ");"
+ END IF
+
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+
+ END IF
+ END IF
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'note: ABSOLUTE cannot be used without CALL
+ cispecial = 0
+ IF n > 1 THEN
+ IF firstelement$ = "INTERRUPT" OR firstelement$ = "INTERRUPTX" THEN
+ a$ = "CALL" + sp + firstelement$ + sp + "(" + sp + getelements$(a$, 2, n) + sp + ")"
+ ca$ = "CALL" + sp + firstelement$ + sp + "(" + sp + getelements$(ca$, 2, n) + sp + ")"
+ n = n + 3
+ firstelement$ = "CALL"
+ cispecial = 1
+ 'fall through
+ END IF
+ END IF
+
+ usecall = 0
+ IF firstelement$ = "CALL" THEN
+ usecall = 1
+ IF n = 1 THEN a$ = "Expected CALL sub-name [(...)]": GOTO errmes
+ cn$ = getelement$(ca$, 2): n$ = UCASE$(cn$)
+
+ IF n > 2 THEN
+
+ IF n <= 4 THEN a$ = "Expected CALL sub-name (...)": GOTO errmes
+ IF getelement$(a$, 3) <> "(" OR getelement$(a$, n) <> ")" THEN a$ = "Expected CALL sub-name (...)": GOTO errmes
+ a$ = n$ + sp + getelements$(a$, 4, n - 1)
+ ca$ = cn$ + sp + getelements$(ca$, 4, n - 1)
+
+
+ IF n$ = "INTERRUPT" OR n$ = "INTERRUPTX" THEN 'assume CALL INTERRUPT[X] request
+ 'print "CI: call interrupt command reached":sleep 1
+ IF n$ = "INTERRUPT" THEN PRINT #12, "call_interrupt("; ELSE PRINT #12, "call_interruptx(";
+ argn = 0
+ n = numelements(a$)
+ B = 0
+ e$ = ""
+ FOR i = 2 TO n
+ e2$ = getelement$(ca$, i)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF (e2$ = "," AND B = 0) OR i = n THEN
+ IF i = n THEN
+ IF e$ = "" THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
+ END IF
+ argn = argn + 1
+ IF argn = 1 THEN 'interrupt number
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = "CALL" + sp + n$ + sp2 + "(" + sp2 + tlayout$
+ IF cispecial = 1 THEN l$ = n$ + sp + tlayout$
+ e$ = evaluatetotyp(e$, 64&)
+ IF Error_Happened THEN GOTO errmes
+ 'print "CI: evaluated interrupt number as ["+e$+"]":sleep 1
+ PRINT #12, e$;
+ END IF
+ IF argn = 2 OR argn = 3 THEN 'inregs, outregs
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ e2$ = e$
+ e$ = evaluatetotyp(e$, -2) 'offset+size
+ IF Error_Happened THEN GOTO errmes
+ 'print "CI: evaluated in/out regs ["+e2$+"] as ["+e$+"]":sleep 1
+ PRINT #12, "," + e$;
+ END IF
+ e$ = ""
+ ELSE
+ IF e$ = "" THEN e$ = e2$ ELSE e$ = e$ + sp + e2$
+ END IF
+ NEXT
+ IF argn <> 3 THEN a$ = "Expected CALL INTERRUPT (interrupt-no, inregs, outregs)": GOTO errmes
+ PRINT #12, ");"
+ IF cispecial = 0 THEN l$ = l$ + sp2 + ")"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ 'print "CI: done":sleep 1
+ GOTO finishedline
+ END IF 'call interrupt
+
+
+
+
+
+
+
+
+ 'call to CALL ABSOLUTE beyond reasonable doubt
+ IF n$ = "ABSOLUTE" THEN
+ l$ = "CALL" + sp + "ABSOLUTE" + sp2 + "(" + sp2
+ argn = 0
+ n = numelements(a$)
+ B = 0
+ e$ = ""
+ FOR i = 2 TO n
+ e2$ = getelement$(ca$, i)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF (e2$ = "," AND B = 0) OR i = n THEN
+ IF i < n THEN
+ IF e$ = "" THEN a$ = "Expected expression before , or )": GOTO errmes
+ '1. variable or value?
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$ + sp2 + "," + sp
+ ignore$ = evaluate(e$, typ)
+ IF Error_Happened THEN GOTO errmes
+
+ IF (typ AND ISPOINTER) <> 0 AND (typ AND ISREFERENCE) <> 0 THEN
+
+ 'assume standard variable
+ 'assume not string/array/udt/etc
+ e$ = "VARPTR" + sp + "(" + sp + e$ + sp + ")"
+ e$ = evaluatetotyp(e$, UINTEGERTYPE - ISPOINTER)
+ IF Error_Happened THEN GOTO errmes
+
+ ELSE
+
+ 'assume not string
+ 'single, double or integer64?
+ IF typ AND ISFLOAT THEN
+ IF (typ AND 511) = 32 THEN
+ e$ = evaluatetotyp(e$, SINGLETYPE - ISPOINTER)
+ IF Error_Happened THEN GOTO errmes
+ v$ = "pass" + str2$(uniquenumber)
+ PRINT #defdatahandle, "float *" + v$ + "=NULL;"
+ PRINT #13, "if(" + v$ + "==NULL){"
+ PRINT #13, "cmem_sp-=4;"
+ PRINT #13, v$ + "=(float*)(dblock+cmem_sp);"
+ PRINT #13, "if (cmem_sp2
+
+ a$ = n$
+ ca$ = cn$
+ usecall = 2
+
+ END IF 'n>2
+
+ n = numelements(a$)
+ firstelement$ = getelement$(a$, 1)
+
+ 'valid SUB name
+ validsub = 0
+ findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
+ try = findid(firstelement$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.subfunc = 2 THEN validsub = 1: EXIT DO
+ IF try = 2 THEN
+ findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
+ findanotherid = 1
+ try = findid(firstelement$)
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ try = 0
+ END IF
+ LOOP
+ IF validsub = 0 THEN a$ = "Expected CALL sub-name [(...)]": GOTO errmes
+ END IF
+
+ 'sub?
+ IF n >= 1 THEN
+
+ IF firstelement$ = "?" THEN firstelement$ = "PRINT"
+
+ findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
+ try = findid(firstelement$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.subfunc = 2 THEN
+
+ 'check symbol
+ s$ = removesymbol$(firstelement$ + "")
+ IF Error_Happened THEN GOTO errmes
+ IF ASC(id.musthave) = 36 THEN '="$"
+ IF s$ <> "$" THEN GOTO notsubcall 'missing musthave "$"
+ ELSE
+ IF LEN(s$) THEN GOTO notsubcall 'unrequired symbol added
+ END IF
+ 'check for variable assignment
+ IF n > 1 THEN
+ IF ASC(id.specialformat) <> 61 THEN '<>"="
+ IF ASC(getelement$(a$, 2)) = 61 THEN GOTO notsubcall 'assignment, not sub call
+ END IF
+ END IF
+ 'check for array assignment
+ IF n > 2 THEN
+ IF firstelement$ <> "PRINT" AND firstelement$ <> "LPRINT" THEN
+ IF getelement$(a$, 2) = "(" THEN
+ B = 1
+ FOR i = 3 TO n
+ e$ = getelement$(a$, i)
+ IF e$ = "(" THEN B = B + 1
+ IF e$ = ")" THEN
+ B = B - 1
+ IF B = 0 THEN
+ IF i = n THEN EXIT FOR
+ IF getelement$(a$, i + 1) = "=" THEN GOTO notsubcall
+ END IF
+ END IF
+ NEXT
+ END IF
+ END IF
+ END IF
+
+
+ IF id.NoCloud THEN
+ IF Cloud THEN a$ = "Feature not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ END IF
+
+ 'generate error on driect _GL call
+ IF firstelement$ = "_GL" THEN a$ = "Cannot call SUB _GL directly": GOTO errmes
+
+ IF firstelement$ = "OPEN" THEN
+ 'gwbasic or qbasic version?
+ B = 0
+ FOR x = 2 TO n
+ a2$ = getelement$(a$, x)
+ IF a2$ = "(" THEN B = B + 1
+ IF a2$ = ")" THEN B = B - 1
+ IF a2$ = "FOR" OR a2$ = "AS" THEN EXIT FOR 'qb style open verified
+ IF B = 0 AND a2$ = "," THEN 'the gwbasic version includes a comma after the first string expression
+ findanotherid = 1
+ try = findid(firstelement$) 'id of sub_open_gwbasic
+ IF Error_Happened THEN GOTO errmes
+ EXIT FOR
+ END IF
+ NEXT
+ END IF
-'IF findid(firstelement$) THEN
-'IF id.subfunc = 2 THEN
+ 'IF findid(firstelement$) THEN
+ 'IF id.subfunc = 2 THEN
-IF firstelement$ = "CLOSE" OR firstelement$ = "RESET" THEN
-IF firstelement$ = "RESET" THEN
-IF n > 1 THEN a$ = "Syntax error": GOTO errmes
-END IF
-l$ = firstelement$
-IF n = 1 THEN
-PRINT #12, "sub_close(NULL,0);" 'closes all files
-ELSE
-l$ = l$ + sp
-B = 0
-s = 0
-a3$ = ""
-FOR x = 2 TO n
-a2$ = getelement$(ca$, x)
-IF a2$ = "(" THEN B = B + 1
-IF a2$ = ")" THEN B = B - 1
-IF a2$ = "#" AND B = 0 THEN
-IF s = 0 THEN s = 1 ELSE a$ = "Unexpected #": GOTO errmes
-l$ = l$ + "#" + sp2
-GOTO closenexta
-END IF
+ IF firstelement$ = "CLOSE" OR firstelement$ = "RESET" THEN
+ IF firstelement$ = "RESET" THEN
+ IF n > 1 THEN a$ = "Syntax error": GOTO errmes
+ END IF
+ l$ = firstelement$
+ IF n = 1 THEN
+ PRINT #12, "sub_close(NULL,0);" 'closes all files
+ ELSE
+ l$ = l$ + sp
+ B = 0
+ s = 0
+ a3$ = ""
+ FOR x = 2 TO n
+ a2$ = getelement$(ca$, x)
+ IF a2$ = "(" THEN B = B + 1
+ IF a2$ = ")" THEN B = B - 1
+ IF a2$ = "#" AND B = 0 THEN
+ IF s = 0 THEN s = 1 ELSE a$ = "Unexpected #": GOTO errmes
+ l$ = l$ + "#" + sp2
+ GOTO closenexta
+ END IF
-IF a2$ = "," AND B = 0 THEN
-IF s = 2 THEN
-e$ = fixoperationorder$(a3$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$ + sp2 + "," + sp
-e$ = evaluatetotyp(e$, 64&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_close(" + e$ + ",1);"
-a3$ = ""
-s = 0
-GOTO closenexta
-ELSE
-a$ = "Expected expression before ,": GOTO errmes
-END IF
-END IF
+ IF a2$ = "," AND B = 0 THEN
+ IF s = 2 THEN
+ e$ = fixoperationorder$(a3$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$ + sp2 + "," + sp
+ e$ = evaluatetotyp(e$, 64&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_close(" + e$ + ",1);"
+ a3$ = ""
+ s = 0
+ GOTO closenexta
+ ELSE
+ a$ = "Expected expression before ,": GOTO errmes
+ END IF
+ END IF
-s = 2
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ s = 2
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
-closenexta:
-NEXT
+ closenexta:
+ NEXT
-IF s = 2 THEN
-e$ = fixoperationorder$(a3$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + tlayout$
-e$ = evaluatetotyp(e$, 64&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_close(" + e$ + ",1);"
-ELSE
-l$ = LEFT$(l$, LEN(l$) - 1)
-END IF
+ IF s = 2 THEN
+ e$ = fixoperationorder$(a3$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + tlayout$
+ e$ = evaluatetotyp(e$, 64&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_close(" + e$ + ",1);"
+ ELSE
+ l$ = LEFT$(l$, LEN(l$) - 1)
+ END IF
-END IF
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF 'close
+ END IF
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF 'close
@@ -8492,13 +8697,13 @@ END IF 'close
-'data, restore, read
-IF firstelement$ = "READ" THEN 'file input
-xread ca$, n
-IF Error_Happened THEN GOTO errmes
-'note: layout done in xread sub
-GOTO finishedline
-END IF 'read
+ 'data, restore, read
+ IF firstelement$ = "READ" THEN 'file input
+ xread ca$, n
+ IF Error_Happened THEN GOTO errmes
+ 'note: layout done in xread sub
+ GOTO finishedline
+ END IF 'read
@@ -8536,1356 +8741,1356 @@ END IF 'read
-lineinput = 0
-IF n >= 2 THEN
-IF firstelement$ = "LINE" AND secondelement$ = "INPUT" THEN
-lineinput = 1
-a$ = RIGHT$(a$, LEN(a$) - 5): ca$ = RIGHT$(ca$, LEN(ca$) - 5): n = n - 1 'remove "LINE"
-firstelement$ = "INPUT"
-END IF
-END IF
+ lineinput = 0
+ IF n >= 2 THEN
+ IF firstelement$ = "LINE" AND secondelement$ = "INPUT" THEN
+ lineinput = 1
+ a$ = RIGHT$(a$, LEN(a$) - 5): ca$ = RIGHT$(ca$, LEN(ca$) - 5): n = n - 1 'remove "LINE"
+ firstelement$ = "INPUT"
+ END IF
+ END IF
-IF firstelement$ = "INPUT" THEN 'file input
-IF n > 1 THEN
-IF getelement$(a$, 2) = "#" THEN
-l$ = "INPUT" + sp + "#": IF lineinput THEN l$ = "LINE" + sp + l$
+ IF firstelement$ = "INPUT" THEN 'file input
+ IF n > 1 THEN
+ IF getelement$(a$, 2) = "#" THEN
+ l$ = "INPUT" + sp + "#": IF lineinput THEN l$ = "LINE" + sp + l$
-u$ = str2$(uniquenumber)
-'which file?
-IF n = 2 THEN a$ = "Expected # ... , ...": GOTO errmes
-a3$ = ""
-B = 0
-FOR i = 3 TO n
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN B = B + 1
-IF a2$ = ")" THEN B = B - 1
-IF a2$ = "," AND B = 0 THEN
-IF a3$ = "" THEN a$ = "Expected # ... , ...": GOTO errmes
-GOTO inputgotfn
-END IF
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
-NEXT
-inputgotfn:
-e$ = fixoperationorder$(a3$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + tlayout$
-e$ = evaluatetotyp(e$, 64&)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "tmp_fileno=" + e$ + ";"
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-i = i + 1
-IF i > n THEN a$ = "Expected , ...": GOTO errmes
-a3$ = ""
-B = 0
-FOR i = i TO n
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN B = B + 1
-IF a2$ = ")" THEN B = B - 1
-IF i = n THEN
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
-a2$ = ",": B = 0
-END IF
-IF a2$ = "," AND B = 0 THEN
-IF a3$ = "" THEN a$ = "Expected , ...": GOTO errmes
-e$ = fixoperationorder$(a3$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp2 + "," + sp + tlayout$
-e$ = evaluate(e$, t)
-IF Error_Happened THEN GOTO errmes
-IF (t AND ISREFERENCE) = 0 THEN a$ = "Expected variable-name": GOTO errmes
-IF (t AND ISSTRING) THEN
-e$ = refer(e$, t, 0)
-IF Error_Happened THEN GOTO errmes
-IF lineinput THEN
-PRINT #12, "sub_file_line_input_string(tmp_fileno," + e$ + ");"
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-ELSE
-PRINT #12, "sub_file_input_string(tmp_fileno," + e$ + ");"
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-END IF
-stringprocessinghappened = 1
-ELSE
-IF lineinput THEN a$ = "Expected string-variable": GOTO errmes
-
-'numeric variable
-IF (t AND ISFLOAT) <> 0 OR (t AND 511) <> 64 THEN
-IF (t AND ISOFFSETINBITS) THEN
-setrefer e$, t, "((int64)func_file_input_float(tmp_fileno," + str2(t) + "))", 1
-IF Error_Happened THEN GOTO errmes
-ELSE
-setrefer e$, t, "func_file_input_float(tmp_fileno," + str2(t) + ")", 1
-IF Error_Happened THEN GOTO errmes
-END IF
-ELSE
-IF t AND ISUNSIGNED THEN
-setrefer e$, t, "func_file_input_uint64(tmp_fileno)", 1
-IF Error_Happened THEN GOTO errmes
-ELSE
-setrefer e$, t, "func_file_input_int64(tmp_fileno)", 1
-IF Error_Happened THEN GOTO errmes
-END IF
-END IF
-
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-
-END IF
-IF i = n THEN EXIT FOR
-IF lineinput THEN a$ = "Too many variables": GOTO errmes
-a3$ = "": a2$ = ""
-END IF
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
-NEXT
-PRINT #12, "skip" + u$ + ":"
-PRINT #12, "revert_input_check();"
-IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-END IF
-END IF 'input#
-
-
-IF firstelement$ = "INPUT" THEN
-l$ = "INPUT": IF lineinput THEN l$ = "LINE" + sp + l$
-commaneeded = 0
-i = 2
-
-newline = 1: IF getelement$(a$, i) = ";" THEN newline = 0: i = i + 1: l$ = l$ + sp + ";"
-
-a2$ = getelement$(ca$, i)
-IF LEFT$(a2$, 1) = CHR$(34) THEN
-e$ = fixoperationorder$(a2$): l$ = l$ + sp + tlayout$
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "qbs_print(qbs_new_txt_len(" + a2$ + "),0);"
-i = i + 1
-'MUST be followed by a ; or ,
-a2$ = getelement$(ca$, i)
-i = i + 1
-l$ = l$ + sp2 + a2$
-IF a2$ = ";" THEN
-IF lineinput THEN GOTO finishedpromptstring
-PRINT #12, "qbs_print(qbs_new_txt(" + CHR$(34) + "? " + CHR$(34) + "),0);"
-GOTO finishedpromptstring
-END IF
-IF a2$ = "," THEN
-GOTO finishedpromptstring
-END IF
-a$ = "INPUT STATEMENT: SYNTAX ERROR!": GOTO errmes
-END IF
-'there was no promptstring, so print a ?
-IF lineinput = 0 THEN PRINT #12, "qbs_print(qbs_new_txt(" + CHR$(34) + "? " + CHR$(34) + "),0);"
-finishedpromptstring:
-numvar = 0
-FOR i = i TO n
-IF commaneeded = 1 THEN
-a2$ = getelement$(ca$, i)
-IF a2$ <> "," THEN a$ = "INPUT STATEMENT: SYNTAX ERROR! (COMMA EXPECTED)": GOTO errmes
-ELSE
-
-B = 0
-e$ = ""
-FOR i2 = i TO n
-e2$ = getelement$(ca$, i2)
-IF e2$ = "(" THEN B = B + 1
-IF e2$ = ")" THEN B = B - 1
-IF e2$ = "," AND B = 0 THEN i2 = i2 - 1: EXIT FOR
-e$ = e$ + sp + e2$
-NEXT
-i = i2: IF i > n THEN i = n
-IF e$ = "" THEN a$ = "Expected variable": GOTO errmes
-e$ = RIGHT$(e$, LEN(e$) - 1)
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$: IF i <> n THEN l$ = l$ + sp2 + ","
-e$ = evaluate(e$, t)
-IF Error_Happened THEN GOTO errmes
-IF (t AND ISREFERENCE) = 0 THEN a$ = "Expected variable": GOTO errmes
-
-IF (t AND ISSTRING) THEN
-e$ = refer(e$, t, 0)
-IF Error_Happened THEN GOTO errmes
-numvar = numvar + 1
-IF lineinput THEN
-PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=ISSTRING+512;"
-ELSE
-PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=ISSTRING;"
-END IF
-PRINT #12, "qbs_input_variableoffsets[" + str2(numvar) + "]=" + e$ + ";"
-GOTO gotinputvar
-END IF
-
-IF lineinput THEN a$ = "Expected string variable": GOTO errmes
-IF (t AND ISARRAY) THEN
-IF (t AND ISOFFSETINBITS) THEN
-a$ = "INPUT cannot handle BIT array elements yet": GOTO errmes
-END IF
-END IF
-e$ = "&(" + refer(e$, t, 0) + ")"
-IF Error_Happened THEN GOTO errmes
-
-'remove assumed/unnecessary flags
-IF (t AND ISPOINTER) THEN t = t - ISPOINTER
-IF (t AND ISINCONVENTIONALMEMORY) THEN t = t - ISINCONVENTIONALMEMORY
-IF (t AND ISREFERENCE) THEN t = t - ISREFERENCE
-
-'IF (t AND ISOFFSETINBITS) THEN
-'numvar = numvar + 1
-'consider storing the bit offset in unused bits of t
-'PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=" + str2(t) + ";"
-'PRINT #12, "qbs_input_variableoffsets[" + str2(numvar) + "]=" + refer(ref$, typ, 1) + ";"
-'GOTO gotinputvar
-'END IF
-
-'assume it is a regular variable
-numvar = numvar + 1
-PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=" + str2$(t) + ";"
-PRINT #12, "qbs_input_variableoffsets[" + str2(numvar) + "]=" + e$ + ";"
-GOTO gotinputvar
-
-END IF
-gotinputvar:
-commaneeded = commaneeded + 1: IF commaneeded = 2 THEN commaneeded = 0
-NEXT
-IF numvar = 0 THEN a$ = "INPUT STATEMENT: SYNTAX ERROR! (NO VARIABLES LISTED FOR INPUT)": GOTO errmes
-IF lineinput = 1 AND numvar > 1 THEN a$ = "Too many variables": GOTO errmes
-PRINT #12, "qbs_input(" + str2(numvar) + "," + str2$(newline) + ");"
-PRINT #12, "if (stop_program) end();"
-PRINT #12, cleanupstringprocessingcall$ + "0);"
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-
-
-
-IF firstelement$ = "WRITE" THEN 'file write
-IF n > 1 THEN
-IF getelement$(a$, 2) = "#" THEN
-xfilewrite ca$, n
-IF Error_Happened THEN GOTO errmes
-GOTO finishedline
-END IF '#
-END IF 'n>1
-END IF '"write"
-
-IF firstelement$ = "WRITE" THEN 'write
-xwrite ca$, n
-IF Error_Happened THEN GOTO errmes
-GOTO finishedline
-END IF '"write"
-
-IF firstelement$ = "PRINT" THEN 'file print
-IF n > 1 THEN
-IF getelement$(a$, 2) = "#" THEN
-xfileprint a$, ca$, n
-IF Error_Happened THEN GOTO errmes
-l$ = tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF '#
-END IF 'n>1
-END IF '"print"
-
-IF firstelement$ = "PRINT" OR firstelement$ = "LPRINT" THEN
-IF secondelement$ <> "USING" THEN 'check to see if we need to auto-add semicolons
-elementon = 2
-redosemi:
-FOR i = elementon TO n - 1
-nextchar$ = getelement$(a$, i + 1)
-IF nextchar$ <> ";" AND nextchar$ <> "," AND nextchar$ <> "+" AND nextchar$ <> ")" THEN
-temp1$ = getelement$(a$, i)
-beginpoint = INSTR(beginpoint, temp1$, CHR$(34))
-endpoint = INSTR(beginpoint + 1, temp1$, CHR$(34) + ",")
-IF beginpoint <> 0 AND endpoint <> 0 THEN 'if we have both positions
-'Quote without semicolon check (like PRINT "abc"123)
-textlength = endpoint - beginpoint - 1
-textvalue$ = MID$(temp1$, endpoint + 2, LEN(LTRIM$(STR$(textlength))))
-IF VAL(textvalue$) = textlength THEN
-insertelements a$, i, ";"
-insertelements ca$, i, ";"
-n = n + 1
-elementon = i + 2 'just a easy way to reduce redundant calls to the routine
-GOTO redosemi
-END IF
-END IF
-'Values before Quote check will go here once my brain stops smoking from sorting out the other half
-'This will fix things like PRINT 123"xyz" to make it PRINT 123; xyz once it's implemented.
-'Brain smoke clear; let's finish this up!
-IF LEFT$(LTRIM$(nextchar$), 1) = CHR$(34) THEN
-IF temp1$ <> ";" AND temp1$ <> "," AND temp1$ <> "+" AND temp1$ <> "(" THEN
-insertelements a$, i, ";"
-insertelements ca$, i, ";"
-n = n + 1
-elementon = i + 2 'just a easy way to reduce redundant calls to the routine
-GOTO redosemi
-END IF
-END IF
-END IF
-NEXT
-END IF
-
-xprint a$, ca$, n
-IF Error_Happened THEN GOTO errmes
-l$ = tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-
-
-
-IF firstelement$ = "CLEAR" THEN
-IF subfunc$ <> "" THEN a$ = "CLEAR cannot be used inside a SUB/FUNCTION": GOTO errmes
-END IF
-
-'LSET/RSET
-IF firstelement$ = "LSET" OR firstelement$ = "RSET" THEN
-IF n = 1 THEN a$ = "Expected " + firstelement$ + " ...": GOTO errmes
-l$ = firstelement$
-dest$ = ""
-source$ = ""
-part = 1
-i = 2
-a3$ = ""
-B = 0
-DO
-IF i > n THEN
-IF part <> 2 OR a3$ = "" THEN a$ = "Expected LSET/RSET stringvariable=string": GOTO errmes
-source$ = a3$
-EXIT DO
-END IF
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN B = B + 1
-IF a2$ = ")" THEN B = B - 1
-IF a2$ = "=" AND B = 0 THEN
-IF part = 1 THEN dest$ = a3$: part = 2: a3$ = "": GOTO lrsetgotpart
-END IF
-IF LEN(a3$) THEN a3$ = a3$ + sp + a2$ ELSE a3$ = a2$
-lrsetgotpart:
-i = i + 1
-LOOP
-IF dest$ = "" THEN a$ = "Expected LSET/RSET stringvariable=string": GOTO errmes
-'check if it is a valid source string
-f$ = fixoperationorder$(dest$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$ + sp + "="
-e$ = evaluate(f$, sourcetyp)
-IF Error_Happened THEN GOTO errmes
-IF (sourcetyp AND ISREFERENCE) = 0 OR (sourcetyp AND ISSTRING) = 0 THEN a$ = "LSET/RSET expects a string variable/array-element as its first argument": GOTO errmes
-dest$ = evaluatetotyp(f$, ISSTRING)
-IF Error_Happened THEN GOTO errmes
-source$ = fixoperationorder$(source$)
-IF Error_Happened THEN GOTO errmes
-l$ = l$ + sp + tlayout$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-source$ = evaluatetotyp(source$, ISSTRING)
-IF Error_Happened THEN GOTO errmes
-IF firstelement$ = "LSET" THEN
-PRINT #12, "sub_lset(" + dest$ + "," + source$ + ");"
-ELSE
-PRINT #12, "sub_rset(" + dest$ + "," + source$ + ");"
-END IF
-GOTO finishedline
-END IF
-
-'SWAP
-IF firstelement$ = "SWAP" THEN
-IF n < 4 THEN a$ = "Expected SWAP ... , ...": GOTO errmes
-B = 0
-ele = 1
-e1$ = ""
-e2$ = ""
-FOR i = 2 TO n
-e$ = getelement$(ca$, i)
-IF e$ = "(" THEN B = B + 1
-IF e$ = ")" THEN B = B - 1
-IF e$ = "," AND B = 0 THEN
-IF ele = 2 THEN a$ = "Expected SWAP ... , ...": GOTO errmes
-ele = 2
-ELSE
-IF ele = 1 THEN e1$ = e1$ + sp + e$ ELSE e2$ = e2$ + sp + e$
-END IF
-NEXT
-IF e2$ = "" THEN a$ = "Expected SWAP ... , ...": GOTO errmes
-e1$ = RIGHT$(e1$, LEN(e1$) - 1): e2$ = RIGHT$(e2$, LEN(e2$) - 1)
-
-e1$ = fixoperationorder(e1$)
-IF Error_Happened THEN GOTO errmes
-e1l$ = tlayout$
-e2$ = fixoperationorder(e2$)
-IF Error_Happened THEN GOTO errmes
-e2l$ = tlayout$
-e1$ = evaluate(e1$, e1typ): e2$ = evaluate(e2$, e2typ)
-IF Error_Happened THEN GOTO errmes
-IF (e1typ AND ISREFERENCE) = 0 OR (e2typ AND ISREFERENCE) = 0 THEN a$ = "Expected variable": GOTO errmes
-
-layoutdone = 1
-l$ = "SWAP" + sp + e1l$ + sp2 + "," + sp + e2l$
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-
-'swap strings?
-IF (e1typ AND ISSTRING) THEN
-IF (e2typ AND ISSTRING) = 0 THEN a$ = "Type mismatch": GOTO errmes
-e1$ = refer(e1$, e1typ, 0): e2$ = refer(e2$, e2typ, 0)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "swap_string(" + e1$ + "," + e2$ + ");"
-GOTO finishedline
-END IF
-
-'swap UDT?
-'note: entire UDTs, unlike thier elements cannot be swapped like standard variables
-' as UDT sizes may vary, and to avoid a malloc operation, QB64 should allocate a buffer
-' in global.txt for the purpose of swapping each UDT type
-
-IF e1typ AND ISUDT THEN
-a$ = e1$
-'retrieve ID
-i = INSTR(a$, sp3)
-IF i THEN
-idnumber = VAL(LEFT$(a$, i - 1)): a$ = RIGHT$(a$, LEN(a$) - i)
-getid idnumber
-IF Error_Happened THEN GOTO errmes
-u = VAL(a$)
-i = INSTR(a$, sp3): a$ = RIGHT$(a$, LEN(a$) - i): E = VAL(a$)
-i = INSTR(a$, sp3): o$ = RIGHT$(a$, LEN(a$) - i)
-n$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n$ = "ARRAY_" + n$ + "[0]"
-IF E = 0 THEN 'not an element of UDT u
-lhsscope$ = scope$
-e$ = e2$: t2 = e2typ
-IF (t2 AND ISUDT) = 0 THEN a$ = "Expected SWAP with similar user defined type": GOTO errmes
-idnumber2 = VAL(e$)
-getid idnumber2
-IF Error_Happened THEN GOTO errmes
-n2$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n2$ = "ARRAY_" + n2$ + "[0]"
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): u2 = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): e2 = VAL(e$)
-
-i = INSTR(e$, sp3): o2$ = RIGHT$(e$, LEN(e$) - i)
-'WARNING: u2 may need minor modifications based on e to see if they are the same
-IF u <> u2 OR e2 <> 0 THEN a$ = "Expected SWAP with similar user defined type": GOTO errmes
-dst$ = "(((char*)" + lhsscope$ + n$ + ")+(" + o$ + "))"
-src$ = "(((char*)" + scope$ + n2$ + ")+(" + o2$ + "))"
-B = udtxsize(u) \ 8
-siz$ = str2$(B)
-IF B = 1 THEN PRINT #12, "swap_8(" + src$ + "," + dst$ + ");"
-IF B = 2 THEN PRINT #12, "swap_16(" + src$ + "," + dst$ + ");"
-IF B = 4 THEN PRINT #12, "swap_32(" + src$ + "," + dst$ + ");"
-IF B = 8 THEN PRINT #12, "swap_64(" + src$ + "," + dst$ + ");"
-IF B <> 1 AND B <> 2 AND B <> 4 AND B <> 8 THEN PRINT #12, "swap_block(" + src$ + "," + dst$ + "," + siz$ + ");"
-GOTO finishedline
-END IF 'e=0
-END IF 'i
-END IF 'isudt
-
-'cull irrelavent flags to make comparison possible
-e1typc = e1typ
-IF e1typc AND ISPOINTER THEN e1typc = e1typc - ISPOINTER
-IF e1typc AND ISINCONVENTIONALMEMORY THEN e1typc = e1typc - ISINCONVENTIONALMEMORY
-IF e1typc AND ISARRAY THEN e1typc = e1typc - ISARRAY
-IF e1typc AND ISUNSIGNED THEN e1typc = e1typc - ISUNSIGNED
-IF e1typc AND ISUDT THEN e1typc = e1typc - ISUDT
-e2typc = e2typ
-IF e2typc AND ISPOINTER THEN e2typc = e2typc - ISPOINTER
-IF e2typc AND ISINCONVENTIONALMEMORY THEN e2typc = e2typc - ISINCONVENTIONALMEMORY
-IF e2typc AND ISARRAY THEN e2typc = e2typc - ISARRAY
-IF e2typc AND ISUNSIGNED THEN e2typc = e2typc - ISUNSIGNED
-IF e2typc AND ISUDT THEN e2typc = e2typc - ISUDT
-IF e1typc <> e2typc THEN a$ = "Type mismatch": GOTO errmes
-t = e1typ
-IF t AND ISOFFSETINBITS THEN a$ = "Cannot SWAP bit-length variables": GOTO errmes
-B = t AND 511
-t$ = str2$(B): IF B > 64 THEN t$ = "longdouble"
-PRINT #12, "swap_" + t$ + "(&" + refer(e1$, e1typ, 0) + ",&" + refer(e2$, e2typ, 0) + ");"
-IF Error_Happened THEN GOTO errmes
-GOTO finishedline
-END IF
-
-IF firstelement$ = "OPTION" THEN
-IF n <> 3 THEN a$ = "Expected OPTION BASE 0 or 1": GOTO errmes
-IF getelement$(a$, 2) <> "BASE" THEN a$ = "Expected OPTION BASE 0 or 1": GOTO errmes
-l$ = getelement$(a$, 3)
-IF l$ <> "0" AND l$ <> "1" THEN a$ = "Expected OPTION BASE 0 or 1": GOTO errmes
-IF l$ = "1" THEN optionbase = 1 ELSE optionbase = 0
-l$ = "OPTION" + sp + "BASE" + sp + l$
-layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-GOTO finishedline
-END IF
-
-'any other "unique" subs can be processed above
-
-id2 = id
-
-targetid = currentid
-
-IF RTRIM$(id2.callname) = "sub_stub" THEN a$ = "Command not implemented": GOTO errmes
-
-IF n > 1 THEN
-IF id2.args = 0 THEN a$ = "SUB does not require any arguments": GOTO errmes
-END IF
-
-SetDependency id2.Dependency
-
-seperateargs_error = 0
-passedneeded = seperateargs(getelements(a$, 2, n), getelements(ca$, 2, n), passed&)
-IF seperateargs_error THEN a$ = seperateargs_error_message: GOTO errmes
-
-'backup args to local string array space before calling evaluate
-FOR i = 1 TO OptMax: separgs2(i) = "": NEXT 'save space!
-FOR i = 1 TO OptMax + 1: separgslayout2(i) = "": NEXT
-FOR i = 1 TO id2.args: separgs2(i) = separgs(i): NEXT
-FOR i = 1 TO id2.args + 1: separgslayout2(i) = separgslayout(i): NEXT
-
-
-
-IF Debug THEN
-PRINT #9, "separgs:": FOR i = 1 TO id2.args: PRINT #9, i, separgs2(i): NEXT
-PRINT #9, "separgslayout:": FOR i = 1 TO id2.args + 1: PRINT #9, i, separgslayout2(i): NEXT
-END IF
-
-
-
-'note: seperateargs finds the arguments to pass and sets passed& as necessary
-' FIXOPERTIONORDER is not called on these args yet
-' what we need it to do is build a second array of layout info at the same time
-' ref:DIM SHARED separgslayout(100) AS STRING
-' the above array stores what layout info (if any) goes BEFORE the arg in question
-' it has one extra index which is the arg after
-
-IF usecall THEN
-IF usecall = 1 THEN l$ = "CALL" + sp + RTRIM$(id.cn) + RTRIM$(id.musthave) + sp2 + "(" + sp2
-IF usecall = 2 THEN l$ = "CALL" + sp + RTRIM$(id.cn) + RTRIM$(id.musthave) + sp 'sp at end for easy parsing
-ELSE
-l$ = RTRIM$(id.cn) + RTRIM$(id.musthave) + sp
-END IF
-
-subcall$ = RTRIM$(id.callname) + "("
-addedlayout = 0
-
-fieldcall = 0
-'GET/PUT field exception
-IF RTRIM$(id2.callname) = "sub_get" OR RTRIM$(id2.callname) = "sub_put" THEN
-IF passed AND 2 THEN
-'regular GET/PUT call with variable provided
-passed = passed - 2 'for complience with existing methods, remove 'passed' flag for the passing of a variable
-ELSE
-'FIELD GET/PUT call with variable omited
-IF RTRIM$(id2.callname) = "sub_get" THEN
-fieldcall = 1
-subcall$ = "field_get("
-ELSE
-fieldcall = 2
-subcall$ = "field_put("
-END IF
-END IF
-END IF 'field exception
-
-IF RTRIM$(id2.callname) = "sub_timer" OR RTRIM$(id2.callname) = "sub_key" THEN 'spacing exception
-IF usecall = 0 THEN
-l$ = LEFT$(l$, LEN(l$) - 1) + sp2
-END IF
-END IF
-
-FOR i = 1 TO id2.args
-targettyp = CVL(MID$(id2.arg, -3 + i * 4, 4))
-nele = ASC(MID$(id2.nele, i, 1))
-nelereq = ASC(MID$(id2.nelereq, i, 1))
-
-addlayout = 1 'omits option values in layout (eg. BINARY="2")
-convertspacing = 0 'if an 'equation' is next, it will be preceeded by a space
-x$ = separgslayout2$(i)
-DO WHILE LEN(x$)
-x = ASC(x$)
-IF x THEN
-convertspacing = 0
-x2$ = MID$(x$, 2, x)
-x$ = RIGHT$(x$, LEN(x$) - x - 1)
+ u$ = str2$(uniquenumber)
+ 'which file?
+ IF n = 2 THEN a$ = "Expected # ... , ...": GOTO errmes
+ a3$ = ""
+ B = 0
+ FOR i = 3 TO n
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN B = B + 1
+ IF a2$ = ")" THEN B = B - 1
+ IF a2$ = "," AND B = 0 THEN
+ IF a3$ = "" THEN a$ = "Expected # ... , ...": GOTO errmes
+ GOTO inputgotfn
+ END IF
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ NEXT
+ inputgotfn:
+ e$ = fixoperationorder$(a3$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + tlayout$
+ e$ = evaluatetotyp(e$, 64&)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "tmp_fileno=" + e$ + ";"
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ i = i + 1
+ IF i > n THEN a$ = "Expected , ...": GOTO errmes
+ a3$ = ""
+ B = 0
+ FOR i = i TO n
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN B = B + 1
+ IF a2$ = ")" THEN B = B - 1
+ IF i = n THEN
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ a2$ = ",": B = 0
+ END IF
+ IF a2$ = "," AND B = 0 THEN
+ IF a3$ = "" THEN a$ = "Expected , ...": GOTO errmes
+ e$ = fixoperationorder$(a3$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp2 + "," + sp + tlayout$
+ e$ = evaluate(e$, t)
+ IF Error_Happened THEN GOTO errmes
+ IF (t AND ISREFERENCE) = 0 THEN a$ = "Expected variable-name": GOTO errmes
+ IF (t AND ISSTRING) THEN
+ e$ = refer(e$, t, 0)
+ IF Error_Happened THEN GOTO errmes
+ IF lineinput THEN
+ PRINT #12, "sub_file_line_input_string(tmp_fileno," + e$ + ");"
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ ELSE
+ PRINT #12, "sub_file_input_string(tmp_fileno," + e$ + ");"
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ END IF
+ stringprocessinghappened = 1
+ ELSE
+ IF lineinput THEN a$ = "Expected string-variable": GOTO errmes
+
+ 'numeric variable
+ IF (t AND ISFLOAT) <> 0 OR (t AND 511) <> 64 THEN
+ IF (t AND ISOFFSETINBITS) THEN
+ setrefer e$, t, "((int64)func_file_input_float(tmp_fileno," + str2(t) + "))", 1
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ setrefer e$, t, "func_file_input_float(tmp_fileno," + str2(t) + ")", 1
+ IF Error_Happened THEN GOTO errmes
+ END IF
+ ELSE
+ IF t AND ISUNSIGNED THEN
+ setrefer e$, t, "func_file_input_uint64(tmp_fileno)", 1
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ setrefer e$, t, "func_file_input_int64(tmp_fileno)", 1
+ IF Error_Happened THEN GOTO errmes
+ END IF
+ END IF
+
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+
+ END IF
+ IF i = n THEN EXIT FOR
+ IF lineinput THEN a$ = "Too many variables": GOTO errmes
+ a3$ = "": a2$ = ""
+ END IF
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ NEXT
+ PRINT #12, "skip" + u$ + ":"
+ PRINT #12, "revert_input_check();"
+ IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+ END IF
+ END IF 'input#
+
+
+ IF firstelement$ = "INPUT" THEN
+ l$ = "INPUT": IF lineinput THEN l$ = "LINE" + sp + l$
+ commaneeded = 0
+ i = 2
+
+ newline = 1: IF getelement$(a$, i) = ";" THEN newline = 0: i = i + 1: l$ = l$ + sp + ";"
+
+ a2$ = getelement$(ca$, i)
+ IF LEFT$(a2$, 1) = CHR$(34) THEN
+ e$ = fixoperationorder$(a2$): l$ = l$ + sp + tlayout$
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "qbs_print(qbs_new_txt_len(" + a2$ + "),0);"
+ i = i + 1
+ 'MUST be followed by a ; or ,
+ a2$ = getelement$(ca$, i)
+ i = i + 1
+ l$ = l$ + sp2 + a2$
+ IF a2$ = ";" THEN
+ IF lineinput THEN GOTO finishedpromptstring
+ PRINT #12, "qbs_print(qbs_new_txt(" + CHR$(34) + "? " + CHR$(34) + "),0);"
+ GOTO finishedpromptstring
+ END IF
+ IF a2$ = "," THEN
+ GOTO finishedpromptstring
+ END IF
+ a$ = "INPUT STATEMENT: SYNTAX ERROR!": GOTO errmes
+ END IF
+ 'there was no promptstring, so print a ?
+ IF lineinput = 0 THEN PRINT #12, "qbs_print(qbs_new_txt(" + CHR$(34) + "? " + CHR$(34) + "),0);"
+ finishedpromptstring:
+ numvar = 0
+ FOR i = i TO n
+ IF commaneeded = 1 THEN
+ a2$ = getelement$(ca$, i)
+ IF a2$ <> "," THEN a$ = "INPUT STATEMENT: SYNTAX ERROR! (COMMA EXPECTED)": GOTO errmes
+ ELSE
+
+ B = 0
+ e$ = ""
+ FOR i2 = i TO n
+ e2$ = getelement$(ca$, i2)
+ IF e2$ = "(" THEN B = B + 1
+ IF e2$ = ")" THEN B = B - 1
+ IF e2$ = "," AND B = 0 THEN i2 = i2 - 1: EXIT FOR
+ e$ = e$ + sp + e2$
+ NEXT
+ i = i2: IF i > n THEN i = n
+ IF e$ = "" THEN a$ = "Expected variable": GOTO errmes
+ e$ = RIGHT$(e$, LEN(e$) - 1)
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$: IF i <> n THEN l$ = l$ + sp2 + ","
+ e$ = evaluate(e$, t)
+ IF Error_Happened THEN GOTO errmes
+ IF (t AND ISREFERENCE) = 0 THEN a$ = "Expected variable": GOTO errmes
+
+ IF (t AND ISSTRING) THEN
+ e$ = refer(e$, t, 0)
+ IF Error_Happened THEN GOTO errmes
+ numvar = numvar + 1
+ IF lineinput THEN
+ PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=ISSTRING+512;"
+ ELSE
+ PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=ISSTRING;"
+ END IF
+ PRINT #12, "qbs_input_variableoffsets[" + str2(numvar) + "]=" + e$ + ";"
+ GOTO gotinputvar
+ END IF
+
+ IF lineinput THEN a$ = "Expected string variable": GOTO errmes
+ IF (t AND ISARRAY) THEN
+ IF (t AND ISOFFSETINBITS) THEN
+ a$ = "INPUT cannot handle BIT array elements yet": GOTO errmes
+ END IF
+ END IF
+ e$ = "&(" + refer(e$, t, 0) + ")"
+ IF Error_Happened THEN GOTO errmes
+
+ 'remove assumed/unnecessary flags
+ IF (t AND ISPOINTER) THEN t = t - ISPOINTER
+ IF (t AND ISINCONVENTIONALMEMORY) THEN t = t - ISINCONVENTIONALMEMORY
+ IF (t AND ISREFERENCE) THEN t = t - ISREFERENCE
+
+ 'IF (t AND ISOFFSETINBITS) THEN
+ 'numvar = numvar + 1
+ 'consider storing the bit offset in unused bits of t
+ 'PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=" + str2(t) + ";"
+ 'PRINT #12, "qbs_input_variableoffsets[" + str2(numvar) + "]=" + refer(ref$, typ, 1) + ";"
+ 'GOTO gotinputvar
+ 'END IF
+
+ 'assume it is a regular variable
+ numvar = numvar + 1
+ PRINT #12, "qbs_input_variabletypes[" + str2(numvar) + "]=" + str2$(t) + ";"
+ PRINT #12, "qbs_input_variableoffsets[" + str2(numvar) + "]=" + e$ + ";"
+ GOTO gotinputvar
+
+ END IF
+ gotinputvar:
+ commaneeded = commaneeded + 1: IF commaneeded = 2 THEN commaneeded = 0
+ NEXT
+ IF numvar = 0 THEN a$ = "INPUT STATEMENT: SYNTAX ERROR! (NO VARIABLES LISTED FOR INPUT)": GOTO errmes
+ IF lineinput = 1 AND numvar > 1 THEN a$ = "Too many variables": GOTO errmes
+ PRINT #12, "qbs_input(" + str2(numvar) + "," + str2$(newline) + ");"
+ PRINT #12, "if (stop_program) end();"
+ PRINT #12, cleanupstringprocessingcall$ + "0);"
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+
+
+
+ IF firstelement$ = "WRITE" THEN 'file write
+ IF n > 1 THEN
+ IF getelement$(a$, 2) = "#" THEN
+ xfilewrite ca$, n
+ IF Error_Happened THEN GOTO errmes
+ GOTO finishedline
+ END IF '#
+ END IF 'n>1
+ END IF '"write"
+
+ IF firstelement$ = "WRITE" THEN 'write
+ xwrite ca$, n
+ IF Error_Happened THEN GOTO errmes
+ GOTO finishedline
+ END IF '"write"
+
+ IF firstelement$ = "PRINT" THEN 'file print
+ IF n > 1 THEN
+ IF getelement$(a$, 2) = "#" THEN
+ xfileprint a$, ca$, n
+ IF Error_Happened THEN GOTO errmes
+ l$ = tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF '#
+ END IF 'n>1
+ END IF '"print"
+
+ IF firstelement$ = "PRINT" OR firstelement$ = "LPRINT" THEN
+ IF secondelement$ <> "USING" THEN 'check to see if we need to auto-add semicolons
+ elementon = 2
+ redosemi:
+ FOR i = elementon TO n - 1
+ nextchar$ = getelement$(a$, i + 1)
+ IF nextchar$ <> ";" AND nextchar$ <> "," AND nextchar$ <> "+" AND nextchar$ <> ")" THEN
+ temp1$ = getelement$(a$, i)
+ beginpoint = INSTR(beginpoint, temp1$, CHR$(34))
+ endpoint = INSTR(beginpoint + 1, temp1$, CHR$(34) + ",")
+ IF beginpoint <> 0 AND endpoint <> 0 THEN 'if we have both positions
+ 'Quote without semicolon check (like PRINT "abc"123)
+ textlength = endpoint - beginpoint - 1
+ textvalue$ = MID$(temp1$, endpoint + 2, LEN(LTRIM$(STR$(textlength))))
+ IF VAL(textvalue$) = textlength THEN
+ insertelements a$, i, ";"
+ insertelements ca$, i, ";"
+ n = n + 1
+ elementon = i + 2 'just a easy way to reduce redundant calls to the routine
+ GOTO redosemi
+ END IF
+ END IF
+ 'Values before Quote check will go here once my brain stops smoking from sorting out the other half
+ 'This will fix things like PRINT 123"xyz" to make it PRINT 123; xyz once it's implemented.
+ 'Brain smoke clear; let's finish this up!
+ IF LEFT$(LTRIM$(nextchar$), 1) = CHR$(34) THEN
+ IF temp1$ <> ";" AND temp1$ <> "," AND temp1$ <> "+" AND temp1$ <> "(" THEN
+ insertelements a$, i, ";"
+ insertelements ca$, i, ";"
+ n = n + 1
+ elementon = i + 2 'just a easy way to reduce redundant calls to the routine
+ GOTO redosemi
+ END IF
+ END IF
+ END IF
+ NEXT
+ END IF
+
+ xprint a$, ca$, n
+ IF Error_Happened THEN GOTO errmes
+ l$ = tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+
+
+
+ IF firstelement$ = "CLEAR" THEN
+ IF subfunc$ <> "" THEN a$ = "CLEAR cannot be used inside a SUB/FUNCTION": GOTO errmes
+ END IF
+
+ 'LSET/RSET
+ IF firstelement$ = "LSET" OR firstelement$ = "RSET" THEN
+ IF n = 1 THEN a$ = "Expected " + firstelement$ + " ...": GOTO errmes
+ l$ = firstelement$
+ dest$ = ""
+ source$ = ""
+ part = 1
+ i = 2
+ a3$ = ""
+ B = 0
+ DO
+ IF i > n THEN
+ IF part <> 2 OR a3$ = "" THEN a$ = "Expected LSET/RSET stringvariable=string": GOTO errmes
+ source$ = a3$
+ EXIT DO
+ END IF
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN B = B + 1
+ IF a2$ = ")" THEN B = B - 1
+ IF a2$ = "=" AND B = 0 THEN
+ IF part = 1 THEN dest$ = a3$: part = 2: a3$ = "": GOTO lrsetgotpart
+ END IF
+ IF LEN(a3$) THEN a3$ = a3$ + sp + a2$ ELSE a3$ = a2$
+ lrsetgotpart:
+ i = i + 1
+ LOOP
+ IF dest$ = "" THEN a$ = "Expected LSET/RSET stringvariable=string": GOTO errmes
+ 'check if it is a valid source string
+ f$ = fixoperationorder$(dest$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$ + sp + "="
+ e$ = evaluate(f$, sourcetyp)
+ IF Error_Happened THEN GOTO errmes
+ IF (sourcetyp AND ISREFERENCE) = 0 OR (sourcetyp AND ISSTRING) = 0 THEN a$ = "LSET/RSET expects a string variable/array-element as its first argument": GOTO errmes
+ dest$ = evaluatetotyp(f$, ISSTRING)
+ IF Error_Happened THEN GOTO errmes
+ source$ = fixoperationorder$(source$)
+ IF Error_Happened THEN GOTO errmes
+ l$ = l$ + sp + tlayout$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ source$ = evaluatetotyp(source$, ISSTRING)
+ IF Error_Happened THEN GOTO errmes
+ IF firstelement$ = "LSET" THEN
+ PRINT #12, "sub_lset(" + dest$ + "," + source$ + ");"
+ ELSE
+ PRINT #12, "sub_rset(" + dest$ + "," + source$ + ");"
+ END IF
+ GOTO finishedline
+ END IF
+
+ 'SWAP
+ IF firstelement$ = "SWAP" THEN
+ IF n < 4 THEN a$ = "Expected SWAP ... , ...": GOTO errmes
+ B = 0
+ ele = 1
+ e1$ = ""
+ e2$ = ""
+ FOR i = 2 TO n
+ e$ = getelement$(ca$, i)
+ IF e$ = "(" THEN B = B + 1
+ IF e$ = ")" THEN B = B - 1
+ IF e$ = "," AND B = 0 THEN
+ IF ele = 2 THEN a$ = "Expected SWAP ... , ...": GOTO errmes
+ ele = 2
+ ELSE
+ IF ele = 1 THEN e1$ = e1$ + sp + e$ ELSE e2$ = e2$ + sp + e$
+ END IF
+ NEXT
+ IF e2$ = "" THEN a$ = "Expected SWAP ... , ...": GOTO errmes
+ e1$ = RIGHT$(e1$, LEN(e1$) - 1): e2$ = RIGHT$(e2$, LEN(e2$) - 1)
+
+ e1$ = fixoperationorder(e1$)
+ IF Error_Happened THEN GOTO errmes
+ e1l$ = tlayout$
+ e2$ = fixoperationorder(e2$)
+ IF Error_Happened THEN GOTO errmes
+ e2l$ = tlayout$
+ e1$ = evaluate(e1$, e1typ): e2$ = evaluate(e2$, e2typ)
+ IF Error_Happened THEN GOTO errmes
+ IF (e1typ AND ISREFERENCE) = 0 OR (e2typ AND ISREFERENCE) = 0 THEN a$ = "Expected variable": GOTO errmes
+
+ layoutdone = 1
+ l$ = "SWAP" + sp + e1l$ + sp2 + "," + sp + e2l$
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+
+ 'swap strings?
+ IF (e1typ AND ISSTRING) THEN
+ IF (e2typ AND ISSTRING) = 0 THEN a$ = "Type mismatch": GOTO errmes
+ e1$ = refer(e1$, e1typ, 0): e2$ = refer(e2$, e2typ, 0)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "swap_string(" + e1$ + "," + e2$ + ");"
+ GOTO finishedline
+ END IF
+
+ 'swap UDT?
+ 'note: entire UDTs, unlike thier elements cannot be swapped like standard variables
+ ' as UDT sizes may vary, and to avoid a malloc operation, QB64 should allocate a buffer
+ ' in global.txt for the purpose of swapping each UDT type
+
+ IF e1typ AND ISUDT THEN
+ a$ = e1$
+ 'retrieve ID
+ i = INSTR(a$, sp3)
+ IF i THEN
+ idnumber = VAL(LEFT$(a$, i - 1)): a$ = RIGHT$(a$, LEN(a$) - i)
+ getid idnumber
+ IF Error_Happened THEN GOTO errmes
+ u = VAL(a$)
+ i = INSTR(a$, sp3): a$ = RIGHT$(a$, LEN(a$) - i): E = VAL(a$)
+ i = INSTR(a$, sp3): o$ = RIGHT$(a$, LEN(a$) - i)
+ n$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n$ = "ARRAY_" + n$ + "[0]"
+ IF E = 0 THEN 'not an element of UDT u
+ lhsscope$ = scope$
+ e$ = e2$: t2 = e2typ
+ IF (t2 AND ISUDT) = 0 THEN a$ = "Expected SWAP with similar user defined type": GOTO errmes
+ idnumber2 = VAL(e$)
+ getid idnumber2
+ IF Error_Happened THEN GOTO errmes
+ n2$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n2$ = "ARRAY_" + n2$ + "[0]"
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): u2 = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): e2 = VAL(e$)
+
+ i = INSTR(e$, sp3): o2$ = RIGHT$(e$, LEN(e$) - i)
+ 'WARNING: u2 may need minor modifications based on e to see if they are the same
+ IF u <> u2 OR e2 <> 0 THEN a$ = "Expected SWAP with similar user defined type": GOTO errmes
+ dst$ = "(((char*)" + lhsscope$ + n$ + ")+(" + o$ + "))"
+ src$ = "(((char*)" + scope$ + n2$ + ")+(" + o2$ + "))"
+ B = udtxsize(u) \ 8
+ siz$ = str2$(B)
+ IF B = 1 THEN PRINT #12, "swap_8(" + src$ + "," + dst$ + ");"
+ IF B = 2 THEN PRINT #12, "swap_16(" + src$ + "," + dst$ + ");"
+ IF B = 4 THEN PRINT #12, "swap_32(" + src$ + "," + dst$ + ");"
+ IF B = 8 THEN PRINT #12, "swap_64(" + src$ + "," + dst$ + ");"
+ IF B <> 1 AND B <> 2 AND B <> 4 AND B <> 8 THEN PRINT #12, "swap_block(" + src$ + "," + dst$ + "," + siz$ + ");"
+ GOTO finishedline
+ END IF 'e=0
+ END IF 'i
+ END IF 'isudt
+
+ 'cull irrelavent flags to make comparison possible
+ e1typc = e1typ
+ IF e1typc AND ISPOINTER THEN e1typc = e1typc - ISPOINTER
+ IF e1typc AND ISINCONVENTIONALMEMORY THEN e1typc = e1typc - ISINCONVENTIONALMEMORY
+ IF e1typc AND ISARRAY THEN e1typc = e1typc - ISARRAY
+ IF e1typc AND ISUNSIGNED THEN e1typc = e1typc - ISUNSIGNED
+ IF e1typc AND ISUDT THEN e1typc = e1typc - ISUDT
+ e2typc = e2typ
+ IF e2typc AND ISPOINTER THEN e2typc = e2typc - ISPOINTER
+ IF e2typc AND ISINCONVENTIONALMEMORY THEN e2typc = e2typc - ISINCONVENTIONALMEMORY
+ IF e2typc AND ISARRAY THEN e2typc = e2typc - ISARRAY
+ IF e2typc AND ISUNSIGNED THEN e2typc = e2typc - ISUNSIGNED
+ IF e2typc AND ISUDT THEN e2typc = e2typc - ISUDT
+ IF e1typc <> e2typc THEN a$ = "Type mismatch": GOTO errmes
+ t = e1typ
+ IF t AND ISOFFSETINBITS THEN a$ = "Cannot SWAP bit-length variables": GOTO errmes
+ B = t AND 511
+ t$ = str2$(B): IF B > 64 THEN t$ = "longdouble"
+ PRINT #12, "swap_" + t$ + "(&" + refer(e1$, e1typ, 0) + ",&" + refer(e2$, e2typ, 0) + ");"
+ IF Error_Happened THEN GOTO errmes
+ GOTO finishedline
+ END IF
+
+ IF firstelement$ = "OPTION" THEN
+ IF n <> 3 THEN a$ = "Expected OPTION BASE 0 or 1": GOTO errmes
+ IF getelement$(a$, 2) <> "BASE" THEN a$ = "Expected OPTION BASE 0 or 1": GOTO errmes
+ l$ = getelement$(a$, 3)
+ IF l$ <> "0" AND l$ <> "1" THEN a$ = "Expected OPTION BASE 0 or 1": GOTO errmes
+ IF l$ = "1" THEN optionbase = 1 ELSE optionbase = 0
+ l$ = "OPTION" + sp + "BASE" + sp + l$
+ layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ GOTO finishedline
+ END IF
+
+ 'any other "unique" subs can be processed above
+
+ id2 = id
+
+ targetid = currentid
+
+ IF RTRIM$(id2.callname) = "sub_stub" THEN a$ = "Command not implemented": GOTO errmes
+
+ IF n > 1 THEN
+ IF id2.args = 0 THEN a$ = "SUB does not require any arguments": GOTO errmes
+ END IF
+
+ SetDependency id2.Dependency
+
+ seperateargs_error = 0
+ passedneeded = seperateargs(getelements(a$, 2, n), getelements(ca$, 2, n), passed&)
+ IF seperateargs_error THEN a$ = seperateargs_error_message: GOTO errmes
+
+ 'backup args to local string array space before calling evaluate
+ FOR i = 1 TO OptMax: separgs2(i) = "": NEXT 'save space!
+ FOR i = 1 TO OptMax + 1: separgslayout2(i) = "": NEXT
+ FOR i = 1 TO id2.args: separgs2(i) = separgs(i): NEXT
+ FOR i = 1 TO id2.args + 1: separgslayout2(i) = separgslayout(i): NEXT
+
+
+
+ IF Debug THEN
+ PRINT #9, "separgs:": FOR i = 1 TO id2.args: PRINT #9, i, separgs2(i): NEXT
+ PRINT #9, "separgslayout:": FOR i = 1 TO id2.args + 1: PRINT #9, i, separgslayout2(i): NEXT
+ END IF
+
+
+
+ 'note: seperateargs finds the arguments to pass and sets passed& as necessary
+ ' FIXOPERTIONORDER is not called on these args yet
+ ' what we need it to do is build a second array of layout info at the same time
+ ' ref:DIM SHARED separgslayout(100) AS STRING
+ ' the above array stores what layout info (if any) goes BEFORE the arg in question
+ ' it has one extra index which is the arg after
+
+ IF usecall THEN
+ IF usecall = 1 THEN l$ = "CALL" + sp + RTRIM$(id.cn) + RTRIM$(id.musthave) + sp2 + "(" + sp2
+ IF usecall = 2 THEN l$ = "CALL" + sp + RTRIM$(id.cn) + RTRIM$(id.musthave) + sp 'sp at end for easy parsing
+ ELSE
+ l$ = RTRIM$(id.cn) + RTRIM$(id.musthave) + sp
+ END IF
+
+ subcall$ = RTRIM$(id.callname) + "("
+ addedlayout = 0
+
+ fieldcall = 0
+ 'GET/PUT field exception
+ IF RTRIM$(id2.callname) = "sub_get" OR RTRIM$(id2.callname) = "sub_put" THEN
+ IF passed AND 2 THEN
+ 'regular GET/PUT call with variable provided
+ passed = passed - 2 'for complience with existing methods, remove 'passed' flag for the passing of a variable
+ ELSE
+ 'FIELD GET/PUT call with variable omited
+ IF RTRIM$(id2.callname) = "sub_get" THEN
+ fieldcall = 1
+ subcall$ = "field_get("
+ ELSE
+ fieldcall = 2
+ subcall$ = "field_put("
+ END IF
+ END IF
+ END IF 'field exception
+
+ IF RTRIM$(id2.callname) = "sub_timer" OR RTRIM$(id2.callname) = "sub_key" THEN 'spacing exception
+ IF usecall = 0 THEN
+ l$ = LEFT$(l$, LEN(l$) - 1) + sp2
+ END IF
+ END IF
+
+ FOR i = 1 TO id2.args
+ targettyp = CVL(MID$(id2.arg, -3 + i * 4, 4))
+ nele = ASC(MID$(id2.nele, i, 1))
+ nelereq = ASC(MID$(id2.nelereq, i, 1))
+
+ addlayout = 1 'omits option values in layout (eg. BINARY="2")
+ convertspacing = 0 'if an 'equation' is next, it will be preceeded by a space
+ x$ = separgslayout2$(i)
+ DO WHILE LEN(x$)
+ x = ASC(x$)
+ IF x THEN
+ convertspacing = 0
+ x2$ = MID$(x$, 2, x)
+ x$ = RIGHT$(x$, LEN(x$) - x - 1)
-s = 0
-an = 0
-x3$ = RIGHT$(l$, 1)
-IF x3$ = sp THEN s = 1
-IF x3$ = sp2 THEN
-s = 2
-IF alphanumeric(ASC(RIGHT$(l$, 2))) THEN an = 1
-ELSE
-IF alphanumeric(ASC(x3$)) THEN an = 1
-END IF
-s1 = s
+ s = 0
+ an = 0
+ x3$ = RIGHT$(l$, 1)
+ IF x3$ = sp THEN s = 1
+ IF x3$ = sp2 THEN
+ s = 2
+ IF alphanumeric(ASC(RIGHT$(l$, 2))) THEN an = 1
+ ELSE
+ IF alphanumeric(ASC(x3$)) THEN an = 1
+ END IF
+ s1 = s
-IF alphanumeric(ASC(x2$)) THEN convertspacing = 1
+ IF alphanumeric(ASC(x2$)) THEN convertspacing = 1
-IF x2$ = "LPRINT" THEN
+ IF x2$ = "LPRINT" THEN
-'x2$="LPRINT"
-'x$=CHR$(0)
-'x3$=[sp] from WIDTH[sp]
-'therefore...
-'s=1
-'an=0
-'convertspacing=1
-
-
-'if debug=1 then
-'print #9,"LPRINT:"
-'print #9,s
-'print #9,an
-'print #9,l$
-'print #9,x2$
-'end if
-
-END IF
-
-
-
-
-IF (an = 1 OR addedlayout = 1) AND alphanumeric(ASC(x2$)) <> 0 THEN
-
-
-
-s = 1 'force space
-x2$ = x2$ + sp2
-GOTO customlaychar
-END IF
-
-IF x2$ = "=" THEN
-s = 1
-x2$ = x2$ + sp
-GOTO customlaychar
-END IF
-
-IF x2$ = "#" THEN
-s = 1
-x2$ = x2$ + sp2
-GOTO customlaychar
-END IF
-
-IF x2$ = "," THEN x2$ = x2$ + sp: GOTO customlaychar
-
-
-IF x$ = CHR$(0) THEN 'substitution
-IF x2$ = "STEP" THEN x2$ = x2$ + sp2: GOTO customlaychar
-x2$ = x2$ + sp: GOTO customlaychar
-END IF
-
-'default solution sp2+?+sp2
-x2$ = x2$ + sp2
-
-
-
-
-
-customlaychar:
-IF s = 0 THEN s = 2
-IF s <> s1 THEN
-IF s1 THEN l$ = LEFT$(l$, LEN(l$) - 1)
-IF s = 1 THEN l$ = l$ + sp
-IF s = 2 THEN l$ = l$ + sp2
-END IF
-
-IF (RTRIM$(id2.callname) = "sub_timer" OR RTRIM$(id2.callname) = "sub_key") AND i = id2.args THEN 'spacing exception
-IF x2$ <> ")" + sp2 THEN
-l$ = LEFT$(l$, LEN(l$) - 1) + sp
-END IF
-END IF
-
-l$ = l$ + x2$
-
-ELSE
-addlayout = 0
-x$ = RIGHT$(x$, LEN(x$) - 1)
-END IF
-addedlayout = 0
-LOOP
-
-
-
-'---better sub syntax checking begins here---
-
-
-
-IF targettyp = -3 THEN
-IF separgs2(i) = "NULL" THEN a$ = "Expected array name": GOTO errmes
-'names of numeric arrays have ( ) automatically appended (nothing else)
-e$ = separgs2(i)
-
-IF INSTR(e$, sp) = 0 THEN 'one element only
-try_string$ = e$
-try = findid(try_string$)
-IF Error_Happened THEN GOTO errmes
-DO
-IF try THEN
-IF id.arraytype THEN
-IF (id.arraytype AND ISSTRING) = 0 THEN
-e$ = e$ + sp + "(" + sp + ")"
-EXIT DO
-END IF
-END IF
-'---
-IF try = 2 THEN findanotherid = 1: try = findid(try_string$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-END IF 'if try
-IF try = 0 THEN 'add symbol?
-IF LEN(removesymbol$(try_string$)) = 0 THEN
-IF Error_Happened THEN GOTO errmes
-a = ASC(try_string$)
-IF a >= 97 AND a <= 122 THEN a = a - 32
-IF a = 95 THEN a = 91
-a = a - 64
-IF LEN(defineextaz(a)) THEN try_string$ = try_string$ + defineextaz(a): try = findid(try_string$)
-IF Error_Happened THEN GOTO errmes
-END IF
-END IF 'try=0
-LOOP UNTIL try = 0
-END IF 'one element only
-
-
-
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
-IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
-e$ = evaluatetotyp(e$, -2)
-IF Error_Happened THEN GOTO errmes
-GOTO sete
-END IF '-3
-
-
-IF targettyp = -2 THEN
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN GOTO errmes
-IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
-IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
-e$ = evaluatetotyp(e$, -2)
-IF Error_Happened THEN GOTO errmes
-GOTO sete
-END IF '-2
-
-IF targettyp = -4 THEN
-
-IF fieldcall THEN
-i = id2.args + 1
-EXIT FOR
-END IF
-
-IF separgs2(i) = "NULL" THEN a$ = "Expected variable name/array element": GOTO errmes
-e$ = fixoperationorder$(separgs2(i))
-IF Error_Happened THEN GOTO errmes
-IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
-IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
-
-'GET/PUT RANDOM-ACCESS override
-IF firstelement$ = "GET" OR firstelement$ = "PUT" THEN
-e2$ = e$ 'backup
-e$ = evaluate(e$, sourcetyp)
-IF Error_Happened THEN GOTO errmes
-IF (sourcetyp AND ISSTRING) THEN
-IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
-'replace name of sub to call
-subcall$ = RIGHT$(subcall$, LEN(subcall$) - 7) 'delete original name
-'note: GET2 & PUT2 take differing input, following code is correct
-IF firstelement$ = "GET" THEN
-subcall$ = "sub_get2" + subcall$
-e$ = refer(e$, sourcetyp, 0) 'pass a qbs pointer instead
-IF Error_Happened THEN GOTO errmes
-GOTO sete
-ELSE
-subcall$ = "sub_put2" + subcall$
-'no goto sete required, fall through
-END IF
-END IF
-END IF
-e$ = e2$ 'restore
-END IF 'override
-
-e$ = evaluatetotyp(e$, -4)
-IF Error_Happened THEN GOTO errmes
-GOTO sete
-END IF '-4
-
-IF separgs2(i) = "NULL" THEN
-e$ = "NULL"
-ELSE
-
-e2$ = fixoperationorder$(separgs2(i))
-IF Error_Happened THEN GOTO errmes
-IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
-IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
-
-e$ = evaluate(e2$, sourcetyp)
-IF Error_Happened THEN GOTO errmes
-
-IF sourcetyp AND ISOFFSET THEN
-IF (targettyp AND ISOFFSET) = 0 THEN
-IF id2.internal_subfunc = 0 THEN a$ = "Cannot convert _OFFSET type to other types": GOTO errmes
-END IF
-END IF
-
-IF RTRIM$(id2.callname) = "sub_paint" THEN
-IF i = 3 THEN
-IF (sourcetyp AND ISSTRING) THEN
-targettyp = ISSTRING
-END IF
-END IF
-END IF
-
-IF LEFT$(separgs2(i), 2) = "(" + sp THEN dereference = 1 ELSE dereference = 0
-
-'pass by reference
-IF (targettyp AND ISPOINTER) THEN
-IF dereference = 0 THEN 'check deferencing wasn't used
-
-'note: array pointer
-IF (targettyp AND ISARRAY) THEN
-IF (sourcetyp AND ISREFERENCE) = 0 THEN a$ = "Expected arrayname()": GOTO errmes
-IF (sourcetyp AND ISARRAY) = 0 THEN a$ = "Expected arrayname()": GOTO errmes
-IF Debug THEN PRINT #9, "sub:array reference:[" + e$ + "]"
-
-'check arrays are of same type
-targettyp2 = targettyp: sourcetyp2 = sourcetyp
-targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
-sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
-IF sourcetyp2 <> targettyp2 THEN a$ = "Incorrect array type passed to sub": GOTO errmes
-
-'check arrayname was followed by '()'
-IF targettyp AND ISUDT THEN
-IF Debug THEN PRINT #9, "sub:array reference:udt reference:[" + e$ + "]"
-'get UDT info
-udtrefid = VAL(e$)
-getid udtrefid
-IF Error_Happened THEN GOTO errmes
-udtrefi = INSTR(e$, sp3) 'end of id
-udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
-udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
-udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
-udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
-o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
-'note: most of the UDT info above is not required
-IF LEFT$(o$, 4) <> "(0)*" THEN a$ = "Expected arrayname()": GOTO errmes
-ELSE
-IF RIGHT$(e$, 2) <> sp3 + "0" THEN a$ = "Expected arrayname()": GOTO errmes
-END IF
-
-idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1))
-getid idnum
-IF Error_Happened THEN GOTO errmes
-
-IF targettyp AND ISFIXEDLENGTH THEN
-targettypsize = CVL(MID$(id2.argsize, i * 4 - 4 + 1, 4))
-IF id.tsize <> targettypsize THEN a$ = "Incorrect array type passed to sub": GOTO errmes
-END IF
-
-IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
-IF cmemlist(idnum) = 0 THEN
-cmemlist(idnum) = 1
-recompile = 1
-END IF
-END IF
-
-IF id.linkid = 0 THEN
-'if id.linkid is 0, it means the number of array elements is definietly
-'known of the array being passed, this is not some "fake"/unknown array.
-'using the numer of array elements of a fake array would be dangerous!
-
-
-IF nelereq = 0 THEN
-'only continue if the number of array elements required is unknown
-'and it needs to be set
-
-IF id.arrayelements > 0 THEN '2009
-
-nelereq = id.arrayelements
-MID$(id2.nelereq, i, 1) = CHR$(nelereq)
-
-END IF
-
-'print rtrim$(id2.n)+">nelereq=";nelereq
-
-ids(targetid) = id2
-
-ELSE
-
-'the number of array elements required is known AND
-'the number of elements in the array to be passed is known
-
-IF id.arrayelements <> nelereq THEN a$ = "Passing arrays with a differing number of elements to a SUB/FUNCTION is not supported (yet)": GOTO errmes
-
-
-END IF
-END IF
-
-e$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN GOTO errmes
-GOTO sete
-
-END IF 'target is an array
-
-'note: not an array...
-'target is not an array
-
-IF (targettyp AND ISSTRING) = 0 THEN
-IF (sourcetyp AND ISREFERENCE) THEN
-idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
-
-targettyp2 = targettyp: sourcetyp2 = sourcetyp
-
-'get info about source/target
-arr = 0: IF (sourcetyp2 AND ISARRAY) THEN arr = 1
-passudtelement = 0: IF (targettyp2 AND ISUDT) = 0 AND (sourcetyp2 AND ISUDT) <> 0 THEN passudtelement = 1: sourcetyp2 = sourcetyp2 - ISUDT
-
-'remove flags irrelevant for comparison... ISPOINTER,ISREFERENCE,ISINCONVENTIONALMEMORY,ISARRAY
-targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
-sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
-
-'compare types
-IF sourcetyp2 = targettyp2 THEN
-
-IF sourcetyp AND ISUDT THEN
-'udt/udt array
-
-'get info
-udtrefid = VAL(e$)
-getid udtrefid
-IF Error_Happened THEN GOTO errmes
-udtrefi = INSTR(e$, sp3) 'end of id
-udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
-udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
-udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
-udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
-o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
-'note: most of the UDT info above is not required
-
-IF arr THEN
-n$ = scope$ + "ARRAY_UDT_" + RTRIM$(id.n) + "[0]"
-ELSE
-n$ = scope$ + "UDT_" + RTRIM$(id.n)
-END IF
-
-e$ = "(void*)( ((char*)(" + n$ + ")) + (" + o$ + ") )"
-
-'convert void* to target type*
-IF passudtelement THEN e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
-IF Error_Happened THEN GOTO errmes
-
-ELSE
-'not a udt
-IF arr THEN
-IF (sourcetyp2 AND ISOFFSETINBITS) THEN a$ = "Cannot pass BIT array offsets yet": GOTO errmes
-e$ = "(&(" + refer(e$, sourcetyp, 0) + "))"
-IF Error_Happened THEN GOTO errmes
-ELSE
-e$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN GOTO errmes
-END IF
-
-'note: signed/unsigned mismatch requires casting
-IF (sourcetyp AND ISUNSIGNED) <> (targettyp AND ISUNSIGNED) THEN
-e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
-IF Error_Happened THEN GOTO errmes
-END IF
-
-END IF 'udt?
-
-IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
-IF cmemlist(idnum) = 0 THEN
-cmemlist(idnum) = 1
-recompile = 1
-END IF
-END IF
-
-GOTO sete
-END IF 'similar
-END IF 'reference
-ELSE 'not a string
-'its a string
-IF (sourcetyp AND ISREFERENCE) THEN
-idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
-IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
-IF cmemlist(idnum) = 0 THEN
-cmemlist(idnum) = 1
-recompile = 1
-END IF
-END IF
-END IF 'reference
-END IF 'its a string
-
-END IF 'dereference check
-END IF 'target is a pointer
-
-'note: Target is not a pointer...
-
-'String-numeric mismatch?
-IF targettyp AND ISSTRING THEN
-IF (sourcetyp AND ISSTRING) = 0 THEN
-nth = i
-IF ids(targetid).args = 1 THEN a$ = "String required for sub": GOTO errmes
-a$ = str_nth$(nth) + " sub argument requires a string": GOTO errmes
-END IF
-END IF
-IF (targettyp AND ISSTRING) = 0 THEN
-IF sourcetyp AND ISSTRING THEN
-nth = i
-IF ids(targetid).args = 1 THEN a$ = "Number required for sub": GOTO errmes
-a$ = str_nth$(nth) + " sub argument requires a number": GOTO errmes
-END IF
-END IF
-
-'change to "non-pointer" value
-IF (sourcetyp AND ISREFERENCE) THEN
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN GOTO errmes
-END IF
-
-IF explicitreference = 0 THEN
-IF targettyp AND ISUDT THEN
-nth = i
-x$ = "'" + RTRIM$(udtxcname(targettyp AND 511)) + "'"
-IF ids(targetid).args = 1 THEN a$ = "TYPE " + x$ + " required for sub": GOTO errmes
-a$ = str_nth$(nth) + " sub argument requires TYPE " + x$: GOTO errmes
-END IF
-ELSE
-IF sourcetyp AND ISUDT THEN a$ = "Number required for sub": GOTO errmes
-END IF
-
-'round to integer if required
-IF (sourcetyp AND ISFLOAT) THEN
-IF (targettyp AND ISFLOAT) = 0 THEN
-'**32 rounding fix
-bits = targettyp AND 511
-IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
-IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
-IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
-END IF
-END IF
-
-IF (targettyp AND ISPOINTER) THEN 'pointer required
-IF (targettyp AND ISSTRING) THEN GOTO sete 'no changes required
-t$ = typ2ctyp$(targettyp, "")
-IF Error_Happened THEN GOTO errmes
-v$ = "pass" + str2$(uniquenumber)
-'assume numeric type
-IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
-bytesreq = ((targettyp AND 511) + 7) \ 8
-PRINT #defdatahandle, t$ + " *" + v$ + "=NULL;"
-PRINT #13, "if(" + v$ + "==NULL){"
-PRINT #13, "cmem_sp-=" + str2(bytesreq) + ";"
-PRINT #13, v$ + "=(" + t$ + "*)(dblock+cmem_sp);"
-PRINT #13, "if (cmem_spchr"
-END IF
-
-IF LTRIM$(RTRIM$(e$)) = "0" THEN e$ = "NULL"
-
-END IF
-
-IF i <> 1 THEN subcall$ = subcall$ + ","
-subcall$ = subcall$ + e$
-NEXT
-
-'note: i=id.args+1
-x$ = separgslayout2$(i)
-DO WHILE LEN(x$)
-x = ASC(x$)
-IF x THEN
-x2$ = MID$(x$, 2, x)
-x$ = RIGHT$(x$, LEN(x$) - x - 1)
-
-s = 0
-an = 0
-x3$ = RIGHT$(l$, 1)
-IF x3$ = sp THEN s = 1
-IF x3$ = sp2 THEN
-s = 2
-IF alphanumeric(ASC(RIGHT$(l$, 2))) THEN an = 1
-'if asc(right$(l$,2))=34 then an=1
-ELSE
-IF alphanumeric(ASC(x3$)) THEN an = 1
-'if asc(x3$)=34 then an=1
-END IF
-s1 = s
-
-IF (an = 1 OR addedlayout = 1) AND alphanumeric(ASC(x2$)) <> 0 THEN
-s = 1 'force space
-x2$ = x2$ + sp2
-GOTO customlaychar2
-END IF
-
-IF x2$ = "=" THEN
-s = 1
-x2$ = x2$ + sp
-GOTO customlaychar2
-END IF
-
-IF x2$ = "#" THEN
-s = 1
-x2$ = x2$ + sp2
-GOTO customlaychar2
-END IF
-
-IF x2$ = "," THEN x2$ = x2$ + sp: GOTO customlaychar2
-
-IF x$ = CHR$(0) THEN 'substitution
-IF x2$ = "STEP" THEN x2$ = x2$ + sp2: GOTO customlaychar2
-x2$ = x2$ + sp: GOTO customlaychar2
-END IF
-
-'default solution sp2+?+sp2
-x2$ = x2$ + sp2
-customlaychar2:
-IF s = 0 THEN s = 2
-IF s <> s1 THEN
-IF s1 THEN l$ = LEFT$(l$, LEN(l$) - 1)
-IF s = 1 THEN l$ = l$ + sp
-IF s = 2 THEN l$ = l$ + sp2
-END IF
-l$ = l$ + x2$
-
-ELSE
-addlayout = 0
-x$ = RIGHT$(x$, LEN(x$) - 1)
-END IF
-addedlayout = 0
-LOOP
-
-
-
-
-
-
-IF passedneeded THEN
-subcall$ = subcall$ + "," + str2$(passed&)
-END IF
-subcall$ = subcall$ + ");"
-PRINT #12, subcall$
-subcall$ = ""
-IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
-
-layoutdone = 1
-x$ = RIGHT$(l$, 1): IF x$ = sp OR x$ = sp2 THEN l$ = LEFT$(l$, LEN(l$) - 1)
-IF usecall = 1 THEN l$ = l$ + sp2 + ")"
-IF Debug THEN PRINT #9, "SUB layout:[" + l$ + "]"
-IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
-GOTO finishedline
-
-
-END IF
-
-IF try = 2 THEN
-findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
-findanotherid = 1
-try = findid(firstelement$)
-IF Error_Happened THEN GOTO errmes
-ELSE
-try = 0
-END IF
-LOOP
-
-END IF
-
-notsubcall:
-
-IF n >= 1 THEN
-IF firstelement$ = "LET" THEN
-IF n = 1 THEN a$ = "Syntax error": GOTO errmes
-ca$ = RIGHT$(ca$, LEN(ca$) - 4)
-n = n - 1
-l$ = "LET"
-IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
-'note: layoutdone=1 will be set later
-GOTO letused
-END IF
-END IF
-
-'LET ???=???
-IF n >= 3 THEN
-IF INSTR(a$, sp + "=" + sp) THEN
-letused:
-assign ca$, n
-IF Error_Happened THEN GOTO errmes
-layoutdone = 1
-IF LEN(layout$) = 0 THEN layout$ = tlayout$ ELSE layout$ = layout$ + sp + tlayout$
-GOTO finishedline
-END IF
-END IF '>=3
-IF RIGHT$(a$, 2) = sp + "=" THEN a$ = "Expected ... = expression": GOTO errmes
-
-'Syntax error
-a$ = "Syntax error": GOTO errmes
-
-finishedline:
-THENGOTO = 0
-finishedline2:
-
-IF arrayprocessinghappened = 1 THEN arrayprocessinghappened = 0
-
-IF NoChecks = 0 THEN
-IF dynscope THEN
-dynscope = 0
-PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");if(r)goto S_" + str2$(statementn) + ";}"
-ELSE
-PRINT #12, "if(!qbevent)break;evnt(" + str2$(linenumber) + ");}while(r);"
-END IF
-END IF
-
-finishednonexec:
-
-IF layoutdone = 0 THEN layoutok = 0 'invalidate layout if not handled
-
-IF continuelinefrom = 0 THEN 'note: manager #2 requires this condition
-
-'Include Manager #2 '***
-IF LEN(addmetainclude$) THEN
-
-IF inclevel = 0 THEN
-'backup line formatting
-layoutcomment_backup$ = layoutcomment$
-layoutok_backup = layoutok
-layout_backup$ = layout$
-END IF
-
-a$ = addmetainclude$: addmetainclude$ = "" 'read/clear message
-IF inclevel = 100 THEN a$ = "Too many indwelling INCLUDE files": GOTO errmes
-'1. Verify file exists (location is either (a)relative to source file or (b)absolute)
-fh = 99 + inclevel + 1
-FOR try = 1 TO 2
-IF try = 1 THEN
-IF inclevel = 0 THEN
-IF idemode THEN p$ = idepath$ + pathsep$ ELSE p$ = getfilepath$(sourcefile$)
-ELSE
-p$ = getfilepath$(incname(inclevel))
-END IF
-f$ = p$ + a$
-END IF
-IF try = 2 THEN f$ = a$
-IF _FILEEXISTS(f$) THEN
-qberrorhappened = -2 '***
-OPEN f$ FOR BINARY AS #fh
-qberrorhappened2: '***
-IF qberrorhappened = -2 THEN EXIT FOR '***
-END IF
-qberrorhappened = 0
-NEXT
-IF qberrorhappened <> -2 THEN qberrorhappened = 0: a$ = "File " + a$ + " not found": GOTO errmes
-inclevel = inclevel + 1: incname$(inclevel) = f$: inclinenumber(inclevel) = 0
-END IF 'fall through to next section...
-'--------------------
-DO WHILE inclevel
-fh = 99 + inclevel
-'2. Feed next line
-IF EOF(fh) = 0 THEN
-LINE INPUT #fh, x$
-a3$ = x$
-continuelinefrom = 0
-inclinenumber(inclevel) = inclinenumber(inclevel) + 1
-'create extended error string 'incerror$'
-e$ = " in line " + str2(inclinenumber(inclevel)) + " of " + incname$(inclevel) + " included"
-IF inclevel > 1 THEN
-e$ = e$ + " (through "
-FOR x = 1 TO inclevel - 1 STEP 1
-e$ = e$ + incname$(x)
-IF x < inclevel - 1 THEN 'a sep is req
-IF x = inclevel - 2 THEN
-e$ = e$ + " then "
-ELSE
-e$ = e$ + ", "
-END IF
-END IF
-NEXT
-e$ = e$ + ")"
-END IF
-incerror$ = e$
-linenumber = linenumber - 1 'lower official linenumber to counter later increment
-IF idemode THEN sendc$ = CHR$(10) + a3$: GOTO sendcommand 'passback
-GOTO includeline
-END IF
-'3. Close & return control
-CLOSE #fh
-inclevel = inclevel - 1
-IF inclevel = 0 THEN
-'restore line formatting
-layoutok = layoutok_backup
-layout$ = layout_backup$
-layoutcomment$ = layoutcomment_backup$
-END IF
-LOOP 'fall through to next section...
-'(end manager)
-
-
-
-END IF 'continuelinefrom=0
-
-
-IF Debug THEN
-PRINT #9, "[layout check]"
-PRINT #9, "[" + layoutoriginal$ + "]"
-PRINT #9, "[" + layout$ + "]"
-PRINT #9, layoutok
-PRINT #9, "[end layout check]"
-END IF
-
-
-
-
-IF idemode THEN
-IF continuelinefrom <> 0 THEN GOTO ide4 'continue processing other commands on line
-
-IF LEN(layoutcomment$) THEN
-IF LEN(layout$) THEN layout$ = layout$ + sp + layoutcomment$ ELSE layout$ = layoutcomment$
-END IF
-
-IF layoutok = 0 THEN
-layout$ = layoutoriginal$
-ELSE
-
-'reverse '046' changes present in autolayout
-'replace fix046$ with .
-i = INSTR(layout$, fix046$)
-DO WHILE i
-layout$ = LEFT$(layout$, i - 1) + "." + RIGHT$(layout$, LEN(layout$) - (i + LEN(fix046$) - 1))
-i = INSTR(layout$, fix046$)
-LOOP
-
-END IF
-x = lhscontrollevel: IF controllevel < lhscontrollevel THEN x = controllevel
-IF definingtype = 2 THEN x = x + 1
-IF declaringlibrary = 2 THEN x = x + 1
-layout$ = SPACE$(x) + layout$
-IF linecontinuation THEN layout$ = ""
-
-GOTO ideret4 'return control to IDE
-END IF
-
-'layout is not currently used by the compiler (as appose to the IDE), if it was it would be used here
+ 'x2$="LPRINT"
+ 'x$=CHR$(0)
+ 'x3$=[sp] from WIDTH[sp]
+ 'therefore...
+ 's=1
+ 'an=0
+ 'convertspacing=1
+
+ 'if debug=1 then
+ 'print #9,"LPRINT:"
+ 'print #9,s
+ 'print #9,an
+ 'print #9,l$
+ 'print #9,x2$
+ 'end if
+
+ END IF
+
+
+
+
+ IF (an = 1 OR addedlayout = 1) AND alphanumeric(ASC(x2$)) <> 0 THEN
+
+
+
+ s = 1 'force space
+ x2$ = x2$ + sp2
+ GOTO customlaychar
+ END IF
+
+ IF x2$ = "=" THEN
+ s = 1
+ x2$ = x2$ + sp
+ GOTO customlaychar
+ END IF
+
+ IF x2$ = "#" THEN
+ s = 1
+ x2$ = x2$ + sp2
+ GOTO customlaychar
+ END IF
+
+ IF x2$ = "," THEN x2$ = x2$ + sp: GOTO customlaychar
+
+
+ IF x$ = CHR$(0) THEN 'substitution
+ IF x2$ = "STEP" THEN x2$ = x2$ + sp2: GOTO customlaychar
+ x2$ = x2$ + sp: GOTO customlaychar
+ END IF
+
+ 'default solution sp2+?+sp2
+ x2$ = x2$ + sp2
+
+
+
+
+
+ customlaychar:
+ IF s = 0 THEN s = 2
+ IF s <> s1 THEN
+ IF s1 THEN l$ = LEFT$(l$, LEN(l$) - 1)
+ IF s = 1 THEN l$ = l$ + sp
+ IF s = 2 THEN l$ = l$ + sp2
+ END IF
+
+ IF (RTRIM$(id2.callname) = "sub_timer" OR RTRIM$(id2.callname) = "sub_key") AND i = id2.args THEN 'spacing exception
+ IF x2$ <> ")" + sp2 THEN
+ l$ = LEFT$(l$, LEN(l$) - 1) + sp
+ END IF
+ END IF
+
+ l$ = l$ + x2$
+
+ ELSE
+ addlayout = 0
+ x$ = RIGHT$(x$, LEN(x$) - 1)
+ END IF
+ addedlayout = 0
+ LOOP
+
+
+
+ '---better sub syntax checking begins here---
+
+
+
+ IF targettyp = -3 THEN
+ IF separgs2(i) = "NULL" THEN a$ = "Expected array name": GOTO errmes
+ 'names of numeric arrays have ( ) automatically appended (nothing else)
+ e$ = separgs2(i)
+
+ IF INSTR(e$, sp) = 0 THEN 'one element only
+ try_string$ = e$
+ try = findid(try_string$)
+ IF Error_Happened THEN GOTO errmes
+ DO
+ IF try THEN
+ IF id.arraytype THEN
+ IF (id.arraytype AND ISSTRING) = 0 THEN
+ e$ = e$ + sp + "(" + sp + ")"
+ EXIT DO
+ END IF
+ END IF
+ '---
+ IF try = 2 THEN findanotherid = 1: try = findid(try_string$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ END IF 'if try
+ IF try = 0 THEN 'add symbol?
+ IF LEN(removesymbol$(try_string$)) = 0 THEN
+ IF Error_Happened THEN GOTO errmes
+ a = ASC(try_string$)
+ IF a >= 97 AND a <= 122 THEN a = a - 32
+ IF a = 95 THEN a = 91
+ a = a - 64
+ IF LEN(defineextaz(a)) THEN try_string$ = try_string$ + defineextaz(a): try = findid(try_string$)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+ END IF 'try=0
+ LOOP UNTIL try = 0
+ END IF 'one element only
+
+
+
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
+ IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
+ e$ = evaluatetotyp(e$, -2)
+ IF Error_Happened THEN GOTO errmes
+ GOTO sete
+ END IF '-3
+
+
+ IF targettyp = -2 THEN
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN GOTO errmes
+ IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
+ IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
+ e$ = evaluatetotyp(e$, -2)
+ IF Error_Happened THEN GOTO errmes
+ GOTO sete
+ END IF '-2
+
+ IF targettyp = -4 THEN
+
+ IF fieldcall THEN
+ i = id2.args + 1
+ EXIT FOR
+ END IF
+
+ IF separgs2(i) = "NULL" THEN a$ = "Expected variable name/array element": GOTO errmes
+ e$ = fixoperationorder$(separgs2(i))
+ IF Error_Happened THEN GOTO errmes
+ IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
+ IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
+
+ 'GET/PUT RANDOM-ACCESS override
+ IF firstelement$ = "GET" OR firstelement$ = "PUT" THEN
+ e2$ = e$ 'backup
+ e$ = evaluate(e$, sourcetyp)
+ IF Error_Happened THEN GOTO errmes
+ IF (sourcetyp AND ISSTRING) THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
+ 'replace name of sub to call
+ subcall$ = RIGHT$(subcall$, LEN(subcall$) - 7) 'delete original name
+ 'note: GET2 & PUT2 take differing input, following code is correct
+ IF firstelement$ = "GET" THEN
+ subcall$ = "sub_get2" + subcall$
+ e$ = refer(e$, sourcetyp, 0) 'pass a qbs pointer instead
+ IF Error_Happened THEN GOTO errmes
+ GOTO sete
+ ELSE
+ subcall$ = "sub_put2" + subcall$
+ 'no goto sete required, fall through
+ END IF
+ END IF
+ END IF
+ e$ = e2$ 'restore
+ END IF 'override
+
+ e$ = evaluatetotyp(e$, -4)
+ IF Error_Happened THEN GOTO errmes
+ GOTO sete
+ END IF '-4
+
+ IF separgs2(i) = "NULL" THEN
+ e$ = "NULL"
+ ELSE
+
+ e2$ = fixoperationorder$(separgs2(i))
+ IF Error_Happened THEN GOTO errmes
+ IF convertspacing = 1 AND addlayout = 1 THEN l$ = LEFT$(l$, LEN(l$) - 1) + sp
+ IF addlayout THEN l$ = l$ + tlayout$: addedlayout = 1
+
+ e$ = evaluate(e2$, sourcetyp)
+ IF Error_Happened THEN GOTO errmes
+
+ IF sourcetyp AND ISOFFSET THEN
+ IF (targettyp AND ISOFFSET) = 0 THEN
+ IF id2.internal_subfunc = 0 THEN a$ = "Cannot convert _OFFSET type to other types": GOTO errmes
+ END IF
+ END IF
+
+ IF RTRIM$(id2.callname) = "sub_paint" THEN
+ IF i = 3 THEN
+ IF (sourcetyp AND ISSTRING) THEN
+ targettyp = ISSTRING
+ END IF
+ END IF
+ END IF
+
+ IF LEFT$(separgs2(i), 2) = "(" + sp THEN dereference = 1 ELSE dereference = 0
+
+ 'pass by reference
+ IF (targettyp AND ISPOINTER) THEN
+ IF dereference = 0 THEN 'check deferencing wasn't used
+
+ 'note: array pointer
+ IF (targettyp AND ISARRAY) THEN
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN a$ = "Expected arrayname()": GOTO errmes
+ IF (sourcetyp AND ISARRAY) = 0 THEN a$ = "Expected arrayname()": GOTO errmes
+ IF Debug THEN PRINT #9, "sub:array reference:[" + e$ + "]"
+
+ 'check arrays are of same type
+ targettyp2 = targettyp: sourcetyp2 = sourcetyp
+ targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
+ sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
+ IF sourcetyp2 <> targettyp2 THEN a$ = "Incorrect array type passed to sub": GOTO errmes
+
+ 'check arrayname was followed by '()'
+ IF targettyp AND ISUDT THEN
+ IF Debug THEN PRINT #9, "sub:array reference:udt reference:[" + e$ + "]"
+ 'get UDT info
+ udtrefid = VAL(e$)
+ getid udtrefid
+ IF Error_Happened THEN GOTO errmes
+ udtrefi = INSTR(e$, sp3) 'end of id
+ udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
+ udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
+ udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
+ udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
+ o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
+ 'note: most of the UDT info above is not required
+ IF LEFT$(o$, 4) <> "(0)*" THEN a$ = "Expected arrayname()": GOTO errmes
+ ELSE
+ IF RIGHT$(e$, 2) <> sp3 + "0" THEN a$ = "Expected arrayname()": GOTO errmes
+ END IF
+
+ idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1))
+ getid idnum
+ IF Error_Happened THEN GOTO errmes
+
+ IF targettyp AND ISFIXEDLENGTH THEN
+ targettypsize = CVL(MID$(id2.argsize, i * 4 - 4 + 1, 4))
+ IF id.tsize <> targettypsize THEN a$ = "Incorrect array type passed to sub": GOTO errmes
+ END IF
+
+ IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
+ IF cmemlist(idnum) = 0 THEN
+ cmemlist(idnum) = 1
+ recompile = 1
+ END IF
+ END IF
+
+ IF id.linkid = 0 THEN
+ 'if id.linkid is 0, it means the number of array elements is definietly
+ 'known of the array being passed, this is not some "fake"/unknown array.
+ 'using the numer of array elements of a fake array would be dangerous!
+
+
+ IF nelereq = 0 THEN
+ 'only continue if the number of array elements required is unknown
+ 'and it needs to be set
+
+ IF id.arrayelements > 0 THEN '2009
+
+ nelereq = id.arrayelements
+ MID$(id2.nelereq, i, 1) = CHR$(nelereq)
+
+ END IF
+
+ 'print rtrim$(id2.n)+">nelereq=";nelereq
+
+ ids(targetid) = id2
+
+ ELSE
+
+ 'the number of array elements required is known AND
+ 'the number of elements in the array to be passed is known
+
+ IF id.arrayelements <> nelereq THEN a$ = "Passing arrays with a differing number of elements to a SUB/FUNCTION is not supported (yet)": GOTO errmes
+
+
+ END IF
+ END IF
+
+ e$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN GOTO errmes
+ GOTO sete
+
+ END IF 'target is an array
+
+ 'note: not an array...
+ 'target is not an array
+
+ IF (targettyp AND ISSTRING) = 0 THEN
+ IF (sourcetyp AND ISREFERENCE) THEN
+ idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
+
+ targettyp2 = targettyp: sourcetyp2 = sourcetyp
+
+ 'get info about source/target
+ arr = 0: IF (sourcetyp2 AND ISARRAY) THEN arr = 1
+ passudtelement = 0: IF (targettyp2 AND ISUDT) = 0 AND (sourcetyp2 AND ISUDT) <> 0 THEN passudtelement = 1: sourcetyp2 = sourcetyp2 - ISUDT
+
+ 'remove flags irrelevant for comparison... ISPOINTER,ISREFERENCE,ISINCONVENTIONALMEMORY,ISARRAY
+ targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
+ sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
+
+ 'compare types
+ IF sourcetyp2 = targettyp2 THEN
+
+ IF sourcetyp AND ISUDT THEN
+ 'udt/udt array
+
+ 'get info
+ udtrefid = VAL(e$)
+ getid udtrefid
+ IF Error_Happened THEN GOTO errmes
+ udtrefi = INSTR(e$, sp3) 'end of id
+ udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
+ udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
+ udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
+ udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
+ o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
+ 'note: most of the UDT info above is not required
+
+ IF arr THEN
+ n$ = scope$ + "ARRAY_UDT_" + RTRIM$(id.n) + "[0]"
+ ELSE
+ n$ = scope$ + "UDT_" + RTRIM$(id.n)
+ END IF
+
+ e$ = "(void*)( ((char*)(" + n$ + ")) + (" + o$ + ") )"
+
+ 'convert void* to target type*
+ IF passudtelement THEN e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
+ IF Error_Happened THEN GOTO errmes
+
+ ELSE
+ 'not a udt
+ IF arr THEN
+ IF (sourcetyp2 AND ISOFFSETINBITS) THEN a$ = "Cannot pass BIT array offsets yet": GOTO errmes
+ e$ = "(&(" + refer(e$, sourcetyp, 0) + "))"
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ e$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+
+ 'note: signed/unsigned mismatch requires casting
+ IF (sourcetyp AND ISUNSIGNED) <> (targettyp AND ISUNSIGNED) THEN
+ e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
+ IF Error_Happened THEN GOTO errmes
+ END IF
+
+ END IF 'udt?
+
+ IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
+ IF cmemlist(idnum) = 0 THEN
+ cmemlist(idnum) = 1
+ recompile = 1
+ END IF
+ END IF
+
+ GOTO sete
+ END IF 'similar
+ END IF 'reference
+ ELSE 'not a string
+ 'its a string
+ IF (sourcetyp AND ISREFERENCE) THEN
+ idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
+ IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
+ IF cmemlist(idnum) = 0 THEN
+ cmemlist(idnum) = 1
+ recompile = 1
+ END IF
+ END IF
+ END IF 'reference
+ END IF 'its a string
+
+ END IF 'dereference check
+ END IF 'target is a pointer
+
+ 'note: Target is not a pointer...
+
+ 'String-numeric mismatch?
+ IF targettyp AND ISSTRING THEN
+ IF (sourcetyp AND ISSTRING) = 0 THEN
+ nth = i
+ IF ids(targetid).args = 1 THEN a$ = "String required for sub": GOTO errmes
+ a$ = str_nth$(nth) + " sub argument requires a string": GOTO errmes
+ END IF
+ END IF
+ IF (targettyp AND ISSTRING) = 0 THEN
+ IF sourcetyp AND ISSTRING THEN
+ nth = i
+ IF ids(targetid).args = 1 THEN a$ = "Number required for sub": GOTO errmes
+ a$ = str_nth$(nth) + " sub argument requires a number": GOTO errmes
+ END IF
+ END IF
+
+ 'change to "non-pointer" value
+ IF (sourcetyp AND ISREFERENCE) THEN
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN GOTO errmes
+ END IF
+
+ IF explicitreference = 0 THEN
+ IF targettyp AND ISUDT THEN
+ nth = i
+ x$ = "'" + RTRIM$(udtxcname(targettyp AND 511)) + "'"
+ IF ids(targetid).args = 1 THEN a$ = "TYPE " + x$ + " required for sub": GOTO errmes
+ a$ = str_nth$(nth) + " sub argument requires TYPE " + x$: GOTO errmes
+ END IF
+ ELSE
+ IF sourcetyp AND ISUDT THEN a$ = "Number required for sub": GOTO errmes
+ END IF
+
+ 'round to integer if required
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF (targettyp AND ISFLOAT) = 0 THEN
+ '**32 rounding fix
+ bits = targettyp AND 511
+ IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
+ IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
+ IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
+ END IF
+ END IF
+
+ IF (targettyp AND ISPOINTER) THEN 'pointer required
+ IF (targettyp AND ISSTRING) THEN GOTO sete 'no changes required
+ t$ = typ2ctyp$(targettyp, "")
+ IF Error_Happened THEN GOTO errmes
+ v$ = "pass" + str2$(uniquenumber)
+ 'assume numeric type
+ IF MID$(sfcmemargs(targetid), i, 1) = CHR$(1) THEN 'cmem required?
+ bytesreq = ((targettyp AND 511) + 7) \ 8
+ PRINT #defdatahandle, t$ + " *" + v$ + "=NULL;"
+ PRINT #13, "if(" + v$ + "==NULL){"
+ PRINT #13, "cmem_sp-=" + str2(bytesreq) + ";"
+ PRINT #13, v$ + "=(" + t$ + "*)(dblock+cmem_sp);"
+ PRINT #13, "if (cmem_spchr"
+ END IF
+
+ IF LTRIM$(RTRIM$(e$)) = "0" THEN e$ = "NULL"
+
+ END IF
+
+ IF i <> 1 THEN subcall$ = subcall$ + ","
+ subcall$ = subcall$ + e$
+ NEXT
+
+ 'note: i=id.args+1
+ x$ = separgslayout2$(i)
+ DO WHILE LEN(x$)
+ x = ASC(x$)
+ IF x THEN
+ x2$ = MID$(x$, 2, x)
+ x$ = RIGHT$(x$, LEN(x$) - x - 1)
+
+ s = 0
+ an = 0
+ x3$ = RIGHT$(l$, 1)
+ IF x3$ = sp THEN s = 1
+ IF x3$ = sp2 THEN
+ s = 2
+ IF alphanumeric(ASC(RIGHT$(l$, 2))) THEN an = 1
+ 'if asc(right$(l$,2))=34 then an=1
+ ELSE
+ IF alphanumeric(ASC(x3$)) THEN an = 1
+ 'if asc(x3$)=34 then an=1
+ END IF
+ s1 = s
+
+ IF (an = 1 OR addedlayout = 1) AND alphanumeric(ASC(x2$)) <> 0 THEN
+ s = 1 'force space
+ x2$ = x2$ + sp2
+ GOTO customlaychar2
+ END IF
+
+ IF x2$ = "=" THEN
+ s = 1
+ x2$ = x2$ + sp
+ GOTO customlaychar2
+ END IF
+
+ IF x2$ = "#" THEN
+ s = 1
+ x2$ = x2$ + sp2
+ GOTO customlaychar2
+ END IF
+
+ IF x2$ = "," THEN x2$ = x2$ + sp: GOTO customlaychar2
+
+ IF x$ = CHR$(0) THEN 'substitution
+ IF x2$ = "STEP" THEN x2$ = x2$ + sp2: GOTO customlaychar2
+ x2$ = x2$ + sp: GOTO customlaychar2
+ END IF
+
+ 'default solution sp2+?+sp2
+ x2$ = x2$ + sp2
+ customlaychar2:
+ IF s = 0 THEN s = 2
+ IF s <> s1 THEN
+ IF s1 THEN l$ = LEFT$(l$, LEN(l$) - 1)
+ IF s = 1 THEN l$ = l$ + sp
+ IF s = 2 THEN l$ = l$ + sp2
+ END IF
+ l$ = l$ + x2$
+
+ ELSE
+ addlayout = 0
+ x$ = RIGHT$(x$, LEN(x$) - 1)
+ END IF
+ addedlayout = 0
+ LOOP
+
+
+
+
+
+
+ IF passedneeded THEN
+ subcall$ = subcall$ + "," + str2$(passed&)
+ END IF
+ subcall$ = subcall$ + ");"
+ PRINT #12, subcall$
+ subcall$ = ""
+ IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
+
+ layoutdone = 1
+ x$ = RIGHT$(l$, 1): IF x$ = sp OR x$ = sp2 THEN l$ = LEFT$(l$, LEN(l$) - 1)
+ IF usecall = 1 THEN l$ = l$ + sp2 + ")"
+ IF Debug THEN PRINT #9, "SUB layout:[" + l$ + "]"
+ IF LEN(layout$) = 0 THEN layout$ = l$ ELSE layout$ = layout$ + sp + l$
+ GOTO finishedline
+
+
+ END IF
+
+ IF try = 2 THEN
+ findidsecondarg = "": IF n >= 2 THEN findidsecondarg = getelement$(a$, 2)
+ findanotherid = 1
+ try = findid(firstelement$)
+ IF Error_Happened THEN GOTO errmes
+ ELSE
+ try = 0
+ END IF
+ LOOP
+
+ END IF
+
+ notsubcall:
+
+ IF n >= 1 THEN
+ IF firstelement$ = "LET" THEN
+ IF n = 1 THEN a$ = "Syntax error": GOTO errmes
+ ca$ = RIGHT$(ca$, LEN(ca$) - 4)
+ n = n - 1
+ l$ = "LET"
+ IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
+ 'note: layoutdone=1 will be set later
+ GOTO letused
+ END IF
+ END IF
+
+ 'LET ???=???
+ IF n >= 3 THEN
+ IF INSTR(a$, sp + "=" + sp) THEN
+ letused:
+ assign ca$, n
+ IF Error_Happened THEN GOTO errmes
+ layoutdone = 1
+ IF LEN(layout$) = 0 THEN layout$ = tlayout$ ELSE layout$ = layout$ + sp + tlayout$
+ GOTO finishedline
+ END IF
+ END IF '>=3
+ IF RIGHT$(a$, 2) = sp + "=" THEN a$ = "Expected ... = expression": GOTO errmes
+
+ 'Syntax error
+ a$ = "Syntax error": GOTO errmes
+
+ finishedline:
+ THENGOTO = 0
+ finishedline2:
+
+ IF arrayprocessinghappened = 1 THEN arrayprocessinghappened = 0
+
+ IF NoChecks = 0 THEN
+ IF dynscope THEN
+ dynscope = 0
+ PRINT #12, "if(qbevent){evnt(" + str2$(linenumber) + ");if(r)goto S_" + str2$(statementn) + ";}"
+ ELSE
+ PRINT #12, "if(!qbevent)break;evnt(" + str2$(linenumber) + ");}while(r);"
+ END IF
+ END IF
+
+ finishednonexec:
+
+ IF layoutdone = 0 THEN layoutok = 0 'invalidate layout if not handled
+
+ IF continuelinefrom = 0 THEN 'note: manager #2 requires this condition
+
+ 'Include Manager #2 '***
+ IF LEN(addmetainclude$) THEN
+
+ IF inclevel = 0 THEN
+ 'backup line formatting
+ layoutcomment_backup$ = layoutcomment$
+ layoutok_backup = layoutok
+ layout_backup$ = layout$
+ END IF
+
+ a$ = addmetainclude$: addmetainclude$ = "" 'read/clear message
+ IF inclevel = 100 THEN a$ = "Too many indwelling INCLUDE files": GOTO errmes
+ '1. Verify file exists (location is either (a)relative to source file or (b)absolute)
+ fh = 99 + inclevel + 1
+ FOR try = 1 TO 2
+ IF try = 1 THEN
+ IF inclevel = 0 THEN
+ IF idemode THEN p$ = idepath$ + pathsep$ ELSE p$ = getfilepath$(sourcefile$)
+ ELSE
+ p$ = getfilepath$(incname(inclevel))
+ END IF
+ f$ = p$ + a$
+ END IF
+ IF try = 2 THEN f$ = a$
+ IF _FILEEXISTS(f$) THEN
+ qberrorhappened = -2 '***
+ OPEN f$ FOR BINARY AS #fh
+ qberrorhappened2: '***
+ IF qberrorhappened = -2 THEN EXIT FOR '***
+ END IF
+ qberrorhappened = 0
+ NEXT
+ IF qberrorhappened <> -2 THEN qberrorhappened = 0: a$ = "File " + a$ + " not found": GOTO errmes
+ inclevel = inclevel + 1: incname$(inclevel) = f$: inclinenumber(inclevel) = 0
+ END IF 'fall through to next section...
+ '--------------------
+ DO WHILE inclevel
+ fh = 99 + inclevel
+ '2. Feed next line
+ IF EOF(fh) = 0 THEN
+ LINE INPUT #fh, x$
+ a3$ = x$
+ continuelinefrom = 0
+ inclinenumber(inclevel) = inclinenumber(inclevel) + 1
+ 'create extended error string 'incerror$'
+ e$ = " in line " + str2(inclinenumber(inclevel)) + " of " + incname$(inclevel) + " included"
+ IF inclevel > 1 THEN
+ e$ = e$ + " (through "
+ FOR x = 1 TO inclevel - 1 STEP 1
+ e$ = e$ + incname$(x)
+ IF x < inclevel - 1 THEN 'a sep is req
+ IF x = inclevel - 2 THEN
+ e$ = e$ + " then "
+ ELSE
+ e$ = e$ + ", "
+ END IF
+ END IF
+ NEXT
+ e$ = e$ + ")"
+ END IF
+ incerror$ = e$
+ linenumber = linenumber - 1 'lower official linenumber to counter later increment
+ IF idemode THEN sendc$ = CHR$(10) + a3$: GOTO sendcommand 'passback
+ GOTO includeline
+ END IF
+ '3. Close & return control
+ CLOSE #fh
+ inclevel = inclevel - 1
+ IF inclevel = 0 THEN
+ 'restore line formatting
+ layoutok = layoutok_backup
+ layout$ = layout_backup$
+ layoutcomment$ = layoutcomment_backup$
+ END IF
+ LOOP 'fall through to next section...
+ '(end manager)
+
+
+
+ END IF 'continuelinefrom=0
+
+
+ IF Debug THEN
+ PRINT #9, "[layout check]"
+ PRINT #9, "[" + layoutoriginal$ + "]"
+ PRINT #9, "[" + layout$ + "]"
+ PRINT #9, layoutok
+ PRINT #9, "[end layout check]"
+ END IF
+
+
+
+
+ IF idemode THEN
+ IF continuelinefrom <> 0 THEN GOTO ide4 'continue processing other commands on line
+
+ IF LEN(layoutcomment$) THEN
+ IF LEN(layout$) THEN layout$ = layout$ + sp + layoutcomment$ ELSE layout$ = layoutcomment$
+ END IF
+
+ IF layoutok = 0 THEN
+ layout$ = layoutoriginal$
+ ELSE
+
+ 'reverse '046' changes present in autolayout
+ 'replace fix046$ with .
+ i = INSTR(layout$, fix046$)
+ DO WHILE i
+ layout$ = LEFT$(layout$, i - 1) + "." + RIGHT$(layout$, LEN(layout$) - (i + LEN(fix046$) - 1))
+ i = INSTR(layout$, fix046$)
+ LOOP
+
+ END IF
+ x = lhscontrollevel: IF controllevel < lhscontrollevel THEN x = controllevel
+ IF definingtype = 2 THEN x = x + 1
+ IF declaringlibrary = 2 THEN x = x + 1
+ layout$ = SPACE$(x) + layout$
+ IF linecontinuation THEN layout$ = ""
+
+ GOTO ideret4 'return control to IDE
+ END IF
+
+ 'layout is not currently used by the compiler (as appose to the IDE), if it was it would be used here
+ skipide4:
LOOP
ide5:
@@ -9897,14 +10102,16 @@ IF definingtype THEN linenumber = definingtypeerror: a$ = "TYPE without END TYPE
'check for open controls (copy #1)
IF controllevel THEN
-x = controltype(controllevel)
-IF x = 1 THEN a$ = "IF without END IF"
-IF x = 2 THEN a$ = "FOR without NEXT"
-IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
-IF x = 5 THEN a$ = "WHILE without WEND"
-IF (x >= 10 AND x <= 17) OR x = 18 OR x = 19 THEN a$ = "SELECT CASE without END SELECT"
-linenumber = controlref(controllevel)
-GOTO errmes
+ x = controltype(controllevel)
+ a$ = "Unidentified open control block"
+ IF x = 1 THEN a$ = "IF without END IF"
+ IF x = 2 THEN a$ = "FOR without NEXT"
+ IF x = 3 OR x = 4 THEN a$ = "DO without LOOP"
+ 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"
+ linenumber = controlref(controllevel)
+ GOTO errmes
END IF
IF LEN(subfunc) THEN a$ = "SUB/FUNCTION without END SUB/FUNCTION": GOTO errmes
@@ -9919,158 +10126,158 @@ OPEN tmpdir$ + "clear.txt" FOR OUTPUT AS #12 'direct code to clear.txt
FOR i = 1 TO idn
-IF ids(i).staticscope THEN 'static scope?
-subfunc = RTRIM$(ids(i).insubfunc) 'set static scope
-GOTO clearstaticscope
-END IF
+ IF ids(i).staticscope THEN 'static scope?
+ subfunc = RTRIM$(ids(i).insubfunc) 'set static scope
+ GOTO clearstaticscope
+ END IF
-a = ASC(ids(i).insubfunc)
-IF a = 0 OR a = 32 THEN 'global scope?
-subfunc = "" 'set global scope
-clearstaticscope:
+ a = ASC(ids(i).insubfunc)
+ IF a = 0 OR a = 32 THEN 'global scope?
+ subfunc = "" 'set global scope
+ clearstaticscope:
-IF ids(i).arraytype THEN 'an array
-getid i
-IF Error_Happened THEN GOTO errmes
-IF id.arrayelements = -1 THEN GOTO clearerasereturned 'cannot erase non-existant array
-clearerasereturn = 1: GOTO clearerase
-END IF 'array
+ IF ids(i).arraytype THEN 'an array
+ getid i
+ IF Error_Happened THEN GOTO errmes
+ IF id.arrayelements = -1 THEN GOTO clearerasereturned 'cannot erase non-existant array
+ clearerasereturn = 1: GOTO clearerase
+ END IF 'array
-IF ids(i).t THEN 'non-array variable
-getid i
-IF Error_Happened THEN GOTO errmes
-bytes$ = variablesize$(-1)
-IF Error_Happened THEN GOTO errmes
-'create a reference
-typ = id.t + ISREFERENCE
-IF typ AND ISUDT THEN
-e$ = str2(i) + sp3 + str2(typ AND 511) + sp3 + "0" + sp3 + "0"
-ELSE
-e$ = str2(i)
-END IF
-e$ = refer$(e$, typ, 1)
-IF Error_Happened THEN GOTO errmes
-IF typ AND ISSTRING THEN
-IF typ AND ISFIXEDLENGTH THEN
-PRINT #12, "memset((void*)(" + e$ + "->chr),0," + bytes$ + ");"
-GOTO cleared
-ELSE
-PRINT #12, e$ + "->len=0;"
-GOTO cleared
-END IF
-END IF
-IF typ AND ISUDT THEN
-PRINT #12, "memset((void*)" + e$ + ",0," + bytes$ + ");"
-ELSE
-PRINT #12, "*" + e$ + "=0;"
-END IF
-GOTO cleared
-END IF 'non-array variable
+ IF ids(i).t THEN 'non-array variable
+ getid i
+ IF Error_Happened THEN GOTO errmes
+ bytes$ = variablesize$(-1)
+ IF Error_Happened THEN GOTO errmes
+ 'create a reference
+ typ = id.t + ISREFERENCE
+ IF typ AND ISUDT THEN
+ e$ = str2(i) + sp3 + str2(typ AND 511) + sp3 + "0" + sp3 + "0"
+ ELSE
+ e$ = str2(i)
+ END IF
+ e$ = refer$(e$, typ, 1)
+ IF Error_Happened THEN GOTO errmes
+ IF typ AND ISSTRING THEN
+ IF typ AND ISFIXEDLENGTH THEN
+ PRINT #12, "memset((void*)(" + e$ + "->chr),0," + bytes$ + ");"
+ GOTO cleared
+ ELSE
+ PRINT #12, e$ + "->len=0;"
+ GOTO cleared
+ END IF
+ END IF
+ IF typ AND ISUDT THEN
+ PRINT #12, "memset((void*)" + e$ + ",0," + bytes$ + ");"
+ ELSE
+ PRINT #12, "*" + e$ + "=0;"
+ END IF
+ GOTO cleared
+ END IF 'non-array variable
-END IF 'scope
+ END IF 'scope
-cleared:
-clearerasereturned:
+ cleared:
+ clearerasereturned:
NEXT
CLOSE #12
IF Debug THEN
-PRINT #9, "finished making program!"
-PRINT #9, "recompile="; recompile
+ PRINT #9, "finished making program!"
+ PRINT #9, "recompile="; recompile
END IF
'Set cmem flags for subs/functions requiring data passed in cmem
FOR i = 1 TO idn
-IF cmemlist(i) THEN 'must be in cmem
+ IF cmemlist(i) THEN 'must be in cmem
-getid i
-IF Error_Happened THEN GOTO errmes
+ getid i
+ IF Error_Happened THEN GOTO errmes
-IF Debug THEN PRINT #9, "recompiling cmem sf! checking:"; RTRIM$(id.n)
+ IF Debug THEN PRINT #9, "recompiling cmem sf! checking:"; RTRIM$(id.n)
-IF id.sfid THEN 'it is an argument of a sub/function
+ IF id.sfid THEN 'it is an argument of a sub/function
-IF Debug THEN PRINT #9, "recompiling cmem sf! It's a sub/func arg!"
+ IF Debug THEN PRINT #9, "recompiling cmem sf! It's a sub/func arg!"
-i2 = id.sfid
-x = id.sfarg
+ i2 = id.sfid
+ x = id.sfarg
-IF Debug THEN PRINT #9, "recompiling cmem sf! values:"; i2; x
+ IF Debug THEN PRINT #9, "recompiling cmem sf! values:"; i2; x
-'check if cmem flag is set, if not then set it & force recompile
-IF MID$(sfcmemargs(i2), x, 1) <> CHR$(1) THEN
-MID$(sfcmemargs(i2), x, 1) = CHR$(1)
+ 'check if cmem flag is set, if not then set it & force recompile
+ IF MID$(sfcmemargs(i2), x, 1) <> CHR$(1) THEN
+ MID$(sfcmemargs(i2), x, 1) = CHR$(1)
-IF Debug THEN PRINT #9, "recompiling cmem sf! setting:"; i2; x
+ IF Debug THEN PRINT #9, "recompiling cmem sf! setting:"; i2; x
-recompile = 1
-END IF
-END IF
-END IF
+ recompile = 1
+ END IF
+ END IF
+ END IF
NEXT i
unresolved = 0
FOR i = 1 TO idn
-getid i
-IF Error_Happened THEN GOTO errmes
+ getid i
+ IF Error_Happened THEN GOTO errmes
-IF Debug THEN PRINT #9, "checking id named:"; id.n
+ IF Debug THEN PRINT #9, "checking id named:"; id.n
-IF id.subfunc THEN
-FOR i2 = 1 TO id.args
-t = CVL(MID$(id.arg, i2 * 4 - 3, 4))
-IF t > 0 THEN
-IF (t AND ISPOINTER) THEN
-IF (t AND ISARRAY) THEN
+ IF id.subfunc THEN
+ FOR i2 = 1 TO id.args
+ t = CVL(MID$(id.arg, i2 * 4 - 3, 4))
+ IF t > 0 THEN
+ IF (t AND ISPOINTER) THEN
+ IF (t AND ISARRAY) THEN
-IF Debug THEN PRINT #9, "checking argument "; i2; " of "; id.args
+ IF Debug THEN PRINT #9, "checking argument "; i2; " of "; id.args
-nele = ASC(MID$(id.nele, i2, 1))
-nelereq = ASC(MID$(id.nelereq, i2, 1))
+ nele = ASC(MID$(id.nele, i2, 1))
+ nelereq = ASC(MID$(id.nelereq, i2, 1))
-IF Debug THEN PRINT #9, "nele="; nele
-IF Debug THEN PRINT #9, "nelereq="; nelereq
+ IF Debug THEN PRINT #9, "nele="; nele
+ IF Debug THEN PRINT #9, "nelereq="; nelereq
-IF nele <> nelereq THEN
+ IF nele <> nelereq THEN
-IF Debug THEN PRINT #9, "mismatch detected!"
+ IF Debug THEN PRINT #9, "mismatch detected!"
-unresolved = unresolved + 1
-sflistn = sflistn + 1
-sfidlist(sflistn) = i
-sfarglist(sflistn) = i2
-sfelelist(sflistn) = nelereq '0 means still unknown
-END IF
-END IF
-END IF
-END IF
-NEXT
-END IF
+ unresolved = unresolved + 1
+ sflistn = sflistn + 1
+ sfidlist(sflistn) = i
+ sfarglist(sflistn) = i2
+ sfelelist(sflistn) = nelereq '0 means still unknown
+ END IF
+ END IF
+ END IF
+ END IF
+ NEXT
+ END IF
NEXT
'is recompilation required to resolve this?
IF unresolved > 0 THEN
-IF lastunresolved = -1 THEN
-'first pass
-recompile = 1
-IF Debug THEN
-PRINT #9, "recompiling to resolve array elements (first time)"
-PRINT #9, "sflistn="; sflistn
-PRINT #9, "oldsflistn="; oldsflistn
-END IF
-ELSE
-'not first pass
-IF unresolved < lastunresolved THEN
-recompile = 1
-IF Debug THEN
-PRINT #9, "recompiling to resolve array elements (not first time)"
-PRINT #9, "sflistn="; sflistn
-PRINT #9, "oldsflistn="; oldsflistn
-END IF
-END IF
-END IF
+ IF lastunresolved = -1 THEN
+ 'first pass
+ recompile = 1
+ IF Debug THEN
+ PRINT #9, "recompiling to resolve array elements (first time)"
+ PRINT #9, "sflistn="; sflistn
+ PRINT #9, "oldsflistn="; oldsflistn
+ END IF
+ ELSE
+ 'not first pass
+ IF unresolved < lastunresolved THEN
+ recompile = 1
+ IF Debug THEN
+ PRINT #9, "recompiling to resolve array elements (not first time)"
+ PRINT #9, "sflistn="; sflistn
+ PRINT #9, "oldsflistn="; oldsflistn
+ END IF
+ END IF
+ END IF
END IF 'unresolved
lastunresolved = unresolved
@@ -10101,95 +10308,95 @@ lastunresolved = unresolved
IF Debug THEN PRINT #9, "Beginning COMMON array list check..."
xi = 1
FOR x = 1 TO commonarraylistn
-varname$ = getelement$(commonarraylist, xi): xi = xi + 1
-typ$ = getelement$(commonarraylist, xi): xi = xi + 1
-dimmethod2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
-dimshared2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
-'find the array ID (try method)
-t = typname2typ(typ$)
-IF Error_Happened THEN GOTO errmes
-IF (t AND ISUDT) = 0 THEN varname$ = varname$ + type2symbol$(typ$)
-IF Error_Happened THEN GOTO errmes
+ varname$ = getelement$(commonarraylist, xi): xi = xi + 1
+ typ$ = getelement$(commonarraylist, xi): xi = xi + 1
+ dimmethod2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
+ dimshared2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
+ 'find the array ID (try method)
+ t = typname2typ(typ$)
+ IF Error_Happened THEN GOTO errmes
+ IF (t AND ISUDT) = 0 THEN varname$ = varname$ + type2symbol$(typ$)
+ IF Error_Happened THEN GOTO errmes
-IF Debug THEN PRINT #9, "Checking for array '" + varname$ + "'..."
+ IF Debug THEN PRINT #9, "Checking for array '" + varname$ + "'..."
-try = findid(varname$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.arraytype THEN GOTO foundcommonarray2
-IF try = 2 THEN findanotherid = 1: try = findid(varname$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-foundcommonarray2:
+ try = findid(varname$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.arraytype THEN GOTO foundcommonarray2
+ IF try = 2 THEN findanotherid = 1: try = findid(varname$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ foundcommonarray2:
-IF Debug THEN PRINT #9, "Found array '" + varname$ + "!"
+ IF Debug THEN PRINT #9, "Found array '" + varname$ + "!"
-IF id.arrayelements = -1 THEN
-IF arrayelementslist(currentid) <> 0 THEN recompile = 1
-IF Debug THEN PRINT #9, "Recompiling to resolve elements of:" + varname$
-END IF
+ IF id.arrayelements = -1 THEN
+ IF arrayelementslist(currentid) <> 0 THEN recompile = 1
+ IF Debug THEN PRINT #9, "Recompiling to resolve elements of:" + varname$
+ END IF
NEXT
IF Debug THEN PRINT #9, "Finished COMMON array list check!"
IF recompile THEN
-do_recompile:
-IF Debug THEN PRINT #9, "Recompile required!"
-recompile = 0
-IF idemode THEN iderecompile = 1
-FOR closeall = 1 TO 255: CLOSE closeall: NEXT
-OPEN tmpdir$ + "temp.bin" FOR OUTPUT LOCK WRITE AS #26 'relock
-GOTO recompile
+ do_recompile:
+ IF Debug THEN PRINT #9, "Recompile required!"
+ recompile = 0
+ IF idemode THEN iderecompile = 1
+ FOR closeall = 1 TO 255: CLOSE closeall: NEXT
+ OPEN tmpdir$ + "temp.bin" FOR OUTPUT LOCK WRITE AS #26 'relock
+ GOTO recompile
END IF
IF Debug THEN PRINT #9, "Beginning label check..."
FOR r = 1 TO nLabels
-IF Labels(r).Scope_Restriction THEN
-a$ = RTRIM$(Labels(r).cn)
-ignore = validlabel(a$)
-v = HashFind(a$, HASHFLAG_LABEL, ignore, r2)
-addlabchk7:
-IF v THEN
-IF Labels(r2).Scope = Labels(r).Scope_Restriction THEN
-linenumber = Labels(r).Error_Line: a$ = "Common label within a SUB/FUNCTION": GOTO errmes
-END IF
-IF v = 2 THEN v = HashFindCont(ignore, r2): GOTO addlabchk7
-END IF 'v
-END IF 'restriction
+ IF Labels(r).Scope_Restriction THEN
+ a$ = RTRIM$(Labels(r).cn)
+ ignore = validlabel(a$)
+ v = HashFind(a$, HASHFLAG_LABEL, ignore, r2)
+ addlabchk7:
+ IF v THEN
+ IF Labels(r2).Scope = Labels(r).Scope_Restriction THEN
+ linenumber = Labels(r).Error_Line: a$ = "Common label within a SUB/FUNCTION": GOTO errmes
+ END IF
+ IF v = 2 THEN v = HashFindCont(ignore, r2): GOTO addlabchk7
+ END IF 'v
+ END IF 'restriction
-'check for undefined labels
-IF Labels(r).State = 0 THEN
+ 'check for undefined labels
+ IF Labels(r).State = 0 THEN
-IF INSTR(PossibleSubNameLabels$, sp + UCASE$(RTRIM$(Labels(r).cn)) + sp) THEN
-IF INSTR(SubNameLabels$, sp + UCASE$(RTRIM$(Labels(r).cn)) + sp) = 0 THEN 'not already added
-SubNameLabels$ = SubNameLabels$ + UCASE$(RTRIM$(Labels(r).cn)) + sp
-IF Debug THEN PRINT #9, "Recompiling to resolve label:"; RTRIM$(Labels(r).cn)
-GOTO do_recompile
-END IF
-END IF
+ IF INSTR(PossibleSubNameLabels$, sp + UCASE$(RTRIM$(Labels(r).cn)) + sp) THEN
+ IF INSTR(SubNameLabels$, sp + UCASE$(RTRIM$(Labels(r).cn)) + sp) = 0 THEN 'not already added
+ SubNameLabels$ = SubNameLabels$ + UCASE$(RTRIM$(Labels(r).cn)) + sp
+ IF Debug THEN PRINT #9, "Recompiling to resolve label:"; RTRIM$(Labels(r).cn)
+ GOTO do_recompile
+ END IF
+ END IF
-linenumber = Labels(r).Error_Line: a$ = "Label not defined": GOTO errmes
-END IF
+ linenumber = Labels(r).Error_Line: a$ = "Label not defined": GOTO errmes
+ END IF
-IF Labels(r).Data_Referenced THEN
+ IF Labels(r).Data_Referenced THEN
-'check for ambiguous RESTORE reference
-x = 0
-a$ = RTRIM$(Labels(r).cn)
-ignore = validlabel(a$)
-v = HashFind(a$, HASHFLAG_LABEL, ignore, r2)
-addlabchk4:
-IF v THEN
-x = x + 1
-IF v = 2 THEN v = HashFindCont(ignore, r2): GOTO addlabchk4
-END IF 'v
-IF x <> 1 THEN linenumber = Labels(r).Error_Line: a$ = "Ambiguous DATA label": GOTO errmes
+ 'check for ambiguous RESTORE reference
+ x = 0
+ a$ = RTRIM$(Labels(r).cn)
+ ignore = validlabel(a$)
+ v = HashFind(a$, HASHFLAG_LABEL, ignore, r2)
+ addlabchk4:
+ IF v THEN
+ x = x + 1
+ IF v = 2 THEN v = HashFindCont(ignore, r2): GOTO addlabchk4
+ END IF 'v
+ IF x <> 1 THEN linenumber = Labels(r).Error_Line: a$ = "Ambiguous DATA label": GOTO errmes
-'add global data offset variable
-PRINT #18, "ptrszint data_at_LABEL_" + a$ + "=" + str2(Labels(r).Data_Offset) + ";"
+ 'add global data offset variable
+ PRINT #18, "ptrszint data_at_LABEL_" + a$ + "=" + str2(Labels(r).Data_Offset) + ";"
-END IF 'data referenced
+ END IF 'data referenced
NEXT
IF Debug THEN PRINT #9, "Finished check!"
@@ -10210,24 +10417,24 @@ CLOSE #13: OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #13
CLOSE #19: OPEN tmpdir$ + "mainfree.txt" FOR APPEND AS #19
IF Console THEN
-PRINT #18, "int32 console=1;"
+ PRINT #18, "int32 console=1;"
ELSE
-PRINT #18, "int32 console=0;"
+ PRINT #18, "int32 console=0;"
END IF
IF ScreenHide THEN
-PRINT #18, "int32 screen_hide_startup=1;"
+ PRINT #18, "int32 screen_hide_startup=1;"
ELSE
-PRINT #18, "int32 screen_hide_startup=0;"
+ PRINT #18, "int32 screen_hide_startup=0;"
END IF
fh = FREEFILE
OPEN tmpdir$ + "dyninfo.txt" FOR APPEND AS #fh
IF Resize THEN
-PRINT #fh, "ScreenResize=1;"
+ PRINT #fh, "ScreenResize=1;"
END IF
IF Resize_Scale THEN
-PRINT #fh, "ScreenResizeScale=" + str2(Resize_Scale) + ";"
+ PRINT #fh, "ScreenResizeScale=" + str2(Resize_Scale) + ";"
END IF
CLOSE #fh
@@ -10235,50 +10442,50 @@ CLOSE #fh
PRINT #18, "ptrszint data_size=" + str2(DataOffset) + ";"
IF DataOffset = 0 THEN
-PRINT #18, "uint8 *data=(uint8*)calloc(1,1);"
+ PRINT #18, "uint8 *data=(uint8*)calloc(1,1);"
ELSE
-IF inline_DATA = 0 THEN
-IF os$ = "WIN" THEN
-IF OS_BITS = 32 THEN
-x$ = CHR$(0): PUT #16, , x$
-PRINT #18, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
-PRINT #18, "extern char *binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
-PRINT #18, "}"
-PRINT #18, "uint8 *data=(uint8*)&binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
-ELSE
-x$ = CHR$(0): PUT #16, , x$
-PRINT #18, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
-PRINT #18, "extern char *_binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
-PRINT #18, "}"
-PRINT #18, "uint8 *data=(uint8*)&_binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
-END IF
-END IF
-IF os$ = "LNX" THEN
-x$ = CHR$(0): PUT #16, , x$
-PRINT #18, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
-PRINT #18, "extern char *_binary____temp" + tempfolderindexstr2$ + "_data_bin_start;"
-PRINT #18, "}"
-PRINT #18, "uint8 *data=(uint8*)&_binary____temp" + tempfolderindexstr2$ + "_data_bin_start;"
-END IF
-ELSE
-'inline data
-CLOSE #16
-ff = FREEFILE
-OPEN tmpdir$ + "data.bin" FOR BINARY AS #ff
-x$ = SPACE$(LOF(ff))
-GET #ff, , x$
-CLOSE #ff
-x2$ = "uint8 inline_data[]={"
-FOR i = 1 TO LEN(x$)
-x2$ = x2$ + inlinedatastr$(ASC(x$, i))
-NEXT
-x2$ = x2$ + "0};"
-PRINT #18, x2$
-PRINT #18, "uint8 *data=&inline_data[0];"
-x$ = "": x2$ = ""
-END IF
+ IF inline_DATA = 0 THEN
+ IF os$ = "WIN" THEN
+ IF OS_BITS = 32 THEN
+ x$ = CHR$(0): PUT #16, , x$
+ PRINT #18, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
+ PRINT #18, "extern char *binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
+ PRINT #18, "}"
+ PRINT #18, "uint8 *data=(uint8*)&binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
+ ELSE
+ x$ = CHR$(0): PUT #16, , x$
+ PRINT #18, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
+ PRINT #18, "extern char *_binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
+ PRINT #18, "}"
+ PRINT #18, "uint8 *data=(uint8*)&_binary_____temp" + tempfolderindexstr2$ + "__data_bin_start;"
+ END IF
+ END IF
+ IF os$ = "LNX" THEN
+ x$ = CHR$(0): PUT #16, , x$
+ PRINT #18, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
+ PRINT #18, "extern char *_binary____temp" + tempfolderindexstr2$ + "_data_bin_start;"
+ PRINT #18, "}"
+ PRINT #18, "uint8 *data=(uint8*)&_binary____temp" + tempfolderindexstr2$ + "_data_bin_start;"
+ END IF
+ ELSE
+ 'inline data
+ CLOSE #16
+ ff = FREEFILE
+ OPEN tmpdir$ + "data.bin" FOR BINARY AS #ff
+ x$ = SPACE$(LOF(ff))
+ GET #ff, , x$
+ CLOSE #ff
+ x2$ = "uint8 inline_data[]={"
+ FOR i = 1 TO LEN(x$)
+ x2$ = x2$ + inlinedatastr$(ASC(x$, i))
+ NEXT
+ x2$ = x2$ + "0};"
+ PRINT #18, x2$
+ PRINT #18, "uint8 *data=&inline_data[0];"
+ x$ = "": x2$ = ""
+ END IF
END IF
IF Debug THEN PRINT #9, "Beginning generation of code for saving/sharing common array data..."
@@ -10286,396 +10493,396 @@ use_global_byte_elements = 1
ncommontmp = 0
xi = 1
FOR x = 1 TO commonarraylistn
-varname$ = getelement$(commonarraylist, xi): xi = xi + 1
-typ$ = getelement$(commonarraylist, xi): xi = xi + 1
-dimmethod2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
-dimshared2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
-
-'find the array ID (try method)
-purevarname$ = varname$
-t = typname2typ(typ$)
-IF Error_Happened THEN GOTO errmes
-IF (t AND ISUDT) = 0 THEN varname$ = varname$ + type2symbol$(typ$)
-IF Error_Happened THEN GOTO errmes
-try = findid(varname$)
-IF Error_Happened THEN GOTO errmes
-DO WHILE try
-IF id.arraytype THEN GOTO foundcommonarray
-IF try = 2 THEN findanotherid = 1: try = findid(varname$) ELSE try = 0
-IF Error_Happened THEN GOTO errmes
-LOOP
-a$ = "COMMON array unlocatable": GOTO errmes 'should never happen
-foundcommonarray:
-IF Debug THEN PRINT #9, "Found common array '" + varname$ + "'!"
-
-i = currentid
-arraytype = id.arraytype
-arrayelements = id.arrayelements
-e$ = RTRIM$(id.n)
-IF (t AND ISUDT) = 0 THEN e$ = e$ + typevalue2symbol$(t)
-IF Error_Happened THEN GOTO errmes
-n$ = e$
-n2$ = RTRIM$(id.callname)
-tsize = id.tsize
-
-'select command
-command = 3 'fixed length elements
-IF t AND ISSTRING THEN
-IF (t AND ISFIXEDLENGTH) = 0 THEN
-command = 4 'var-len elements
-END IF
-END IF
-
-
-'if...
-'i) array elements are still undefined (ie. arrayelements=-1) pass the input content along
-' if any existed or an array-placeholder
-'ii) if the array's elements were defined, any input content would have been loaded so the
-' array (in whatever state it currently is) should be passed. If it is currently erased
-' then it should be passed as a placeholder
-
-IF arrayelements = -1 THEN
-
-'load array (copies the array, if any, into a buffer for later)
-
-
-
-OPEN tmpdir$ + "inpchain" + str2$(i) + ".txt" FOR OUTPUT AS #12
-PRINT #12, "if (int32val==2){" 'array place-holder
-'create buffer to store array as-is in global.txt
-x$ = str2$(uniquenumber)
-x1$ = "chainarraybuf" + x$
-x2$ = "chainarraybufsiz" + x$
-PRINT #18, "static uint8 *" + x1$ + "=(uint8*)malloc(1);"
-PRINT #18, "static int64 " + x2$ + "=0;"
-'read next command
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-
-IF command = 3 THEN PRINT #12, "if (int32val==3){" 'fixed-length-element array
-IF command = 4 THEN PRINT #12, "if (int32val==4){" 'var-length-element array
-PRINT #12, x2$ + "+=4; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int32*)(" + x1$ + "+" + x2$ + "-4)=int32val;"
-
-IF command = 3 THEN
-'read size in bits of one element, convert it to bytes
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-PRINT #12, x2$ + "+=8; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int64*)(" + x1$ + "+" + x2$ + "-8)=int64val;"
-PRINT #12, "bytes=int64val>>3;"
-END IF 'com=3
-
-IF command = 4 THEN PRINT #12, "bytes=1;" 'bytes used to calculate number of elements
-
-'read number of dimensions
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-PRINT #12, x2$ + "+=4; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int32*)(" + x1$ + "+" + x2$ + "-4)=int32val;"
-
-'read size of dimensions & calculate the size of the array in bytes
-PRINT #12, "while(int32val--){"
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);" 'lbound
-PRINT #12, x2$ + "+=8; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int64*)(" + x1$ + "+" + x2$ + "-8)=int64val;"
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val2,8," + NewByteElement$ + "),0);" 'ubound
-PRINT #12, x2$ + "+=8; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int64*)(" + x1$ + "+" + x2$ + "-8)=int64val2;"
-PRINT #12, "bytes*=(int64val2-int64val+1);"
-PRINT #12, "}"
-
-IF command = 3 THEN
-'read the array data
-PRINT #12, x2$ + "+=bytes; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + ");"
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)(" + x1$ + "+" + x2$ + "-bytes),bytes," + NewByteElement$ + "),0);"
-END IF 'com=3
-
-IF command = 4 THEN
-PRINT #12, "bytei=0;"
-PRINT #12, "while(bytei>3); " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + ");"
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)(" + x1$ + "+" + x2$ + "-(int64val>>3)),(int64val>>3)," + NewByteElement$ + "),0);"
-PRINT #12, "bytei++;"
-PRINT #12, "}"
-END IF
-
-'get next command
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-PRINT #12, "}" 'command=3 or 4
-
-PRINT #12, "}" 'array place-holder
-CLOSE #12
-
-
-'save array (saves the buffered data, if any, for later)
-
-OPEN tmpdir$ + "chain" + str2$(i) + ".txt" FOR OUTPUT AS #12
-PRINT #12, "int32val=2;" 'placeholder
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)" + x1$ + "," + x2$ + "," + NewByteElement$ + "),0);"
-CLOSE #12
-
-
-
-
-ELSE
-'note: arrayelements<>-1
-
-'load array
-
-OPEN tmpdir$ + "inpchain" + str2$(i) + ".txt" FOR OUTPUT AS #12
-
-PRINT #12, "if (int32val==2){" 'array place-holder
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-
-IF command = 3 THEN PRINT #12, "if (int32val==3){" 'fixed-length-element array
-IF command = 4 THEN PRINT #12, "if (int32val==4){" 'var-length-element array
-
-IF command = 3 THEN
-'get size in bits
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-'***assume correct***
-END IF
-
-'get number of elements
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-'***assume correct***
-
-e$ = ""
-IF command = 4 THEN PRINT #12, "bytes=1;" 'bytes counts the number of total elements
-FOR x2 = 1 TO arrayelements
-
-'create 'secret' variables to assist in passing common arrays
-IF x2 > ncommontmp THEN
-ncommontmp = ncommontmp + 1
-
-IF Debug THEN PRINT #9, "Calling DIM2(...)..."
-IF Error_Happened THEN GOTO errmes
-retval = dim2("___RESERVED_COMMON_LBOUND" + str2$(ncommontmp), "_INTEGER64", 0, "")
-IF Error_Happened THEN GOTO errmes
-retval = dim2("___RESERVED_COMMON_UBOUND" + str2$(ncommontmp), "_INTEGER64", 0, "")
-IF Error_Happened THEN GOTO errmes
-IF Debug THEN PRINT #9, "Finished calling DIM2(...)!"
-IF Error_Happened THEN GOTO errmes
-
-
-END IF
-
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-PRINT #12, "*__INTEGER64____RESERVED_COMMON_LBOUND" + str2$(x2) + "=int64val;"
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val2,8," + NewByteElement$ + "),0);"
-PRINT #12, "*__INTEGER64____RESERVED_COMMON_UBOUND" + str2$(x2) + "=int64val2;"
-IF command = 4 THEN PRINT #12, "bytes*=(int64val2-int64val+1);"
-IF x2 > 1 THEN e$ = e$ + sp + "," + sp
-e$ = e$ + "___RESERVED_COMMON_LBOUND" + str2$(x2) + sp + "TO" + sp + "___RESERVED_COMMON_UBOUND" + str2$(x2)
-NEXT
-
-IF Debug THEN PRINT #9, "Calling DIM2(" + purevarname$ + "," + typ$ + ",0," + e$ + ")..."
-IF Error_Happened THEN GOTO errmes
-'Note: purevarname$ is simply varname$ without the type symbol after it
-redimoption = 1
-retval = dim2(purevarname$, typ$, 0, e$)
-IF Error_Happened THEN GOTO errmes
-redimoption = 0
-IF Debug THEN PRINT #9, "Finished calling DIM2(" + purevarname$ + "," + typ$ + ",0," + e$ + ")!"
-IF Error_Happened THEN GOTO errmes
-
-IF command = 3 THEN
-'use get to load in the array data
-varname$ = varname$ + sp + "(" + sp + ")"
-e$ = evaluatetotyp(fixoperationorder$(varname$), -4)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_get(FF,NULL," + e$ + ",0);"
-END IF
-
-IF command = 4 THEN
-PRINT #12, "bytei=0;"
-PRINT #12, "while(bytei>3,1));" 'change string size
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)tqbs->chr,int64val>>3," + NewByteElement$ + "),0);" 'get size
-PRINT #12, "bytei++;"
-PRINT #12, "}"
-END IF
-
-'get next command
-PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-PRINT #12, "}"
-PRINT #12, "}"
-CLOSE #12
-
-'save array
-
-OPEN tmpdir$ + "chain" + str2$(i) + ".txt" FOR OUTPUT AS #12
-
-PRINT #12, "int32val=2;" 'placeholder
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-
-PRINT #12, "if (" + n2$ + "[2]&1){" 'don't add unless defined
-
-IF command = 3 THEN PRINT #12, "int32val=3;"
-IF command = 4 THEN PRINT #12, "int32val=4;"
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-
-IF command = 3 THEN
-'size of each element in bits
-bits = t AND 511
-IF t AND ISUDT THEN bits = udtxsize(t AND 511)
-IF t AND ISSTRING THEN bits = tsize * 8
-PRINT #12, "int64val=" + str2$(bits) + ";" 'size in bits
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-END IF 'com=3
-
-PRINT #12, "int32val=" + str2$(arrayelements) + ";" 'number of dimensions
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
-
-IF command = 3 THEN
-
-FOR x2 = 1 TO arrayelements
-'simulate calls to lbound/ubound
-e$ = "LBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
-e$ = evaluatetotyp(fixoperationorder$(e$), 64)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "int64val=" + e$ + ";"
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-e$ = "UBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
-e$ = evaluatetotyp(fixoperationorder$(e$), 64)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "int64val=" + e$ + ";"
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-NEXT
-
-'array data
-e$ = evaluatetotyp(fixoperationorder$(n$ + sp + "(" + sp + ")"), -4)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "sub_put(FF,NULL," + e$ + ",0);"
-
-END IF 'com=3
-
-IF command = 4 THEN
-
-'store LBOUND/UBOUND values and calculate number of total elements/strings
-PRINT #12, "bytes=1;" 'note: bytes is actually the total number of elements
-FOR x2 = 1 TO arrayelements
-e$ = "LBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
-e$ = evaluatetotyp(fixoperationorder$(e$), 64)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "int64val=" + e$ + ";"
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
-e$ = "UBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
-e$ = evaluatetotyp(fixoperationorder$(e$), 64)
-IF Error_Happened THEN GOTO errmes
-PRINT #12, "int64val2=" + e$ + ";"
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val2,8," + NewByteElement$ + "),0);"
-PRINT #12, "bytes*=(int64val2-int64val+1);"
-NEXT
-
-PRINT #12, "bytei=0;"
-PRINT #12, "while(byteilen; int64val<<=3;"
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);" 'size of element
-PRINT #12, "sub_put(FF,NULL,byte_element((uint64)tqbs->chr,tqbs->len," + NewByteElement$ + "),0);" 'element data
-PRINT #12, "bytei++;"
-PRINT #12, "}"
-
-END IF 'com=4
-
-PRINT #12, "}" 'don't add unless defined
-
-CLOSE #12
-
-
-
-
-'if chaincommonarray then
-'l2$=tlayout$
-'x=chaincommonarray
-'
-''chain???.txt
-'open tmpdir$ + "chain" + str2$(x) + ".txt" for append as #22
-'if lof(22) then close #22: goto chaindone 'only add this once
-''***assume non-var-len-string array***
-'print #22,"int32val=3;" 'non-var-len-element array
-'print #22,"sub_put(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
-'t=id.arraytype
-''***check for UDT size if necessary***
-''***check for string length if necessary***
-'bits=t and 511
-'print #22,"int64val="+str2$(bits)+";" 'size in bits
-'print #22,"sub_put(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
-'print #22,"int32val="+str2$(id.arrayelements)+";" 'number of elements
-'print #22,"sub_put(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
-'e$=rtrim$(id.n)
-'if (t and ISUDT)=0 then e$=e$+typevalue2symbol$(t)
-'n$=e$
-'for x2=1 to id.arrayelements
-''simulate calls to lbound/ubound
-'e$="LBOUND"+sp+"("+sp+n$+sp+","+sp+str2$(x2)+sp+")"
-'e$=evaluatetotyp(fixoperationorder$(e$),64)
-'print #22,"int64val="+e$+";"'LBOUND
-'print #22,"sub_put(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
-'e$="UBOUND"+sp+"("+sp+n$+sp+","+sp+str2$(x2)+sp+")"
-'e$=evaluatetotyp(fixoperationorder$(e$),64)
-'print #22,"int64val="+e$+";"'LBOUND
-'print #22,"sub_put(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
-'next
-''add array data
-'e$=evaluatetotyp(fixoperationorder$(n$+sp+"("+sp+")"),-4)
-'print #22,"sub_put(FF,NULL,"+e$+",0);"
-'close #22
-'
-''inpchain???.txt
-'open tmpdir$ + "chain" + str2$(x) + ".txt" for append as #22
-'print #22,"if (int32val==1){" 'common declaration of an array
-'print #22,"sub_get(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
-'print #22,"if (int32val==3){" 'fixed-length-element array
-'
-'print #22,"sub_get(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
-''***assume size correct and continue***
-'
-''get number of elements
-'print #22,"sub_get(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
-'
-''call dim2 and tell it to redim an array
-'
-''*********this should happen BEFORE the array (above) is actually dimensioned,
-''*********where the common() declaration is
-'
-''****although, if you never reference the array.............
-''****ARGH! you can access an undimmed array just like in a sub/function
-'
-'
-'
-'
-'print #22,"}"
-'print #22,"}"
-'close #22
-'
-'chaindone:
-'tlayout$=l2$
-'end if 'chaincommonarray
-
-
-
-
-'OPEN tmpdir$ + "chain.txt" FOR APPEND AS #22
-''include directive
-'print #22, "#include " + CHR$(34) + "chain" + str2$(x) + ".txt" + CHR$(34)
-'close #22
-''create/clear include file
-'open tmpdir$ + "chain" + str2$(x) + ".txt" for output as #22:close #22
-'
-'OPEN tmpdir$ + "inpchain.txt" FOR APPEND AS #22
-''include directive
-'print #22, "#include " + CHR$(34) + "inpchain" + str2$(x) + ".txt" + CHR$(34)
-'close #22
-''create/clear include file
-'open tmpdir$ + "inpchain" + str2$(x) + ".txt" for output as #22:close #22
-
-
-
-
-
-
-END IF 'id.arrayelements=-1
+ varname$ = getelement$(commonarraylist, xi): xi = xi + 1
+ typ$ = getelement$(commonarraylist, xi): xi = xi + 1
+ dimmethod2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
+ dimshared2 = VAL(getelement$(commonarraylist, xi)): xi = xi + 1
+
+ 'find the array ID (try method)
+ purevarname$ = varname$
+ t = typname2typ(typ$)
+ IF Error_Happened THEN GOTO errmes
+ IF (t AND ISUDT) = 0 THEN varname$ = varname$ + type2symbol$(typ$)
+ IF Error_Happened THEN GOTO errmes
+ try = findid(varname$)
+ IF Error_Happened THEN GOTO errmes
+ DO WHILE try
+ IF id.arraytype THEN GOTO foundcommonarray
+ IF try = 2 THEN findanotherid = 1: try = findid(varname$) ELSE try = 0
+ IF Error_Happened THEN GOTO errmes
+ LOOP
+ a$ = "COMMON array unlocatable": GOTO errmes 'should never happen
+ foundcommonarray:
+ IF Debug THEN PRINT #9, "Found common array '" + varname$ + "'!"
+
+ i = currentid
+ arraytype = id.arraytype
+ arrayelements = id.arrayelements
+ e$ = RTRIM$(id.n)
+ IF (t AND ISUDT) = 0 THEN e$ = e$ + typevalue2symbol$(t)
+ IF Error_Happened THEN GOTO errmes
+ n$ = e$
+ n2$ = RTRIM$(id.callname)
+ tsize = id.tsize
+
+ 'select command
+ command = 3 'fixed length elements
+ IF t AND ISSTRING THEN
+ IF (t AND ISFIXEDLENGTH) = 0 THEN
+ command = 4 'var-len elements
+ END IF
+ END IF
+
+
+ 'if...
+ 'i) array elements are still undefined (ie. arrayelements=-1) pass the input content along
+ ' if any existed or an array-placeholder
+ 'ii) if the array's elements were defined, any input content would have been loaded so the
+ ' array (in whatever state it currently is) should be passed. If it is currently erased
+ ' then it should be passed as a placeholder
+
+ IF arrayelements = -1 THEN
+
+ 'load array (copies the array, if any, into a buffer for later)
+
+
+
+ OPEN tmpdir$ + "inpchain" + str2$(i) + ".txt" FOR OUTPUT AS #12
+ PRINT #12, "if (int32val==2){" 'array place-holder
+ 'create buffer to store array as-is in global.txt
+ x$ = str2$(uniquenumber)
+ x1$ = "chainarraybuf" + x$
+ x2$ = "chainarraybufsiz" + x$
+ PRINT #18, "static uint8 *" + x1$ + "=(uint8*)malloc(1);"
+ PRINT #18, "static int64 " + x2$ + "=0;"
+ 'read next command
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+
+ IF command = 3 THEN PRINT #12, "if (int32val==3){" 'fixed-length-element array
+ IF command = 4 THEN PRINT #12, "if (int32val==4){" 'var-length-element array
+ PRINT #12, x2$ + "+=4; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int32*)(" + x1$ + "+" + x2$ + "-4)=int32val;"
+
+ IF command = 3 THEN
+ 'read size in bits of one element, convert it to bytes
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ PRINT #12, x2$ + "+=8; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int64*)(" + x1$ + "+" + x2$ + "-8)=int64val;"
+ PRINT #12, "bytes=int64val>>3;"
+ END IF 'com=3
+
+ IF command = 4 THEN PRINT #12, "bytes=1;" 'bytes used to calculate number of elements
+
+ 'read number of dimensions
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+ PRINT #12, x2$ + "+=4; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int32*)(" + x1$ + "+" + x2$ + "-4)=int32val;"
+
+ 'read size of dimensions & calculate the size of the array in bytes
+ PRINT #12, "while(int32val--){"
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);" 'lbound
+ PRINT #12, x2$ + "+=8; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int64*)(" + x1$ + "+" + x2$ + "-8)=int64val;"
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val2,8," + NewByteElement$ + "),0);" 'ubound
+ PRINT #12, x2$ + "+=8; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + "); *(int64*)(" + x1$ + "+" + x2$ + "-8)=int64val2;"
+ PRINT #12, "bytes*=(int64val2-int64val+1);"
+ PRINT #12, "}"
+
+ IF command = 3 THEN
+ 'read the array data
+ PRINT #12, x2$ + "+=bytes; " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + ");"
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)(" + x1$ + "+" + x2$ + "-bytes),bytes," + NewByteElement$ + "),0);"
+ END IF 'com=3
+
+ IF command = 4 THEN
+ PRINT #12, "bytei=0;"
+ PRINT #12, "while(bytei>3); " + x1$ + "=(uint8*)realloc(" + x1$ + "," + x2$ + ");"
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)(" + x1$ + "+" + x2$ + "-(int64val>>3)),(int64val>>3)," + NewByteElement$ + "),0);"
+ PRINT #12, "bytei++;"
+ PRINT #12, "}"
+ END IF
+
+ 'get next command
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+ PRINT #12, "}" 'command=3 or 4
+
+ PRINT #12, "}" 'array place-holder
+ CLOSE #12
+
+
+ 'save array (saves the buffered data, if any, for later)
+
+ OPEN tmpdir$ + "chain" + str2$(i) + ".txt" FOR OUTPUT AS #12
+ PRINT #12, "int32val=2;" 'placeholder
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)" + x1$ + "," + x2$ + "," + NewByteElement$ + "),0);"
+ CLOSE #12
+
+
+
+
+ ELSE
+ 'note: arrayelements<>-1
+
+ 'load array
+
+ OPEN tmpdir$ + "inpchain" + str2$(i) + ".txt" FOR OUTPUT AS #12
+
+ PRINT #12, "if (int32val==2){" 'array place-holder
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+
+ IF command = 3 THEN PRINT #12, "if (int32val==3){" 'fixed-length-element array
+ IF command = 4 THEN PRINT #12, "if (int32val==4){" 'var-length-element array
+
+ IF command = 3 THEN
+ 'get size in bits
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ '***assume correct***
+ END IF
+
+ 'get number of elements
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+ '***assume correct***
+
+ e$ = ""
+ IF command = 4 THEN PRINT #12, "bytes=1;" 'bytes counts the number of total elements
+ FOR x2 = 1 TO arrayelements
+
+ 'create 'secret' variables to assist in passing common arrays
+ IF x2 > ncommontmp THEN
+ ncommontmp = ncommontmp + 1
+
+ IF Debug THEN PRINT #9, "Calling DIM2(...)..."
+ IF Error_Happened THEN GOTO errmes
+ retval = dim2("___RESERVED_COMMON_LBOUND" + str2$(ncommontmp), "_INTEGER64", 0, "")
+ IF Error_Happened THEN GOTO errmes
+ retval = dim2("___RESERVED_COMMON_UBOUND" + str2$(ncommontmp), "_INTEGER64", 0, "")
+ IF Error_Happened THEN GOTO errmes
+ IF Debug THEN PRINT #9, "Finished calling DIM2(...)!"
+ IF Error_Happened THEN GOTO errmes
+
+
+ END IF
+
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ PRINT #12, "*__INTEGER64____RESERVED_COMMON_LBOUND" + str2$(x2) + "=int64val;"
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int64val2,8," + NewByteElement$ + "),0);"
+ PRINT #12, "*__INTEGER64____RESERVED_COMMON_UBOUND" + str2$(x2) + "=int64val2;"
+ IF command = 4 THEN PRINT #12, "bytes*=(int64val2-int64val+1);"
+ IF x2 > 1 THEN e$ = e$ + sp + "," + sp
+ e$ = e$ + "___RESERVED_COMMON_LBOUND" + str2$(x2) + sp + "TO" + sp + "___RESERVED_COMMON_UBOUND" + str2$(x2)
+ NEXT
+
+ IF Debug THEN PRINT #9, "Calling DIM2(" + purevarname$ + "," + typ$ + ",0," + e$ + ")..."
+ IF Error_Happened THEN GOTO errmes
+ 'Note: purevarname$ is simply varname$ without the type symbol after it
+ redimoption = 1
+ retval = dim2(purevarname$, typ$, 0, e$)
+ IF Error_Happened THEN GOTO errmes
+ redimoption = 0
+ IF Debug THEN PRINT #9, "Finished calling DIM2(" + purevarname$ + "," + typ$ + ",0," + e$ + ")!"
+ IF Error_Happened THEN GOTO errmes
+
+ IF command = 3 THEN
+ 'use get to load in the array data
+ varname$ = varname$ + sp + "(" + sp + ")"
+ e$ = evaluatetotyp(fixoperationorder$(varname$), -4)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_get(FF,NULL," + e$ + ",0);"
+ END IF
+
+ IF command = 4 THEN
+ PRINT #12, "bytei=0;"
+ PRINT #12, "while(bytei>3,1));" 'change string size
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)tqbs->chr,int64val>>3," + NewByteElement$ + "),0);" 'get size
+ PRINT #12, "bytei++;"
+ PRINT #12, "}"
+ END IF
+
+ 'get next command
+ PRINT #12, "sub_get(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+ PRINT #12, "}"
+ PRINT #12, "}"
+ CLOSE #12
+
+ 'save array
+
+ OPEN tmpdir$ + "chain" + str2$(i) + ".txt" FOR OUTPUT AS #12
+
+ PRINT #12, "int32val=2;" 'placeholder
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+
+ PRINT #12, "if (" + n2$ + "[2]&1){" 'don't add unless defined
+
+ IF command = 3 THEN PRINT #12, "int32val=3;"
+ IF command = 4 THEN PRINT #12, "int32val=4;"
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+
+ IF command = 3 THEN
+ 'size of each element in bits
+ bits = t AND 511
+ IF t AND ISUDT THEN bits = udtxsize(t AND 511)
+ IF t AND ISSTRING THEN bits = tsize * 8
+ PRINT #12, "int64val=" + str2$(bits) + ";" 'size in bits
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ END IF 'com=3
+
+ PRINT #12, "int32val=" + str2$(arrayelements) + ";" 'number of dimensions
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int32val,4," + NewByteElement$ + "),0);"
+
+ IF command = 3 THEN
+
+ FOR x2 = 1 TO arrayelements
+ 'simulate calls to lbound/ubound
+ e$ = "LBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
+ e$ = evaluatetotyp(fixoperationorder$(e$), 64)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "int64val=" + e$ + ";"
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ e$ = "UBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
+ e$ = evaluatetotyp(fixoperationorder$(e$), 64)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "int64val=" + e$ + ";"
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ NEXT
+
+ 'array data
+ e$ = evaluatetotyp(fixoperationorder$(n$ + sp + "(" + sp + ")"), -4)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "sub_put(FF,NULL," + e$ + ",0);"
+
+ END IF 'com=3
+
+ IF command = 4 THEN
+
+ 'store LBOUND/UBOUND values and calculate number of total elements/strings
+ PRINT #12, "bytes=1;" 'note: bytes is actually the total number of elements
+ FOR x2 = 1 TO arrayelements
+ e$ = "LBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
+ e$ = evaluatetotyp(fixoperationorder$(e$), 64)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "int64val=" + e$ + ";"
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);"
+ e$ = "UBOUND" + sp + "(" + sp + n$ + sp + "," + sp + str2$(x2) + sp + ")"
+ e$ = evaluatetotyp(fixoperationorder$(e$), 64)
+ IF Error_Happened THEN GOTO errmes
+ PRINT #12, "int64val2=" + e$ + ";"
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val2,8," + NewByteElement$ + "),0);"
+ PRINT #12, "bytes*=(int64val2-int64val+1);"
+ NEXT
+
+ PRINT #12, "bytei=0;"
+ PRINT #12, "while(byteilen; int64val<<=3;"
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)&int64val,8," + NewByteElement$ + "),0);" 'size of element
+ PRINT #12, "sub_put(FF,NULL,byte_element((uint64)tqbs->chr,tqbs->len," + NewByteElement$ + "),0);" 'element data
+ PRINT #12, "bytei++;"
+ PRINT #12, "}"
+
+ END IF 'com=4
+
+ PRINT #12, "}" 'don't add unless defined
+
+ CLOSE #12
+
+
+
+
+ 'if chaincommonarray then
+ 'l2$=tlayout$
+ 'x=chaincommonarray
+ '
+ ''chain???.txt
+ 'open tmpdir$ + "chain" + str2$(x) + ".txt" for append as #22
+ 'if lof(22) then close #22: goto chaindone 'only add this once
+ ''***assume non-var-len-string array***
+ 'print #22,"int32val=3;" 'non-var-len-element array
+ 'print #22,"sub_put(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
+ 't=id.arraytype
+ ''***check for UDT size if necessary***
+ ''***check for string length if necessary***
+ 'bits=t and 511
+ 'print #22,"int64val="+str2$(bits)+";" 'size in bits
+ 'print #22,"sub_put(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
+ 'print #22,"int32val="+str2$(id.arrayelements)+";" 'number of elements
+ 'print #22,"sub_put(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
+ 'e$=rtrim$(id.n)
+ 'if (t and ISUDT)=0 then e$=e$+typevalue2symbol$(t)
+ 'n$=e$
+ 'for x2=1 to id.arrayelements
+ ''simulate calls to lbound/ubound
+ 'e$="LBOUND"+sp+"("+sp+n$+sp+","+sp+str2$(x2)+sp+")"
+ 'e$=evaluatetotyp(fixoperationorder$(e$),64)
+ 'print #22,"int64val="+e$+";"'LBOUND
+ 'print #22,"sub_put(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
+ 'e$="UBOUND"+sp+"("+sp+n$+sp+","+sp+str2$(x2)+sp+")"
+ 'e$=evaluatetotyp(fixoperationorder$(e$),64)
+ 'print #22,"int64val="+e$+";"'LBOUND
+ 'print #22,"sub_put(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
+ 'next
+ ''add array data
+ 'e$=evaluatetotyp(fixoperationorder$(n$+sp+"("+sp+")"),-4)
+ 'print #22,"sub_put(FF,NULL,"+e$+",0);"
+ 'close #22
+ '
+ ''inpchain???.txt
+ 'open tmpdir$ + "chain" + str2$(x) + ".txt" for append as #22
+ 'print #22,"if (int32val==1){" 'common declaration of an array
+ 'print #22,"sub_get(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
+ 'print #22,"if (int32val==3){" 'fixed-length-element array
+ '
+ 'print #22,"sub_get(FF,NULL,byte_element((uint64)&int64val,8,"+NewByteElement$+"),0);"
+ ''***assume size correct and continue***
+ '
+ ''get number of elements
+ 'print #22,"sub_get(FF,NULL,byte_element((uint64)&int32val,4,"+NewByteElement$+"),0);"
+ '
+ ''call dim2 and tell it to redim an array
+ '
+ ''*********this should happen BEFORE the array (above) is actually dimensioned,
+ ''*********where the common() declaration is
+ '
+ ''****although, if you never reference the array.............
+ ''****ARGH! you can access an undimmed array just like in a sub/function
+ '
+ '
+ '
+ '
+ 'print #22,"}"
+ 'print #22,"}"
+ 'close #22
+ '
+ 'chaindone:
+ 'tlayout$=l2$
+ 'end if 'chaincommonarray
+
+
+
+
+ 'OPEN tmpdir$ + "chain.txt" FOR APPEND AS #22
+ ''include directive
+ 'print #22, "#include " + CHR$(34) + "chain" + str2$(x) + ".txt" + CHR$(34)
+ 'close #22
+ ''create/clear include file
+ 'open tmpdir$ + "chain" + str2$(x) + ".txt" for output as #22:close #22
+ '
+ 'OPEN tmpdir$ + "inpchain.txt" FOR APPEND AS #22
+ ''include directive
+ 'print #22, "#include " + CHR$(34) + "inpchain" + str2$(x) + ".txt" + CHR$(34)
+ 'close #22
+ ''create/clear include file
+ 'open tmpdir$ + "inpchain" + str2$(x) + ".txt" for output as #22:close #22
+
+
+
+
+
+
+ END IF 'id.arrayelements=-1
NEXT
use_global_byte_elements = 0
@@ -10698,21 +10905,21 @@ ide6:
IF idemode = 0 AND No_C_Compile_Mode = 0 THEN
-PRINT
-IF os$ = "LNX" THEN
-PRINT "COMPILING C++ CODE INTO EXECUTABLE..."
-ELSE
-PRINT "COMPILING C++ CODE INTO EXE..."
-END IF
-IF _FILEEXISTS(file$ + extension$) THEN
-E = 0
-ON ERROR GOTO qberror_test
-KILL file$ + extension$
-ON ERROR GOTO qberror
-IF E = 1 THEN
-a$ = "CANNOT CREATE " + CHR$(34) + file$ + extension$ + CHR$(34) + " BECAUSE THE FILE IS ALREADY IN USE!": GOTO errmes
-END IF
-END IF
+ PRINT
+ IF os$ = "LNX" THEN
+ PRINT "COMPILING C++ CODE INTO EXECUTABLE..."
+ ELSE
+ PRINT "COMPILING C++ CODE INTO EXE..."
+ END IF
+ IF _FILEEXISTS(file$ + extension$) THEN
+ E = 0
+ ON ERROR GOTO qberror_test
+ KILL file$ + extension$
+ ON ERROR GOTO qberror
+ IF E = 1 THEN
+ a$ = "CANNOT CREATE " + CHR$(34) + file$ + extension$ + CHR$(34) + " BECAUSE THE FILE IS ALREADY IN USE!": GOTO errmes
+ END IF
+ END IF
END IF
@@ -10728,65 +10935,65 @@ x = INSTR(ver$, "."): IF x THEN ASC(ver$, x) = 95 'change "." to "_"
libs$ = ""
IF DEPENDENCY(DEPENDENCY_GL) THEN
-IF Cloud THEN a$ = "GL not supported on QLOUD": GOTO errmes '***NOCLOUD***
-defines$ = defines$ + defines_header$ + "DEPENDENCY_GL"
+ IF Cloud THEN a$ = "GL not supported on QLOUD": GOTO errmes '***NOCLOUD***
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_GL"
END IF
IF DEPENDENCY(DEPENDENCY_SCREENIMAGE) THEN
-DEPENDENCY(DEPENDENCY_IMAGE_CODEC) = 1 'used by OSX to read in screen capture files
+ DEPENDENCY(DEPENDENCY_IMAGE_CODEC) = 1 'used by OSX to read in screen capture files
END IF
IF DEPENDENCY(DEPENDENCY_IMAGE_CODEC) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_IMAGE_CODEC"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_IMAGE_CODEC"
END IF
IF DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_CONSOLE_ONLY"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_CONSOLE_ONLY"
END IF
IF DEPENDENCY(DEPENDENCY_SOCKETS) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_SOCKETS"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_SOCKETS"
ELSE
-defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_SOCKETS"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_SOCKETS"
END IF
IF DEPENDENCY(DEPENDENCY_PRINTER) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_PRINTER"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_PRINTER"
ELSE
-defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_PRINTER"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_PRINTER"
END IF
IF DEPENDENCY(DEPENDENCY_ICON) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_ICON"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_ICON"
ELSE
-defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_ICON"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_ICON"
END IF
IF DEPENDENCY(DEPENDENCY_SCREENIMAGE) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_SCREENIMAGE"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_SCREENIMAGE"
ELSE
-defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_SCREENIMAGE"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_NO_SCREENIMAGE"
END IF
IF DEPENDENCY(DEPENDENCY_LOADFONT) THEN
-d$ = "internal\c\parts\video\font\ttf\"
-'rebuild?
-IF _FILEEXISTS(d$ + "os\" + o$ + "\src.o") = 0 THEN
-Build d$ + "os\" + o$
-END IF
-defines$ = defines$ + defines_header$ + "DEPENDENCY_LOADFONT"
-libs$ = libs$ + " " + "parts\video\font\ttf\os\" + o$ + "\src.o"
+ d$ = "internal\c\parts\video\font\ttf\"
+ 'rebuild?
+ IF _FILEEXISTS(d$ + "os\" + o$ + "\src.o") = 0 THEN
+ Build d$ + "os\" + o$
+ END IF
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_LOADFONT"
+ libs$ = libs$ + " " + "parts\video\font\ttf\os\" + o$ + "\src.o"
END IF
localpath$ = "internal\c\"
IF DEPENDENCY(DEPENDENCY_DEVICEINPUT) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_DEVICEINPUT"
-libname$ = "input\game_controller"
-libpath$ = "parts\" + libname$ + "\os\" + o$
-libfile$ = libpath$ + "\src.a"
-IF _FILEEXISTS(localpath$ + libfile$) = 0 THEN Build localpath$ + libpath$ 'rebuild?
-libs$ = libs$ + " " + libfile$
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_DEVICEINPUT"
+ libname$ = "input\game_controller"
+ libpath$ = "parts\" + libname$ + "\os\" + o$
+ libfile$ = libpath$ + "\src.a"
+ IF _FILEEXISTS(localpath$ + libfile$) = 0 THEN Build localpath$ + libpath$ 'rebuild?
+ libs$ = libs$ + " " + libfile$
END IF
IF DEPENDENCY(DEPENDENCY_AUDIO_DECODE) THEN DEPENDENCY(DEPENDENCY_AUDIO_CONVERSION) = 1
@@ -10795,68 +11002,68 @@ IF DEPENDENCY(DEPENDENCY_AUDIO_DECODE) THEN DEPENDENCY(DEPENDENCY_AUDIO_OUT) = 1
IF DEPENDENCY(DEPENDENCY_AUDIO_CONVERSION) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_AUDIO_CONVERSION"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_AUDIO_CONVERSION"
-d1$ = "parts\audio\conversion"
-d2$ = d1$ + "\os\" + o$
-d3$ = "internal\c\" + d2$
-IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
-Build d3$
-END IF
-libs$ = libs$ + " " + d2$ + "\src.a"
+ d1$ = "parts\audio\conversion"
+ d2$ = d1$ + "\os\" + o$
+ d3$ = "internal\c\" + d2$
+ IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
+ Build d3$
+ END IF
+ libs$ = libs$ + " " + d2$ + "\src.a"
END IF
IF DEPENDENCY(DEPENDENCY_AUDIO_DECODE) THEN
-'General decoder
-defines$ = defines$ + defines_header$ + "DEPENDENCY_AUDIO_DECODE"
-'MP3 decoder (deprecated)
-d1$ = "parts\audio\decode\mp3"
-d2$ = d1$ + "\os\" + o$
-d3$ = "internal\c\" + d2$
-IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
-Build d3$
-END IF
-libs$ = libs$ + " " + d2$ + "\src.a"
-'MINI_MP3 decoder
-d1$ = "parts\audio\decode\mp3_mini"
-d2$ = d1$ + "\os\" + o$
-d3$ = "internal\c\" + d2$
-IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
-Build d3$
-END IF
-libs$ = libs$ + " " + d2$ + "\src.a"
-'OGG decoder
-d1$ = "parts\audio\decode\ogg"
-d2$ = d1$ + "\os\" + o$
-d3$ = "internal\c\" + d2$
-IF _FILEEXISTS(d3$ + "\src.o") = 0 THEN 'rebuild?
-Build d3$
-END IF
-libs$ = libs$ + " " + d2$ + "\src.o"
-'WAV decoder
-'(no action required)
+ 'General decoder
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_AUDIO_DECODE"
+ 'MP3 decoder (deprecated)
+ d1$ = "parts\audio\decode\mp3"
+ d2$ = d1$ + "\os\" + o$
+ d3$ = "internal\c\" + d2$
+ IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
+ Build d3$
+ END IF
+ libs$ = libs$ + " " + d2$ + "\src.a"
+ 'MINI_MP3 decoder
+ d1$ = "parts\audio\decode\mp3_mini"
+ d2$ = d1$ + "\os\" + o$
+ d3$ = "internal\c\" + d2$
+ IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
+ Build d3$
+ END IF
+ libs$ = libs$ + " " + d2$ + "\src.a"
+ 'OGG decoder
+ d1$ = "parts\audio\decode\ogg"
+ d2$ = d1$ + "\os\" + o$
+ d3$ = "internal\c\" + d2$
+ IF _FILEEXISTS(d3$ + "\src.o") = 0 THEN 'rebuild?
+ Build d3$
+ END IF
+ libs$ = libs$ + " " + d2$ + "\src.o"
+ 'WAV decoder
+ '(no action required)
END IF
IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_AUDIO_OUT"
-d1$ = "parts\audio\out"
-d2$ = d1$ + "\os\" + o$
-d3$ = "internal\c\" + d2$
-IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
-Build d3$
-END IF
-libs$ = libs$ + " " + d2$ + "\src.a"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_AUDIO_OUT"
+ d1$ = "parts\audio\out"
+ d2$ = d1$ + "\os\" + o$
+ d3$ = "internal\c\" + d2$
+ IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
+ Build d3$
+ END IF
+ libs$ = libs$ + " " + d2$ + "\src.a"
END IF
IF DEPENDENCY(DEPENDENCY_USER_MODS) THEN
-defines$ = defines$ + defines_header$ + "DEPENDENCY_USER_MODS"
-d1$ = "parts\user_mods"
-d2$ = d1$ + "\os\" + o$
-d3$ = "internal\c\" + d2$
-IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN
-Build d3$
-END IF
-libs$ = libs$ + " " + d2$ + "\src.a"
+ defines$ = defines$ + defines_header$ + "DEPENDENCY_USER_MODS"
+ d1$ = "parts\user_mods"
+ d2$ = d1$ + "\os\" + o$
+ d3$ = "internal\c\" + d2$
+ IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN
+ Build d3$
+ END IF
+ libs$ = libs$ + " " + d2$ + "\src.a"
END IF
'finalize libs$ and defines$ strings
@@ -10866,38 +11073,38 @@ IF LEN(defines$) THEN defines$ = defines$ + " "
'Build core?
IF mac = 0 THEN 'macosx uses Apple's GLUT not FreeGLUT
-d1$ = "parts\core"
-d2$ = d1$ + "\os\" + o$
-d3$ = "internal\c\" + d2$
-IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
-Build d3$
-END IF
+ d1$ = "parts\core"
+ d2$ = d1$ + "\os\" + o$
+ d3$ = "internal\c\" + d2$
+ IF _FILEEXISTS(d3$ + "\src.a") = 0 THEN 'rebuild?
+ Build d3$
+ END IF
END IF 'mac = 0
'Build libqb?
depstr$ = ver$ + "_"
FOR i = 1 TO DEPENDENCY_LAST
-IF DEPENDENCY(i) THEN depstr$ = depstr$ + "1" ELSE depstr$ = depstr$ + "0"
+ IF DEPENDENCY(i) THEN depstr$ = depstr$ + "1" ELSE depstr$ = depstr$ + "0"
NEXT
libqb$ = " libqb\os\" + o$ + "\libqb_" + depstr$ + ".o "
PATH_SLASH_CORRECT libqb$
IF _FILEEXISTS("internal\c\" + LTRIM$(RTRIM$(libqb$))) = 0 THEN
-CHDIR "internal\c"
-IF os$ = "WIN" THEN
-SHELL _HIDE GDB_Fix("cmd /c c_compiler\bin\g++ -c -s -w -Wall libqb.cpp -D FREEGLUT_STATIC " + defines$ + " -o libqb\os\" + o$ + "\libqb_" + depstr$ + ".o")
-ELSE
-IF mac THEN
-SHELL _HIDE GDB_Fix("g++ -c -s -w -Wall libqb.mm " + defines$ + " -o libqb/os/" + o$ + "/libqb_" + depstr$ + ".o")
-ELSE
-SHELL _HIDE GDB_Fix("g++ -c -s -w -Wall libqb.cpp -D FREEGLUT_STATIC " + defines$ + " -o libqb/os/" + o$ + "/libqb_" + depstr$ + ".o")
-END IF
-END IF
-CHDIR "..\.."
+ CHDIR "internal\c"
+ IF os$ = "WIN" THEN
+ SHELL _HIDE GDB_Fix("cmd /c c_compiler\bin\g++ -c -s -w -Wall libqb.cpp -D FREEGLUT_STATIC " + defines$ + " -o libqb\os\" + o$ + "\libqb_" + depstr$ + ".o")
+ ELSE
+ IF mac THEN
+ SHELL _HIDE GDB_Fix("g++ -c -s -w -Wall libqb.mm " + defines$ + " -o libqb/os/" + o$ + "/libqb_" + depstr$ + ".o")
+ ELSE
+ SHELL _HIDE GDB_Fix("g++ -c -s -w -Wall libqb.cpp -D FREEGLUT_STATIC " + defines$ + " -o libqb/os/" + o$ + "/libqb_" + depstr$ + ".o")
+ END IF
+ END IF
+ CHDIR "..\.."
END IF
'link-time only defines
IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
-IF mac THEN defines$ = defines$ + " -framework AudioUnit -framework AudioToolbox "
+ IF mac THEN defines$ = defines$ + " -framework AudioUnit -framework AudioToolbox "
END IF
@@ -10931,477 +11138,477 @@ IF MakeAndroid THEN
-GOTO Skip_Build
+ GOTO Skip_Build
END IF
IF os$ = "WIN" THEN
-'resolve static function definitions and add to global.txt
-FOR x = 1 TO ResolveStaticFunctions
-IF LEN(ResolveStaticFunction_File(x)) THEN
+ 'resolve static function definitions and add to global.txt
+ FOR x = 1 TO ResolveStaticFunctions
+ IF LEN(ResolveStaticFunction_File(x)) THEN
-n = 0
-SHELL _HIDE "internal\c\c_compiler\bin\nm.exe " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " --demangle -g >internal\temp\nm_output.txt"
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x) + "("
-OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname+LEFTBRACKET
-x1 = INSTR(a$, s$)
-IF x1 THEN
-IF ResolveStaticFunction_Method(x) = 1 THEN
-x1 = x1 + 1
-x2 = INSTR(x1, a$, ")")
-fh2 = FREEFILE
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
-CLOSE #fh2
-END IF
-n = n + 1
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
+ n = 0
+ SHELL _HIDE "internal\c\c_compiler\bin\nm.exe " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " --demangle -g >internal\temp\nm_output.txt"
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x) + "("
+ OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname+LEFTBRACKET
+ x1 = INSTR(a$, s$)
+ IF x1 THEN
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ x1 = x1 + 1
+ x2 = INSTR(x1, a$, ")")
+ fh2 = FREEFILE
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
+ CLOSE #fh2
+ END IF
+ n = n + 1
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
-IF n = 0 THEN 'attempt to locate simple function name without brackets
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x)
-OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname
-x1 = INSTR(a$, s$)
-IF RIGHT$(a$, LEN(s$)) = s$ THEN
-fh2 = FREEFILE
-IF ResolveStaticFunction_Method(x) = 1 THEN
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
-PRINT #fh2, "extern void " + s$ + "(void);"
-PRINT #fh2, "}"
-ELSE
-OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
-END IF
-CLOSE #fh2
-n = n + 1
-EXIT DO
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-END IF
+ IF n = 0 THEN 'attempt to locate simple function name without brackets
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x)
+ OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname
+ x1 = INSTR(a$, s$)
+ IF RIGHT$(a$, LEN(s$)) = s$ THEN
+ fh2 = FREEFILE
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
+ PRINT #fh2, "extern void " + s$ + "(void);"
+ PRINT #fh2, "}"
+ ELSE
+ OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
+ END IF
+ CLOSE #fh2
+ n = n + 1
+ EXIT DO
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ END IF
-IF n = 0 THEN 'a C++ dynamic object library?
-SHELL _HIDE "internal\c\c_compiler\bin\nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " -D --demangle -g >.\internal\temp\nm_output_dynamic.txt"
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x) + "("
-OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname+LEFTBRACKET
-x1 = INSTR(a$, s$)
-IF x1 THEN
-IF ResolveStaticFunction_Method(x) = 1 THEN
-x1 = x1 + 1
-x2 = INSTR(x1, a$, ")")
-fh2 = FREEFILE
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
-CLOSE #fh2
-END IF
-n = n + 1
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
-END IF
+ IF n = 0 THEN 'a C++ dynamic object library?
+ SHELL _HIDE "internal\c\c_compiler\bin\nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " -D --demangle -g >.\internal\temp\nm_output_dynamic.txt"
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x) + "("
+ OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname+LEFTBRACKET
+ x1 = INSTR(a$, s$)
+ IF x1 THEN
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ x1 = x1 + 1
+ x2 = INSTR(x1, a$, ")")
+ fh2 = FREEFILE
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
+ CLOSE #fh2
+ END IF
+ n = n + 1
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
+ END IF
-IF n = 0 THEN 'a C dynamic object library?
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x)
-OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname
-x1 = INSTR(a$, s$)
-IF RIGHT$(a$, LEN(s$)) = s$ THEN
-fh2 = FREEFILE
-IF ResolveStaticFunction_Method(x) = 1 THEN
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
-PRINT #fh2, "extern void " + s$ + "(void);"
-PRINT #fh2, "}"
-ELSE
-OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
-END IF
-CLOSE #fh2
-n = n + 1
-EXIT DO
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-IF n = 0 THEN a$ = "Could not find sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
-END IF
+ IF n = 0 THEN 'a C dynamic object library?
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x)
+ OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname
+ x1 = INSTR(a$, s$)
+ IF RIGHT$(a$, LEN(s$)) = s$ THEN
+ fh2 = FREEFILE
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
+ PRINT #fh2, "extern void " + s$ + "(void);"
+ PRINT #fh2, "}"
+ ELSE
+ OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
+ END IF
+ CLOSE #fh2
+ n = n + 1
+ EXIT DO
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ IF n = 0 THEN a$ = "Could not find sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
+ END IF
-END IF
-NEXT
+ END IF
+ NEXT
-IF inline_DATA = 0 THEN
-IF DataOffset THEN
-IF OS_BITS = 32 THEN
-OPEN ".\internal\c\makedat_win32.txt" FOR BINARY AS #150: LINE INPUT #150, a$: CLOSE #150
-ELSE
-OPEN ".\internal\c\makedat_win64.txt" FOR BINARY AS #150: LINE INPUT #150, a$: CLOSE #150
-END IF
-a$ = a$ + " " + tmpdir2$ + "data.bin " + tmpdir2$ + "data.o"
-CHDIR ".\internal\c"
-SHELL _HIDE a$
-CHDIR "..\.."
-END IF
-END IF
+ IF inline_DATA = 0 THEN
+ IF DataOffset THEN
+ IF OS_BITS = 32 THEN
+ OPEN ".\internal\c\makedat_win32.txt" FOR BINARY AS #150: LINE INPUT #150, a$: CLOSE #150
+ ELSE
+ OPEN ".\internal\c\makedat_win64.txt" FOR BINARY AS #150: LINE INPUT #150, a$: CLOSE #150
+ END IF
+ a$ = a$ + " " + tmpdir2$ + "data.bin " + tmpdir2$ + "data.o"
+ CHDIR ".\internal\c"
+ SHELL _HIDE a$
+ CHDIR "..\.."
+ END IF
+ END IF
-OPEN ".\internal\c\makeline_win.txt" FOR BINARY AS #150
-LINE INPUT #150, a$: a$ = GDB_Fix(a$)
-CLOSE #150
-IF RIGHT$(a$, 7) = " ..\..\" THEN a$ = LEFT$(a$, LEN(a$) - 6) 'makeline.txt patch (line will become unrequired in later versions)
-'change qbx.cpp to qbx999.cpp?
-x = INSTR(a$, "qbx.cpp"): IF x <> 0 AND tempfolderindex <> 1 THEN a$ = LEFT$(a$, x - 1) + "qbx" + str2$(tempfolderindex) + ".cpp" + RIGHT$(a$, LEN(a$) - (x + 6))
+ OPEN ".\internal\c\makeline_win.txt" FOR BINARY AS #150
+ LINE INPUT #150, a$: a$ = GDB_Fix(a$)
+ CLOSE #150
+ IF RIGHT$(a$, 7) = " ..\..\" THEN a$ = LEFT$(a$, LEN(a$) - 6) 'makeline.txt patch (line will become unrequired in later versions)
+ 'change qbx.cpp to qbx999.cpp?
+ x = INSTR(a$, "qbx.cpp"): IF x <> 0 AND tempfolderindex <> 1 THEN a$ = LEFT$(a$, x - 1) + "qbx" + str2$(tempfolderindex) + ".cpp" + RIGHT$(a$, LEN(a$) - (x + 6))
-IF Console THEN
-x = INSTR(a$, " -s"): a$ = LEFT$(a$, x - 1) + " -mconsole" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ IF Console THEN
+ x = INSTR(a$, " -s"): a$ = LEFT$(a$, x - 1) + " -mconsole" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-IF DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) THEN
-a$ = StrRemove(a$, "-mwindows")
-a$ = StrRemove(a$, "-lopengl32")
-a$ = StrRemove(a$, "-lglu32")
-a$ = StrRemove(a$, "parts\core\os\win\src.a")
-a$ = StrRemove(a$, "-D FREEGLUT_STATIC")
-a$ = StrRemove(a$, "-D GLEW_STATIC")
-END IF
+ IF DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) THEN
+ a$ = StrRemove(a$, "-mwindows")
+ a$ = StrRemove(a$, "-lopengl32")
+ a$ = StrRemove(a$, "-lglu32")
+ a$ = StrRemove(a$, "parts\core\os\win\src.a")
+ a$ = StrRemove(a$, "-D FREEGLUT_STATIC")
+ a$ = StrRemove(a$, "-D GLEW_STATIC")
+ END IF
-a$ = StrRemove(a$, "-lws2_32")
-IF DEPENDENCY(DEPENDENCY_SOCKETS) THEN
-x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lws2_32" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ a$ = StrRemove(a$, "-lws2_32")
+ IF DEPENDENCY(DEPENDENCY_SOCKETS) THEN
+ x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lws2_32" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-a$ = StrRemove(a$, "-lwinspool")
-IF DEPENDENCY(DEPENDENCY_PRINTER) THEN
-x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lwinspool" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ a$ = StrRemove(a$, "-lwinspool")
+ IF DEPENDENCY(DEPENDENCY_PRINTER) THEN
+ x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lwinspool" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-a$ = StrRemove(a$, "-lwinmm")
-IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) <> 0 OR DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) = 0 THEN
-x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lwinmm" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ a$ = StrRemove(a$, "-lwinmm")
+ IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) <> 0 OR DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) = 0 THEN
+ x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lwinmm" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-a$ = StrRemove(a$, "-lksguid")
-IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
-x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lksguid" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ a$ = StrRemove(a$, "-lksguid")
+ IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
+ x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lksguid" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-a$ = StrRemove(a$, "-ldxguid")
-IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
-x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -ldxguid" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ a$ = StrRemove(a$, "-ldxguid")
+ IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
+ x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -ldxguid" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-a$ = StrRemove(a$, "-lole32")
-IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
-x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lole32" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ a$ = StrRemove(a$, "-lole32")
+ IF DEPENDENCY(DEPENDENCY_AUDIO_OUT) THEN
+ x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lole32" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-a$ = StrRemove(a$, "-lgdi32")
-IF DEPENDENCY(DEPENDENCY_ICON) <> 0 OR DEPENDENCY(DEPENDENCY_SCREENIMAGE) <> 0 OR DEPENDENCY(DEPENDENCY_PRINTER) <> 0 THEN
-x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lgdi32" + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ a$ = StrRemove(a$, "-lgdi32")
+ IF DEPENDENCY(DEPENDENCY_ICON) <> 0 OR DEPENDENCY(DEPENDENCY_SCREENIMAGE) <> 0 OR DEPENDENCY(DEPENDENCY_PRINTER) <> 0 THEN
+ x = INSTR(a$, " -o"): a$ = LEFT$(a$, x - 1) + " -lgdi32" + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-IF inline_DATA = 0 THEN
-'add data.o?
-IF DataOffset THEN
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 3
-a$ = LEFT$(a$, x) + " " + tmpdir2$ + "data.o" + " " + RIGHT$(a$, LEN(a$) - x)
-END IF
-END IF
-END IF
+ IF inline_DATA = 0 THEN
+ 'add data.o?
+ IF DataOffset THEN
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 3
+ a$ = LEFT$(a$, x) + " " + tmpdir2$ + "data.o" + " " + RIGHT$(a$, LEN(a$) - x)
+ END IF
+ END IF
+ END IF
-'add custom libraries
-'mylib$="..\..\"+x$+".lib"
-IF LEN(mylib$) THEN
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 3
-a$ = LEFT$(a$, x) + " " + mylib$ + " " + RIGHT$(a$, LEN(a$) - x)
-END IF
-END IF
+ 'add custom libraries
+ 'mylib$="..\..\"+x$+".lib"
+ IF LEN(mylib$) THEN
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 3
+ a$ = LEFT$(a$, x) + " " + mylib$ + " " + RIGHT$(a$, LEN(a$) - x)
+ END IF
+ END IF
-'add dependent libraries
-IF LEN(libs$) THEN
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 5
-a$ = LEFT$(a$, x - 1) + libs$ + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
-END IF
+ 'add dependent libraries
+ IF LEN(libs$) THEN
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 5
+ a$ = LEFT$(a$, x - 1) + libs$ + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
+ END IF
-'add dependency defines
-IF LEN(defines$) THEN
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 5
-a$ = LEFT$(a$, x - 1) + defines$ + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
-END IF
+ 'add dependency defines
+ IF LEN(defines$) THEN
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 5
+ a$ = LEFT$(a$, x - 1) + defines$ + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
+ END IF
-'add libqb
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 5
-a$ = LEFT$(a$, x - 1) + libqb$ + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ 'add libqb
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 5
+ a$ = LEFT$(a$, x - 1) + libqb$ + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
-a$ = a$ + QuotedFilename$("..\..\" + file$ + extension$)
+ a$ = a$ + QuotedFilename$("..\..\" + file$ + extension$)
-ffh = FREEFILE
-OPEN tmpdir$ + "recompile_win.bat" FOR OUTPUT AS #ffh
-PRINT #ffh, "@echo off"
-PRINT #ffh, "cd %0\..\"
-PRINT #ffh, "echo Recompiling..."
-PRINT #ffh, "cd ../c"
-PRINT #ffh, a$
-PRINT #ffh, "pause"
-CLOSE ffh
+ ffh = FREEFILE
+ OPEN tmpdir$ + "recompile_win.bat" FOR OUTPUT AS #ffh
+ PRINT #ffh, "@echo off"
+ PRINT #ffh, "cd %0\..\"
+ PRINT #ffh, "echo Recompiling..."
+ PRINT #ffh, "cd ../c"
+ PRINT #ffh, a$
+ PRINT #ffh, "pause"
+ CLOSE ffh
-ffh = FREEFILE
-OPEN tmpdir$ + "debug_win.bat" FOR OUTPUT AS #ffh
-PRINT #ffh, "@echo off"
-PRINT #ffh, "cd %0\..\"
-PRINT #ffh, "cd ../.."
-PRINT #ffh, "echo C++ Debugging: " + file$ + extension$ + " using gdb.exe"
-PRINT #ffh, "echo Debugger commands:"
-PRINT #ffh, "echo After the debugger launches type 'run' to start your program"
-PRINT #ffh, "echo After your program crashes type 'list' to find where the problem is and fix/report it"
-PRINT #ffh, "echo Type 'quit' to exit"
-PRINT #ffh, "echo (the GDB debugger has many other useful commands, this advice is for beginners)"
-PRINT #ffh, "pause"
-PRINT #ffh, "internal\c\c_compiler\bin\gdb.exe " + CHR$(34) + file$ + extension$ + CHR$(34)
-PRINT #ffh, "pause"
-CLOSE ffh
+ ffh = FREEFILE
+ OPEN tmpdir$ + "debug_win.bat" FOR OUTPUT AS #ffh
+ PRINT #ffh, "@echo off"
+ PRINT #ffh, "cd %0\..\"
+ PRINT #ffh, "cd ../.."
+ PRINT #ffh, "echo C++ Debugging: " + file$ + extension$ + " using gdb.exe"
+ PRINT #ffh, "echo Debugger commands:"
+ PRINT #ffh, "echo After the debugger launches type 'run' to start your program"
+ PRINT #ffh, "echo After your program crashes type 'list' to find where the problem is and fix/report it"
+ PRINT #ffh, "echo Type 'quit' to exit"
+ PRINT #ffh, "echo (the GDB debugger has many other useful commands, this advice is for beginners)"
+ PRINT #ffh, "pause"
+ PRINT #ffh, "internal\c\c_compiler\bin\gdb.exe " + CHR$(34) + file$ + extension$ + CHR$(34)
+ PRINT #ffh, "pause"
+ CLOSE ffh
-IF No_C_Compile_Mode = 0 THEN
-CHDIR ".\internal\c"
-SHELL _HIDE a$
-CHDIR "..\.."
-END IF 'No_C_Compile_Mode=0
+ IF No_C_Compile_Mode = 0 THEN
+ CHDIR ".\internal\c"
+ SHELL _HIDE a$
+ CHDIR "..\.."
+ END IF 'No_C_Compile_Mode=0
END IF
IF os$ = "LNX" THEN
-FOR x = 1 TO ResolveStaticFunctions
-IF LEN(ResolveStaticFunction_File(x)) THEN
+ FOR x = 1 TO ResolveStaticFunctions
+ IF LEN(ResolveStaticFunction_File(x)) THEN
-n = 0
-IF MacOSX = 0 THEN SHELL _HIDE "nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " --demangle -g >./internal/temp/nm_output.txt 2>./internal/temp/nm_error.txt"
-IF MacOSX THEN SHELL _HIDE "nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " >./internal/temp/nm_output.txt 2>./internal/temp/nm_error.txt"
+ n = 0
+ IF MacOSX = 0 THEN SHELL _HIDE "nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " --demangle -g >./internal/temp/nm_output.txt 2>./internal/temp/nm_error.txt"
+ IF MacOSX THEN SHELL _HIDE "nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " >./internal/temp/nm_output.txt 2>./internal/temp/nm_error.txt"
-IF MacOSX = 0 THEN 'C++ name demangling not supported in MacOSX
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x) + "("
-OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname+LEFTBRACKET
-x1 = INSTR(a$, s$)
-IF x1 THEN
-IF ResolveStaticFunction_Method(x) = 1 THEN
-x1 = x1 + 1
-x2 = INSTR(x1, a$, ")")
-fh2 = FREEFILE
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
-CLOSE #fh2
-END IF
-n = n + 1
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
-END IF 'macosx=0
+ IF MacOSX = 0 THEN 'C++ name demangling not supported in MacOSX
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x) + "("
+ OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname+LEFTBRACKET
+ x1 = INSTR(a$, s$)
+ IF x1 THEN
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ x1 = x1 + 1
+ x2 = INSTR(x1, a$, ")")
+ fh2 = FREEFILE
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
+ CLOSE #fh2
+ END IF
+ n = n + 1
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
+ END IF 'macosx=0
-IF n = 0 THEN 'attempt to locate simple function name without brackets
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x): s2$ = s$
-IF MacOSX THEN s$ = " _" + ResolveStaticFunction_Name(x) 'search for C mangled name
-OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname
-x1 = INSTR(a$, s$)
-IF RIGHT$(a$, LEN(s$)) = s$ THEN
-fh2 = FREEFILE
-IF ResolveStaticFunction_Method(x) = 1 THEN
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
-PRINT #fh2, "extern void " + s2$ + "(void);"
-PRINT #fh2, "}"
-ELSE
-OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
-END IF
-CLOSE #fh2
-n = n + 1
-EXIT DO
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-END IF
+ IF n = 0 THEN 'attempt to locate simple function name without brackets
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x): s2$ = s$
+ IF MacOSX THEN s$ = " _" + ResolveStaticFunction_Name(x) 'search for C mangled name
+ OPEN "internal\temp\nm_output.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname
+ x1 = INSTR(a$, s$)
+ IF RIGHT$(a$, LEN(s$)) = s$ THEN
+ fh2 = FREEFILE
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
+ PRINT #fh2, "extern void " + s2$ + "(void);"
+ PRINT #fh2, "}"
+ ELSE
+ OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
+ END IF
+ CLOSE #fh2
+ n = n + 1
+ EXIT DO
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ END IF
-IF n = 0 THEN 'a C++ dynamic object library?
-IF MacOSX THEN GOTO macosx_libfind_failed
-SHELL _HIDE "nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " -D --demangle -g >./internal/temp/nm_output_dynamic.txt 2>./internal/temp/nm_error.txt"
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x) + "("
-OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname+LEFTBRACKET
-x1 = INSTR(a$, s$)
-IF x1 THEN
-IF ResolveStaticFunction_Method(x) = 1 THEN
-x1 = x1 + 1
-x2 = INSTR(x1, a$, ")")
-fh2 = FREEFILE
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
-CLOSE #fh2
-END IF
-n = n + 1
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
-END IF
+ IF n = 0 THEN 'a C++ dynamic object library?
+ IF MacOSX THEN GOTO macosx_libfind_failed
+ SHELL _HIDE "nm " + CHR$(34) + ResolveStaticFunction_File(x) + CHR$(34) + " -D --demangle -g >./internal/temp/nm_output_dynamic.txt 2>./internal/temp/nm_error.txt"
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x) + "("
+ OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname+LEFTBRACKET
+ x1 = INSTR(a$, s$)
+ IF x1 THEN
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ x1 = x1 + 1
+ x2 = INSTR(x1, a$, ")")
+ fh2 = FREEFILE
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern void " + MID$(a$, x1, x2 - x1 + 1) + ";"
+ CLOSE #fh2
+ END IF
+ n = n + 1
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ IF n > 1 THEN a$ = "Unable to resolve multiple instances of sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
+ END IF
-IF n = 0 THEN 'a C dynamic object library?
-fh = FREEFILE
-s$ = " " + ResolveStaticFunction_Name(x)
-OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
-DO UNTIL EOF(fh)
-LINE INPUT #fh, a$
-IF LEN(a$) THEN
-'search for SPACE+functionname
-x1 = INSTR(a$, s$)
-IF RIGHT$(a$, LEN(s$)) = s$ THEN
-fh2 = FREEFILE
-IF ResolveStaticFunction_Method(x) = 1 THEN
-OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
-PRINT #fh2, "extern void " + s$ + "(void);"
-PRINT #fh2, "}"
-ELSE
-OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
-PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
-END IF
-CLOSE #fh2
-n = n + 1
-EXIT DO
-END IF 'x1
-END IF '<>""
-LOOP
-CLOSE #fh
-macosx_libfind_failed:
-IF n = 0 THEN a$ = "Could not find sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
-END IF
+ IF n = 0 THEN 'a C dynamic object library?
+ fh = FREEFILE
+ s$ = " " + ResolveStaticFunction_Name(x)
+ OPEN "internal\temp\nm_output_dynamic.txt" FOR BINARY AS #fh
+ DO UNTIL EOF(fh)
+ LINE INPUT #fh, a$
+ IF LEN(a$) THEN
+ 'search for SPACE+functionname
+ x1 = INSTR(a$, s$)
+ IF RIGHT$(a$, LEN(s$)) = s$ THEN
+ fh2 = FREEFILE
+ IF ResolveStaticFunction_Method(x) = 1 THEN
+ OPEN tmpdir$ + "global.txt" FOR APPEND AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + "{"
+ PRINT #fh2, "extern void " + s$ + "(void);"
+ PRINT #fh2, "}"
+ ELSE
+ OPEN tmpdir$ + "externtype" + str2(x) + ".txt" FOR OUTPUT AS #fh2
+ PRINT #fh2, "extern " + CHR$(34) + "C" + CHR$(34) + " "
+ END IF
+ CLOSE #fh2
+ n = n + 1
+ EXIT DO
+ END IF 'x1
+ END IF '<>""
+ LOOP
+ CLOSE #fh
+ macosx_libfind_failed:
+ IF n = 0 THEN a$ = "Could not find sub/function '" + ResolveStaticFunction_Name(x) + "' in '" + ResolveStaticFunction_File(x) + "'": GOTO errmes
+ END IF
-END IF
-NEXT
+ END IF
+ NEXT
-IF inline_DATA = 0 THEN
-IF DataOffset THEN
-IF INSTR(_OS$, "[32BIT]") THEN b$ = "32" ELSE b$ = "64"
-OPEN ".\internal\c\makedat_lnx" + b$ + ".txt" FOR BINARY AS #150: LINE INPUT #150, a$: CLOSE #150
-a$ = a$ + " " + tmpdir2$ + "data.bin " + tmpdir2$ + "data.o"
-CHDIR ".\internal\c"
-SHELL _HIDE a$
-CHDIR "..\.."
-END IF
-END IF
+ IF inline_DATA = 0 THEN
+ IF DataOffset THEN
+ IF INSTR(_OS$, "[32BIT]") THEN b$ = "32" ELSE b$ = "64"
+ OPEN ".\internal\c\makedat_lnx" + b$ + ".txt" FOR BINARY AS #150: LINE INPUT #150, a$: CLOSE #150
+ a$ = a$ + " " + tmpdir2$ + "data.bin " + tmpdir2$ + "data.o"
+ CHDIR ".\internal\c"
+ SHELL _HIDE a$
+ CHDIR "..\.."
+ END IF
+ END IF
-IF INSTR(_OS$, "[MACOSX]") THEN
-OPEN "./internal/c/makeline_osx.txt" FOR INPUT AS #150
-ELSE
-OPEN "./internal/c/makeline_lnx.txt" FOR INPUT AS #150
-END IF
+ IF INSTR(_OS$, "[MACOSX]") THEN
+ OPEN "./internal/c/makeline_osx.txt" FOR INPUT AS #150
+ ELSE
+ OPEN "./internal/c/makeline_lnx.txt" FOR INPUT AS #150
+ END IF
-LINE INPUT #150, a$: a$ = GDB_Fix(a$)
-CLOSE #150
-'change qbx.cpp to qbx999.cpp?
-x = INSTR(a$, "qbx.cpp"): IF x <> 0 AND tempfolderindex <> 1 THEN a$ = LEFT$(a$, x - 1) + "qbx" + str2$(tempfolderindex) + ".cpp" + RIGHT$(a$, LEN(a$) - (x + 6))
+ LINE INPUT #150, a$: a$ = GDB_Fix(a$)
+ CLOSE #150
+ 'change qbx.cpp to qbx999.cpp?
+ x = INSTR(a$, "qbx.cpp"): IF x <> 0 AND tempfolderindex <> 1 THEN a$ = LEFT$(a$, x - 1) + "qbx" + str2$(tempfolderindex) + ".cpp" + RIGHT$(a$, LEN(a$) - (x + 6))
-IF inline_DATA = 0 THEN
-'add data.o?
-IF DataOffset THEN
-x = INSTR(a$, "-lX11")
-IF x THEN
-a$ = LEFT$(a$, x - 1) + " " + tmpdir2$ + "data.o " + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
-END IF
-END IF
+ IF inline_DATA = 0 THEN
+ 'add data.o?
+ IF DataOffset THEN
+ x = INSTR(a$, "-lX11")
+ IF x THEN
+ a$ = LEFT$(a$, x - 1) + " " + tmpdir2$ + "data.o " + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
+ END IF
+ END IF
-'add custom libraries
-IF LEN(mylib$) THEN
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 5
-a$ = LEFT$(a$, x - 1) + " " + mylibopt$ + " " + mylib$ + " " + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
-END IF
+ 'add custom libraries
+ IF LEN(mylib$) THEN
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 5
+ a$ = LEFT$(a$, x - 1) + " " + mylibopt$ + " " + mylib$ + " " + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
+ END IF
-'add dependent libraries
-IF LEN(libs$) THEN
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 5
-a$ = LEFT$(a$, x - 1) + libs$ + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
-END IF
+ 'add dependent libraries
+ IF LEN(libs$) THEN
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 5
+ a$ = LEFT$(a$, x - 1) + libs$ + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
+ END IF
-'add dependency defines
-IF LEN(defines$) THEN
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 5
-a$ = LEFT$(a$, x - 1) + defines$ + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
-END IF
+ 'add dependency defines
+ IF LEN(defines$) THEN
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 5
+ a$ = LEFT$(a$, x - 1) + defines$ + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
+ END IF
-'add libqb
-x = INSTR(a$, ".cpp ")
-IF x THEN
-x = x + 5
-a$ = LEFT$(a$, x - 1) + libqb$ + RIGHT$(a$, LEN(a$) - x + 1)
-END IF
+ 'add libqb
+ x = INSTR(a$, ".cpp ")
+ IF x THEN
+ x = x + 5
+ a$ = LEFT$(a$, x - 1) + libqb$ + RIGHT$(a$, LEN(a$) - x + 1)
+ END IF
@@ -11410,98 +11617,98 @@ END IF
-a$ = a$ + QuotedFilename$("../../" + file$ + extension$)
+ a$ = a$ + QuotedFilename$("../../" + file$ + extension$)
-IF INSTR(_OS$, "[MACOSX]") THEN
+ IF INSTR(_OS$, "[MACOSX]") THEN
-ffh = FREEFILE
-OPEN tmpdir$ + "recompile_osx.command" FOR OUTPUT AS #ffh
-PRINT #ffh, "cd " + CHR_QUOTE + "$(dirname " + CHR_QUOTE + "$0" + CHR_QUOTE + ")" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "Recompiling..." + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "cd ../c" + CHR$(10);
-PRINT #ffh, a$ + CHR$(10);
-PRINT #ffh, "read -p " + CHR_QUOTE + "Press ENTER to exit..." + CHR_QUOTE + CHR$(10);
-CLOSE ffh
-SHELL _HIDE "chmod +x " + tmpdir$ + "recompile_osx.command"
+ ffh = FREEFILE
+ OPEN tmpdir$ + "recompile_osx.command" FOR OUTPUT AS #ffh
+ PRINT #ffh, "cd " + CHR_QUOTE + "$(dirname " + CHR_QUOTE + "$0" + CHR_QUOTE + ")" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "Recompiling..." + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "cd ../c" + CHR$(10);
+ PRINT #ffh, a$ + CHR$(10);
+ PRINT #ffh, "read -p " + CHR_QUOTE + "Press ENTER to exit..." + CHR_QUOTE + CHR$(10);
+ CLOSE ffh
+ SHELL _HIDE "chmod +x " + tmpdir$ + "recompile_osx.command"
-ffh = FREEFILE
-OPEN tmpdir$ + "debug_osx.command" FOR OUTPUT AS #ffh
-PRINT #ffh, "cd " + CHR_QUOTE + "$(dirname " + CHR_QUOTE + "$0" + CHR_QUOTE + ")" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "Pause()" + CHR$(10);
-PRINT #ffh, "{" + CHR$(10);
-PRINT #ffh, "OLDCONFIG=`stty -g`" + CHR$(10);
-PRINT #ffh, "stty -icanon -echo min 1 time 0" + CHR$(10);
-PRINT #ffh, "dd count=1 2>/dev/null" + CHR$(10);
-PRINT #ffh, "stty $OLDCONFIG" + CHR$(10);
-PRINT #ffh, "}" + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "C++ Debugging: " + file$ + extension$ + " using GDB" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "Debugger commands:" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "After the debugger launches type 'run' to start your program" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "After your program crashes type 'list' to find where the problem is and fix/report it" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "(the GDB debugger has many other useful commands, this advice is for beginners)" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "gdb " + CHR$(34) + "../../" + file$ + extension$ + CHR$(34) + CHR$(10);
-PRINT #ffh, "Pause" + CHR$(10);
-CLOSE ffh
-SHELL _HIDE "chmod +x " + tmpdir$ + "debug_osx.command"
+ ffh = FREEFILE
+ OPEN tmpdir$ + "debug_osx.command" FOR OUTPUT AS #ffh
+ PRINT #ffh, "cd " + CHR_QUOTE + "$(dirname " + CHR_QUOTE + "$0" + CHR_QUOTE + ")" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "Pause()" + CHR$(10);
+ PRINT #ffh, "{" + CHR$(10);
+ PRINT #ffh, "OLDCONFIG=`stty -g`" + CHR$(10);
+ PRINT #ffh, "stty -icanon -echo min 1 time 0" + CHR$(10);
+ PRINT #ffh, "dd count=1 2>/dev/null" + CHR$(10);
+ PRINT #ffh, "stty $OLDCONFIG" + CHR$(10);
+ PRINT #ffh, "}" + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "C++ Debugging: " + file$ + extension$ + " using GDB" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "Debugger commands:" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "After the debugger launches type 'run' to start your program" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "After your program crashes type 'list' to find where the problem is and fix/report it" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "(the GDB debugger has many other useful commands, this advice is for beginners)" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "gdb " + CHR$(34) + "../../" + file$ + extension$ + CHR$(34) + CHR$(10);
+ PRINT #ffh, "Pause" + CHR$(10);
+ CLOSE ffh
+ SHELL _HIDE "chmod +x " + tmpdir$ + "debug_osx.command"
-ELSE
+ ELSE
-ffh = FREEFILE
-OPEN tmpdir$ + "recompile_lnx.sh" FOR OUTPUT AS #ffh
-PRINT #ffh, "#!/bin/sh" + CHR$(10);
-PRINT #ffh, "Pause()" + CHR$(10);
-PRINT #ffh, "{" + CHR$(10);
-PRINT #ffh, "OLDCONFIG=`stty -g`" + CHR$(10);
-PRINT #ffh, "stty -icanon -echo min 1 time 0" + CHR$(10);
-PRINT #ffh, "dd count=1 2>/dev/null" + CHR$(10);
-PRINT #ffh, "stty $OLDCONFIG" + CHR$(10);
-PRINT #ffh, "}" + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "Recompiling..." + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "cd ../c" + CHR$(10);
-PRINT #ffh, a$ + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "Press ENTER to exit..." + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "Pause" + CHR$(10);
-CLOSE ffh
-SHELL _HIDE "chmod +x " + tmpdir$ + "recompile_lnx.sh"
+ ffh = FREEFILE
+ OPEN tmpdir$ + "recompile_lnx.sh" FOR OUTPUT AS #ffh
+ PRINT #ffh, "#!/bin/sh" + CHR$(10);
+ PRINT #ffh, "Pause()" + CHR$(10);
+ PRINT #ffh, "{" + CHR$(10);
+ PRINT #ffh, "OLDCONFIG=`stty -g`" + CHR$(10);
+ PRINT #ffh, "stty -icanon -echo min 1 time 0" + CHR$(10);
+ PRINT #ffh, "dd count=1 2>/dev/null" + CHR$(10);
+ PRINT #ffh, "stty $OLDCONFIG" + CHR$(10);
+ PRINT #ffh, "}" + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "Recompiling..." + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "cd ../c" + CHR$(10);
+ PRINT #ffh, a$ + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "Press ENTER to exit..." + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "Pause" + CHR$(10);
+ CLOSE ffh
+ SHELL _HIDE "chmod +x " + tmpdir$ + "recompile_lnx.sh"
-ffh = FREEFILE
-OPEN tmpdir$ + "debug_lnx.sh" FOR OUTPUT AS #ffh
-PRINT #ffh, "#!/bin/sh" + CHR$(10);
-PRINT #ffh, "Pause()" + CHR$(10);
-PRINT #ffh, "{" + CHR$(10);
-PRINT #ffh, "OLDCONFIG=`stty -g`" + CHR$(10);
-PRINT #ffh, "stty -icanon -echo min 1 time 0" + CHR$(10);
-PRINT #ffh, "dd count=1 2>/dev/null" + CHR$(10);
-PRINT #ffh, "stty $OLDCONFIG" + CHR$(10);
-PRINT #ffh, "}" + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "C++ Debugging: " + file$ + extension$ + " using GDB" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "Debugger commands:" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "After the debugger launches type 'run' to start your program" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "After your program crashes type 'list' to find where the problem is and fix/report it" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "echo " + CHR_QUOTE + "(the GDB debugger has many other useful commands, this advice is for beginners)" + CHR_QUOTE + CHR$(10);
-PRINT #ffh, "gdb " + CHR$(34) + "../../" + file$ + extension$ + CHR$(34) + CHR$(10);
-PRINT #ffh, "Pause" + CHR$(10);
-CLOSE ffh
-SHELL _HIDE "chmod +x " + tmpdir$ + "debug_lnx.sh"
+ ffh = FREEFILE
+ OPEN tmpdir$ + "debug_lnx.sh" FOR OUTPUT AS #ffh
+ PRINT #ffh, "#!/bin/sh" + CHR$(10);
+ PRINT #ffh, "Pause()" + CHR$(10);
+ PRINT #ffh, "{" + CHR$(10);
+ PRINT #ffh, "OLDCONFIG=`stty -g`" + CHR$(10);
+ PRINT #ffh, "stty -icanon -echo min 1 time 0" + CHR$(10);
+ PRINT #ffh, "dd count=1 2>/dev/null" + CHR$(10);
+ PRINT #ffh, "stty $OLDCONFIG" + CHR$(10);
+ PRINT #ffh, "}" + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "C++ Debugging: " + file$ + extension$ + " using GDB" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "Debugger commands:" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "After the debugger launches type 'run' to start your program" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "After your program crashes type 'list' to find where the problem is and fix/report it" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "echo " + CHR_QUOTE + "(the GDB debugger has many other useful commands, this advice is for beginners)" + CHR_QUOTE + CHR$(10);
+ PRINT #ffh, "gdb " + CHR$(34) + "../../" + file$ + extension$ + CHR$(34) + CHR$(10);
+ PRINT #ffh, "Pause" + CHR$(10);
+ CLOSE ffh
+ SHELL _HIDE "chmod +x " + tmpdir$ + "debug_lnx.sh"
-END IF
+ END IF
-IF No_C_Compile_Mode = 0 THEN
-CHDIR "./internal/c"
-SHELL _HIDE a$
-CHDIR "../.."
-END IF
+ IF No_C_Compile_Mode = 0 THEN
+ CHDIR "./internal/c"
+ SHELL _HIDE a$
+ CHDIR "../.."
+ END IF
-IF INSTR(_OS$, "[MACOSX]") THEN
-ff = FREEFILE
-OPEN file$ + extension$ + "_start.command" FOR OUTPUT AS #ff
-PRINT #ff, "cd " + CHR$(34) + "$(dirname " + CHR$(34) + "$0" + CHR$(34) + ")" + CHR$(34);
-PRINT #ff, CHR$(10);
-PRINT #ff, "./" + file$ + extension$;
-PRINT #ff, CHR$(10);
-CLOSE #ff
-SHELL _HIDE "chmod +x " + file$ + extension$ + "_start.command"
-END IF
+ IF INSTR(_OS$, "[MACOSX]") THEN
+ ff = FREEFILE
+ OPEN file$ + extension$ + "_start.command" FOR OUTPUT AS #ff
+ PRINT #ff, "cd " + CHR$(34) + "$(dirname " + CHR$(34) + "$0" + CHR$(34) + ")" + CHR$(34);
+ PRINT #ff, CHR$(10);
+ PRINT #ff, "./" + file$ + extension$;
+ PRINT #ff, CHR$(10);
+ CLOSE #ff
+ SHELL _HIDE "chmod +x " + file$ + extension$ + "_start.command"
+ END IF
END IF
@@ -11509,11 +11716,11 @@ IF No_C_Compile_Mode THEN compfailed = 0: GOTO No_C_Compile
IF _FILEEXISTS(file$ + extension$) THEN compfailed = 0 ELSE compfailed = 1 'detect compilation failure
IF compfailed THEN
-IF idemode THEN
-idemessage$ = "C++ Compilation failed"
-GOTO ideerror
-END IF
-IF compfailed THEN PRINT "C++ COMPILATION FAILED!"
+ IF idemode THEN
+ idemessage$ = "C++ Compilation failed"
+ GOTO ideerror
+ END IF
+ IF compfailed THEN PRINT "C++ COMPILATION FAILED!"
END IF
@@ -11537,13 +11744,13 @@ RESUME NEXT
qberror:
IF ideerror THEN 'error happened inside the IDE
-fh = FREEFILE
-OPEN "internal\temp\ideerror.txt" FOR OUTPUT AS #fh
-PRINT #fh, ERR
-PRINT #fh, _ERRORLINE
-CLOSE #fh
-sendc$ = CHR$(255) 'a runtime error has occurred
-RESUME sendcommand 'allow IDE to handle error recovery
+ fh = FREEFILE
+ OPEN "internal\temp\ideerror.txt" FOR OUTPUT AS #fh
+ PRINT #fh, ERR
+ PRINT #fh, _ERRORLINE
+ CLOSE #fh
+ sendc$ = CHR$(255) 'a runtime error has occurred
+ RESUME sendcommand 'allow IDE to handle error recovery
END IF
qberrorhappenedvalue = qberrorhappened
@@ -11554,15 +11761,15 @@ IF Debug THEN PRINT #9, "ERR="; ERR
IF Debug THEN PRINT #9, "ERL="; ERL
IF idemode AND qberrorhappenedvalue >= 0 THEN
-'real qb error occurred
-ideerrorline = linenumber
-idemessage$ = "Compiler error (check for syntax errors) (Reference:" + str2$(ERR) + "-" + str2$(_ERRORLINE) + ")"
-IF inclevel > 0 THEN idemessage$ = idemessage$ + incerror$
-RESUME ideerror
+ 'real qb error occurred
+ ideerrorline = linenumber
+ idemessage$ = "Compiler error (check for syntax errors) (Reference:" + str2$(ERR) + "-" + str2$(_ERRORLINE) + ")"
+ IF inclevel > 0 THEN idemessage$ = idemessage$ + incerror$
+ RESUME ideerror
END IF
IF qberrorhappenedvalue >= 0 THEN
-a$ = "UNEXPECTED INTERNAL COMPILER ERROR!": GOTO errmes 'internal comiler error
+ a$ = "UNEXPECTED INTERNAL COMPILER ERROR!": GOTO errmes 'internal comiler error
END IF
@@ -11578,18 +11785,18 @@ IF Error_Happened THEN a$ = Error_Message: Error_Happened = 0
layout$ = "": layoutok = 0 'invalidate layout
IF inclevel > 0 THEN a$ = a$ + incerror$
IF idemode THEN
-ideerrorline = linenumber
-idemessage$ = a$
-GOTO ideerror 'infinitely preferable to RESUME
+ ideerrorline = linenumber
+ idemessage$ = a$
+ GOTO ideerror 'infinitely preferable to RESUME
END IF
'non-ide mode output
PRINT
PRINT a$
FOR i = 1 TO LEN(linefragment)
-IF MID$(linefragment, i, 1) = sp$ THEN MID$(linefragment, i, 1) = " "
+ IF MID$(linefragment, i, 1) = sp$ THEN MID$(linefragment, i, 1) = " "
NEXT
FOR i = 1 TO LEN(wholeline)
-IF MID$(wholeline, i, 1) = sp$ THEN MID$(wholeline, i, 1) = " "
+ IF MID$(wholeline, i, 1) = sp$ THEN MID$(wholeline, i, 1) = " "
NEXT
PRINT "Caused by (or after):" + linefragment
PRINT "LINE " + str2(linenumber) + ":" + wholeline
@@ -11604,32 +11811,32 @@ FUNCTION ParseCMDLineArgs$ ()
cmdline$ = LTRIM$(RTRIM$(COMMAND$))
tpos = 1
DO
-token$ = MID$(cmdline$, tpos, 2) '))
-SELECT CASE token$
-CASE "-g" 'non-GUI environment (uses $CONSOLE:ONLY)
-DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) = DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) OR 2
-NoIDEMode = 1 'Implies -c
-Console = 1
-CASE "-q" 'Building a Qloud program
-Cloud = 1
-ConsoleMode = 1 'Implies -x
-NoIDEMode = 1 'Imples -c
-CASE "-z" 'Not compiling C code
-No_C_Compile_Mode = 1
-ConsoleMode = 1 'Implies -x
-NoIDEMode = 1 'Implies -c
-CASE "-x" 'Use the console
-ConsoleMode = 1
-NoIDEMode = 1 'Implies -c
-CASE "-c" 'Compile instead of edit
-NoIDEMode = 1
-CASE "--" 'Signifies the end of options; the rest of the line is a filename (allows compilation of -crapfile.bas and -xtreme.bas etc.)
-tpos = tpos + 3 'Do it manually here
-EXIT DO
-CASE ELSE 'Something we don't recognise, assume it's a filename
-EXIT DO
-END SELECT
-tpos = tpos + 3
+ token$ = MID$(cmdline$, tpos, 2) '))
+ SELECT CASE token$
+ CASE "-g" 'non-GUI environment (uses $CONSOLE:ONLY)
+ DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) = DEPENDENCY(DEPENDENCY_CONSOLE_ONLY) OR 2
+ NoIDEMode = 1 'Implies -c
+ Console = 1
+ CASE "-q" 'Building a Qloud program
+ Cloud = 1
+ ConsoleMode = 1 'Implies -x
+ NoIDEMode = 1 'Imples -c
+ CASE "-z" 'Not compiling C code
+ No_C_Compile_Mode = 1
+ ConsoleMode = 1 'Implies -x
+ NoIDEMode = 1 'Implies -c
+ CASE "-x" 'Use the console
+ ConsoleMode = 1
+ NoIDEMode = 1 'Implies -c
+ CASE "-c" 'Compile instead of edit
+ NoIDEMode = 1
+ CASE "--" 'Signifies the end of options; the rest of the line is a filename (allows compilation of -crapfile.bas and -xtreme.bas etc.)
+ tpos = tpos + 3 'Do it manually here
+ EXIT DO
+ CASE ELSE 'Something we don't recognise, assume it's a filename
+ EXIT DO
+ END SELECT
+ tpos = tpos + 3
LOOP
'tpos should now point to the filename (the rest of the command line). This means options *must* come before the file.
ParseCMDLineArgs$ = MID$(cmdline$, tpos)
@@ -11639,48 +11846,48 @@ FUNCTION Type2MemTypeValue (t1)
t = 0
IF t1 AND ISARRAY THEN t = t + 65536
IF t1 AND ISUDT THEN
-IF (t1 AND 511) = 1 THEN
-t = t + 4096 '_MEM type
+ IF (t1 AND 511) = 1 THEN
+ t = t + 4096 '_MEM type
+ ELSE
+ t = t + 32768
+ END IF
ELSE
-t = t + 32768
-END IF
-ELSE
-IF t1 AND ISSTRING THEN
-t = t + 512 'string
-ELSE
-IF t1 AND ISFLOAT THEN
-t = t + 256 'float
-ELSE
-t = t + 128 'integer
-IF t1 AND ISUNSIGNED THEN t = t + 1024
-IF t1 AND ISOFFSET THEN t = t + 8192 'offset type
-END IF
-t1s = (t1 AND 511) \ 8
-IF t1s = 1 THEN t = t + t1s
-IF t1s = 2 THEN t = t + t1s
-IF t1s = 4 THEN t = t + t1s
-IF t1s = 8 THEN t = t + t1s
-IF t1s = 16 THEN t = t + t1s
-IF t1s = 32 THEN t = t + t1s
-IF t1s = 64 THEN t = t + t1s
-END IF
+ IF t1 AND ISSTRING THEN
+ t = t + 512 'string
+ ELSE
+ IF t1 AND ISFLOAT THEN
+ t = t + 256 'float
+ ELSE
+ t = t + 128 'integer
+ IF t1 AND ISUNSIGNED THEN t = t + 1024
+ IF t1 AND ISOFFSET THEN t = t + 8192 'offset type
+ END IF
+ t1s = (t1 AND 511) \ 8
+ IF t1s = 1 THEN t = t + t1s
+ IF t1s = 2 THEN t = t + t1s
+ IF t1s = 4 THEN t = t + t1s
+ IF t1s = 8 THEN t = t + t1s
+ IF t1s = 16 THEN t = t + t1s
+ IF t1s = 32 THEN t = t + t1s
+ IF t1s = 64 THEN t = t + t1s
+ END IF
END IF
Type2MemTypeValue = t
END FUNCTION
FUNCTION FileHasExtension (f$)
FOR i = LEN(f$) TO 1 STEP -1
-a = ASC(f$, i)
-IF a = 47 OR a = 92 THEN EXIT FOR
-IF a = 46 THEN FileHasExtension = -1: EXIT FUNCTION
+ a = ASC(f$, i)
+ IF a = 47 OR a = 92 THEN EXIT FOR
+ IF a = 46 THEN FileHasExtension = -1: EXIT FUNCTION
NEXT
END FUNCTION
FUNCTION RemoveFileExtension$ (f$) 'returns f$ without extension
FOR i = LEN(f$) TO 1 STEP -1
-a = ASC(f$, i)
-IF a = 47 OR a = 92 THEN EXIT FOR
-IF a = 46 THEN RemoveFileExtension$ = LEFT$(f$, i - 1): EXIT FUNCTION
+ a = ASC(f$, i)
+ IF a = 47 OR a = 92 THEN EXIT FOR
+ IF a = 46 THEN RemoveFileExtension$ = LEFT$(f$, i - 1): EXIT FUNCTION
NEXT
RemoveFileExtension$ = f$
END FUNCTION
@@ -11704,13 +11911,13 @@ e$ = elements$: n$ = n2$
IF elementsize = -2147483647 THEN stringarray = 1: elementsize = 8
IF ASC(e$) = 63 THEN '?
-l$ = "(" + sp2 + ")"
-undefined = -1
-nume = 1
-IF LEN(e$) = 1 THEN GOTO undefinedarray
-undefined = 1
-nume = VAL(RIGHT$(e$, LEN(e$) - 1))
-GOTO undefinedarray
+ l$ = "(" + sp2 + ")"
+ undefined = -1
+ nume = 1
+ IF LEN(e$) = 1 THEN GOTO undefinedarray
+ undefined = 1
+ nume = VAL(RIGHT$(e$, LEN(e$) - 1))
+ GOTO undefinedarray
END IF
@@ -11718,27 +11925,27 @@ END IF
nume = 1
n = numelements(e$)
FOR i = 1 TO n
-e2$ = getelement(e$, i)
-IF e2$ = "(" THEN b = b + 1
-IF b = 0 AND e2$ = "," THEN nume = nume + 1
-IF e2$ = ")" THEN b = b - 1
+ e2$ = getelement(e$, i)
+ IF e2$ = "(" THEN b = b + 1
+ IF b = 0 AND e2$ = "," THEN nume = nume + 1
+ IF e2$ = ")" THEN b = b - 1
NEXT
IF Debug THEN PRINT #9, "numelements count:"; nume
descstatic = 0
IF arraydesc THEN
-IF id.arrayelements <> nume THEN
+ IF id.arrayelements <> nume THEN
-IF id.arrayelements = -1 THEN 'unknown
-IF arrayelementslist(currentid) <> 0 AND nume <> arrayelementslist(currentid) THEN Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
-IF nume = 1 THEN id.arrayelements = 1: ids(currentid).arrayelements = 1 'lucky guess!
-arrayelementslist(currentid) = nume
-ELSE
-Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
-END IF
+ IF id.arrayelements = -1 THEN 'unknown
+ IF arrayelementslist(currentid) <> 0 AND nume <> arrayelementslist(currentid) THEN Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
+ IF nume = 1 THEN id.arrayelements = 1: ids(currentid).arrayelements = 1 'lucky guess!
+ arrayelementslist(currentid) = nume
+ ELSE
+ Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
+ END IF
-END IF
-IF id.staticarray THEN descstatic = 1
+ END IF
+ IF id.staticarray THEN descstatic = 1
END IF
l$ = "(" + sp2
@@ -11750,63 +11957,63 @@ ei = 4 + nume * 4 - 4
cure = 1
e3$ = "": e3base$ = ""
FOR i = 1 TO n
-e2$ = getelement(e$, i)
-IF e2$ = "(" THEN b = b + 1
-IF (e2$ = "," AND b = 0) OR i = n THEN
-IF i = n THEN e3$ = e3$ + sp + e2$
-e3$ = RIGHT$(e3$, LEN(e3$) - 1)
-IF e3base$ <> "" THEN e3base$ = RIGHT$(e3base$, LEN(e3base$) - 1)
-'PRINT e3base$ + "[TO]" + e3$
-'set the base
+ e2$ = getelement(e$, i)
+ IF e2$ = "(" THEN b = b + 1
+ IF (e2$ = "," AND b = 0) OR i = n THEN
+ IF i = n THEN e3$ = e3$ + sp + e2$
+ e3$ = RIGHT$(e3$, LEN(e3$) - 1)
+ IF e3base$ <> "" THEN e3base$ = RIGHT$(e3base$, LEN(e3base$) - 1)
+ 'PRINT e3base$ + "[TO]" + e3$
+ 'set the base
-basegiven = 1
-IF e3base$ = "" THEN e3base$ = str2$(optionbase + 0): basegiven = 0
-constequation = 1
+ basegiven = 1
+ IF e3base$ = "" THEN e3base$ = str2$(optionbase + 0): basegiven = 0
+ constequation = 1
-e3base$ = fixoperationorder$(e3base$)
-IF Error_Happened THEN EXIT FUNCTION
-IF basegiven THEN l$ = l$ + tlayout$ + sp + "TO" + sp
-e3base$ = evaluatetotyp$(e3base$, 64&)
-IF Error_Happened THEN EXIT FUNCTION
+ e3base$ = fixoperationorder$(e3base$)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF basegiven THEN l$ = l$ + tlayout$ + sp + "TO" + sp
+ e3base$ = evaluatetotyp$(e3base$, 64&)
+ IF Error_Happened THEN EXIT FUNCTION
-IF constequation = 0 THEN constdimensions = 0
-sd$ = sd$ + n$ + "[" + str2(ei) + "]=" + e3base$ + ";" + cr$
-'set the number of indexes
-constequation = 1
+ IF constequation = 0 THEN constdimensions = 0
+ sd$ = sd$ + n$ + "[" + str2(ei) + "]=" + e3base$ + ";" + cr$
+ 'set the number of indexes
+ constequation = 1
-e3$ = fixoperationorder$(e3$)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + tlayout$ + sp2
-IF i = n THEN l$ = l$ + ")" ELSE l$ = l$ + "," + sp
-e3$ = evaluatetotyp$(e3$, 64&)
-IF Error_Happened THEN EXIT FUNCTION
+ e3$ = fixoperationorder$(e3$)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + tlayout$ + sp2
+ IF i = n THEN l$ = l$ + ")" ELSE l$ = l$ + "," + sp
+ e3$ = evaluatetotyp$(e3$, 64&)
+ IF Error_Happened THEN EXIT FUNCTION
-IF constequation = 0 THEN constdimensions = 0
-ei = ei + 1
-sd$ = sd$ + n$ + "[" + str2(ei) + "]=(" + e3$ + ")-" + n$ + "[" + str2(ei - 1) + "]+1;" + cr$
-ei = ei + 1
-'calc muliplier
-IF cure = 1 THEN
-'set only for the purpose of the calculating correct multipliers
-sd$ = sd$ + n$ + "[" + str2(ei) + "]=1;" + cr$
-ELSE
-sd$ = sd$ + n$ + "[" + str2(ei) + "]=" + n$ + "[" + str2(ei + 4) + "]*" + n$ + "[" + str2(ei + 3) + "];" + cr$
-END IF
-ei = ei + 1
-ei = ei + 1 'skip reserved
-ei = ei - 8
-cure = cure + 1
-e3$ = "": e3base$ = ""
-GOTO aanexte
-END IF
-IF e2$ = ")" THEN b = b - 1
-IF UCASE$(e2$) = "TO" AND b = 0 THEN
-e3base$ = e3$
-e3$ = ""
-ELSE
-e3$ = e3$ + sp + e2$
-END IF
-aanexte:
+ IF constequation = 0 THEN constdimensions = 0
+ ei = ei + 1
+ sd$ = sd$ + n$ + "[" + str2(ei) + "]=(" + e3$ + ")-" + n$ + "[" + str2(ei - 1) + "]+1;" + cr$
+ ei = ei + 1
+ 'calc muliplier
+ IF cure = 1 THEN
+ 'set only for the purpose of the calculating correct multipliers
+ sd$ = sd$ + n$ + "[" + str2(ei) + "]=1;" + cr$
+ ELSE
+ sd$ = sd$ + n$ + "[" + str2(ei) + "]=" + n$ + "[" + str2(ei + 4) + "]*" + n$ + "[" + str2(ei + 3) + "];" + cr$
+ END IF
+ ei = ei + 1
+ ei = ei + 1 'skip reserved
+ ei = ei - 8
+ cure = cure + 1
+ e3$ = "": e3base$ = ""
+ GOTO aanexte
+ END IF
+ IF e2$ = ")" THEN b = b - 1
+ IF UCASE$(e2$) = "TO" AND b = 0 THEN
+ e3base$ = e3$
+ e3$ = ""
+ ELSE
+ e3$ = e3$ + sp + e2$
+ END IF
+ aanexte:
NEXT
sd$ = LEFT$(sd$, LEN(sd$) - 2)
@@ -11815,9 +12022,9 @@ undefinedarray:
'calc cmem
cmem = 0
IF arraydesc = 0 THEN
-IF cmemlist(idn + 1) THEN cmem = 1
+ IF cmemlist(idn + 1) THEN cmem = 1
ELSE
-IF cmemlist(arraydesc) THEN cmem = 1
+ IF cmemlist(arraydesc) THEN cmem = 1
END IF
staticarray = constdimensions
@@ -11828,10 +12035,10 @@ IF redimoption THEN staticarray = 0
IF dimoption = 3 THEN staticarray = 0 'STATIC a(100) arrays are still dynamic
IF arraydesc THEN
-IF staticarray = 1 THEN
-IF descstatic THEN Give_Error "Cannot redefine a static array!": EXIT FUNCTION
-staticarray = 0
-END IF
+ IF staticarray = 1 THEN
+ IF descstatic THEN Give_Error "Cannot redefine a static array!": EXIT FUNCTION
+ staticarray = 0
+ END IF
END IF
@@ -11841,27 +12048,27 @@ END IF
bytesperelement$ = str2(elementsize)
IF elementsize < 0 THEN
-elementsize = -elementsize
-bytesperelement$ = str2(elementsize) + "/8+1"
+ elementsize = -elementsize
+ bytesperelement$ = str2(elementsize) + "/8+1"
END IF
'Begin creation of array descriptor (if array has not been defined yet)
IF arraydesc = 0 THEN
-PRINT #defdatahandle, "ptrszint *" + n$ + "=NULL;"
-PRINT #13, "if (!" + n$ + "){"
-PRINT #13, n$ + "=(ptrszint*)mem_static_malloc(" + str2(4 * nume + 4 + 1) + "*ptrsz);" '+1 is for the lock
-'create _MEM lock
-PRINT #13, "new_mem_lock();"
-PRINT #13, "mem_lock_tmp->type=4;"
-PRINT #13, "((ptrszint*)" + n$ + ")[" + str2(4 * nume + 4 + 1 - 1) + "]=(ptrszint)mem_lock_tmp;"
+ PRINT #defdatahandle, "ptrszint *" + n$ + "=NULL;"
+ PRINT #13, "if (!" + n$ + "){"
+ PRINT #13, n$ + "=(ptrszint*)mem_static_malloc(" + str2(4 * nume + 4 + 1) + "*ptrsz);" '+1 is for the lock
+ 'create _MEM lock
+ PRINT #13, "new_mem_lock();"
+ PRINT #13, "mem_lock_tmp->type=4;"
+ PRINT #13, "((ptrszint*)" + n$ + ")[" + str2(4 * nume + 4 + 1 - 1) + "]=(ptrszint)mem_lock_tmp;"
END IF
'generate sizestr$ & elesizestr$ (both are used in various places in following code)
sizestr$ = ""
FOR i = 1 TO nume
-IF i <> 1 THEN sizestr$ = sizestr$ + "*"
-sizestr$ = sizestr$ + n$ + "[" + str2(i * 4 - 4 + 5) + "]"
+ IF i <> 1 THEN sizestr$ = sizestr$ + "*"
+ sizestr$ = sizestr$ + n$ + "[" + str2(i * 4 - 4 + 5) + "]"
NEXT
elesizestr$ = sizestr$ 'elements in entire array
sizestr$ = sizestr$ + "*" + bytesperelement$ 'bytes in entire array
@@ -11870,291 +12077,291 @@ sizestr$ = sizestr$ + "*" + bytesperelement$ 'bytes in entire array
'------------------STATIC ARRAY CREATION--------------------------------
IF staticarray THEN
-'STATIC memory
-PRINT #13, sd$ 'setup new array dimension ranges
-'Example of sd$ for DIM a(10):
-'__ARRAY_SINGLE_A[4]= 0 ;
-'__ARRAY_SINGLE_A[5]=( 10 )-__ARRAY_SINGLE_A[4]+1;
-'__ARRAY_SINGLE_A[6]=1;
-IF cmem AND stringarray = 0 THEN
-'Note: A string array's pointers are always stored in 64bit memory
-'(static)CONVENTINAL memory
-PRINT #13, n$ + "[0]=(ptrszint)cmem_static_pointer;"
-'alloc mem & check if static memory boundry has oversteped dynamic memory boundry
-PRINT #13, "if ((cmem_static_pointer+=((" + sizestr$ + ")+15)&-16)>cmem_dynamic_base) error(257);"
-'64K check
-PRINT #13, "if ((" + sizestr$ + ")>65536) error(257);"
-'clear array
-PRINT #13, "memset((void*)(" + n$ + "[0]),0," + sizestr$ + ");"
-'set flags
-PRINT #13, n$ + "[2]=1+2+4;" 'init+static+cmem
-ELSE
-'64BIT MEMORY
-PRINT #13, n$ + "[0]=(ptrszint)mem_static_malloc(" + sizestr$ + ");"
-IF stringarray THEN
-'Init string pointers in the array
-PRINT #13, "tmp_long=" + elesizestr$ + ";"
-PRINT #13, "while(tmp_long--){"
-IF cmem THEN
-PRINT #13, "((uint64*)(" + n$ + "[0]))[tmp_long]=(uint64)qbs_new_cmem(0,0);"
-ELSE
-PRINT #13, "((uint64*)(" + n$ + "[0]))[tmp_long]=(uint64)qbs_new(0,0);"
-END IF
-PRINT #13, "}"
-ELSE
-'clear array
-PRINT #13, "memset((void*)(" + n$ + "[0]),0," + sizestr$ + ");"
-END IF
-PRINT #13, n$ + "[2]=1+2;" 'init+static
-END IF
-'Close static array desc
-PRINT #13, "}"
-allocarray = nume + 65536
+ 'STATIC memory
+ PRINT #13, sd$ 'setup new array dimension ranges
+ 'Example of sd$ for DIM a(10):
+ '__ARRAY_SINGLE_A[4]= 0 ;
+ '__ARRAY_SINGLE_A[5]=( 10 )-__ARRAY_SINGLE_A[4]+1;
+ '__ARRAY_SINGLE_A[6]=1;
+ IF cmem AND stringarray = 0 THEN
+ 'Note: A string array's pointers are always stored in 64bit memory
+ '(static)CONVENTINAL memory
+ PRINT #13, n$ + "[0]=(ptrszint)cmem_static_pointer;"
+ 'alloc mem & check if static memory boundry has oversteped dynamic memory boundry
+ PRINT #13, "if ((cmem_static_pointer+=((" + sizestr$ + ")+15)&-16)>cmem_dynamic_base) error(257);"
+ '64K check
+ PRINT #13, "if ((" + sizestr$ + ")>65536) error(257);"
+ 'clear array
+ PRINT #13, "memset((void*)(" + n$ + "[0]),0," + sizestr$ + ");"
+ 'set flags
+ PRINT #13, n$ + "[2]=1+2+4;" 'init+static+cmem
+ ELSE
+ '64BIT MEMORY
+ PRINT #13, n$ + "[0]=(ptrszint)mem_static_malloc(" + sizestr$ + ");"
+ IF stringarray THEN
+ 'Init string pointers in the array
+ PRINT #13, "tmp_long=" + elesizestr$ + ";"
+ PRINT #13, "while(tmp_long--){"
+ IF cmem THEN
+ PRINT #13, "((uint64*)(" + n$ + "[0]))[tmp_long]=(uint64)qbs_new_cmem(0,0);"
+ ELSE
+ PRINT #13, "((uint64*)(" + n$ + "[0]))[tmp_long]=(uint64)qbs_new(0,0);"
+ END IF
+ PRINT #13, "}"
+ ELSE
+ 'clear array
+ PRINT #13, "memset((void*)(" + n$ + "[0]),0," + sizestr$ + ");"
+ END IF
+ PRINT #13, n$ + "[2]=1+2;" 'init+static
+ END IF
+ 'Close static array desc
+ PRINT #13, "}"
+ allocarray = nume + 65536
END IF
'------------------END OF STATIC ARRAY CREATION-------------------------
'------------------DYNAMIC ARRAY CREATION-------------------------------
IF staticarray = 0 THEN
-IF undefined = 0 THEN
+ IF undefined = 0 THEN
-'Generate error if array is static
-f12$ = f12$ + CRLF + "if (" + n$ + "[2]&2){" 'static array
-f12$ = f12$ + CRLF + "error(10);" 'cannot redefine a static array!
-f12$ = f12$ + CRLF + "}else{"
-'Note: Array is either undefined or dynamically defined at this point
+ 'Generate error if array is static
+ f12$ = f12$ + CRLF + "if (" + n$ + "[2]&2){" 'static array
+ f12$ = f12$ + CRLF + "error(10);" 'cannot redefine a static array!
+ f12$ = f12$ + CRLF + "}else{"
+ 'Note: Array is either undefined or dynamically defined at this point
-'REDIM (not DIM) must be used to redefine an array
-IF redimoption = 0 THEN
-f12$ = f12$ + CRLF + "if (" + n$ + "[2]&1){" 'array is defined
-f12$ = f12$ + CRLF + "error(10);" 'cannot redefine an array without using REDIM!
-f12$ = f12$ + CRLF + "}else{"
-ELSE
-'--------ERASE EXISTING ARRAY IF NECESSARY--------
+ 'REDIM (not DIM) must be used to redefine an array
+ IF redimoption = 0 THEN
+ f12$ = f12$ + CRLF + "if (" + n$ + "[2]&1){" 'array is defined
+ f12$ = f12$ + CRLF + "error(10);" 'cannot redefine an array without using REDIM!
+ f12$ = f12$ + CRLF + "}else{"
+ ELSE
+ '--------ERASE EXISTING ARRAY IF NECESSARY--------
-'IMPORTANT: If array is not going to be preserved, it should be cleared before
-' creating the new array for memory considerations
+ 'IMPORTANT: If array is not going to be preserved, it should be cleared before
+ ' creating the new array for memory considerations
-'refresh lock ID (_MEM)
-f12$ = f12$ + CRLF + "((mem_lock*)((ptrszint*)" + n$ + ")[" + str2(4 * nume + 4 + 1 - 1) + "])->id=(++mem_lock_id);"
+ 'refresh lock ID (_MEM)
+ f12$ = f12$ + CRLF + "((mem_lock*)((ptrszint*)" + n$ + ")[" + str2(4 * nume + 4 + 1 - 1) + "])->id=(++mem_lock_id);"
-IF redimoption = 2 THEN
-f12$ = f12$ + CRLF + "static int32 preserved_elements;" 'must be put here for scope considerations
-END IF
+ IF redimoption = 2 THEN
+ f12$ = f12$ + CRLF + "static int32 preserved_elements;" 'must be put here for scope considerations
+ END IF
-'If array is defined, it must be destroyed first
-f12$ = f12$ + CRLF + "if (" + n$ + "[2]&1){" 'array is defined
+ 'If array is defined, it must be destroyed first
+ f12$ = f12$ + CRLF + "if (" + n$ + "[2]&1){" 'array is defined
-IF redimoption = 2 THEN
-f12$ = f12$ + CRLF + "preserved_elements=" + elesizestr$ + ";"
-GOTO skiperase
-END IF
+ IF redimoption = 2 THEN
+ f12$ = f12$ + CRLF + "preserved_elements=" + elesizestr$ + ";"
+ GOTO skiperase
+ END IF
-'Note: pointers to strings must be freed before array can be freed
-IF stringarray THEN
-f12$ = f12$ + CRLF + "tmp_long=" + elesizestr$ + ";"
-f12$ = f12$ + CRLF + "while(tmp_long--) qbs_free((qbs*)((uint64*)(" + n$ + "[0]))[tmp_long]);"
-END IF
-'Free array's memory
-IF stringarray THEN
-'Note: String arrays are never in cmem
-f12$ = f12$ + CRLF + "free((void*)(" + n$ + "[0]));"
-ELSE
-'Note: Array may be in cmem!
-f12$ = f12$ + CRLF + "if (" + n$ + "[2]&4){" 'array is in cmem
-f12$ = f12$ + CRLF + "cmem_dynamic_free((uint8*)(" + n$ + "[0]));"
-f12$ = f12$ + CRLF + "}else{" 'not in cmem
-f12$ = f12$ + CRLF + "free((void*)(" + n$ + "[0]));"
-f12$ = f12$ + CRLF + "}"
-END IF
+ 'Note: pointers to strings must be freed before array can be freed
+ IF stringarray THEN
+ f12$ = f12$ + CRLF + "tmp_long=" + elesizestr$ + ";"
+ f12$ = f12$ + CRLF + "while(tmp_long--) qbs_free((qbs*)((uint64*)(" + n$ + "[0]))[tmp_long]);"
+ END IF
+ 'Free array's memory
+ IF stringarray THEN
+ 'Note: String arrays are never in cmem
+ f12$ = f12$ + CRLF + "free((void*)(" + n$ + "[0]));"
+ ELSE
+ 'Note: Array may be in cmem!
+ f12$ = f12$ + CRLF + "if (" + n$ + "[2]&4){" 'array is in cmem
+ f12$ = f12$ + CRLF + "cmem_dynamic_free((uint8*)(" + n$ + "[0]));"
+ f12$ = f12$ + CRLF + "}else{" 'not in cmem
+ f12$ = f12$ + CRLF + "free((void*)(" + n$ + "[0]));"
+ f12$ = f12$ + CRLF + "}"
+ END IF
-skiperase:
+ skiperase:
-f12$ = f12$ + CRLF + "}" 'array was defined
-IF redimoption = 2 THEN
-f12$ = f12$ + CRLF + "else preserved_elements=0;" 'if array wasn't defined, no elements are preserved
-END IF
+ f12$ = f12$ + CRLF + "}" 'array was defined
+ IF redimoption = 2 THEN
+ f12$ = f12$ + CRLF + "else preserved_elements=0;" 'if array wasn't defined, no elements are preserved
+ END IF
-'--------ERASED ARRAY AS NECESSARY--------
-END IF 'redim specified
+ '--------ERASED ARRAY AS NECESSARY--------
+ END IF 'redim specified
-'--------CREATE ARRAY & CLEAN-UP CODE--------
-'Overwrite existing array dimension sizes/ranges
-f12$ = f12$ + CRLF + sd$
-IF stringarray THEN
+ '--------CREATE ARRAY & CLEAN-UP CODE--------
+ 'Overwrite existing array dimension sizes/ranges
+ f12$ = f12$ + CRLF + sd$
+ IF stringarray THEN
-'Note: String arrays are always created in 64bit memory
+ 'Note: String arrays are always created in 64bit memory
-IF redimoption = 2 THEN
-f12$ = f12$ + CRLF + "if (preserved_elements){"
+ IF redimoption = 2 THEN
+ f12$ = f12$ + CRLF + "if (preserved_elements){"
-f12$ = f12$ + CRLF + "static ptrszint tmp_long2;"
+ f12$ = f12$ + CRLF + "static ptrszint tmp_long2;"
-'free any qbs strings which will be lost in the realloc
-f12$ = f12$ + CRLF + "tmp_long=" + elesizestr$ + ";"
-f12$ = f12$ + CRLF + "if (tmp_long 0 AND elements <> arrayelementslist(currentid) THEN Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
-IF elements = 1 THEN id2.arrayelements = 1: ids(currentid).arrayelements = 1 'lucky guess
-arrayelementslist(currentid) = elements
+ IF arrayelementslist(currentid) <> 0 AND elements <> arrayelementslist(currentid) THEN Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
+ IF elements = 1 THEN id2.arrayelements = 1: ids(currentid).arrayelements = 1 'lucky guess
+ arrayelementslist(currentid) = elements
ELSE
-IF elements <> id2.arrayelements THEN Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
+ IF elements <> id2.arrayelements THEN Give_Error "Cannot change the number of elements an array has!": EXIT FUNCTION
END IF
curarg = 1
firsti = 1
FOR i = 1 TO n
-l$ = getelement(a$, i)
-IF l$ = "(" THEN b = b + 1
-IF l$ = ")" THEN b = b - 1
-IF (l$ = "," AND b = 0) OR (i = n) THEN
-IF i = n THEN
-IF l$ = "," THEN Give_Error "Array index missing": EXIT FUNCTION
-e$ = evaluatetotyp(getelements$(a$, firsti, i), 64&)
-IF Error_Happened THEN EXIT FUNCTION
-ELSE
-e$ = evaluatetotyp(getelements$(a$, firsti, i - 1), 64&)
-IF Error_Happened THEN EXIT FUNCTION
-END IF
-IF e$ = "" THEN Give_Error "Array index missing": EXIT FUNCTION
-argi = (elements - curarg) * 4 + 4
-IF curarg = 1 THEN
-r$ = r$ + "array_check((" + e$ + ")-" + n$ + "[" + str2(argi) + "]," + n$ + "[" + str2(argi + 1) + "])+"
-ELSE
-r$ = r$ + "array_check((" + e$ + ")-" + n$ + "[" + str2(argi) + "]," + n$ + "[" + str2(argi + 1) + "])*" + n$ + "[" + str2(argi + 2) + "]+"
-END IF
-firsti = i + 1
-curarg = curarg + 1
-END IF
+ l$ = getelement(a$, i)
+ IF l$ = "(" THEN b = b + 1
+ IF l$ = ")" THEN b = b - 1
+ IF (l$ = "," AND b = 0) OR (i = n) THEN
+ IF i = n THEN
+ IF l$ = "," THEN Give_Error "Array index missing": EXIT FUNCTION
+ e$ = evaluatetotyp(getelements$(a$, firsti, i), 64&)
+ IF Error_Happened THEN EXIT FUNCTION
+ ELSE
+ e$ = evaluatetotyp(getelements$(a$, firsti, i - 1), 64&)
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF
+ IF e$ = "" THEN Give_Error "Array index missing": EXIT FUNCTION
+ argi = (elements - curarg) * 4 + 4
+ IF curarg = 1 THEN
+ r$ = r$ + "array_check((" + e$ + ")-" + n$ + "[" + str2(argi) + "]," + n$ + "[" + str2(argi + 1) + "])+"
+ ELSE
+ r$ = r$ + "array_check((" + e$ + ")-" + n$ + "[" + str2(argi) + "]," + n$ + "[" + str2(argi + 1) + "])*" + n$ + "[" + str2(argi + 2) + "]+"
+ END IF
+ firsti = i + 1
+ curarg = curarg + 1
+ END IF
NEXT
r$ = LEFT$(r$, LEN(r$) - 1) 'remove trailing +
gotarrayindex:
@@ -12253,45 +12460,45 @@ END FUNCTION
SUB assign (a$, n)
FOR i = 1 TO n
-c = ASC(getelement$(a$, i))
-IF c = 40 THEN b = b + 1 '(
-IF c = 41 THEN b = b - 1 ')
-IF c = 61 AND b = 0 THEN '=
-IF i = 1 THEN Give_Error "Expected ... =": EXIT SUB
-IF i = n THEN Give_Error "Expected = ...": EXIT SUB
+ c = ASC(getelement$(a$, i))
+ IF c = 40 THEN b = b + 1 '(
+ IF c = 41 THEN b = b - 1 ')
+ IF c = 61 AND b = 0 THEN '=
+ IF i = 1 THEN Give_Error "Expected ... =": EXIT SUB
+ IF i = n THEN Give_Error "Expected = ...": EXIT SUB
-a2$ = fixoperationorder(getelements$(a$, 1, i - 1))
-IF Error_Happened THEN EXIT SUB
-l$ = tlayout$ + sp + "=" + sp
+ a2$ = fixoperationorder(getelements$(a$, 1, i - 1))
+ IF Error_Happened THEN EXIT SUB
+ l$ = tlayout$ + sp + "=" + sp
-'note: evaluating a2$ will fail if it is setting a function's return value without this check (as the function, not the return-variable) will be found by evaluate)
-IF i = 2 THEN 'lhs has only 1 element
-try = findid(a2$)
-IF Error_Happened THEN EXIT SUB
-DO WHILE try
-IF id.t THEN
-IF subfuncn = id.insubfuncn THEN 'avoid global before local
-IF (id.t AND ISUDT) = 0 THEN
-makeidrefer a2$, typ
-GOTO assignsimplevariable
-END IF
-END IF
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
-IF Error_Happened THEN EXIT SUB
-LOOP
-END IF
+ 'note: evaluating a2$ will fail if it is setting a function's return value without this check (as the function, not the return-variable) will be found by evaluate)
+ IF i = 2 THEN 'lhs has only 1 element
+ try = findid(a2$)
+ IF Error_Happened THEN EXIT SUB
+ DO WHILE try
+ IF id.t THEN
+ IF subfuncn = id.insubfuncn THEN 'avoid global before local
+ IF (id.t AND ISUDT) = 0 THEN
+ makeidrefer a2$, typ
+ GOTO assignsimplevariable
+ END IF
+ END IF
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(a2$) ELSE try = 0
+ IF Error_Happened THEN EXIT SUB
+ LOOP
+ END IF
-a2$ = evaluate$(a2$, typ): IF Error_Happened THEN EXIT SUB
-assignsimplevariable:
-IF (typ AND ISREFERENCE) = 0 THEN Give_Error "Expected variable =": EXIT SUB
-setrefer a2$, typ, getelements$(a$, i + 1, n), 0
-IF Error_Happened THEN EXIT SUB
-tlayout$ = l$ + tlayout$
+ a2$ = evaluate$(a2$, typ): IF Error_Happened THEN EXIT SUB
+ assignsimplevariable:
+ IF (typ AND ISREFERENCE) = 0 THEN Give_Error "Expected variable =": EXIT SUB
+ setrefer a2$, typ, getelements$(a$, i + 1, n), 0
+ IF Error_Happened THEN EXIT SUB
+ tlayout$ = l$ + tlayout$
-EXIT SUB
+ EXIT SUB
-END IF '=,b=0
+ END IF '=,b=0
NEXT
Give_Error "Expected =": EXIT SUB
END SUB
@@ -12318,11 +12525,11 @@ FUNCTION countelements (a$)
n = numelements(a$)
c = 1
FOR i = 1 TO n
-e$ = getelement$(a$, i)
-IF e$ = "(" THEN b = b + 1
-IF e$ = ")" THEN b = b - 1
-IF b < 0 THEN Give_Error "Unexpected ) encountered": EXIT FUNCTION
-IF e$ = "," AND b = 0 THEN c = c + 1
+ e$ = getelement$(a$, i)
+ IF e$ = "(" THEN b = b + 1
+ IF e$ = ")" THEN b = b - 1
+ IF b < 0 THEN Give_Error "Unexpected ) encountered": EXIT FUNCTION
+ IF e$ = "," AND b = 0 THEN c = c + 1
NEXT
countelements = c
END FUNCTION
@@ -12361,11 +12568,11 @@ varname$ = UCASE$(varname$)
IF dimsfarray = 1 THEN f = 0 ELSE f = 1
IF dimstatic <> 0 AND dimshared = 0 THEN
-'name will have include the sub/func name in its scope
-'variable/array will be created in main on startup
-defdatahandle = 18 'change from 13 to 18(global.txt)
-CLOSE #13: OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #13
-CLOSE #19: OPEN tmpdir$ + "mainfree.txt" FOR APPEND AS #19
+ 'name will have include the sub/func name in its scope
+ 'variable/array will be created in main on startup
+ defdatahandle = 18 'change from 13 to 18(global.txt)
+ CLOSE #13: OPEN tmpdir$ + "maindata.txt" FOR APPEND AS #13
+ CLOSE #19: OPEN tmpdir$ + "mainfree.txt" FOR APPEND AS #19
END IF
@@ -12377,96 +12584,96 @@ IF LEN(typ$) = 0 THEN Give_Error "DIM2: No type specified!": EXIT FUNCTION
'UDT
'is it a udt?
FOR i = 1 TO lasttype
-IF typ$ = RTRIM$(udtxname(i)) THEN
-dim2typepassback$ = RTRIM$(udtxcname(i))
+ IF typ$ = RTRIM$(udtxname(i)) THEN
+ dim2typepassback$ = RTRIM$(udtxcname(i))
-n$ = "UDT_" + varname$
+ n$ = "UDT_" + varname$
-'array of UDTs
-IF elements$ <> "" THEN
-arraydesc = 0
-IF f = 1 THEN
-try = findid(varname$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(varname$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
-bits = udtxsize(i)
-IF udtxbytealign(i) THEN
-IF bits MOD 8 THEN bits = bits + 8 - (bits MOD 8)
-END IF
+ 'array of UDTs
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ IF f = 1 THEN
+ try = findid(varname$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(varname$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
+ bits = udtxsize(i)
+ IF udtxbytealign(i) THEN
+ IF bits MOD 8 THEN bits = bits + 8 - (bits MOD 8)
+ END IF
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, -bits)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, -bits)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = UDTTYPE + i
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-id.n = cvarname$
+ id.arraytype = UDTTYPE + i
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ id.n = cvarname$
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-regid
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dim2exitfunc
-END IF
+ id.arrayelements = nume
+ id.callname = n$
+ regid
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dim2exitfunc
+ END IF
-'not an array of UDTs
-bits = udtxsize(i): bytes = bits \ 8
-IF bits MOD 8 THEN
-bytes = bytes + 1
-END IF
-n$ = scope2$ + n$
-IF f THEN PRINT #defdatahandle, "void *" + n$ + "=NULL;"
-clearid
-id.n = cvarname$
-id.t = UDTTYPE + i
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF f THEN PRINT #13, "cmem_sp-=" + str2(bytes) + ";"
-IF f THEN PRINT #13, "if (cmem_sp 6 THEN
-IF LEFT$(typ$, 9) <> "STRING * " THEN Give_Error "Expected STRING * number/constant": EXIT FUNCTION
+ IF LEN(typ$) > 6 THEN
+ IF LEFT$(typ$, 9) <> "STRING * " THEN Give_Error "Expected STRING * number/constant": EXIT FUNCTION
-c$ = RIGHT$(typ$, LEN(typ$) - 9)
+ c$ = RIGHT$(typ$, LEN(typ$) - 9)
-'constant check 2011
-hashfound = 0
-hashname$ = c$
-hashchkflags = HASHFLAG_CONSTANT
-hashres = HashFindRev(hashname$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-IF constsubfunc(hashresref) = subfuncn OR constsubfunc(hashresref) = 0 THEN
-IF constdefined(hashresref) THEN
-hashfound = 1
-EXIT DO
-END IF
-END IF
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-IF hashfound THEN
-i2 = hashresref
-t = consttype(i2)
-IF t AND ISSTRING THEN Give_Error "Expected STRING * numeric-constant": EXIT FUNCTION
-'convert value to general formats
-IF t AND ISFLOAT THEN
-v## = constfloat(i2)
-v&& = v##
-v~&& = v&&
-ELSE
-IF t AND ISUNSIGNED THEN
-v~&& = constuinteger(i2)
-v&& = v~&&
-v## = v&&
-ELSE
-v&& = constinteger(i2)
-v## = v&&
-v~&& = v&&
-END IF
-END IF
-IF v&& < 1 OR v&& > 9999999999 THEN Give_Error "STRING * out-of-range constant": EXIT FUNCTION
-bytes = v&&
-GOTO constantlenstr
-END IF
+ 'constant check 2011
+ hashfound = 0
+ hashname$ = c$
+ hashchkflags = HASHFLAG_CONSTANT
+ hashres = HashFindRev(hashname$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ IF constsubfunc(hashresref) = subfuncn OR constsubfunc(hashresref) = 0 THEN
+ IF constdefined(hashresref) THEN
+ hashfound = 1
+ EXIT DO
+ END IF
+ END IF
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+ IF hashfound THEN
+ i2 = hashresref
+ t = consttype(i2)
+ IF t AND ISSTRING THEN Give_Error "Expected STRING * numeric-constant": EXIT FUNCTION
+ 'convert value to general formats
+ IF t AND ISFLOAT THEN
+ v## = constfloat(i2)
+ v&& = v##
+ v~&& = v&&
+ ELSE
+ IF t AND ISUNSIGNED THEN
+ v~&& = constuinteger(i2)
+ v&& = v~&&
+ v## = v&&
+ ELSE
+ v&& = constinteger(i2)
+ v## = v&&
+ v~&& = v&&
+ END IF
+ END IF
+ IF v&& < 1 OR v&& > 9999999999 THEN Give_Error "STRING * out-of-range constant": EXIT FUNCTION
+ bytes = v&&
+ GOTO constantlenstr
+ END IF
-IF isuinteger(c$) = 0 THEN Give_Error "Number/Constant expected after *": EXIT FUNCTION
-IF LEN(c$) > 10 THEN Give_Error "Too many characters in number after *": EXIT FUNCTION
-bytes = VAL(c$)
-IF bytes = 0 THEN Give_Error "Cannot create a fixed string of length 0": EXIT FUNCTION
-constantlenstr:
-n$ = "STRING" + str2(bytes) + "_" + varname$
+ IF isuinteger(c$) = 0 THEN Give_Error "Number/Constant expected after *": EXIT FUNCTION
+ IF LEN(c$) > 10 THEN Give_Error "Too many characters in number after *": EXIT FUNCTION
+ bytes = VAL(c$)
+ IF bytes = 0 THEN Give_Error "Cannot create a fixed string of length 0": EXIT FUNCTION
+ constantlenstr:
+ n$ = "STRING" + str2(bytes) + "_" + varname$
-'array of fixed length strings
-IF elements$ <> "" THEN
-arraydesc = 0
-IF f = 1 THEN
-try = findid(varname$ + "$")
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(varname$ + "$") ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ 'array of fixed length strings
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ IF f = 1 THEN
+ try = findid(varname$ + "$")
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(varname$ + "$") ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, bytes)
-'IF arraydesc THEN goto dim2exitfunc 'id already exists!
-'clearid
+ 'nume = allocarray(n$, elements$, bytes)
+ 'IF arraydesc THEN goto dim2exitfunc 'id already exists!
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, bytes)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, bytes)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = STRINGTYPE + ISFIXEDLENGTH
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-id.n = cvarname$
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = STRINGTYPE + ISFIXEDLENGTH
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ id.n = cvarname$
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-id.tsize = bytes
-IF method = 0 THEN
-id.mayhave = "$" + str2(bytes)
-END IF
-IF method = 1 THEN
-id.musthave = "$" + str2(bytes)
-END IF
-regid
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dim2exitfunc
-END IF
+ id.arrayelements = nume
+ id.callname = n$
+ id.tsize = bytes
+ IF method = 0 THEN
+ id.mayhave = "$" + str2(bytes)
+ END IF
+ IF method = 1 THEN
+ id.musthave = "$" + str2(bytes)
+ END IF
+ regid
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dim2exitfunc
+ END IF
-'standard fixed length string
-n$ = scope2$ + n$
-IF f THEN PRINT #defdatahandle, "qbs *" + n$ + "=NULL;"
-IF f THEN PRINT #19, "qbs_free(" + n$ + ");" 'so descriptor can be freed
-clearid
-id.n = cvarname$
-id.t = STRINGTYPE + ISFIXEDLENGTH
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF f THEN PRINT #13, "cmem_sp-=" + str2(bytes) + ";"
-IF f THEN PRINT #13, "if (cmem_spchr,0," + str2(bytes) + ");"
-IF f THEN PRINT #13, "}"
-ELSE
-IF f THEN PRINT #13, "if(" + n$ + "==NULL){"
-o$ = "(uint8*)mem_static_malloc(" + str2$(bytes) + ")"
-IF f THEN PRINT #13, n$ + "=qbs_new_fixed(" + o$ + "," + str2$(bytes) + ",0);"
-IF f THEN PRINT #13, "memset(" + n$ + "->chr,0," + str2$(bytes) + ");"
-IF f THEN PRINT #13, "}"
-END IF
-id.tsize = bytes
-IF method = 0 THEN
-id.mayhave = "$" + str2(bytes)
-END IF
-IF method = 1 THEN
-id.musthave = "$" + str2(bytes)
-END IF
-regid
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dim2exitfunc
-END IF
+ 'standard fixed length string
+ n$ = scope2$ + n$
+ IF f THEN PRINT #defdatahandle, "qbs *" + n$ + "=NULL;"
+ IF f THEN PRINT #19, "qbs_free(" + n$ + ");" 'so descriptor can be freed
+ clearid
+ id.n = cvarname$
+ id.t = STRINGTYPE + ISFIXEDLENGTH
+ IF cmemlist(idn + 1) THEN
+ id.t = id.t + ISINCONVENTIONALMEMORY
+ IF f THEN PRINT #13, "if(" + n$ + "==NULL){"
+ IF f THEN PRINT #13, "cmem_sp-=" + str2(bytes) + ";"
+ IF f THEN PRINT #13, "if (cmem_spchr,0," + str2(bytes) + ");"
+ IF f THEN PRINT #13, "}"
+ ELSE
+ IF f THEN PRINT #13, "if(" + n$ + "==NULL){"
+ o$ = "(uint8*)mem_static_malloc(" + str2$(bytes) + ")"
+ IF f THEN PRINT #13, n$ + "=qbs_new_fixed(" + o$ + "," + str2$(bytes) + ",0);"
+ IF f THEN PRINT #13, "memset(" + n$ + "->chr,0," + str2$(bytes) + ");"
+ IF f THEN PRINT #13, "}"
+ END IF
+ id.tsize = bytes
+ IF method = 0 THEN
+ id.mayhave = "$" + str2(bytes)
+ END IF
+ IF method = 1 THEN
+ id.musthave = "$" + str2(bytes)
+ END IF
+ regid
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dim2exitfunc
+ END IF
-'variable length string processing
-n$ = "STRING_" + varname$
+ 'variable length string processing
+ n$ = "STRING_" + varname$
-'array of variable length strings
-IF elements$ <> "" THEN
-arraydesc = 0
-IF f = 1 THEN
-try = findid(varname$ + "$")
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(varname$ + "$") ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ 'array of variable length strings
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ IF f = 1 THEN
+ try = findid(varname$ + "$")
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(varname$ + "$") ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, -2147483647) '-2147483647=STRING
-'IF arraydesc THEN goto dim2exitfunc 'id already exists!
-'clearid
+ 'nume = allocarray(n$, elements$, -2147483647) '-2147483647=STRING
+ 'IF arraydesc THEN goto dim2exitfunc 'id already exists!
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, -2147483647)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, -2147483647)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.n = cvarname$
-id.arraytype = STRINGTYPE
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.n = cvarname$
+ id.arraytype = STRINGTYPE
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-IF method = 0 THEN
-id.mayhave = "$"
-END IF
-IF method = 1 THEN
-id.musthave = "$"
-END IF
-regid
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dim2exitfunc
-END IF
+ id.arrayelements = nume
+ id.callname = n$
+ IF method = 0 THEN
+ id.mayhave = "$"
+ END IF
+ IF method = 1 THEN
+ id.musthave = "$"
+ END IF
+ regid
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dim2exitfunc
+ END IF
-'standard variable length string
-n$ = scope2$ + n$
-clearid
-id.n = cvarname$
-id.t = STRINGTYPE
-IF cmemlist(idn + 1) THEN
-IF f THEN PRINT #defdatahandle, "qbs *" + n$ + "=NULL;"
-IF f THEN PRINT #13, "if (!" + n$ + ")" + n$ + "=qbs_new_cmem(0,0);"
-id.t = id.t + ISINCONVENTIONALMEMORY
-ELSE
-IF f THEN PRINT #defdatahandle, "qbs *" + n$ + "=NULL;"
-IF f THEN PRINT #13, "if (!" + n$ + ")" + n$ + "=qbs_new(0,0);"
-END IF
-IF f THEN PRINT #19, "qbs_free(" + n$ + ");"
-IF method = 0 THEN
-id.mayhave = "$"
-END IF
-IF method = 1 THEN
-id.musthave = "$"
-END IF
-regid
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dim2exitfunc
+ 'standard variable length string
+ n$ = scope2$ + n$
+ clearid
+ id.n = cvarname$
+ id.t = STRINGTYPE
+ IF cmemlist(idn + 1) THEN
+ IF f THEN PRINT #defdatahandle, "qbs *" + n$ + "=NULL;"
+ IF f THEN PRINT #13, "if (!" + n$ + ")" + n$ + "=qbs_new_cmem(0,0);"
+ id.t = id.t + ISINCONVENTIONALMEMORY
+ ELSE
+ IF f THEN PRINT #defdatahandle, "qbs *" + n$ + "=NULL;"
+ IF f THEN PRINT #13, "if (!" + n$ + ")" + n$ + "=qbs_new(0,0);"
+ END IF
+ IF f THEN PRINT #19, "qbs_free(" + n$ + ");"
+ IF method = 0 THEN
+ id.mayhave = "$"
+ END IF
+ IF method = 1 THEN
+ id.musthave = "$"
+ END IF
+ regid
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dim2exitfunc
END IF
IF LEFT$(typ$, 4) = "_BIT" THEN
-IF LEN(typ$) > 4 THEN
-IF LEFT$(typ$, 7) <> "_BIT * " THEN Give_Error "Expected _BIT * number": EXIT FUNCTION
-c$ = RIGHT$(typ$, LEN(typ$) - 7)
-IF isuinteger(c$) = 0 THEN Give_Error "Number expected after *": EXIT FUNCTION
-IF LEN(c$) > 2 THEN Give_Error "Too many characters in number after *": EXIT FUNCTION
-bits = VAL(c$)
-IF bits = 0 THEN Give_Error "Cannot create a bit variable of size 0 bits": EXIT FUNCTION
-IF bits > 57 THEN Give_Error "Cannot create a bit variable of size > 24 bits": EXIT FUNCTION
-ELSE
-bits = 1
-END IF
-IF bits <= 32 THEN ct$ = "int32" ELSE ct$ = "int64"
-IF unsgn THEN n$ = "U": ct$ = "u" + ct$
-n$ = n$ + "BIT" + str2(bits) + "_" + varname$
+ IF LEN(typ$) > 4 THEN
+ IF LEFT$(typ$, 7) <> "_BIT * " THEN Give_Error "Expected _BIT * number": EXIT FUNCTION
+ c$ = RIGHT$(typ$, LEN(typ$) - 7)
+ IF isuinteger(c$) = 0 THEN Give_Error "Number expected after *": EXIT FUNCTION
+ IF LEN(c$) > 2 THEN Give_Error "Too many characters in number after *": EXIT FUNCTION
+ bits = VAL(c$)
+ IF bits = 0 THEN Give_Error "Cannot create a bit variable of size 0 bits": EXIT FUNCTION
+ IF bits > 57 THEN Give_Error "Cannot create a bit variable of size > 24 bits": EXIT FUNCTION
+ ELSE
+ bits = 1
+ END IF
+ IF bits <= 32 THEN ct$ = "int32" ELSE ct$ = "int64"
+ IF unsgn THEN n$ = "U": ct$ = "u" + ct$
+ n$ = n$ + "BIT" + str2(bits) + "_" + varname$
-'array of bit-length variables
-IF elements$ <> "" THEN
-arraydesc = 0
-cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
-cmps$ = cmps$ + "`" + str2(bits)
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ 'array of bit-length variables
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
+ cmps$ = cmps$ + "`" + str2(bits)
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, -bits) 'passing a negative element size signifies bits not bytes
-'IF arraydesc THEN goto dim2exitfunc 'id already exists!
-'clearid
+ 'nume = allocarray(n$, elements$, -bits) 'passing a negative element size signifies bits not bytes
+ 'IF arraydesc THEN goto dim2exitfunc 'id already exists!
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, -bits)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, -bits)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.n = cvarname$
-id.arraytype = BITTYPE - 1 + bits
-IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.n = cvarname$
+ id.arraytype = BITTYPE - 1 + bits
+ IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-IF method = 0 THEN
-IF unsgn THEN id.mayhave = "~`" + str2(bits) ELSE id.mayhave = "`" + str2(bits)
-END IF
-IF method = 1 THEN
-IF unsgn THEN id.musthave = "~`" + str2(bits) ELSE id.musthave = "`" + str2(bits)
-END IF
-regid
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dim2exitfunc
-END IF
-'standard bit-length variable
-n$ = scope2$ + n$
-PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-PRINT #13, "if(" + n$ + "==NULL){"
-PRINT #13, "cmem_sp-=4;"
-PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
-cmps$ = cmps$ + "%%"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
+ ct$ = "int8"
+ IF unsgn THEN n$ = "U": ct$ = "u" + ct$
+ n$ = n$ + "BYTE_" + varname$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
+ cmps$ = cmps$ + "%%"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, 1)
-'IF arraydesc THEN goto dim2exitfunc
-'clearid
+ 'nume = allocarray(n$, elements$, 1)
+ 'IF arraydesc THEN goto dim2exitfunc
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, 1)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = BYTETYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = BYTETYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = BYTETYPE: IF unsgn THEN id.t = id.t + ISUNSIGNED
-IF f = 1 THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f = 1 THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f = 1 THEN PRINT #13, "cmem_sp-=1;"
-IF f = 1 THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f = 1 THEN PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
-cmps$ = cmps$ + "%"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
+ cmps$ = cmps$ + "%"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, 2)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, 2)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = INTEGERTYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = INTEGERTYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = INTEGERTYPE: IF unsgn THEN id.t = id.t + ISUNSIGNED
-IF f = 1 THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f = 1 THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f = 1 THEN PRINT #13, "cmem_sp-=2;"
-IF f = 1 THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f = 1 THEN PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
-cmps$ = cmps$ + "%&"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ ct$ = "ptrszint"
+ IF unsgn THEN n$ = "U": ct$ = "u" + ct$
+ n$ = n$ + "OFFSET_" + varname$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
+ cmps$ = cmps$ + "%&"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, OS_BITS \ 8)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, OS_BITS \ 8)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = OFFSETTYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = OFFSETTYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = OFFSETTYPE: IF unsgn THEN id.t = id.t + ISUNSIGNED
-IF f = 1 THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f = 1 THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f = 1 THEN PRINT #13, "cmem_sp-=" + str2(OS_BITS \ 8) + ";"
-IF f = 1 THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f = 1 THEN PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
-cmps$ = cmps$ + "&"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ ct$ = "int32"
+ IF unsgn THEN n$ = "U": ct$ = "u" + ct$
+ n$ = n$ + "LONG_" + varname$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
+ cmps$ = cmps$ + "&"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, 4)
-'IF arraydesc THEN goto dim2exitfunc
-'clearid
+ 'nume = allocarray(n$, elements$, 4)
+ 'IF arraydesc THEN goto dim2exitfunc
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, 4)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, 4)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = LONGTYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = LONGTYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = LONGTYPE: IF unsgn THEN id.t = id.t + ISUNSIGNED
-IF f = 1 THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f = 1 THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f = 1 THEN PRINT #13, "cmem_sp-=4;"
-IF f = 1 THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f = 1 THEN PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
-cmps$ = cmps$ + "&&"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ ct$ = "int64"
+ IF unsgn THEN n$ = "U": ct$ = "u" + ct$
+ n$ = n$ + "INTEGER64_" + varname$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$: IF unsgn THEN cmps$ = cmps$ + "~"
+ cmps$ = cmps$ + "&&"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, 8)
-'IF arraydesc THEN goto dim2exitfunc
-'clearid
+ 'nume = allocarray(n$, elements$, 8)
+ 'IF arraydesc THEN goto dim2exitfunc
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, 8)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, 8)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = INTEGER64TYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = INTEGER64TYPE: IF unsgn THEN id.arraytype = id.arraytype + ISUNSIGNED
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = INTEGER64TYPE: IF unsgn THEN id.t = id.t + ISUNSIGNED
-IF f = 1 THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f = 1 THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f = 1 THEN PRINT #13, "cmem_sp-=8;"
-IF f = 1 THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f = 1 THEN PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$ + "!"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ ct$ = "float"
+ n$ = n$ + "SINGLE_" + varname$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$ + "!"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, 4)
-'IF arraydesc THEN goto dim2exitfunc
-'clearid
+ 'nume = allocarray(n$, elements$, 4)
+ 'IF arraydesc THEN goto dim2exitfunc
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, 4)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, 4)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = SINGLETYPE
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = SINGLETYPE
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = SINGLETYPE
-IF f = 1 THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f = 1 THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f = 1 THEN PRINT #13, "cmem_sp-=4;"
-IF f = 1 THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f = 1 THEN PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$ + "#"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ ct$ = "double"
+ n$ = n$ + "DOUBLE_" + varname$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$ + "#"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, 8)
-'IF arraydesc THEN goto dim2exitfunc
-'clearid
+ 'nume = allocarray(n$, elements$, 8)
+ 'IF arraydesc THEN goto dim2exitfunc
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, 8)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, 8)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = DOUBLETYPE
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = DOUBLETYPE
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = DOUBLETYPE
-IF f = 1 THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f = 1 THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f = 1 THEN PRINT #13, "cmem_sp-=8;"
-IF f = 1 THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f = 1 THEN PRINT #13, "if (cmem_sp "" THEN
-arraydesc = 0
-cmps$ = varname$ + "##"
-IF f = 1 THEN
-try = findid(cmps$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (id.arraytype) THEN
-l$ = RTRIM$(id.cn)
-arraydesc = currentid: scope2$ = scope$
-EXIT DO
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-n$ = scope2$ + "ARRAY_" + n$
+ ct$ = "long double"
+ n$ = n$ + "FLOAT_" + varname$
+ IF elements$ <> "" THEN
+ arraydesc = 0
+ cmps$ = varname$ + "##"
+ IF f = 1 THEN
+ try = findid(cmps$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (id.arraytype) THEN
+ l$ = RTRIM$(id.cn)
+ arraydesc = currentid: scope2$ = scope$
+ EXIT DO
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(cmps$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ n$ = scope2$ + "ARRAY_" + n$
-'nume = allocarray(n$, elements$, 32)
-'IF arraydesc THEN goto dim2exitfunc
-'clearid
+ 'nume = allocarray(n$, elements$, 32)
+ 'IF arraydesc THEN goto dim2exitfunc
+ 'clearid
-IF f = 1 THEN
+ IF f = 1 THEN
-IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
-E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
-END IF
-nume = allocarray(n$, elements$, 32)
-IF Error_Happened THEN EXIT FUNCTION
-l$ = l$ + sp + tlayout$
-IF arraydesc THEN GOTO dim2exitfunc
-clearid
+ IF LEN(elements$) = 1 AND ASC(elements$) = 63 THEN '"?"
+ E = arrayelementslist(idn + 1): IF E THEN elements$ = elements$ + str2$(E) 'eg. "?3" for a 3 dimensional array
+ END IF
+ nume = allocarray(n$, elements$, 32)
+ IF Error_Happened THEN EXIT FUNCTION
+ l$ = l$ + sp + tlayout$
+ IF arraydesc THEN GOTO dim2exitfunc
+ clearid
-ELSE
-clearid
-IF elements$ = "?" THEN
-nume = -1
-id.linkid = glinkid
-id.linkarg = glinkarg
-ELSE
-nume = VAL(elements$)
-END IF
-END IF
+ ELSE
+ clearid
+ IF elements$ = "?" THEN
+ nume = -1
+ id.linkid = glinkid
+ id.linkarg = glinkarg
+ ELSE
+ nume = VAL(elements$)
+ END IF
+ END IF
-id.arraytype = FLOATTYPE
-IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
-IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
+ id.arraytype = FLOATTYPE
+ IF cmemlist(idn + 1) THEN id.arraytype = id.arraytype + ISINCONVENTIONALMEMORY
+ IF nume > 65536 THEN nume = nume - 65536: id.staticarray = 1
-id.arrayelements = nume
-id.callname = n$
-ELSE
-n$ = scope2$ + n$
-clearid
-id.t = FLOATTYPE
-IF f THEN PRINT #defdatahandle, ct$ + " *" + n$ + "=NULL;"
-IF f THEN PRINT #13, "if(" + n$ + "==NULL){"
-IF cmemlist(idn + 1) THEN
-id.t = id.t + ISINCONVENTIONALMEMORY
-IF f THEN PRINT #13, "cmem_sp-=32;"
-IF f THEN PRINT #13, n$ + "=(" + ct$ + "*)(dblock+cmem_sp);"
-IF f THEN PRINT #13, "if (cmem_sp 0 AND dimshared = 0 THEN
-defdatahandle = 13
-CLOSE #13: OPEN tmpdir$ + "data" + str2$(subfuncn) + ".txt" FOR APPEND AS #13
-CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR APPEND AS #19
+ defdatahandle = 13
+ CLOSE #13: OPEN tmpdir$ + "data" + str2$(subfuncn) + ".txt" FOR APPEND AS #13
+ CLOSE #19: OPEN tmpdir$ + "free" + str2$(subfuncn) + ".txt" FOR APPEND AS #19
END IF
tlayout$ = l$
@@ -13533,11 +13740,11 @@ o = 0 'the fixed/known part of the offset
incmem = 0
IF id.t THEN
-u = id.t AND 511
-IF id.t AND ISINCONVENTIONALMEMORY THEN incmem = 1
+ u = id.t AND 511
+ IF id.t AND ISINCONVENTIONALMEMORY THEN incmem = 1
ELSE
-u = id.arraytype AND 511
-IF id.arraytype AND ISINCONVENTIONALMEMORY THEN incmem = 1
+ u = id.arraytype AND 511
+ IF id.arraytype AND ISINCONVENTIONALMEMORY THEN incmem = 1
END IF
E = 0
@@ -13558,39 +13765,39 @@ IF E = 0 THEN E = udtxnext(u) ELSE E = udtenext(E)
IF E = 0 THEN Give_Error "Element not defined": EXIT FUNCTION
n2$ = RTRIM$(udtename(E))
IF udtebytealign(E) THEN
-IF o MOD 8 THEN o = o + (8 - (o MOD 8))
+ IF o MOD 8 THEN o = o + (8 - (o MOD 8))
END IF
IF n$ <> n2$ THEN
-'increment fixed offset
-o = o + udtesize(E)
-GOTO udtfindele
+ 'increment fixed offset
+ o = o + udtesize(E)
+ GOTO udtfindele
END IF
'check symbol after element's name (if given) is correct
IF LEN(nsym$) THEN
-IF udtetype(E) AND ISUDT THEN Give_Error "Invalid symbol after user defined type": EXIT FUNCTION
-IF ntyp <> udtetype(E) OR ntypsize <> udtetypesize(E) THEN
-IF nsym$ = "$" AND ((udtetype(E) AND ISFIXEDLENGTH) <> 0) THEN GOTO correctsymbol
-Give_Error "Incorrect symbol after element name": EXIT FUNCTION
-END IF
+ IF udtetype(E) AND ISUDT THEN Give_Error "Invalid symbol after user defined type": EXIT FUNCTION
+ IF ntyp <> udtetype(E) OR ntypsize <> udtetypesize(E) THEN
+ IF nsym$ = "$" AND ((udtetype(E) AND ISFIXEDLENGTH) <> 0) THEN GOTO correctsymbol
+ Give_Error "Incorrect symbol after element name": EXIT FUNCTION
+ END IF
END IF
correctsymbol:
'Move into another UDT structure?
IF i <> n THEN
-IF (udtetype(E) AND ISUDT) = 0 THEN Give_Error "Expected user defined type": EXIT FUNCTION
-u = udtetype(E) AND 511
-E = 0
-i = i + 1
-GOTO udtfindelenext
+ IF (udtetype(E) AND ISUDT) = 0 THEN Give_Error "Expected user defined type": EXIT FUNCTION
+ u = udtetype(E) AND 511
+ E = 0
+ i = i + 1
+ GOTO udtfindelenext
END IF
'Change e reference to u³0 reference?
IF udtetype(E) AND ISUDT THEN
-u = udtetype(E) AND 511
-E = 0
+ u = udtetype(E) AND 511
+ E = 0
END IF
fulludt:
@@ -13601,11 +13808,11 @@ IF o MOD 8 THEN Give_Error "QB64 cannot handle bit offsets within user defined t
o = o \ 8
IF o$ <> "" THEN
-IF o <> 0 THEN 'dont add an unnecessary 0
-o$ = o$ + "+" + str2$(o)
-END IF
+ IF o <> 0 THEN 'dont add an unnecessary 0
+ o$ = o$ + "+" + str2$(o)
+ END IF
ELSE
-o$ = str2$(o)
+ o$ = str2$(o)
END IF
r$ = r$ + o$
@@ -13615,7 +13822,7 @@ typ = udtetype(E) + ISUDT + ISREFERENCE
'full udt override:
IF E = 0 THEN
-typ = u + ISUDT + ISREFERENCE
+ typ = u + ISUDT + ISREFERENCE
END IF
IF obak$ <> "" THEN typ = typ + ISARRAY
@@ -13648,485 +13855,485 @@ n = numelements(a$)
b = 0 'bracketting level
FOR i = 1 TO n
-reevaluate:
+ reevaluate:
-l$ = getelement(a$, i)
+ l$ = getelement(a$, i)
-IF Debug THEN PRINT #9, "#*#*#* reevaluating:" + l$, i
+ IF Debug THEN PRINT #9, "#*#*#* reevaluating:" + l$, i
-IF i <> n THEN nextl$ = getelement(a$, i + 1) ELSE nextl$ = ""
+ IF i <> n THEN nextl$ = getelement(a$, i + 1) ELSE nextl$ = ""
-'''getclass cl$, i, cli()
+ '''getclass cl$, i, cli()
-IF b = 0 THEN 'don't evaluate anything within brackets
+ IF b = 0 THEN 'don't evaluate anything within brackets
-IF Debug THEN PRINT #9, l$
+ IF Debug THEN PRINT #9, l$
-l2$ = l$ 'pure version of l$
-FOR try_method = 1 TO 4
-l$ = l2$
-IF try_method = 2 OR try_method = 4 THEN
-IF Error_Happened THEN EXIT FUNCTION
-dtyp$ = removesymbol(l$): IF Error_Happened THEN dtyp$ = "": Error_Happened = 0
-IF LEN(dtyp$) = 0 THEN
-IF isoperator(l$) = 0 THEN
-IF isvalidvariable(l$) THEN
-IF LEFT$(l$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(l$)) - 64
-l$ = l$ + defineextaz(v)
-END IF
-END IF
-ELSE
-l$ = l2$
-END IF
-END IF
-try = findid(l$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
+ l2$ = l$ 'pure version of l$
+ FOR try_method = 1 TO 4
+ l$ = l2$
+ IF try_method = 2 OR try_method = 4 THEN
+ IF Error_Happened THEN EXIT FUNCTION
+ dtyp$ = removesymbol(l$): IF Error_Happened THEN dtyp$ = "": Error_Happened = 0
+ IF LEN(dtyp$) = 0 THEN
+ IF isoperator(l$) = 0 THEN
+ IF isvalidvariable(l$) THEN
+ IF LEFT$(l$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(l$)) - 64
+ l$ = l$ + defineextaz(v)
+ END IF
+ END IF
+ ELSE
+ l$ = l2$
+ END IF
+ END IF
+ try = findid(l$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
-IF Debug THEN PRINT #9, try
+ IF Debug THEN PRINT #9, try
-'is l$ an array?
-IF nextl$ = "(" THEN
-IF id.arraytype THEN
-IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
-arrayid = currentid
-constequation = 0
-i2 = i + 2
-b2 = 0
-evalnextele3:
-l2$ = getelement(a$, i2)
-IF l2$ = "(" THEN b2 = b2 + 1
-IF l2$ = ")" THEN
-b2 = b2 - 1
-IF b2 = -1 THEN
-c$ = arrayreference(getelements$(a$, i + 2, i2 - 1), typ2)
-IF Error_Happened THEN EXIT FUNCTION
-i = i2
+ 'is l$ an array?
+ IF nextl$ = "(" THEN
+ IF id.arraytype THEN
+ IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
+ arrayid = currentid
+ constequation = 0
+ i2 = i + 2
+ b2 = 0
+ evalnextele3:
+ l2$ = getelement(a$, i2)
+ IF l2$ = "(" THEN b2 = b2 + 1
+ IF l2$ = ")" THEN
+ b2 = b2 - 1
+ IF b2 = -1 THEN
+ c$ = arrayreference(getelements$(a$, i + 2, i2 - 1), typ2)
+ IF Error_Happened THEN EXIT FUNCTION
+ i = i2
-'UDT
-IF typ2 AND ISUDT THEN
-'print "arrayref returned:"+c$
-getid arrayid
-IF Error_Happened THEN EXIT FUNCTION
-o$ = RIGHT$(c$, LEN(c$) - INSTR(c$, sp3))
-'change o$ to a byte offset if necessary
-u = typ2 AND 511
-s = udtxsize(u)
-IF udtxbytealign(u) THEN
-IF s MOD 8 THEN s = s + (8 - (s MOD 8)) 'round up to nearest byte
-s = s \ 8
-END IF
-o$ = "(" + o$ + ")*" + str2$(s)
-'print "calling evaludt with o$:"+o$
-GOTO evaludt
-END IF
+ 'UDT
+ IF typ2 AND ISUDT THEN
+ 'print "arrayref returned:"+c$
+ getid arrayid
+ IF Error_Happened THEN EXIT FUNCTION
+ o$ = RIGHT$(c$, LEN(c$) - INSTR(c$, sp3))
+ 'change o$ to a byte offset if necessary
+ u = typ2 AND 511
+ s = udtxsize(u)
+ IF udtxbytealign(u) THEN
+ IF s MOD 8 THEN s = s + (8 - (s MOD 8)) 'round up to nearest byte
+ s = s \ 8
+ END IF
+ o$ = "(" + o$ + ")*" + str2$(s)
+ 'print "calling evaludt with o$:"+o$
+ GOTO evaludt
+ END IF
-GOTO evalednextele3
-END IF
-END IF
-i2 = i2 + 1
-GOTO evalnextele3
-evalednextele3:
-blockn = blockn + 1
-block(blockn) = c$
-evaledblock(blockn) = 2
-blocktype(blockn) = typ2
-IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
-GOTO evaled
-END IF
-END IF
+ GOTO evalednextele3
+ END IF
+ END IF
+ i2 = i2 + 1
+ GOTO evalnextele3
+ evalednextele3:
+ blockn = blockn + 1
+ block(blockn) = c$
+ evaledblock(blockn) = 2
+ blocktype(blockn) = typ2
+ IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
+ GOTO evaled
+ END IF
+ END IF
-ELSE
-'not followed by "("
+ ELSE
+ 'not followed by "("
-'is l$ a simple variable?
-IF id.t <> 0 AND (id.t AND ISUDT) = 0 THEN
-IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
-constequation = 0
-blockn = blockn + 1
-makeidrefer block(blockn), blocktype(blockn)
-IF (blocktype(blockn) AND ISSTRING) THEN stringprocessinghappened = 1
-evaledblock(blockn) = 2
-GOTO evaled
-END IF
-END IF
+ 'is l$ a simple variable?
+ IF id.t <> 0 AND (id.t AND ISUDT) = 0 THEN
+ IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
+ constequation = 0
+ blockn = blockn + 1
+ makeidrefer block(blockn), blocktype(blockn)
+ IF (blocktype(blockn) AND ISSTRING) THEN stringprocessinghappened = 1
+ evaledblock(blockn) = 2
+ GOTO evaled
+ END IF
+ END IF
-'is l$ a UDT?
-IF id.t AND ISUDT THEN
-IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
-constequation = 0
-o$ = ""
-evaludt:
-b2 = 0
-i3 = i + 1
-FOR i2 = i3 TO n
-e2$ = getelement(a$, i2)
-IF e2$ = "(" THEN b2 = b2 + 1
-IF b2 = 0 THEN
-IF e2$ = ")" OR isoperator(e2$) THEN
-i4 = i2 - 1
-GOTO gotudt
-END IF
-END IF
-IF e2$ = ")" THEN b2 = b2 - 1
-NEXT
-i4 = n
-gotudt:
-IF i4 < i3 THEN e$ = "" ELSE e$ = getelements$(a$, i3, i4)
-'PRINT "UDTREFERENCE:";l$; e$
-e$ = udtreference(o$, e$, typ2)
-IF Error_Happened THEN EXIT FUNCTION
-i = i4
-blockn = blockn + 1
-block(blockn) = e$
-evaledblock(blockn) = 2
-blocktype(blockn) = typ2
-'is the following next necessary?
-'IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
-GOTO evaled
-END IF
-END IF
+ 'is l$ a UDT?
+ IF id.t AND ISUDT THEN
+ IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
+ constequation = 0
+ o$ = ""
+ evaludt:
+ b2 = 0
+ i3 = i + 1
+ FOR i2 = i3 TO n
+ e2$ = getelement(a$, i2)
+ IF e2$ = "(" THEN b2 = b2 + 1
+ IF b2 = 0 THEN
+ IF e2$ = ")" OR isoperator(e2$) THEN
+ i4 = i2 - 1
+ GOTO gotudt
+ END IF
+ END IF
+ IF e2$ = ")" THEN b2 = b2 - 1
+ NEXT
+ i4 = n
+ gotudt:
+ IF i4 < i3 THEN e$ = "" ELSE e$ = getelements$(a$, i3, i4)
+ 'PRINT "UDTREFERENCE:";l$; e$
+ e$ = udtreference(o$, e$, typ2)
+ IF Error_Happened THEN EXIT FUNCTION
+ i = i4
+ blockn = blockn + 1
+ block(blockn) = e$
+ evaledblock(blockn) = 2
+ blocktype(blockn) = typ2
+ 'is the following next necessary?
+ 'IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
+ GOTO evaled
+ END IF
+ END IF
-END IF '"(" or no "("
+ END IF '"(" or no "("
-'is l$ a function?
-IF id.subfunc = 1 THEN
-constequation = 0
-IF getelement(a$, i + 1) = "(" THEN
-i2 = i + 2
-b2 = 0
-args = 1
-evalnextele:
-l2$ = getelement(a$, i2)
-IF l2$ = "(" THEN b2 = b2 + 1
-IF l2$ = ")" THEN
-b2 = b2 - 1
-IF b2 = -1 THEN
-IF i2 = i + 2 THEN Give_Error "Expected (...)": EXIT FUNCTION
-c$ = evaluatefunc(getelements$(a$, i + 2, i2 - 1), args, typ2)
-IF Error_Happened THEN EXIT FUNCTION
-i = i2
-GOTO evalednextele
-END IF
-END IF
-IF l2$ = "," AND b2 = 0 THEN args = args + 1
-i2 = i2 + 1
-GOTO evalnextele
-ELSE
-'no brackets
-c$ = evaluatefunc("", 0, typ2)
-IF Error_Happened THEN EXIT FUNCTION
-END IF
-evalednextele:
-blockn = blockn + 1
-block(blockn) = c$
-evaledblock(blockn) = 2
-blocktype(blockn) = typ2
-IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
-GOTO evaled
-END IF
+ 'is l$ a function?
+ IF id.subfunc = 1 THEN
+ constequation = 0
+ IF getelement(a$, i + 1) = "(" THEN
+ i2 = i + 2
+ b2 = 0
+ args = 1
+ evalnextele:
+ l2$ = getelement(a$, i2)
+ IF l2$ = "(" THEN b2 = b2 + 1
+ IF l2$ = ")" THEN
+ b2 = b2 - 1
+ IF b2 = -1 THEN
+ IF i2 = i + 2 THEN Give_Error "Expected (...)": EXIT FUNCTION
+ c$ = evaluatefunc(getelements$(a$, i + 2, i2 - 1), args, typ2)
+ IF Error_Happened THEN EXIT FUNCTION
+ i = i2
+ GOTO evalednextele
+ END IF
+ END IF
+ IF l2$ = "," AND b2 = 0 THEN args = args + 1
+ i2 = i2 + 1
+ GOTO evalnextele
+ ELSE
+ 'no brackets
+ c$ = evaluatefunc("", 0, typ2)
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF
+ evalednextele:
+ blockn = blockn + 1
+ block(blockn) = c$
+ evaledblock(blockn) = 2
+ blocktype(blockn) = typ2
+ IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
+ GOTO evaled
+ END IF
-IF try = 2 THEN findanotherid = 1: try = findid(l$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-NEXT 'try method (1-4)
+ IF try = 2 THEN findanotherid = 1: try = findid(l$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ NEXT 'try method (1-4)
-'assume l$ an undefined array?
+ 'assume l$ an undefined array?
-IF i <> n THEN
-IF getelement$(a$, i + 1) = "(" THEN
-IF isoperator(l$) = 0 THEN
-IF isvalidvariable(l$) THEN
-IF Debug THEN
-PRINT #9, "**************"
-PRINT #9, "about to auto-create array:" + l$, i
-PRINT #9, "**************"
-END IF
-dtyp$ = removesymbol(l$)
-IF Error_Happened THEN EXIT FUNCTION
-'count the number of elements
-nume = 1
-b2 = 0
-FOR i2 = i + 2 TO n
-e$ = getelement(a$, i2)
-IF e$ = "(" THEN b2 = b2 + 1
-IF b2 = 0 AND e$ = "," THEN nume = nume + 1
-IF e$ = ")" THEN b2 = b2 - 1
-IF b2 = -1 THEN EXIT FOR
-NEXT
-fakee$ = "10": FOR i2 = 2 TO nume: fakee$ = fakee$ + sp + "," + sp + "10": NEXT
-IF Debug THEN PRINT #9, "evaluate:creating undefined array using dim2(" + l$ + "," + dtyp$ + ",1," + fakee$ + ")"
-IF Error_Happened THEN EXIT FUNCTION
-olddimstatic = dimstatic
-method = 1
-IF subfuncn THEN
-autoarray = 1 'move dimensioning of auto array to data???.txt from inline
-'static array declared by STATIC name()?
-'check if varname is on the static list
-xi = 1
-FOR x = 1 TO staticarraylistn
-varname2$ = getelement$(staticarraylist, xi): xi = xi + 1
-typ2$ = getelement$(staticarraylist, xi): xi = xi + 1
-dimmethod2 = VAL(getelement$(staticarraylist, xi)): xi = xi + 1
-'check if they are similar
-IF UCASE$(l$) = UCASE$(varname2$) THEN
-l3$ = l2$: s$ = removesymbol(l3$)
-IF symbol2fulltypename$(dtyp$) = typ2$ OR (dimmethod2 = 0 AND s$ = "") THEN
-IF Error_Happened THEN EXIT FUNCTION
-'adopt properties
-l$ = varname2$
-dtyp$ = typ2$
-method = dimmethod2
-dimstatic = 3
-END IF 'typ
-IF Error_Happened THEN EXIT FUNCTION
-END IF 'varname
-NEXT
-END IF 'subfuncn
-ignore = dim2(l$, dtyp$, method, fakee$)
-IF Error_Happened THEN EXIT FUNCTION
-dimstatic = olddimstatic
-IF Debug THEN PRINT #9, "#*#*#* dim2 has returned!!!"
-GOTO reevaluate
-END IF
-END IF
-END IF
-END IF
+ IF i <> n THEN
+ IF getelement$(a$, i + 1) = "(" THEN
+ IF isoperator(l$) = 0 THEN
+ IF isvalidvariable(l$) THEN
+ IF Debug THEN
+ PRINT #9, "**************"
+ PRINT #9, "about to auto-create array:" + l$, i
+ PRINT #9, "**************"
+ END IF
+ dtyp$ = removesymbol(l$)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'count the number of elements
+ nume = 1
+ b2 = 0
+ FOR i2 = i + 2 TO n
+ e$ = getelement(a$, i2)
+ IF e$ = "(" THEN b2 = b2 + 1
+ IF b2 = 0 AND e$ = "," THEN nume = nume + 1
+ IF e$ = ")" THEN b2 = b2 - 1
+ IF b2 = -1 THEN EXIT FOR
+ NEXT
+ fakee$ = "10": FOR i2 = 2 TO nume: fakee$ = fakee$ + sp + "," + sp + "10": NEXT
+ IF Debug THEN PRINT #9, "evaluate:creating undefined array using dim2(" + l$ + "," + dtyp$ + ",1," + fakee$ + ")"
+ IF Error_Happened THEN EXIT FUNCTION
+ olddimstatic = dimstatic
+ method = 1
+ IF subfuncn THEN
+ autoarray = 1 'move dimensioning of auto array to data???.txt from inline
+ 'static array declared by STATIC name()?
+ 'check if varname is on the static list
+ xi = 1
+ FOR x = 1 TO staticarraylistn
+ varname2$ = getelement$(staticarraylist, xi): xi = xi + 1
+ typ2$ = getelement$(staticarraylist, xi): xi = xi + 1
+ dimmethod2 = VAL(getelement$(staticarraylist, xi)): xi = xi + 1
+ 'check if they are similar
+ IF UCASE$(l$) = UCASE$(varname2$) THEN
+ l3$ = l2$: s$ = removesymbol(l3$)
+ IF symbol2fulltypename$(dtyp$) = typ2$ OR (dimmethod2 = 0 AND s$ = "") THEN
+ IF Error_Happened THEN EXIT FUNCTION
+ 'adopt properties
+ l$ = varname2$
+ dtyp$ = typ2$
+ method = dimmethod2
+ dimstatic = 3
+ END IF 'typ
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF 'varname
+ NEXT
+ END IF 'subfuncn
+ ignore = dim2(l$, dtyp$, method, fakee$)
+ IF Error_Happened THEN EXIT FUNCTION
+ dimstatic = olddimstatic
+ IF Debug THEN PRINT #9, "#*#*#* dim2 has returned!!!"
+ GOTO reevaluate
+ END IF
+ END IF
+ END IF
+ END IF
-l$ = l2$ 'restore l$
+ l$ = l2$ 'restore l$
-END IF 'b=0
+ END IF 'b=0
-IF l$ = "(" THEN
-IF b = 0 THEN i1 = i + 1
-b = b + 1
-END IF
+ IF l$ = "(" THEN
+ IF b = 0 THEN i1 = i + 1
+ b = b + 1
+ END IF
-IF b = 0 THEN
-blockn = blockn + 1
-block(blockn) = l$
-evaledblock(blockn) = 0
-END IF
+ IF b = 0 THEN
+ blockn = blockn + 1
+ block(blockn) = l$
+ evaledblock(blockn) = 0
+ END IF
-IF l$ = ")" THEN
-b = b - 1
-IF b = 0 THEN
-c$ = evaluate(getelements$(a$, i1, i - 1), typ2)
-IF Error_Happened THEN EXIT FUNCTION
-IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
-blockn = blockn + 1
-IF (typ2 AND ISPOINTER) THEN
-block(blockn) = c$
-ELSE
-block(blockn) = "(" + c$ + ")"
-END IF
-evaledblock(blockn) = 1
-blocktype(blockn) = typ2
-END IF
-END IF
-evaled:
+ IF l$ = ")" THEN
+ b = b - 1
+ IF b = 0 THEN
+ c$ = evaluate(getelements$(a$, i1, i - 1), typ2)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF (typ2 AND ISSTRING) THEN stringprocessinghappened = 1
+ blockn = blockn + 1
+ IF (typ2 AND ISPOINTER) THEN
+ block(blockn) = c$
+ ELSE
+ block(blockn) = "(" + c$ + ")"
+ END IF
+ evaledblock(blockn) = 1
+ blocktype(blockn) = typ2
+ END IF
+ END IF
+ evaled:
NEXT
r$ = "" 'return value
IF Debug THEN PRINT #9, "evaluated blocks:";
FOR i = 1 TO blockn
-IF i <> blockn THEN
-IF Debug THEN PRINT #9, block(i) + CHR$(219);
-ELSE
-IF Debug THEN PRINT #9, block(i)
-END IF
+ IF i <> blockn THEN
+ IF Debug THEN PRINT #9, block(i) + CHR$(219);
+ ELSE
+ IF Debug THEN PRINT #9, block(i)
+ END IF
NEXT
'identify any referencable values
FOR i = 1 TO blockn
-IF isoperator(block(i)) = 0 THEN
-IF evaledblock(i) = 0 THEN
+ IF isoperator(block(i)) = 0 THEN
+ IF evaledblock(i) = 0 THEN
-'a number?
-c = ASC(LEFT$(block(i), 1))
-IF c = 45 OR (c >= 48 AND c <= 57) THEN
-num$ = block(i)
-'a float?
-f = 0
-x = INSTR(num$, "E")
-IF x THEN
-f = 1: blocktype(i) = SINGLETYPE - ISPOINTER
-ELSE
-x = INSTR(num$, "D")
-IF x THEN
-f = 2: blocktype(i) = DOUBLETYPE - ISPOINTER
-ELSE
-x = INSTR(num$, "F")
-IF x THEN
-f = 3: blocktype(i) = FLOATTYPE - ISPOINTER
-END IF
-END IF
-END IF
-IF f THEN
-'float
-IF f = 2 OR f = 3 THEN MID$(num$, x, 1) = "E" 'D,F invalid in C++
-IF f = 3 THEN num$ = num$ + "L" 'otherwise number is rounded to a double
-ELSE
-'integer
-blocktype(i) = typname2typ(removesymbol$(num$))
-IF Error_Happened THEN EXIT FUNCTION
-IF blocktype(i) AND ISPOINTER THEN blocktype(i) = blocktype(i) - ISPOINTER
-IF (blocktype(i) AND 511) > 32 THEN
-IF blocktype(i) AND ISUNSIGNED THEN num$ = num$ + "ull" ELSE num$ = num$ + "ll"
-END IF
-END IF
-block(i) = " " + num$ + " " 'pad with spaces to avoid C++ computation errors
-evaledblock(i) = 1
-GOTO evaledblock
-END IF
+ 'a number?
+ c = ASC(LEFT$(block(i), 1))
+ IF c = 45 OR (c >= 48 AND c <= 57) THEN
+ num$ = block(i)
+ 'a float?
+ f = 0
+ x = INSTR(num$, "E")
+ IF x THEN
+ f = 1: blocktype(i) = SINGLETYPE - ISPOINTER
+ ELSE
+ x = INSTR(num$, "D")
+ IF x THEN
+ f = 2: blocktype(i) = DOUBLETYPE - ISPOINTER
+ ELSE
+ x = INSTR(num$, "F")
+ IF x THEN
+ f = 3: blocktype(i) = FLOATTYPE - ISPOINTER
+ END IF
+ END IF
+ END IF
+ IF f THEN
+ 'float
+ IF f = 2 OR f = 3 THEN MID$(num$, x, 1) = "E" 'D,F invalid in C++
+ IF f = 3 THEN num$ = num$ + "L" 'otherwise number is rounded to a double
+ ELSE
+ 'integer
+ blocktype(i) = typname2typ(removesymbol$(num$))
+ IF Error_Happened THEN EXIT FUNCTION
+ IF blocktype(i) AND ISPOINTER THEN blocktype(i) = blocktype(i) - ISPOINTER
+ IF (blocktype(i) AND 511) > 32 THEN
+ IF blocktype(i) AND ISUNSIGNED THEN num$ = num$ + "ull" ELSE num$ = num$ + "ll"
+ END IF
+ END IF
+ block(i) = " " + num$ + " " 'pad with spaces to avoid C++ computation errors
+ evaledblock(i) = 1
+ GOTO evaledblock
+ END IF
-'number?
-'fc = ASC(LEFT$(block(i), 1))
-'IF fc = 45 OR (fc >= 48 AND fc <= 57) THEN '- or 0-9
-''it's a number
-''check for an extension, if none, assume integer
-'blocktype(i) = INTEGER64TYPE - ISPOINTER
-'tblock$ = " " + block(i)
-'IF RIGHT$(tblock$, 2) = "##" THEN blocktype(i) = FLOATTYPE - ISPOINTER: block(i) = LEFT$(block(i), LEN(block$(i)) - 2): GOTO evfltnum
-'IF RIGHT$(tblock$, 1) = "#" THEN blocktype(i) = DOUBLETYPE - ISPOINTER: block(i) = LEFT$(block(i), LEN(block$(i)) - 1): GOTO evfltnum
-'IF RIGHT$(tblock$, 1) = "!" THEN blocktype(i) = SINGLETYPE - ISPOINTER: block(i) = LEFT$(block(i), LEN(block$(i)) - 1): GOTO evfltnum
-'
-''C++ 32bit unsigned to signed 64bit
-'IF INSTR(block(i),".")=0 THEN
-'
-'negated=0
-'if left$(block(i),1)="-" then block(i)=right$(block(i),len(block(i))-1):negated=1
-'
-'if left$(block(i),2)="0x" then 'hex
-'if len(block(i))=10 then
-'if block(i)>="0x80000000" and block(i)<="0xFFFFFFFF" then block(i)="(int64)"+block(i): goto evnum
-'end if
-'if len(block(i))>10 then block(i)=block(i)+"ll": goto evnum
-'goto evnum
-'end if
-'
-'if left$(block(i),1)="0" then 'octal
-'if len(block(i))=12 then
-'if block(i)>="020000000000" and block(i)<="037777777777" then block(i)="(int64)"+block(i): goto evnum
-'if block(i)>"037777777777" then block(i)=block(i)+"ll": goto evnum
-'end if
-'if len(block(i))>12 then block(i)=block(i)+"ll": goto evnum
-'goto evnum
-'end if
-'
-''decimal
-'if len(block(i))=10 then
-'if block(i)>="2147483648" and block(i)<="4294967295" then block(i)="(int64)"+block(i): goto evnum
-'if block(i)>"4294967295" then block(i)=block(i)+"ll": goto evnum
-'end if
-'if len(block(i))>10 then block(i)=block(i)+"ll"
-'
-'evnum:
-'
-'if negated=1 then block(i)="-"+block(i)
-'
-'END IF
-'
-'evfltnum:
-'
-'block(i) = " " + block(i)+" "
-'evaledblock(i) = 1
-'GOTO evaledblock
-'END IF
+ 'number?
+ 'fc = ASC(LEFT$(block(i), 1))
+ 'IF fc = 45 OR (fc >= 48 AND fc <= 57) THEN '- or 0-9
+ ''it's a number
+ ''check for an extension, if none, assume integer
+ 'blocktype(i) = INTEGER64TYPE - ISPOINTER
+ 'tblock$ = " " + block(i)
+ 'IF RIGHT$(tblock$, 2) = "##" THEN blocktype(i) = FLOATTYPE - ISPOINTER: block(i) = LEFT$(block(i), LEN(block$(i)) - 2): GOTO evfltnum
+ 'IF RIGHT$(tblock$, 1) = "#" THEN blocktype(i) = DOUBLETYPE - ISPOINTER: block(i) = LEFT$(block(i), LEN(block$(i)) - 1): GOTO evfltnum
+ 'IF RIGHT$(tblock$, 1) = "!" THEN blocktype(i) = SINGLETYPE - ISPOINTER: block(i) = LEFT$(block(i), LEN(block$(i)) - 1): GOTO evfltnum
+ '
+ ''C++ 32bit unsigned to signed 64bit
+ 'IF INSTR(block(i),".")=0 THEN
+ '
+ 'negated=0
+ 'if left$(block(i),1)="-" then block(i)=right$(block(i),len(block(i))-1):negated=1
+ '
+ 'if left$(block(i),2)="0x" then 'hex
+ 'if len(block(i))=10 then
+ 'if block(i)>="0x80000000" and block(i)<="0xFFFFFFFF" then block(i)="(int64)"+block(i): goto evnum
+ 'end if
+ 'if len(block(i))>10 then block(i)=block(i)+"ll": goto evnum
+ 'goto evnum
+ 'end if
+ '
+ 'if left$(block(i),1)="0" then 'octal
+ 'if len(block(i))=12 then
+ 'if block(i)>="020000000000" and block(i)<="037777777777" then block(i)="(int64)"+block(i): goto evnum
+ 'if block(i)>"037777777777" then block(i)=block(i)+"ll": goto evnum
+ 'end if
+ 'if len(block(i))>12 then block(i)=block(i)+"ll": goto evnum
+ 'goto evnum
+ 'end if
+ '
+ ''decimal
+ 'if len(block(i))=10 then
+ 'if block(i)>="2147483648" and block(i)<="4294967295" then block(i)="(int64)"+block(i): goto evnum
+ 'if block(i)>"4294967295" then block(i)=block(i)+"ll": goto evnum
+ 'end if
+ 'if len(block(i))>10 then block(i)=block(i)+"ll"
+ '
+ 'evnum:
+ '
+ 'if negated=1 then block(i)="-"+block(i)
+ '
+ 'END IF
+ '
+ 'evfltnum:
+ '
+ 'block(i) = " " + block(i)+" "
+ 'evaledblock(i) = 1
+ 'GOTO evaledblock
+ 'END IF
-'a typed string in ""
-IF LEFT$(block(i), 1) = CHR$(34) THEN
-IF RIGHT$(block(i), 1) <> CHR$(34) THEN
-block(i) = "qbs_new_txt_len(" + block(i) + ")"
-ELSE
-block(i) = "qbs_new_txt(" + block(i) + ")"
-END IF
-blocktype(i) = ISSTRING
-evaledblock(i) = 1
-stringprocessinghappened = 1
-GOTO evaledblock
-END IF
+ 'a typed string in ""
+ IF LEFT$(block(i), 1) = CHR$(34) THEN
+ IF RIGHT$(block(i), 1) <> CHR$(34) THEN
+ block(i) = "qbs_new_txt_len(" + block(i) + ")"
+ ELSE
+ block(i) = "qbs_new_txt(" + block(i) + ")"
+ END IF
+ blocktype(i) = ISSTRING
+ evaledblock(i) = 1
+ stringprocessinghappened = 1
+ GOTO evaledblock
+ END IF
-'create variable
-IF isvalidvariable(block(i)) THEN
-x$ = block(i)
+ 'create variable
+ IF isvalidvariable(block(i)) THEN
+ x$ = block(i)
-typ$ = removesymbol$(x$)
-IF Error_Happened THEN EXIT FUNCTION
+ typ$ = removesymbol$(x$)
+ IF Error_Happened THEN EXIT FUNCTION
-'add symbol extension if none given
-IF LEN(typ$) = 0 THEN
-IF LEFT$(x$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(x$)) - 64
-typ$ = defineextaz(v)
-END IF
+ 'add symbol extension if none given
+ IF LEN(typ$) = 0 THEN
+ IF LEFT$(x$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(x$)) - 64
+ typ$ = defineextaz(v)
+ END IF
-'check that it hasn't just been created within this loop (a=b+b)
-try = findid(x$ + typ$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF Debug THEN PRINT #9, try
-IF id.t <> 0 AND (id.t AND ISUDT) = 0 THEN 'is x$ a simple variable?
-GOTO simplevarfound
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(x$ + typ$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
+ 'check that it hasn't just been created within this loop (a=b+b)
+ try = findid(x$ + typ$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF Debug THEN PRINT #9, try
+ IF id.t <> 0 AND (id.t AND ISUDT) = 0 THEN 'is x$ a simple variable?
+ GOTO simplevarfound
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(x$ + typ$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
-IF Debug THEN PRINT #9, "CREATING VARIABLE:" + x$
-retval = dim2(x$, typ$, 1, "")
-IF Error_Happened THEN EXIT FUNCTION
+ IF Debug THEN PRINT #9, "CREATING VARIABLE:" + x$
+ retval = dim2(x$, typ$, 1, "")
+ IF Error_Happened THEN EXIT FUNCTION
-simplevarfound:
-constequation = 0
-makeidrefer block(i), blocktype(i)
-IF (blocktype(i) AND ISSTRING) THEN stringprocessinghappened = 1
-IF blockn = 1 THEN
-IF (blocktype(i) AND ISREFERENCE) THEN GOTO returnpointer
-END IF
-'reference value
-block(i) = refer(block(i), blocktype(i), 0): IF Error_Happened THEN EXIT FUNCTION
-evaledblock(i) = 1
-GOTO evaledblock
-END IF
-Give_Error "Invalid expression": EXIT FUNCTION
+ simplevarfound:
+ constequation = 0
+ makeidrefer block(i), blocktype(i)
+ IF (blocktype(i) AND ISSTRING) THEN stringprocessinghappened = 1
+ IF blockn = 1 THEN
+ IF (blocktype(i) AND ISREFERENCE) THEN GOTO returnpointer
+ END IF
+ 'reference value
+ block(i) = refer(block(i), blocktype(i), 0): IF Error_Happened THEN EXIT FUNCTION
+ evaledblock(i) = 1
+ GOTO evaledblock
+ END IF
+ Give_Error "Invalid expression": EXIT FUNCTION
-ELSE
-IF (blocktype(i) AND ISREFERENCE) THEN
-IF blockn = 1 THEN GOTO returnpointer
+ ELSE
+ IF (blocktype(i) AND ISREFERENCE) THEN
+ IF blockn = 1 THEN GOTO returnpointer
-'if blocktype(i) and ISUDT then PRINT "UDT passed to refer by evaluate"
+ 'if blocktype(i) and ISUDT then PRINT "UDT passed to refer by evaluate"
-block(i) = refer(block(i), blocktype(i), 0)
-IF Error_Happened THEN EXIT FUNCTION
+ block(i) = refer(block(i), blocktype(i), 0)
+ IF Error_Happened THEN EXIT FUNCTION
-END IF
+ END IF
-END IF
-END IF
-evaledblock:
+ END IF
+ END IF
+ evaledblock:
NEXT
'return a POINTER if possible
IF blockn = 1 THEN
-IF evaledblock(1) THEN
-IF (blocktype(1) AND ISREFERENCE) THEN
-returnpointer:
-IF (blocktype(1) AND ISSTRING) THEN stringprocessinghappened = 1
-IF Debug THEN PRINT #9, "evaluated reference:" + block(1)
-typ = blocktype(1)
-evaluate$ = block(1)
-EXIT FUNCTION
-END IF
-END IF
+ IF evaledblock(1) THEN
+ IF (blocktype(1) AND ISREFERENCE) THEN
+ returnpointer:
+ IF (blocktype(1) AND ISSTRING) THEN stringprocessinghappened = 1
+ IF Debug THEN PRINT #9, "evaluated reference:" + block(1)
+ typ = blocktype(1)
+ evaluate$ = block(1)
+ EXIT FUNCTION
+ END IF
+ END IF
END IF
'it cannot be returned as a pointer
@@ -14141,307 +14348,307 @@ IF Debug THEN PRINT #9, "applying operators:";
IF typ = -1 THEN
-typ = blocktype(1) 'init typ with first blocktype
+ typ = blocktype(1) 'init typ with first blocktype
-IF isoperator(block(1)) THEN 'but what if it starts with a UNARY operator?
-typ = blocktype(2) 'init typ with second blocktype
-END IF
+ IF isoperator(block(1)) THEN 'but what if it starts with a UNARY operator?
+ typ = blocktype(2) 'init typ with second blocktype
+ END IF
END IF
nonop = 0
FOR i = 1 TO blockn
-IF evaledblock(i) = 0 THEN
-isop = isoperator(block(i))
-IF isop THEN
-nonop = 0
+ IF evaledblock(i) = 0 THEN
+ isop = isoperator(block(i))
+ IF isop THEN
+ nonop = 0
-constequation = 0
+ constequation = 0
-'operator found
-o$ = block(i)
-u = operatorusage(o$, typ, i$, lhstyp, rhstyp, result)
+ 'operator found
+ o$ = block(i)
+ u = operatorusage(o$, typ, i$, lhstyp, rhstyp, result)
-IF u <> 5 THEN 'not unary
-nonop = 1
-IF i = 1 OR evaledblock(i - 1) = 0 THEN
-IF i = 1 AND blockn = 1 AND o$ = "-" THEN Give_Error "Expected variable/value after '" + UCASE$(o$) + "'": EXIT FUNCTION 'guess - is neg in this case
-Give_Error "Expected variable/value before '" + UCASE$(o$) + "'": EXIT FUNCTION
-END IF
-END IF
-IF i = blockn OR evaledblock(i + 1) = 0 THEN Give_Error "Expected variable/value after '" + UCASE$(o$) + "'": EXIT FUNCTION
+ IF u <> 5 THEN 'not unary
+ nonop = 1
+ IF i = 1 OR evaledblock(i - 1) = 0 THEN
+ IF i = 1 AND blockn = 1 AND o$ = "-" THEN Give_Error "Expected variable/value after '" + UCASE$(o$) + "'": EXIT FUNCTION 'guess - is neg in this case
+ Give_Error "Expected variable/value before '" + UCASE$(o$) + "'": EXIT FUNCTION
+ END IF
+ END IF
+ IF i = blockn OR evaledblock(i + 1) = 0 THEN Give_Error "Expected variable/value after '" + UCASE$(o$) + "'": EXIT FUNCTION
-'lhstyp & rhstyp bit-field values
-'1=integeral
-'2=floating point
-'4=string
-'8=bool *only used for result
+ 'lhstyp & rhstyp bit-field values
+ '1=integeral
+ '2=floating point
+ '4=string
+ '8=bool *only used for result
-oldtyp = typ
-newtyp = blocktype(i + 1)
+ oldtyp = typ
+ newtyp = blocktype(i + 1)
-'IF block(i - 1) = "6" THEN
-'PRINT o$
-'PRINT oldtyp AND ISFLOAT
-'PRINT blocktype(i - 1) AND ISFLOAT
-'END
-'END IF
+ 'IF block(i - 1) = "6" THEN
+ 'PRINT o$
+ 'PRINT oldtyp AND ISFLOAT
+ 'PRINT blocktype(i - 1) AND ISFLOAT
+ 'END
+ 'END IF
-'numeric->string is illegal!
-IF (typ AND ISSTRING) = 0 AND (newtyp AND ISSTRING) <> 0 THEN
-Give_Error "Cannot convert number to string": EXIT FUNCTION
-END IF
+ 'numeric->string is illegal!
+ IF (typ AND ISSTRING) = 0 AND (newtyp AND ISSTRING) <> 0 THEN
+ Give_Error "Cannot convert number to string": EXIT FUNCTION
+ END IF
-'Offset protection: Override conversion rules for operator as necessary
-offsetmode = 0
-offsetcvi = 0
-IF (oldtyp AND ISOFFSET) <> 0 OR (newtyp AND ISOFFSET) <> 0 THEN
-offsetmode = 2
-IF newtyp AND ISOFFSET THEN
-IF (newtyp AND ISUNSIGNED) = 0 THEN offsetmode = 1
-END IF
-IF oldtyp AND ISOFFSET THEN
-IF (oldtyp AND ISUNSIGNED) = 0 THEN offsetmode = 1
-END IF
+ 'Offset protection: Override conversion rules for operator as necessary
+ offsetmode = 0
+ offsetcvi = 0
+ IF (oldtyp AND ISOFFSET) <> 0 OR (newtyp AND ISOFFSET) <> 0 THEN
+ offsetmode = 2
+ IF newtyp AND ISOFFSET THEN
+ IF (newtyp AND ISUNSIGNED) = 0 THEN offsetmode = 1
+ END IF
+ IF oldtyp AND ISOFFSET THEN
+ IF (oldtyp AND ISUNSIGNED) = 0 THEN offsetmode = 1
+ END IF
-'depending on the operater we may do things differently
-'the default method is convert both sides to integer first
-'but these operators are different: * / ^
-IF o$ = "*" OR o$ = "/" OR o$ = "^" THEN
-IF o$ = "*" OR o$ = "^" THEN
-'for mult, if either side is a float cast integers to 'long double's first
-IF (newtyp AND ISFLOAT) <> 0 OR (oldtyp AND ISFLOAT) <> 0 THEN
-offsetcvi = 1
-IF (oldtyp AND ISFLOAT) = 0 THEN lhstyp = 2
-IF (newtyp AND ISFLOAT) = 0 THEN rhstyp = 2
-END IF
-END IF
-IF o$ = "/" OR o$ = "^" THEN
-'for division or exponentials, to prevent integer division cast integers to 'long double's
-offsetcvi = 1
-IF (oldtyp AND ISFLOAT) = 0 THEN lhstyp = 2
-IF (newtyp AND ISFLOAT) = 0 THEN rhstyp = 2
-END IF
-ELSE
-IF lhstyp AND 2 THEN lhstyp = 1 'force lhs and rhs to be integer values
-IF rhstyp AND 2 THEN rhstyp = 1
-END IF
+ 'depending on the operater we may do things differently
+ 'the default method is convert both sides to integer first
+ 'but these operators are different: * / ^
+ IF o$ = "*" OR o$ = "/" OR o$ = "^" THEN
+ IF o$ = "*" OR o$ = "^" THEN
+ 'for mult, if either side is a float cast integers to 'long double's first
+ IF (newtyp AND ISFLOAT) <> 0 OR (oldtyp AND ISFLOAT) <> 0 THEN
+ offsetcvi = 1
+ IF (oldtyp AND ISFLOAT) = 0 THEN lhstyp = 2
+ IF (newtyp AND ISFLOAT) = 0 THEN rhstyp = 2
+ END IF
+ END IF
+ IF o$ = "/" OR o$ = "^" THEN
+ 'for division or exponentials, to prevent integer division cast integers to 'long double's
+ offsetcvi = 1
+ IF (oldtyp AND ISFLOAT) = 0 THEN lhstyp = 2
+ IF (newtyp AND ISFLOAT) = 0 THEN rhstyp = 2
+ END IF
+ ELSE
+ IF lhstyp AND 2 THEN lhstyp = 1 'force lhs and rhs to be integer values
+ IF rhstyp AND 2 THEN rhstyp = 1
+ END IF
-IF result = 2 THEN result = 1 'force integer result
-'note: result=1 just sets typ&=64 if typ is a float
+ IF result = 2 THEN result = 1 'force integer result
+ 'note: result=1 just sets typ&=64 if typ is a float
-END IF
+ END IF
-'STEP 1: convert oldtyp and/or newtyp if required for the operator
-'convert lhs
-IF (oldtyp AND ISSTRING) THEN
-IF (lhstyp AND 4) = 0 THEN Give_Error "Cannot convert string to number": EXIT FUNCTION
-ELSE
-'oldtyp is numeric
-IF lhstyp = 4 THEN Give_Error "Cannot convert number to string": EXIT FUNCTION
-IF (oldtyp AND ISFLOAT) THEN
-IF (lhstyp AND 2) = 0 THEN
-'convert float to int
-block(i - 1) = "qbr(" + block(i - 1) + ")"
-oldtyp = 64&
-END IF
-ELSE
-'oldtyp is an int
-IF (lhstyp AND 1) = 0 THEN
-'convert int to float
-block(i - 1) = "((long double)(" + block(i - 1) + "))"
-oldtyp = 256& + ISFLOAT
-END IF
-END IF
-END IF
-'convert rhs
-IF (newtyp AND ISSTRING) THEN
-IF (rhstyp AND 4) = 0 THEN Give_Error "Cannot convert string to number": EXIT FUNCTION
-ELSE
-'newtyp is numeric
-IF rhstyp = 4 THEN Give_Error "Cannot convert number to string": EXIT FUNCTION
-IF (newtyp AND ISFLOAT) THEN
-IF (rhstyp AND 2) = 0 THEN
-'convert float to int
-block(i + 1) = "qbr(" + block(i + 1) + ")"
-newtyp = 64&
-END IF
-ELSE
-'newtyp is an int
-IF (rhstyp AND 1) = 0 THEN
-'convert int to float
-block(i + 1) = "((long double)(" + block(i + 1) + "))"
-newtyp = 256& + ISFLOAT
-END IF
-END IF
-END IF
+ 'STEP 1: convert oldtyp and/or newtyp if required for the operator
+ 'convert lhs
+ IF (oldtyp AND ISSTRING) THEN
+ IF (lhstyp AND 4) = 0 THEN Give_Error "Cannot convert string to number": EXIT FUNCTION
+ ELSE
+ 'oldtyp is numeric
+ IF lhstyp = 4 THEN Give_Error "Cannot convert number to string": EXIT FUNCTION
+ IF (oldtyp AND ISFLOAT) THEN
+ IF (lhstyp AND 2) = 0 THEN
+ 'convert float to int
+ block(i - 1) = "qbr(" + block(i - 1) + ")"
+ oldtyp = 64&
+ END IF
+ ELSE
+ 'oldtyp is an int
+ IF (lhstyp AND 1) = 0 THEN
+ 'convert int to float
+ block(i - 1) = "((long double)(" + block(i - 1) + "))"
+ oldtyp = 256& + ISFLOAT
+ END IF
+ END IF
+ END IF
+ 'convert rhs
+ IF (newtyp AND ISSTRING) THEN
+ IF (rhstyp AND 4) = 0 THEN Give_Error "Cannot convert string to number": EXIT FUNCTION
+ ELSE
+ 'newtyp is numeric
+ IF rhstyp = 4 THEN Give_Error "Cannot convert number to string": EXIT FUNCTION
+ IF (newtyp AND ISFLOAT) THEN
+ IF (rhstyp AND 2) = 0 THEN
+ 'convert float to int
+ block(i + 1) = "qbr(" + block(i + 1) + ")"
+ newtyp = 64&
+ END IF
+ ELSE
+ 'newtyp is an int
+ IF (rhstyp AND 1) = 0 THEN
+ 'convert int to float
+ block(i + 1) = "((long double)(" + block(i + 1) + "))"
+ newtyp = 256& + ISFLOAT
+ END IF
+ END IF
+ END IF
-'Reduce floating point values to common base for comparison?
-IF isop = 7 THEN 'comparitive operator
-'Corrects problems encountered such as:
-' S = 2.1
-' IF S = 2.1 THEN PRINT "OK" ELSE PRINT "ERROR S PRINTS AS"; S; "BUT IS SEEN BY QB64 AS..."
-' IF S < 2.1 THEN PRINT "LESS THAN 2.1"
-'concerns:
-'1. Return value from TIMER will be reduced to a SINGLE in direct comparisons
-'solution: assess, and only apply to SINGLE variables/arrays
-'2. Comparison of a double higher/lower than single range may fail
-'solution: out of range values convert to +/-1.#INF, making comparison still possible
-IF (oldtyp AND ISFLOAT) <> 0 AND (newtyp AND ISFLOAT) <> 0 THEN 'both floating point
-s1 = oldtyp AND 511: s2 = newtyp AND 511
-IF s2 < s1 THEN s1 = s2
-IF s1 = 32 THEN
-block(i - 1) = "((float)(" + block(i - 1) + "))": oldtyp = 32& + ISFLOAT
-block(i + 1) = "((float)(" + block(i + 1) + "))": newtyp = 32& + ISFLOAT
-END IF
-IF s1 = 64 THEN
-block(i - 1) = "((double)(" + block(i - 1) + "))": oldtyp = 64& + ISFLOAT
-block(i + 1) = "((double)(" + block(i + 1) + "))": newtyp = 64& + ISFLOAT
-END IF
-END IF 'both floating point
-END IF 'comparitive operator
+ 'Reduce floating point values to common base for comparison?
+ IF isop = 7 THEN 'comparitive operator
+ 'Corrects problems encountered such as:
+ ' S = 2.1
+ ' IF S = 2.1 THEN PRINT "OK" ELSE PRINT "ERROR S PRINTS AS"; S; "BUT IS SEEN BY QB64 AS..."
+ ' IF S < 2.1 THEN PRINT "LESS THAN 2.1"
+ 'concerns:
+ '1. Return value from TIMER will be reduced to a SINGLE in direct comparisons
+ 'solution: assess, and only apply to SINGLE variables/arrays
+ '2. Comparison of a double higher/lower than single range may fail
+ 'solution: out of range values convert to +/-1.#INF, making comparison still possible
+ IF (oldtyp AND ISFLOAT) <> 0 AND (newtyp AND ISFLOAT) <> 0 THEN 'both floating point
+ s1 = oldtyp AND 511: s2 = newtyp AND 511
+ IF s2 < s1 THEN s1 = s2
+ IF s1 = 32 THEN
+ block(i - 1) = "((float)(" + block(i - 1) + "))": oldtyp = 32& + ISFLOAT
+ block(i + 1) = "((float)(" + block(i + 1) + "))": newtyp = 32& + ISFLOAT
+ END IF
+ IF s1 = 64 THEN
+ block(i - 1) = "((double)(" + block(i - 1) + "))": oldtyp = 64& + ISFLOAT
+ block(i + 1) = "((double)(" + block(i + 1) + "))": newtyp = 64& + ISFLOAT
+ END IF
+ END IF 'both floating point
+ END IF 'comparitive operator
-typ = newtyp
+ typ = newtyp
-'STEP 2: markup typ
-' if either side is a float, markup typ to largest float
-' if either side is integer, markup typ
-'Note: A markup is a GUESS of what the return type will be,
-' 'result' can override this markup
-IF (oldtyp AND ISSTRING) = 0 AND (newtyp AND ISSTRING) = 0 THEN
-IF (oldtyp AND ISFLOAT) <> 0 OR (newtyp AND ISFLOAT) <> 0 THEN
-'float
-b = 0: IF (oldtyp AND ISFLOAT) THEN b = oldtyp AND 511
-IF (newtyp AND ISFLOAT) THEN
-b2 = newtyp AND 511: IF b2 > b THEN b = b2
-END IF
-typ = ISFLOAT + b
-ELSE
-'integer
-'***THIS IS THE IDEAL MARKUP FOR A 64-BIT SYSTEM***
-'In reality 32-bit C++ only marks-up to 32-bit integers
-b = oldtyp AND 511: b2 = newtyp AND 511: IF b2 > b THEN b = b2
-typ = 64&
-IF b = 64 THEN
-IF (oldtyp AND ISUNSIGNED) <> 0 AND (newtyp AND ISUNSIGNED) <> 0 THEN typ = 64& + ISUNSIGNED
-END IF
-END IF
-END IF
+ 'STEP 2: markup typ
+ ' if either side is a float, markup typ to largest float
+ ' if either side is integer, markup typ
+ 'Note: A markup is a GUESS of what the return type will be,
+ ' 'result' can override this markup
+ IF (oldtyp AND ISSTRING) = 0 AND (newtyp AND ISSTRING) = 0 THEN
+ IF (oldtyp AND ISFLOAT) <> 0 OR (newtyp AND ISFLOAT) <> 0 THEN
+ 'float
+ b = 0: IF (oldtyp AND ISFLOAT) THEN b = oldtyp AND 511
+ IF (newtyp AND ISFLOAT) THEN
+ b2 = newtyp AND 511: IF b2 > b THEN b = b2
+ END IF
+ typ = ISFLOAT + b
+ ELSE
+ 'integer
+ '***THIS IS THE IDEAL MARKUP FOR A 64-BIT SYSTEM***
+ 'In reality 32-bit C++ only marks-up to 32-bit integers
+ b = oldtyp AND 511: b2 = newtyp AND 511: IF b2 > b THEN b = b2
+ typ = 64&
+ IF b = 64 THEN
+ IF (oldtyp AND ISUNSIGNED) <> 0 AND (newtyp AND ISUNSIGNED) <> 0 THEN typ = 64& + ISUNSIGNED
+ END IF
+ END IF
+ END IF
-IF result = 1 THEN
-IF (typ AND ISFLOAT) <> 0 OR (typ AND ISSTRING) <> 0 THEN typ = 64 'otherwise keep markuped integer type
-END IF
-IF result = 2 THEN
-IF (typ AND ISFLOAT) = 0 THEN typ = ISFLOAT + 256
-END IF
-IF result = 4 THEN
-typ = ISSTRING
-END IF
-IF result = 8 THEN 'bool
-typ = 32
-END IF
+ IF result = 1 THEN
+ IF (typ AND ISFLOAT) <> 0 OR (typ AND ISSTRING) <> 0 THEN typ = 64 'otherwise keep markuped integer type
+ END IF
+ IF result = 2 THEN
+ IF (typ AND ISFLOAT) = 0 THEN typ = ISFLOAT + 256
+ END IF
+ IF result = 4 THEN
+ typ = ISSTRING
+ END IF
+ IF result = 8 THEN 'bool
+ typ = 32
+ END IF
-'Offset protection: Force result to be an offset type with correct signage
-IF offsetmode THEN
-IF result <> 8 THEN 'boolean comparison results are allowed
-typ = OFFSETTYPE - ISPOINTER: IF offsetmode = 2 THEN typ = typ + ISUNSIGNED
-END IF
-END IF
+ 'Offset protection: Force result to be an offset type with correct signage
+ IF offsetmode THEN
+ IF result <> 8 THEN 'boolean comparison results are allowed
+ typ = OFFSETTYPE - ISPOINTER: IF offsetmode = 2 THEN typ = typ + ISUNSIGNED
+ END IF
+ END IF
-'override typ=ISFLOAT+256 to typ=ISFLOAT+64 for ^ operator's result
-IF u = 2 THEN
-IF i$ = "pow2" THEN
+ 'override typ=ISFLOAT+256 to typ=ISFLOAT+64 for ^ operator's result
+ IF u = 2 THEN
+ IF i$ = "pow2" THEN
-IF offsetmode THEN Give_Error "Operator '^' cannot be used with an _OFFSET": EXIT FUNCTION
+ IF offsetmode THEN Give_Error "Operator '^' cannot be used with an _OFFSET": EXIT FUNCTION
-'QB-like conversion of math functions returning floating point values
-'reassess oldtype & newtype
-b = oldtyp AND 511
-IF oldtyp AND ISFLOAT THEN
-'no change to b
-ELSE
-IF b > 16 THEN b = 64 'larger than INTEGER? return DOUBLE
-IF b > 32 THEN b = 256 'larger than LONG? return FLOAT
-IF b <= 16 THEN b = 32
-END IF
-b2 = newtyp AND 511
-IF newtyp AND ISFLOAT THEN
-IF b2 > b THEN b = b2
-ELSE
-b3 = 32
-IF b2 > 16 THEN b3 = 64 'larger than INTEGER? return DOUBLE
-IF b2 > 32 THEN b3 = 256 'larger than LONG? return FLOAT
-IF b3 > b THEN b = b3
-END IF
-typ = ISFLOAT + b
+ 'QB-like conversion of math functions returning floating point values
+ 'reassess oldtype & newtype
+ b = oldtyp AND 511
+ IF oldtyp AND ISFLOAT THEN
+ 'no change to b
+ ELSE
+ IF b > 16 THEN b = 64 'larger than INTEGER? return DOUBLE
+ IF b > 32 THEN b = 256 'larger than LONG? return FLOAT
+ IF b <= 16 THEN b = 32
+ END IF
+ b2 = newtyp AND 511
+ IF newtyp AND ISFLOAT THEN
+ IF b2 > b THEN b = b2
+ ELSE
+ b3 = 32
+ IF b2 > 16 THEN b3 = 64 'larger than INTEGER? return DOUBLE
+ IF b2 > 32 THEN b3 = 256 'larger than LONG? return FLOAT
+ IF b3 > b THEN b = b3
+ END IF
+ typ = ISFLOAT + b
-END IF 'pow2
-END IF 'u=2
+ END IF 'pow2
+ END IF 'u=2
-'STEP 3: apply operator appropriately
+ 'STEP 3: apply operator appropriately
-IF u = 5 THEN
-block(i + 1) = i$ + "(" + block(i + 1) + ")"
-block(i) = "": i = i + 1: GOTO operatorapplied
-END IF
+ IF u = 5 THEN
+ block(i + 1) = i$ + "(" + block(i + 1) + ")"
+ block(i) = "": i = i + 1: GOTO operatorapplied
+ END IF
-'binary operators
+ 'binary operators
-IF u = 1 THEN
-block(i + 1) = block(i - 1) + i$ + block(i + 1)
-block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
-END IF
+ IF u = 1 THEN
+ block(i + 1) = block(i - 1) + i$ + block(i + 1)
+ block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
+ END IF
-IF u = 2 THEN
-block(i + 1) = i$ + "(" + block(i - 1) + "," + block(i + 1) + ")"
-block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
-END IF
+ IF u = 2 THEN
+ block(i + 1) = i$ + "(" + block(i - 1) + "," + block(i + 1) + ")"
+ block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
+ END IF
-IF u = 3 THEN
-block(i + 1) = "-(" + block(i - 1) + i$ + block(i + 1) + ")"
-block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
-END IF
+ IF u = 3 THEN
+ block(i + 1) = "-(" + block(i - 1) + i$ + block(i + 1) + ")"
+ block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
+ END IF
-IF u = 4 THEN
-block(i + 1) = "~" + block(i - 1) + i$ + block(i + 1)
-block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
-END IF
+ IF u = 4 THEN
+ block(i + 1) = "~" + block(i - 1) + i$ + block(i + 1)
+ block(i - 1) = "": block(i) = "": i = i + 1: GOTO operatorapplied
+ END IF
-'...more?...
+ '...more?...
-Give_Error "ERROR: Operator could not be applied correctly!": EXIT FUNCTION '<--should never happen!
-operatorapplied:
+ Give_Error "ERROR: Operator could not be applied correctly!": EXIT FUNCTION '<--should never happen!
+ operatorapplied:
-IF offsetcvi THEN block(i) = "qbr(" + block(i) + ")": offsetcvi = 0
-offsetmode = 0
+ IF offsetcvi THEN block(i) = "qbr(" + block(i) + ")": offsetcvi = 0
+ offsetmode = 0
-ELSE
-nonop = nonop + 1
-END IF
-ELSE
-nonop = nonop + 1
-END IF
-IF nonop > 1 THEN Give_Error "Expected operator in equation": EXIT FUNCTION
+ ELSE
+ nonop = nonop + 1
+ END IF
+ ELSE
+ nonop = nonop + 1
+ END IF
+ IF nonop > 1 THEN Give_Error "Expected operator in equation": EXIT FUNCTION
NEXT
IF Debug THEN PRINT #9, ""
'join blocks
FOR i = 1 TO blockn
-r$ = r$ + block(i)
+ r$ = r$ + block(i)
NEXT
IF Debug THEN
-PRINT #9, "evaluated:" + r$ + " AS TYPE:";
-IF (typ AND ISSTRING) THEN PRINT #9, "[ISSTRING]";
-IF (typ AND ISFLOAT) THEN PRINT #9, "[ISFLOAT]";
-IF (typ AND ISUNSIGNED) THEN PRINT #9, "[ISUNSIGNED]";
-IF (typ AND ISPOINTER) THEN PRINT #9, "[ISPOINTER]";
-IF (typ AND ISFIXEDLENGTH) THEN PRINT #9, "[ISFIXEDLENGTH]";
-IF (typ AND ISINCONVENTIONALMEMORY) THEN PRINT #9, "[ISINCONVENTIONALMEMORY]";
-PRINT #9, "(size in bits=" + str2$(typ AND 511) + ")"
+ PRINT #9, "evaluated:" + r$ + " AS TYPE:";
+ IF (typ AND ISSTRING) THEN PRINT #9, "[ISSTRING]";
+ IF (typ AND ISFLOAT) THEN PRINT #9, "[ISFLOAT]";
+ IF (typ AND ISUNSIGNED) THEN PRINT #9, "[ISUNSIGNED]";
+ IF (typ AND ISPOINTER) THEN PRINT #9, "[ISPOINTER]";
+ IF (typ AND ISFIXEDLENGTH) THEN PRINT #9, "[ISFIXEDLENGTH]";
+ IF (typ AND ISINCONVENTIONALMEMORY) THEN PRINT #9, "[ISINCONVENTIONALMEMORY]";
+ PRINT #9, "(size in bits=" + str2$(typ AND 511) + ")"
END IF
@@ -14476,37 +14683,37 @@ omitarg_first = 0: omitarg_last = 0
f$ = RTRIM$(id2.specialformat)
IF LEN(f$) THEN 'special format given
-'count omittable args
-sqb = 0
-a = 0
-FOR fi = 1 TO LEN(f$)
-fa = ASC(f$, fi)
-IF fa = ASC_QUESTIONMARK THEN
-a = a + 1
-IF sqb <> 0 AND omitarg_first = 0 THEN omitarg_first = a
-END IF
-IF fa = ASC_LEFTSQUAREBRACKET THEN sqb = 1
-IF fa = ASC_RIGHTSQUAREBRACKET THEN sqb = 0: omitarg_last = a
-NEXT
-omitargs = omitarg_last - omitarg_first + 1
+ 'count omittable args
+ sqb = 0
+ a = 0
+ FOR fi = 1 TO LEN(f$)
+ fa = ASC(f$, fi)
+ IF fa = ASC_QUESTIONMARK THEN
+ a = a + 1
+ IF sqb <> 0 AND omitarg_first = 0 THEN omitarg_first = a
+ END IF
+ IF fa = ASC_LEFTSQUAREBRACKET THEN sqb = 1
+ IF fa = ASC_RIGHTSQUAREBRACKET THEN sqb = 0: omitarg_last = a
+ NEXT
+ omitargs = omitarg_last - omitarg_first + 1
-IF args <> id2.args - omitargs AND args <> id2.args THEN Give_Error "Incorrect number of arguments passed to function": EXIT FUNCTION
+ IF args <> id2.args - omitargs AND args <> id2.args THEN Give_Error "Incorrect number of arguments passed to function": EXIT FUNCTION
-passomit = 1 'pass omit flags param to function
+ passomit = 1 'pass omit flags param to function
-IF id2.args = args THEN omitarg_first = 0: omitarg_last = 0 'all arguments were passed!
+ IF id2.args = args THEN omitarg_first = 0: omitarg_last = 0 'all arguments were passed!
ELSE 'no special format given
-IF n$ = "ASC" AND args = 2 THEN GOTO skipargnumchk
-IF id2.args <> args THEN Give_Error "Incorrect number of arguments passed to function": EXIT FUNCTION
+ IF n$ = "ASC" AND args = 2 THEN GOTO skipargnumchk
+ IF id2.args <> args THEN Give_Error "Incorrect number of arguments passed to function": EXIT FUNCTION
END IF
skipargnumchk:
IF id2.NoCloud THEN
-IF Cloud THEN Give_Error "Feature not supported on QLOUD" '***NOCLOUD***
+ IF Cloud THEN Give_Error "Feature not supported on QLOUD" '***NOCLOUD***
END IF
r$ = RTRIM$(id2.callname) + "("
@@ -14514,1259 +14721,1259 @@ r$ = RTRIM$(id2.callname) + "("
IF id2.args <> 0 THEN
-curarg = 1
-firsti = 1
+ curarg = 1
+ firsti = 1
-n = numelements(a$)
-IF n = 0 THEN i = 0: GOTO noargs
+ n = numelements(a$)
+ IF n = 0 THEN i = 0: GOTO noargs
-FOR i = 1 TO n
+ FOR i = 1 TO n
-IF curarg >= omitarg_first AND curarg <= omitarg_last THEN
-noargs:
-targettyp = CVL(MID$(id2.arg, curarg * 4 - 4 + 1, 4))
+ IF curarg >= omitarg_first AND curarg <= omitarg_last THEN
+ noargs:
+ targettyp = CVL(MID$(id2.arg, curarg * 4 - 4 + 1, 4))
-'IF (targettyp AND ISSTRING) THEN Give_Error "QB64 doesn't support optional string arguments for functions yet!": EXIT FUNCTION
+ 'IF (targettyp AND ISSTRING) THEN Give_Error "QB64 doesn't support optional string arguments for functions yet!": EXIT FUNCTION
-FOR fi = 1 TO omitargs - 1: r$ = r$ + "NULL,": NEXT: r$ = r$ + "NULL"
-curarg = curarg + omitargs
-IF i = n THEN EXIT FOR
-r$ = r$ + ","
-END IF
+ FOR fi = 1 TO omitargs - 1: r$ = r$ + "NULL,": NEXT: r$ = r$ + "NULL"
+ curarg = curarg + omitargs
+ IF i = n THEN EXIT FOR
+ r$ = r$ + ","
+ END IF
-l$ = getelement(a$, i)
-IF l$ = "(" THEN b = b + 1
-IF l$ = ")" THEN b = b - 1
-IF (l$ = "," AND b = 0) OR (i = n) THEN
+ l$ = getelement(a$, i)
+ IF l$ = "(" THEN b = b + 1
+ IF l$ = ")" THEN b = b - 1
+ IF (l$ = "," AND b = 0) OR (i = n) THEN
-targettyp = CVL(MID$(id2.arg, curarg * 4 - 4 + 1, 4))
-nele = ASC(MID$(id2.nele, curarg, 1))
-nelereq = ASC(MID$(id2.nelereq, curarg, 1))
+ targettyp = CVL(MID$(id2.arg, curarg * 4 - 4 + 1, 4))
+ nele = ASC(MID$(id2.nele, curarg, 1))
+ nelereq = ASC(MID$(id2.nelereq, curarg, 1))
-IF i = n THEN
-e$ = getelements$(a$, firsti, i)
-ELSE
-e$ = getelements$(a$, firsti, i - 1)
-END IF
+ IF i = n THEN
+ e$ = getelements$(a$, firsti, i)
+ ELSE
+ e$ = getelements$(a$, firsti, i - 1)
+ END IF
-IF LEFT$(e$, 2) = "(" + sp THEN dereference = 1 ELSE dereference = 0
+ IF LEFT$(e$, 2) = "(" + sp THEN dereference = 1 ELSE dereference = 0
-'*special case CVI,CVL,CVS,CVD,_CV (part #1)
-IF n$ = "_CV" THEN
-IF curarg = 1 THEN
-cvtype$ = type2symbol$(e$)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = ""
-GOTO dontevaluate
-END IF
-END IF
+ '*special case CVI,CVL,CVS,CVD,_CV (part #1)
+ IF n$ = "_CV" THEN
+ IF curarg = 1 THEN
+ cvtype$ = type2symbol$(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = ""
+ GOTO dontevaluate
+ END IF
+ END IF
-'*special case MKI,MKL,MKS,MKD,_MK (part #1)
+ '*special case MKI,MKL,MKS,MKD,_MK (part #1)
-IF n$ = "_MK" THEN
-IF RTRIM$(id2.musthave) = "$" THEN
-IF curarg = 1 THEN
-mktype$ = type2symbol$(e$)
-IF Error_Happened THEN EXIT FUNCTION
-IF Debug THEN PRINT #9, "_MK:[" + e$ + "]:[" + mktype$ + "]"
-e$ = ""
-GOTO dontevaluate
-END IF
-END IF
+ IF n$ = "_MK" THEN
+ IF RTRIM$(id2.musthave) = "$" THEN
+ IF curarg = 1 THEN
+ mktype$ = type2symbol$(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF Debug THEN PRINT #9, "_MK:[" + e$ + "]:[" + mktype$ + "]"
+ e$ = ""
+ GOTO dontevaluate
+ END IF
+ END IF
+ END IF
+
+ IF n$ = "UBOUND" OR n$ = "LBOUND" THEN
+ IF curarg = 1 THEN
+ 'perform a "fake" evaluation of the array
+ e$ = e$ + sp + "(" + sp + ")"
+ e$ = evaluate(e$, sourcetyp)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected array-name": EXIT FUNCTION
+ IF (sourcetyp AND ISARRAY) = 0 THEN Give_Error "Expected array-name": EXIT FUNCTION
+ 'make a note of the array's index for later
+ ulboundarray$ = e$
+ ulboundarraytyp = sourcetyp
+ e$ = ""
+ r$ = ""
+ GOTO dontevaluate
+ END IF
+ END IF
+
+
+ '*special case: INPUT$ function
+ IF n$ = "INPUT" THEN
+ IF RTRIM$(id2.musthave) = "$" THEN
+ IF curarg = 2 THEN
+ IF LEFT$(e$, 2) = "#" + sp THEN e$ = RIGHT$(e$, LEN(e$) - 2)
+ END IF
+ END IF
+ END IF
+
+
+ '*special case*
+ IF n$ = "ASC" THEN
+ IF curarg = 2 THEN
+ e$ = evaluatetotyp$(e$, 32&)
+ IF Error_Happened THEN EXIT FUNCTION
+ typ& = LONGTYPE - ISPOINTER
+ r$ = r$ + e$ + ")"
+ GOTO evalfuncspecial
+ END IF
+ END IF
+
+
+ 'PRINT #12, "n$="; n$
+ 'PRINT #12, "curarg="; curarg
+ 'PRINT #12, "e$="; e$
+ 'PRINT #12, "r$="; r$
+
+ '*special case*
+ IF n$ = "_MEMGET" THEN
+ IF curarg = 1 THEN
+ memget_blk$ = e$
+ END IF
+ IF curarg = 2 THEN
+ memget_offs$ = e$
+ END IF
+ IF curarg = 3 THEN
+ e$ = UCASE$(e$)
+ IF INSTR(e$, sp + "*" + sp) THEN 'multiplier will have an appended %,& or && symbol
+ IF RIGHT$(e$, 2) = "&&" THEN
+ e$ = LEFT$(e$, LEN(e$) - 2)
+ ELSE
+ IF RIGHT$(e$, 1) = "&" OR RIGHT$(e$, 1) = "%" THEN e$ = LEFT$(e$, LEN(e$) - 1)
+ END IF
+ END IF
+ t = typname2typ(e$)
+ IF t = 0 THEN Give_Error "Invalid TYPE name": EXIT FUNCTION
+ IF t AND ISOFFSETINBITS THEN Give_Error "_BIT TYPE unsupported": EXIT FUNCTION
+ memget_size = typname2typsize
+ IF t AND ISSTRING THEN
+ IF (t AND ISFIXEDLENGTH) = 0 THEN Give_Error "Expected STRING * ...": EXIT FUNCTION
+ memget_ctyp$ = "qbs*"
+ ELSE
+ IF t AND ISUDT THEN
+ memget_size = udtxsize(t AND 511) \ 8
+ memget_ctyp$ = "void*"
+ ELSE
+ memget_size = (t AND 511) \ 8
+ memget_ctyp$ = typ2ctyp$(t, "")
+ END IF
+ END IF
+
+
+
+
+
+ 'assume checking off
+ offs$ = evaluatetotyp(memget_offs$, OFFSETTYPE - ISPOINTER)
+ blkoffs$ = evaluatetotyp(memget_blk$, -6)
+ IF NoChecks = 0 THEN
+ 'change offs$ to be the return of the safe version
+ offs$ = "func__memget((mem_block*)" + blkoffs$ + "," + offs$ + "," + str2(memget_size) + ")"
+ END IF
+ IF t AND ISSTRING THEN
+ r$ = "qbs_new_txt_len((char*)" + offs$ + "," + str2(memget_size) + ")"
+ ELSE
+ IF t AND ISUDT THEN
+ r$ = "((void*)+" + offs$ + ")"
+ t = ISUDT + ISPOINTER + (t AND 511)
+ ELSE
+ r$ = "*(" + memget_ctyp$ + "*)(" + offs$ + ")"
+ IF t AND ISPOINTER THEN t = t - ISPOINTER
+ END IF
+ END IF
+
+
+
+
+
+
+
+ typ& = t
+
+
+ GOTO evalfuncspecial
+ END IF
+ END IF
+
+ '------------------------------------------------------------------------------------------------------------
+ e2$ = e$
+ e$ = evaluate(e$, sourcetyp)
+ IF Error_Happened THEN EXIT FUNCTION
+ '------------------------------------------------------------------------------------------------------------
+
+ '***special case***
+ IF n$ = "_MEM" THEN
+ IF curarg = 1 THEN
+ IF args = 1 THEN
+ targettyp = -7
+ END IF
+ IF args = 2 THEN
+ r$ = RTRIM$(id2.callname) + "_at_offset" + RIGHT$(r$, LEN(r$) - LEN(RTRIM$(id2.callname)))
+ IF (sourcetyp AND ISOFFSET) = 0 THEN Give_Error "Expected _MEM(_OFFSET-value,...)": EXIT FUNCTION
+ END IF
+ END IF
+ END IF
+
+ '*special case*
+ IF n$ = "_OFFSET" THEN
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN
+ Give_Error "_OFFSET expects the name of a variable/array": EXIT FUNCTION
+ END IF
+ IF (sourcetyp AND ISARRAY) THEN
+ IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "_OFFSET cannot reference _BIT type arrays": EXIT FUNCTION
+ END IF
+ r$ = "((uptrszint)(" + evaluatetotyp$(e2$, -6) + "))"
+ IF Error_Happened THEN EXIT FUNCTION
+ typ& = UOFFSETTYPE - ISPOINTER
+ GOTO evalfuncspecial
+ END IF '_OFFSET
+
+ '*_OFFSET exceptions*
+ IF sourcetyp AND ISOFFSET THEN
+ IF n$ = "MKSMBF" AND RTRIM$(id2.musthave) = "$" THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ IF n$ = "MKDMBF" AND RTRIM$(id2.musthave) = "$" THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ END IF
+
+ '*special case*
+ IF n$ = "ENVIRON" THEN
+ IF sourcetyp AND ISSTRING THEN
+ IF sourcetyp AND ISREFERENCE THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dontevaluate
+ END IF
+ END IF
+
+ '*special case*
+ IF n$ = "LEN" THEN
+ typ& = LONGTYPE - ISPOINTER
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN
+ 'could be a string expression
+ IF sourcetyp AND ISSTRING THEN
+ r$ = "((int32)(" + e$ + ")->len)"
+ GOTO evalfuncspecial
+ END IF
+ Give_Error "String expression or variable name required in LEN statement": EXIT FUNCTION
+ END IF
+ r$ = evaluatetotyp$(e2$, -5) 'use evaluatetotyp to get 'element' size
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case*
+ IF n$ = "OCT" THEN
+ IF RTRIM$(id2.musthave) = "$" THEN
+ bits = sourcetyp AND 511
+
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ wasref = 0
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0): wasref = 1
+ IF Error_Happened THEN EXIT FUNCTION
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISOFFSETINBITS) THEN
+ e$ = "func_oct(" + e$ + "," + str2$(bits) + ")"
+ ELSE
+ IF (sourcetyp AND ISFLOAT) THEN
+ e$ = "func_oct_float(" + e$ + ")"
+ ELSE
+ IF bits = 64 THEN
+ IF wasref = 0 THEN bits = 0
+ END IF
+ e$ = "func_oct(" + e$ + "," + str2$(bits) + ")"
+ END IF
+ END IF
+ typ& = STRINGTYPE - ISPOINTER
+ r$ = e$
+ GOTO evalfuncspecial
+ END IF
+ END IF
+
+
+
+ '*special case*
+ IF n$ = "HEX" THEN
+ IF RTRIM$(id2.musthave) = "$" THEN
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ wasref = 0
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0): wasref = 1
+ IF Error_Happened THEN EXIT FUNCTION
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISOFFSETINBITS) THEN
+ chars = (bits + 3) \ 4
+ e$ = "func_hex(" + e$ + "," + str2$(chars) + ")"
+ ELSE
+ IF (sourcetyp AND ISFLOAT) THEN
+ e$ = "func_hex_float(" + e$ + ")"
+ ELSE
+ IF bits = 8 THEN chars = 2
+ IF bits = 16 THEN chars = 4
+ IF bits = 32 THEN chars = 8
+ IF bits = 64 THEN
+ IF wasref = 1 THEN chars = 16 ELSE chars = 0
+ END IF
+ e$ = "func_hex(" + e$ + "," + str2$(chars) + ")"
+ END IF
+ END IF
+ typ& = STRINGTYPE - ISPOINTER
+ r$ = e$
+ GOTO evalfuncspecial
+ END IF
+ END IF
+
+
+
+
+
+
+
+
+
+ '*special case*
+ IF n$ = "EXP" THEN
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ bits = sourcetyp AND 511
+ typ& = SINGLETYPE - ISPOINTER
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF bits = 32 THEN e$ = "func_exp_single(" + e$ + ")" ELSE e$ = "func_exp_float(" + e$ + ")": typ& = FLOATTYPE - ISPOINTER
+ ELSE
+ IF (sourcetyp AND ISOFFSETINBITS) THEN
+ e$ = "func_exp_float(" + e$ + ")": typ& = FLOATTYPE - ISPOINTER
+ ELSE
+ IF bits <= 16 THEN e$ = "func_exp_single(" + e$ + ")" ELSE e$ = "func_exp_float(" + e$ + ")": typ& = FLOATTYPE - ISPOINTER
+ END IF
+ END IF
+ r$ = e$
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case*
+ IF n$ = "INT" THEN
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'establish which function (if any!) should be used
+ IF (sourcetyp AND ISFLOAT) THEN e$ = "floor(" + e$ + ")" ELSE e$ = "(" + e$ + ")"
+ r$ = e$
+ typ& = sourcetyp
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case*
+ IF n$ = "FIX" THEN
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'establish which function (if any!) should be used
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF bits > 64 THEN e$ = "func_fix_float(" + e$ + ")" ELSE e$ = "func_fix_double(" + e$ + ")"
+ ELSE
+ e$ = "(" + e$ + ")"
+ END IF
+ r$ = e$
+ typ& = sourcetyp
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case*
+ IF n$ = "_ROUND" THEN
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'establish which function (if any!) should be used
+ IF (sourcetyp AND ISFLOAT) THEN
+ bits = sourcetyp AND 511
+ IF bits > 64 THEN e$ = "func_round_float(" + e$ + ")" ELSE e$ = "func_round_double(" + e$ + ")"
+ ELSE
+ e$ = "(" + e$ + ")"
+ END IF
+ r$ = e$
+ typ& = 64&
+ IF (sourcetyp AND ISOFFSET) THEN
+ IF sourcetyp AND ISUNSIGNED THEN typ& = UOFFSETTYPE - ISPOINTER ELSE typ& = OFFSETTYPE - ISPOINTER
+ END IF
+ GOTO evalfuncspecial
+ END IF
+
+
+ '*special case*
+ IF n$ = "CDBL" THEN
+ IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'establish which function (if any!) should be used
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF bits > 64 THEN e$ = "func_cdbl_float(" + e$ + ")"
+ ELSE
+ e$ = "((double)(" + e$ + "))"
+ END IF
+ r$ = e$
+ typ& = DOUBLETYPE - ISPOINTER
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case*
+ IF n$ = "CSNG" THEN
+ IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'establish which function (if any!) should be used
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF bits = 64 THEN e$ = "func_csng_double(" + e$ + ")"
+ IF bits > 64 THEN e$ = "func_csng_float(" + e$ + ")"
+ ELSE
+ e$ = "((double)(" + e$ + "))"
+ END IF
+ r$ = e$
+ typ& = SINGLETYPE - ISPOINTER
+ GOTO evalfuncspecial
+ END IF
+
+
+ '*special case*
+ IF n$ = "CLNG" THEN
+ IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'establish which function (if any!) should be used
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF bits > 64 THEN e$ = "func_clng_float(" + e$ + ")" ELSE e$ = "func_clng_double(" + e$ + ")"
+ ELSE 'integer
+ IF (sourcetyp AND ISUNSIGNED) THEN
+ IF bits = 32 THEN e$ = "func_clng_ulong(" + e$ + ")"
+ IF bits > 32 THEN e$ = "func_clng_uint64(" + e$ + ")"
+ ELSE 'signed
+ IF bits > 32 THEN e$ = "func_clng_int64(" + e$ + ")"
+ END IF
+ END IF
+ r$ = e$
+ typ& = 32&
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case*
+ IF n$ = "CINT" THEN
+ IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'establish which function (if any!) should be used
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF bits > 64 THEN e$ = "func_cint_float(" + e$ + ")" ELSE e$ = "func_cint_double(" + e$ + ")"
+ ELSE 'integer
+ IF (sourcetyp AND ISUNSIGNED) THEN
+ IF bits > 15 AND bits <= 32 THEN e$ = "func_cint_ulong(" + e$ + ")"
+ IF bits > 32 THEN e$ = "func_cint_uint64(" + e$ + ")"
+ ELSE 'signed
+ IF bits > 16 AND bits <= 32 THEN e$ = "func_cint_long(" + e$ + ")"
+ IF bits > 32 THEN e$ = "func_cint_int64(" + e$ + ")"
+ END IF
+ END IF
+ r$ = e$
+ typ& = 16&
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case MKI,MKL,MKS,MKD,_MK (part #2)
+ mktype = 0
+ size = 0
+ IF n$ = "MKI" THEN mktype = 1: mktype$ = "%"
+ IF n$ = "MKL" THEN mktype = 2: mktype$ = "&"
+ IF n$ = "MKS" THEN mktype = 3: mktype$ = "!"
+ IF n$ = "MKD" THEN mktype = 4: mktype$ = "#"
+ IF n$ = "_MK" THEN mktype = -1
+ IF mktype THEN
+ IF mktype <> -1 OR curarg = 2 THEN
+ IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ 'both _MK and trad. process the following
+ qtyp& = 0
+ IF mktype$ = "%%" THEN ctype$ = "b": qtyp& = BYTETYPE - ISPOINTER
+ IF mktype$ = "~%%" THEN ctype$ = "ub": qtyp& = UBYTETYPE - ISPOINTER
+ IF mktype$ = "%" THEN ctype$ = "i": qtyp& = INTEGERTYPE - ISPOINTER
+ IF mktype$ = "~%" THEN ctype$ = "ui": qtyp& = UINTEGERTYPE - ISPOINTER
+ IF mktype$ = "&" THEN ctype$ = "l": qtyp& = LONGTYPE - ISPOINTER
+ IF mktype$ = "~&" THEN ctype$ = "ul": qtyp& = ULONGTYPE - ISPOINTER
+ IF mktype$ = "&&" THEN ctype$ = "i64": qtyp& = INTEGER64TYPE - ISPOINTER
+ IF mktype$ = "~&&" THEN ctype$ = "ui64": qtyp& = UINTEGER64TYPE - ISPOINTER
+ IF mktype$ = "!" THEN ctype$ = "s": qtyp& = SINGLETYPE - ISPOINTER
+ IF mktype$ = "#" THEN ctype$ = "d": qtyp& = DOUBLETYPE - ISPOINTER
+ IF mktype$ = "##" THEN ctype$ = "f": qtyp& = FLOATTYPE - ISPOINTER
+ IF LEFT$(mktype$, 2) = "~`" THEN ctype$ = "ubit": qtyp& = UINTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(mktype$, LEN(mktype$) - 2))
+ IF LEFT$(mktype$, 1) = "`" THEN ctype$ = "bit": qtyp& = INTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(mktype$, LEN(mktype$) - 1))
+ IF qtyp& = 0 THEN Give_Error "_MK only accepts numeric types": EXIT FUNCTION
+ IF size THEN
+ r$ = ctype$ + "2string(" + str2(size) + ","
+ ELSE
+ r$ = ctype$ + "2string("
+ END IF
+ nocomma = 1
+ targettyp = qtyp&
+ END IF
+ END IF
+
+ '*special case CVI,CVL,CVS,CVD,_CV (part #2)
+ cvtype = 0
+ IF n$ = "CVI" THEN cvtype = 1: cvtype$ = "%"
+ IF n$ = "CVL" THEN cvtype = 2: cvtype$ = "&"
+ IF n$ = "CVS" THEN cvtype = 3: cvtype$ = "!"
+ IF n$ = "CVD" THEN cvtype = 4: cvtype$ = "#"
+ IF n$ = "_CV" THEN cvtype = -1
+ IF cvtype THEN
+ IF cvtype <> -1 OR curarg = 2 THEN
+ IF (sourcetyp AND ISSTRING) = 0 THEN Give_Error n$ + " requires a STRING argument": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ typ& = 0
+ IF cvtype$ = "%%" THEN ctype$ = "b": typ& = BYTETYPE - ISPOINTER
+ IF cvtype$ = "~%%" THEN ctype$ = "ub": typ& = UBYTETYPE - ISPOINTER
+ IF cvtype$ = "%" THEN ctype$ = "i": typ& = INTEGERTYPE - ISPOINTER
+ IF cvtype$ = "~%" THEN ctype$ = "ui": typ& = UINTEGERTYPE - ISPOINTER
+ IF cvtype$ = "&" THEN ctype$ = "l": typ& = LONGTYPE - ISPOINTER
+ IF cvtype$ = "~&" THEN ctype$ = "ul": typ& = ULONGTYPE - ISPOINTER
+ IF cvtype$ = "&&" THEN ctype$ = "i64": typ& = INTEGER64TYPE - ISPOINTER
+ IF cvtype$ = "~&&" THEN ctype$ = "ui64": typ& = UINTEGER64TYPE - ISPOINTER
+ IF cvtype$ = "!" THEN ctype$ = "s": typ& = SINGLETYPE - ISPOINTER
+ IF cvtype$ = "#" THEN ctype$ = "d": typ& = DOUBLETYPE - ISPOINTER
+ IF cvtype$ = "##" THEN ctype$ = "f": typ& = FLOATTYPE - ISPOINTER
+ IF LEFT$(cvtype$, 2) = "~`" THEN ctype$ = "ubit": typ& = UINTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(cvtype$, LEN(cvtype$) - 2))
+ IF LEFT$(cvtype$, 1) = "`" THEN ctype$ = "bit": typ& = INTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(cvtype$, LEN(cvtype$) - 1))
+ IF typ& = 0 THEN Give_Error "_CV cannot return STRING type!": EXIT FUNCTION
+ IF ctype$ = "bit" OR ctype$ = "ubit" THEN
+ r$ = "string2" + ctype$ + "(" + e$ + "," + str2(size) + ")"
+ ELSE
+ r$ = "string2" + ctype$ + "(" + e$ + ")"
+ END IF
+ GOTO evalfuncspecial
+ END IF
+ END IF
+
+ '*special case
+ IF RTRIM$(id2.n) = "STRING" THEN
+ IF curarg = 2 THEN
+ IF (sourcetyp AND ISSTRING) THEN
+ IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ sourcetyp = 64&
+ e$ = "(" + e$ + "->chr[0])"
+ END IF
+ END IF
+ END IF
+
+ '*special case
+ IF RTRIM$(id2.n) = "SADD" THEN
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN
+ Give_Error "SADD only accepts variable-length string variables": EXIT FUNCTION
+ END IF
+ IF (sourcetyp AND ISFIXEDLENGTH) THEN
+ Give_Error "SADD only accepts variable-length string variables": EXIT FUNCTION
+ END IF
+ IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
+ recompile = 1
+ cmemlist(VAL(e$)) = 1
+ r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
+ typ& = 64&
+ GOTO evalfuncspecial
+ END IF
+ r$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ r$ = "((unsigned short)(" + r$ + "->chr-&cmem[1280]))"
+ typ& = 64&
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case
+ IF RTRIM$(id2.n) = "VARPTR" THEN
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN
+ Give_Error "Expected reference to a variable/array": EXIT FUNCTION
+ END IF
+
+ IF RTRIM$(id2.musthave) = "$" THEN
+ IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
+ recompile = 1
+ cmemlist(VAL(e$)) = 1
+ r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
+ typ& = ISSTRING
+ GOTO evalfuncspecial
+ END IF
+
+ IF (sourcetyp AND ISARRAY) THEN
+ IF (sourcetyp AND ISSTRING) = 0 THEN Give_Error "VARPTR$ only accepts variable-length string arrays": EXIT FUNCTION
+ IF (sourcetyp AND ISFIXEDLENGTH) THEN Give_Error "VARPTR$ only accepts variable-length string arrays": EXIT FUNCTION
+ END IF
+
+ 'must be a simple variable
+ '!assuming it is in cmem in DBLOCK
+ r$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF (sourcetyp AND ISSTRING) THEN
+ IF (sourcetyp AND ISARRAY) THEN r$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ r$ = r$ + "->cmem_descriptor_offset"
+ t = 3
+ ELSE
+ r$ = "((unsigned short)(((uint8*)" + r$ + ")-&cmem[1280]))"
+ '*top bit on=unsigned
+ '*second top bit on=bit-value (lower bits indicate the size)
+ 'BYTE=1
+ 'INTEGER=2
+ 'STRING=3
+ 'SINGLE=4
+ 'INT64=5
+ 'FLOAT=6
+ 'DOUBLE=8
+ 'LONG=20
+ 'BIT=64+n
+ t = 0
+ IF (sourcetyp AND ISUNSIGNED) THEN t = t + 128
+ IF (sourcetyp AND ISOFFSETINBITS) THEN
+ t = t + 64
+ t = t + (sourcetyp AND 63)
+ ELSE
+ bits = sourcetyp AND 511
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF bits = 32 THEN t = t + 4
+ IF bits = 64 THEN t = t + 8
+ IF bits = 256 THEN t = t + 6
+ ELSE
+ IF bits = 8 THEN t = t + 1
+ IF bits = 16 THEN t = t + 2
+ IF bits = 32 THEN t = t + 20
+ IF bits = 64 THEN t = t + 5
+ END IF
+ END IF
+ END IF
+ r$ = "func_varptr_helper(" + str2(t) + "," + r$ + ")"
+ typ& = ISSTRING
+ GOTO evalfuncspecial
+ END IF 'end of varptr$
+
+
+
+
+
+
+
+
+
+
+
+ 'VARPTR
+ IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
+ recompile = 1
+ cmemlist(VAL(e$)) = 1
+ r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
+ typ& = 64&
+ GOTO evalfuncspecial
+ END IF
+
+ IF (sourcetyp AND ISARRAY) THEN
+ IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "VARPTR cannot reference _BIT type arrays": EXIT FUNCTION
+
+ 'string array?
+ IF (sourcetyp AND ISSTRING) THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) THEN
+ getid VAL(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+ m = id.tsize
+ index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3))
+ typ = 64&
+ r$ = "((" + index$ + ")*" + str2(m) + ")"
+ GOTO evalfuncspecial
+ ELSE
+ 'return the offset of the string's descriptor
+ r$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ r$ = r$ + "->cmem_descriptor_offset"
+ typ = 64&
+ GOTO evalfuncspecial
+ END IF
+ END IF
+
+ IF sourcetyp AND ISUDT THEN
+ e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip idnumber
+ e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip u
+ o$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip e
+ typ = 64&
+ r$ = "(" + o$ + ")"
+ GOTO evalfuncspecial
+ END IF
+
+ 'non-UDT array
+ m = (sourcetyp AND 511) \ 8 'calculate size multiplier
+ index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3))
+ typ = 64&
+ r$ = "((" + index$ + ")*" + str2(m) + ")"
+ GOTO evalfuncspecial
+
+ END IF
+
+ 'not an array
+
+ IF sourcetyp AND ISUDT THEN
+ r$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip idnumber
+ e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip u
+ o$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip e
+ typ = 64&
+
+ 'if sub/func arg, may not be in DBLOCK
+ getid VAL(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF id.sfarg THEN 'could be in DBLOCK
+ 'note: segment could be the closest segment to UDT element or the base of DBLOCK
+ r$ = "varptr_dblock_check(((uint8*)" + r$ + ")+(" + o$ + "))"
+ ELSE 'definitely in DBLOCK
+ 'give offset relative to DBLOCK
+ r$ = "((unsigned short)(((uint8*)" + r$ + ") - &cmem[1280] + (" + o$ + ") ))"
+ END IF
+
+ GOTO evalfuncspecial
+ END IF
+
+ typ = 64&
+ r$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF (sourcetyp AND ISSTRING) THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) THEN
+
+ 'if sub/func arg, may not be in DBLOCK
+ getid VAL(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF id.sfarg THEN 'could be in DBLOCK
+ r$ = "varptr_dblock_check(" + r$ + "->chr)"
+ ELSE 'definitely in DBLOCK
+ r$ = "((unsigned short)(" + r$ + "->chr-&cmem[1280]))"
+ END IF
+
+ ELSE
+ r$ = r$ + "->cmem_descriptor_offset"
+ END IF
+ GOTO evalfuncspecial
+ END IF
+
+ 'single, simple variable
+ 'if sub/func arg, may not be in DBLOCK
+ getid VAL(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF id.sfarg THEN 'could be in DBLOCK
+ r$ = "varptr_dblock_check((uint8*)" + r$ + ")"
+ ELSE 'definitely in DBLOCK
+ r$ = "((unsigned short)(((uint8*)" + r$ + ")-&cmem[1280]))"
+ END IF
+
+ GOTO evalfuncspecial
+ END IF
+
+ '*special case*
+ IF RTRIM$(id2.n) = "VARSEG" THEN
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN
+ Give_Error "Expected reference to a variable/array": EXIT FUNCTION
+ END IF
+ IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
+ recompile = 1
+ cmemlist(VAL(e$)) = 1
+ r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
+ typ& = 64&
+ GOTO evalfuncspecial
+ END IF
+ 'array?
+ IF (sourcetyp AND ISARRAY) THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
+ IF (sourcetyp AND ISSTRING) THEN
+ r$ = "80"
+ typ = 64&
+ GOTO evalfuncspecial
+ END IF
+ END IF
+ typ = 64&
+ r$ = "( ( ((ptrszint)(" + refer(e$, sourcetyp, 1) + "[0])) - ((ptrszint)(&cmem[0])) ) /16)"
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO evalfuncspecial
+ END IF
+
+ 'single variable/(var-len)string/udt? (usually stored in DBLOCK)
+ typ = 64&
+ 'if sub/func arg, may not be in DBLOCK
+ getid VAL(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF id.sfarg <> 0 AND (sourcetyp AND ISSTRING) = 0 THEN
+ IF sourcetyp AND ISUDT THEN
+ r$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip idnumber
+ e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip u
+ o$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip e
+ r$ = "varseg_dblock_check(((uint8*)" + r$ + ")+(" + o$ + "))"
+ ELSE
+ r$ = "varseg_dblock_check((uint8*)" + refer(e$, sourcetyp, 1) + ")"
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF
+ ELSE
+ 'can be assumed to be in DBLOCK
+ r$ = "80"
+ END IF
+ GOTO evalfuncspecial
+ END IF 'varseg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'note: this code has already been called...
+ '------------------------------------------------------------------------------------------------------------
+ 'e2$ = e$
+ 'e$ = evaluate(e$, sourcetyp)
+ '------------------------------------------------------------------------------------------------------------
+
+ 'note: this comment makes no sense...
+ 'any numeric variable, but it must be type-speficied
+
+ IF targettyp = -2 THEN
+ e$ = evaluatetotyp(e2$, -2)
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dontevaluate
+ END IF '-2
+
+ IF targettyp = -7 THEN
+ e$ = evaluatetotyp(e2$, -7)
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dontevaluate
+ END IF '-7
+
+ IF targettyp = -8 THEN
+ e$ = evaluatetotyp(e2$, -8)
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dontevaluate
+ END IF '-8
+
+ IF sourcetyp AND ISOFFSET THEN
+ IF (targettyp AND ISOFFSET) = 0 THEN
+ IF id2.internal_subfunc = 0 THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ END IF
+ END IF
+
+ 'note: this is used for functions like STR(...) which accept all types...
+ explicitreference = 0
+ IF targettyp = -1 THEN
+ explicitreference = 1
+ IF (sourcetyp AND ISSTRING) THEN Give_Error "Number required for function": EXIT FUNCTION
+ targettyp = sourcetyp
+ IF (targettyp AND ISPOINTER) THEN targettyp = targettyp - ISPOINTER
+ END IF
+
+ 'pointer?
+ IF (targettyp AND ISPOINTER) THEN
+ IF dereference = 0 THEN 'check deferencing wasn't used
+
+
+
+ 'note: array pointer
+ IF (targettyp AND ISARRAY) THEN
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected arrayname()": EXIT FUNCTION
+ IF (sourcetyp AND ISARRAY) = 0 THEN Give_Error "Expected arrayname()": EXIT FUNCTION
+ IF Debug THEN PRINT #9, "evaluatefunc:array reference:[" + e$ + "]"
+
+ 'check arrays are of same type
+ targettyp2 = targettyp: sourcetyp2 = sourcetyp
+ targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
+ sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
+ IF sourcetyp2 <> targettyp2 THEN Give_Error "Incorrect array type passed to function": EXIT FUNCTION
+
+ 'check arrayname was followed by '()'
+ IF targettyp AND ISUDT THEN
+ IF Debug THEN PRINT #9, "evaluatefunc:array reference:udt reference:[" + e$ + "]"
+ 'get UDT info
+ udtrefid = VAL(e$)
+ getid udtrefid
+ IF Error_Happened THEN EXIT FUNCTION
+ udtrefi = INSTR(e$, sp3) 'end of id
+ udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
+ udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
+ udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
+ udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
+ o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
+ 'note: most of the UDT info above is not required
+ IF LEFT$(o$, 4) <> "(0)*" THEN Give_Error "Expected arrayname()": EXIT FUNCTION
+ ELSE
+ IF RIGHT$(e$, 2) <> sp3 + "0" THEN Give_Error "Expected arrayname()": EXIT FUNCTION
+ END IF
+
+
+ idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1))
+ getid idnum
+ IF Error_Happened THEN EXIT FUNCTION
+
+ IF targettyp AND ISFIXEDLENGTH THEN
+ targettypsize = CVL(MID$(id2.argsize, curarg * 4 - 4 + 1, 4))
+ IF id.tsize <> targettypsize THEN Give_Error "Incorrect array type passed to function": EXIT FUNCTION
+ END IF
+
+ IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
+ IF cmemlist(idnum) = 0 THEN
+ cmemlist(idnum) = 1
+
+ recompile = 1
+ END IF
+ END IF
+
+
+
+ IF id.linkid = 0 THEN
+ 'if id.linkid is 0, it means the number of array elements is definietly
+ 'known of the array being passed, this is not some "fake"/unknown array.
+ 'using the numer of array elements of a fake array would be dangerous!
+
+ IF nelereq = 0 THEN
+ 'only continue if the number of array elements required is unknown
+ 'and it needs to be set
+
+ IF id.arrayelements <> -1 THEN
+ nelereq = id.arrayelements
+ MID$(id2.nelereq, curarg, 1) = CHR$(nelereq)
+ END IF
+
+ ids(targetid) = id2
+
+ ELSE
+
+ 'the number of array elements required is known AND
+ 'the number of elements in the array to be passed is known
+
+
+
+ 'REMOVE FOR TESTING PURPOSES ONLY!!! SHOULD BE UNREM'd!
+ 'print id.arrayelements,nelereq
+ ' 1 , 2
+
+ IF id.arrayelements <> nelereq THEN Give_Error "Passing arrays with a differing number of elements to a SUB/FUNCTION is not supported (yet)": EXIT FUNCTION
+
+
+
+ END IF
+ END IF
+
+
+ e$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO dontevaluate
+ END IF
+
+
+
+
+
+
+
+
+
+
+
+
+ 'note: not an array...
+
+ 'target is not an array
+
+ IF (targettyp AND ISSTRING) = 0 THEN
+ IF (sourcetyp AND ISREFERENCE) THEN
+ idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
+
+ targettyp2 = targettyp: sourcetyp2 = sourcetyp
+
+ 'get info about source/target
+ arr = 0: IF (sourcetyp2 AND ISARRAY) THEN arr = 1
+ passudtelement = 0: IF (targettyp2 AND ISUDT) = 0 AND (sourcetyp2 AND ISUDT) <> 0 THEN passudtelement = 1: sourcetyp2 = sourcetyp2 - ISUDT
+
+ 'remove flags irrelevant for comparison... ISPOINTER,ISREFERENCE,ISINCONVENTIONALMEMORY,ISARRAY
+ targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
+ sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
+
+ 'compare types
+ IF sourcetyp2 = targettyp2 THEN
+
+ IF sourcetyp AND ISUDT THEN
+ 'udt/udt array
+
+ 'get info
+ udtrefid = VAL(e$)
+ getid udtrefid
+ IF Error_Happened THEN EXIT FUNCTION
+ udtrefi = INSTR(e$, sp3) 'end of id
+ udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
+ udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
+ udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
+ udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
+ o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
+ 'note: most of the UDT info above is not required
+
+ IF arr THEN
+ n2$ = scope$ + "ARRAY_UDT_" + RTRIM$(id.n) + "[0]"
+ ELSE
+ n2$ = scope$ + "UDT_" + RTRIM$(id.n)
+ END IF
+
+ e$ = "(void*)( ((char*)(" + n2$ + ")) + (" + o$ + ") )"
+
+ 'convert void* to target type*
+ IF passudtelement THEN e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
+ IF Error_Happened THEN EXIT FUNCTION
+
+ ELSE
+ 'not a udt
+ IF arr THEN
+ IF (sourcetyp2 AND ISOFFSETINBITS) THEN Give_Error "Cannot pass BIT array offsets yet": EXIT FUNCTION
+ e$ = "(&(" + refer(e$, sourcetyp, 0) + "))"
+ IF Error_Happened THEN EXIT FUNCTION
+ ELSE
+ e$ = refer(e$, sourcetyp, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF
+
+ 'note: signed/unsigned mismatch requires casting
+ IF (sourcetyp AND ISUNSIGNED) <> (targettyp AND ISUNSIGNED) THEN
+ e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF
+
+ END IF 'udt?
+
+ 'force recompile if target needs to be in cmem and the source is not
+ IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
+ IF cmemlist(idnum) = 0 THEN
+ cmemlist(idnum) = 1
+ recompile = 1
+ END IF
+ END IF
+
+ GOTO dontevaluate
+ END IF 'similar
+
+ 'IF sourcetyp2 = targettyp2 THEN
+ 'IF arr THEN
+ 'IF (sourcetyp2 AND ISOFFSETINBITS) THEN Give_Error "Cannot pass BIT array offsets yet": EXIT FUNCTION
+ 'e$ = "(&(" + refer(e$, sourcetyp, 0) + "))"
+ 'ELSE
+ 'e$ = refer(e$, sourcetyp, 1)
+ 'END IF
+ 'GOTO dontevaluate
+ 'END IF
+
+ END IF 'source is a reference
+
+ ELSE 'string
+ 'its a string
+
+ IF (sourcetyp AND ISREFERENCE) THEN
+ idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
+ IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
+ IF cmemlist(idnum) = 0 THEN
+ cmemlist(idnum) = 1
+ recompile = 1
+ END IF
+ END IF
+ END IF 'reference
+
+ END IF 'string
+
+ END IF 'dereference was not used
+ END IF 'pointer
+
+
+ 'note: Target is not a pointer...
+
+ 'IF (targettyp AND ISSTRING) = 0 THEN
+ 'IF (sourcetyp AND ISREFERENCE) THEN
+ 'targettyp2 = targettyp: sourcetyp2 = sourcetyp - ISREFERENCE
+ 'IF (sourcetyp2 AND ISINCONVENTIONALMEMORY) THEN sourcetyp2 = sourcetyp2 - ISINCONVENTIONALMEMORY
+ 'IF sourcetyp2 = targettyp2 THEN e$ = refer(e$, sourcetyp, 1): GOTO dontevaluate
+ 'END IF
+ 'END IF
+ 'END IF
+
+ 'String-numeric mismatch?
+ IF targettyp AND ISSTRING THEN
+ IF (sourcetyp AND ISSTRING) = 0 THEN
+ nth = curarg
+ IF omitarg_last <> 0 AND nth > omitarg_last THEN nth = nth - 1
+ IF ids(targetid).args = 1 THEN Give_Error "String required for function": EXIT FUNCTION
+ Give_Error str_nth$(nth) + " function argument requires a string": EXIT FUNCTION
+ END IF
+ END IF
+ IF (targettyp AND ISSTRING) = 0 THEN
+ IF sourcetyp AND ISSTRING THEN
+ nth = curarg
+ IF omitarg_last <> 0 AND nth > omitarg_last THEN nth = nth - 1
+ IF ids(targetid).args = 1 THEN Give_Error "Number required for function": EXIT FUNCTION
+ Give_Error str_nth$(nth) + " function argument requires a number": EXIT FUNCTION
+ END IF
+ END IF
+
+ 'change to "non-pointer" value
+ IF (sourcetyp AND ISREFERENCE) THEN
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF
+
+ IF explicitreference = 0 THEN
+ IF targettyp AND ISUDT THEN
+ nth = curarg
+ IF omitarg_last <> 0 AND nth > omitarg_last THEN nth = nth - 1
+ x$ = "'" + RTRIM$(udtxcname(targettyp AND 511)) + "'"
+ IF ids(targetid).args = 1 THEN Give_Error "TYPE " + x$ + " required for function": EXIT FUNCTION
+ Give_Error str_nth$(nth) + " function argument requires TYPE " + x$: EXIT FUNCTION
+ END IF
+ ELSE
+ IF sourcetyp AND ISUDT THEN Give_Error "Number required for function": EXIT FUNCTION
+ END IF
+
+ 'round to integer if required
+ IF (sourcetyp AND ISFLOAT) THEN
+ IF (targettyp AND ISFLOAT) = 0 THEN
+ '**32 rounding fix
+ bits = targettyp AND 511
+ IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
+ IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
+ IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
+ END IF
+ END IF
+
+ IF explicitreference THEN
+ IF (targettyp AND ISOFFSETINBITS) THEN
+ 'integer value can fit inside int64
+ e$ = "(int64)(" + e$ + ")"
+ ELSE
+ IF (targettyp AND ISFLOAT) THEN
+ IF (targettyp AND 511) = 32 THEN e$ = "(float)(" + e$ + ")"
+ IF (targettyp AND 511) = 64 THEN e$ = "(double)(" + e$ + ")"
+ IF (targettyp AND 511) = 256 THEN e$ = "(long double)(" + e$ + ")"
+ ELSE
+ IF (targettyp AND ISUNSIGNED) THEN
+ IF (targettyp AND 511) = 8 THEN e$ = "(uint8)(" + e$ + ")"
+ IF (targettyp AND 511) = 16 THEN e$ = "(uint16)(" + e$ + ")"
+ IF (targettyp AND 511) = 32 THEN e$ = "(uint32)(" + e$ + ")"
+ IF (targettyp AND 511) = 64 THEN e$ = "(uint64)(" + e$ + ")"
+ ELSE
+ IF (targettyp AND 511) = 8 THEN e$ = "(int8)(" + e$ + ")"
+ IF (targettyp AND 511) = 16 THEN e$ = "(int16)(" + e$ + ")"
+ IF (targettyp AND 511) = 32 THEN e$ = "(int32)(" + e$ + ")"
+ IF (targettyp AND 511) = 64 THEN e$ = "(int64)(" + e$ + ")"
+ END IF
+ END IF 'float?
+ END IF 'offset in bits?
+ END IF 'explicit?
+
+
+ IF (targettyp AND ISPOINTER) THEN 'pointer required
+ IF (targettyp AND ISSTRING) THEN GOTO dontevaluate 'no changes required
+ '20090703
+ t$ = typ2ctyp$(targettyp, "")
+ IF Error_Happened THEN EXIT FUNCTION
+ v$ = "pass" + str2$(uniquenumber)
+ 'assume numeric type
+ IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
+ bytesreq = ((targettyp AND 511) + 7) \ 8
+ PRINT #defdatahandle, t$ + " *" + v$ + "=NULL;"
+ PRINT #13, "if(" + v$ + "==NULL){"
+ PRINT #13, "cmem_sp-=" + str2(bytesreq) + ";"
+ PRINT #13, v$ + "=(" + t$ + "*)(dblock+cmem_sp);"
+ PRINT #13, "if (cmem_spchr"
+ END IF
+
+ IF LTRIM$(RTRIM$(e$)) = "0" THEN e$ = "NULL"
+
+ END IF
+
+ r$ = r$ + e$
+
+ '***special case****
+ IF n$ = "_MEM" THEN
+ IF args = 1 THEN
+ IF curarg = 1 THEN r$ = r$ + ")": GOTO evalfuncspecial
+ END IF
+ IF args = 2 THEN
+ IF curarg = 2 THEN r$ = r$ + ")": GOTO evalfuncspecial
+ END IF
+ END IF
+
+ IF i <> n AND nocomma = 0 THEN r$ = r$ + ","
+ nocomma = 0
+ firsti = i + 1
+ curarg = curarg + 1
+ END IF
+
+ IF (curarg >= omitarg_first AND curarg <= omitarg_last) AND i = n THEN
+ targettyp = CVL(MID$(id2.arg, curarg * 4 - 4 + 1, 4))
+ 'IF (targettyp AND ISSTRING) THEN Give_Error "QB64 doesn't support optional string arguments for functions yet!": EXIT FUNCTION
+ FOR fi = 1 TO omitargs: r$ = r$ + ",NULL": NEXT
+ curarg = curarg + omitargs
+ END IF
+
+ NEXT
END IF
IF n$ = "UBOUND" OR n$ = "LBOUND" THEN
-IF curarg = 1 THEN
-'perform a "fake" evaluation of the array
-e$ = e$ + sp + "(" + sp + ")"
-e$ = evaluate(e$, sourcetyp)
-IF Error_Happened THEN EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected array-name": EXIT FUNCTION
-IF (sourcetyp AND ISARRAY) = 0 THEN Give_Error "Expected array-name": EXIT FUNCTION
-'make a note of the array's index for later
-ulboundarray$ = e$
-ulboundarraytyp = sourcetyp
-e$ = ""
-r$ = ""
-GOTO dontevaluate
-END IF
-END IF
-
-
-'*special case: INPUT$ function
-IF n$ = "INPUT" THEN
-IF RTRIM$(id2.musthave) = "$" THEN
-IF curarg = 2 THEN
-IF LEFT$(e$, 2) = "#" + sp THEN e$ = RIGHT$(e$, LEN(e$) - 2)
-END IF
-END IF
-END IF
-
-
-'*special case*
-IF n$ = "ASC" THEN
-IF curarg = 2 THEN
-e$ = evaluatetotyp$(e$, 32&)
-IF Error_Happened THEN EXIT FUNCTION
-typ& = LONGTYPE - ISPOINTER
-r$ = r$ + e$ + ")"
-GOTO evalfuncspecial
-END IF
-END IF
-
-
-'PRINT #12, "n$="; n$
-'PRINT #12, "curarg="; curarg
-'PRINT #12, "e$="; e$
-'PRINT #12, "r$="; r$
-
-'*special case*
-IF n$ = "_MEMGET" THEN
-IF curarg = 1 THEN
-memget_blk$ = e$
-END IF
-IF curarg = 2 THEN
-memget_offs$ = e$
-END IF
-IF curarg = 3 THEN
-e$ = UCASE$(e$)
-IF INSTR(e$, sp + "*" + sp) THEN 'multiplier will have an appended %,& or && symbol
-IF RIGHT$(e$, 2) = "&&" THEN
-e$ = LEFT$(e$, LEN(e$) - 2)
-ELSE
-IF RIGHT$(e$, 1) = "&" OR RIGHT$(e$, 1) = "%" THEN e$ = LEFT$(e$, LEN(e$) - 1)
-END IF
-END IF
-t = typname2typ(e$)
-IF t = 0 THEN Give_Error "Invalid TYPE name": EXIT FUNCTION
-IF t AND ISOFFSETINBITS THEN Give_Error "_BIT TYPE unsupported": EXIT FUNCTION
-memget_size = typname2typsize
-IF t AND ISSTRING THEN
-IF (t AND ISFIXEDLENGTH) = 0 THEN Give_Error "Expected STRING * ...": EXIT FUNCTION
-memget_ctyp$ = "qbs*"
-ELSE
-IF t AND ISUDT THEN
-memget_size = udtxsize(t AND 511) \ 8
-memget_ctyp$ = "void*"
-ELSE
-memget_size = (t AND 511) \ 8
-memget_ctyp$ = typ2ctyp$(t, "")
-END IF
-END IF
-
-
-
-
-
-'assume checking off
-offs$ = evaluatetotyp(memget_offs$, OFFSETTYPE - ISPOINTER)
-blkoffs$ = evaluatetotyp(memget_blk$, -6)
-IF NoChecks = 0 THEN
-'change offs$ to be the return of the safe version
-offs$ = "func__memget((mem_block*)" + blkoffs$ + "," + offs$ + "," + str2(memget_size) + ")"
-END IF
-IF t AND ISSTRING THEN
-r$ = "qbs_new_txt_len((char*)" + offs$ + "," + str2(memget_size) + ")"
-ELSE
-IF t AND ISUDT THEN
-r$ = "((void*)+" + offs$ + ")"
-t = ISUDT + ISPOINTER + (t AND 511)
-ELSE
-r$ = "*(" + memget_ctyp$ + "*)(" + offs$ + ")"
-IF t AND ISPOINTER THEN t = t - ISPOINTER
-END IF
-END IF
-
-
-
-
-
-
-
-typ& = t
-
-
-GOTO evalfuncspecial
-END IF
-END IF
-
-'------------------------------------------------------------------------------------------------------------
-e2$ = e$
-e$ = evaluate(e$, sourcetyp)
-IF Error_Happened THEN EXIT FUNCTION
-'------------------------------------------------------------------------------------------------------------
-
-'***special case***
-IF n$ = "_MEM" THEN
-IF curarg = 1 THEN
-IF args = 1 THEN
-targettyp = -7
-END IF
-IF args = 2 THEN
-r$ = RTRIM$(id2.callname) + "_at_offset" + RIGHT$(r$, LEN(r$) - LEN(RTRIM$(id2.callname)))
-IF (sourcetyp AND ISOFFSET) = 0 THEN Give_Error "Expected _MEM(_OFFSET-value,...)": EXIT FUNCTION
-END IF
-END IF
-END IF
-
-'*special case*
-IF n$ = "_OFFSET" THEN
-IF (sourcetyp AND ISREFERENCE) = 0 THEN
-Give_Error "_OFFSET expects the name of a variable/array": EXIT FUNCTION
-END IF
-IF (sourcetyp AND ISARRAY) THEN
-IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "_OFFSET cannot reference _BIT type arrays": EXIT FUNCTION
-END IF
-r$ = "((uptrszint)(" + evaluatetotyp$(e2$, -6) + "))"
-IF Error_Happened THEN EXIT FUNCTION
-typ& = UOFFSETTYPE - ISPOINTER
-GOTO evalfuncspecial
-END IF '_OFFSET
-
-'*_OFFSET exceptions*
-IF sourcetyp AND ISOFFSET THEN
-IF n$ = "MKSMBF" AND RTRIM$(id2.musthave) = "$" THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-IF n$ = "MKDMBF" AND RTRIM$(id2.musthave) = "$" THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-END IF
-
-'*special case*
-IF n$ = "ENVIRON" THEN
-IF sourcetyp AND ISSTRING THEN
-IF sourcetyp AND ISREFERENCE THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dontevaluate
-END IF
-END IF
-
-'*special case*
-IF n$ = "LEN" THEN
-typ& = LONGTYPE - ISPOINTER
-IF (sourcetyp AND ISREFERENCE) = 0 THEN
-'could be a string expression
-IF sourcetyp AND ISSTRING THEN
-r$ = "((int32)(" + e$ + ")->len)"
-GOTO evalfuncspecial
-END IF
-Give_Error "String expression or variable name required in LEN statement": EXIT FUNCTION
-END IF
-r$ = evaluatetotyp$(e2$, -5) 'use evaluatetotyp to get 'element' size
-IF Error_Happened THEN EXIT FUNCTION
-GOTO evalfuncspecial
-END IF
-
-'*special case*
-IF n$ = "OCT" THEN
-IF RTRIM$(id2.musthave) = "$" THEN
-bits = sourcetyp AND 511
-
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-wasref = 0
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0): wasref = 1
-IF Error_Happened THEN EXIT FUNCTION
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISOFFSETINBITS) THEN
-e$ = "func_oct(" + e$ + "," + str2$(bits) + ")"
-ELSE
-IF (sourcetyp AND ISFLOAT) THEN
-e$ = "func_oct_float(" + e$ + ")"
-ELSE
-IF bits = 64 THEN
-IF wasref = 0 THEN bits = 0
-END IF
-e$ = "func_oct(" + e$ + "," + str2$(bits) + ")"
-END IF
-END IF
-typ& = STRINGTYPE - ISPOINTER
-r$ = e$
-GOTO evalfuncspecial
-END IF
-END IF
-
-
-
-'*special case*
-IF n$ = "HEX" THEN
-IF RTRIM$(id2.musthave) = "$" THEN
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-wasref = 0
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0): wasref = 1
-IF Error_Happened THEN EXIT FUNCTION
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISOFFSETINBITS) THEN
-chars = (bits + 3) \ 4
-e$ = "func_hex(" + e$ + "," + str2$(chars) + ")"
-ELSE
-IF (sourcetyp AND ISFLOAT) THEN
-e$ = "func_hex_float(" + e$ + ")"
-ELSE
-IF bits = 8 THEN chars = 2
-IF bits = 16 THEN chars = 4
-IF bits = 32 THEN chars = 8
-IF bits = 64 THEN
-IF wasref = 1 THEN chars = 16 ELSE chars = 0
-END IF
-e$ = "func_hex(" + e$ + "," + str2$(chars) + ")"
-END IF
-END IF
-typ& = STRINGTYPE - ISPOINTER
-r$ = e$
-GOTO evalfuncspecial
-END IF
-END IF
-
-
-
-
-
-
-
-
-
-'*special case*
-IF n$ = "EXP" THEN
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-bits = sourcetyp AND 511
-typ& = SINGLETYPE - ISPOINTER
-IF (sourcetyp AND ISFLOAT) THEN
-IF bits = 32 THEN e$ = "func_exp_single(" + e$ + ")" ELSE e$ = "func_exp_float(" + e$ + ")": typ& = FLOATTYPE - ISPOINTER
-ELSE
-IF (sourcetyp AND ISOFFSETINBITS) THEN
-e$ = "func_exp_float(" + e$ + ")": typ& = FLOATTYPE - ISPOINTER
-ELSE
-IF bits <= 16 THEN e$ = "func_exp_single(" + e$ + ")" ELSE e$ = "func_exp_float(" + e$ + ")": typ& = FLOATTYPE - ISPOINTER
-END IF
-END IF
-r$ = e$
-GOTO evalfuncspecial
-END IF
-
-'*special case*
-IF n$ = "INT" THEN
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'establish which function (if any!) should be used
-IF (sourcetyp AND ISFLOAT) THEN e$ = "floor(" + e$ + ")" ELSE e$ = "(" + e$ + ")"
-r$ = e$
-typ& = sourcetyp
-GOTO evalfuncspecial
-END IF
-
-'*special case*
-IF n$ = "FIX" THEN
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'establish which function (if any!) should be used
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISFLOAT) THEN
-IF bits > 64 THEN e$ = "func_fix_float(" + e$ + ")" ELSE e$ = "func_fix_double(" + e$ + ")"
-ELSE
-e$ = "(" + e$ + ")"
-END IF
-r$ = e$
-typ& = sourcetyp
-GOTO evalfuncspecial
-END IF
-
-'*special case*
-IF n$ = "_ROUND" THEN
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'establish which function (if any!) should be used
-IF (sourcetyp AND ISFLOAT) THEN
-bits = sourcetyp AND 511
-IF bits > 64 THEN e$ = "func_round_float(" + e$ + ")" ELSE e$ = "func_round_double(" + e$ + ")"
-ELSE
-e$ = "(" + e$ + ")"
-END IF
-r$ = e$
-typ& = 64&
-IF (sourcetyp AND ISOFFSET) THEN
-IF sourcetyp AND ISUNSIGNED THEN typ& = UOFFSETTYPE - ISPOINTER ELSE typ& = OFFSETTYPE - ISPOINTER
-END IF
-GOTO evalfuncspecial
-END IF
-
-
-'*special case*
-IF n$ = "CDBL" THEN
-IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'establish which function (if any!) should be used
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISFLOAT) THEN
-IF bits > 64 THEN e$ = "func_cdbl_float(" + e$ + ")"
-ELSE
-e$ = "((double)(" + e$ + "))"
-END IF
-r$ = e$
-typ& = DOUBLETYPE - ISPOINTER
-GOTO evalfuncspecial
-END IF
-
-'*special case*
-IF n$ = "CSNG" THEN
-IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'establish which function (if any!) should be used
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISFLOAT) THEN
-IF bits = 64 THEN e$ = "func_csng_double(" + e$ + ")"
-IF bits > 64 THEN e$ = "func_csng_float(" + e$ + ")"
-ELSE
-e$ = "((double)(" + e$ + "))"
-END IF
-r$ = e$
-typ& = SINGLETYPE - ISPOINTER
-GOTO evalfuncspecial
-END IF
-
-
-'*special case*
-IF n$ = "CLNG" THEN
-IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'establish which function (if any!) should be used
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISFLOAT) THEN
-IF bits > 64 THEN e$ = "func_clng_float(" + e$ + ")" ELSE e$ = "func_clng_double(" + e$ + ")"
-ELSE 'integer
-IF (sourcetyp AND ISUNSIGNED) THEN
-IF bits = 32 THEN e$ = "func_clng_ulong(" + e$ + ")"
-IF bits > 32 THEN e$ = "func_clng_uint64(" + e$ + ")"
-ELSE 'signed
-IF bits > 32 THEN e$ = "func_clng_int64(" + e$ + ")"
-END IF
-END IF
-r$ = e$
-typ& = 32&
-GOTO evalfuncspecial
-END IF
-
-'*special case*
-IF n$ = "CINT" THEN
-IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Expected numeric value": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'establish which function (if any!) should be used
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISFLOAT) THEN
-IF bits > 64 THEN e$ = "func_cint_float(" + e$ + ")" ELSE e$ = "func_cint_double(" + e$ + ")"
-ELSE 'integer
-IF (sourcetyp AND ISUNSIGNED) THEN
-IF bits > 15 AND bits <= 32 THEN e$ = "func_cint_ulong(" + e$ + ")"
-IF bits > 32 THEN e$ = "func_cint_uint64(" + e$ + ")"
-ELSE 'signed
-IF bits > 16 AND bits <= 32 THEN e$ = "func_cint_long(" + e$ + ")"
-IF bits > 32 THEN e$ = "func_cint_int64(" + e$ + ")"
-END IF
-END IF
-r$ = e$
-typ& = 16&
-GOTO evalfuncspecial
-END IF
-
-'*special case MKI,MKL,MKS,MKD,_MK (part #2)
-mktype = 0
-size = 0
-IF n$ = "MKI" THEN mktype = 1: mktype$ = "%"
-IF n$ = "MKL" THEN mktype = 2: mktype$ = "&"
-IF n$ = "MKS" THEN mktype = 3: mktype$ = "!"
-IF n$ = "MKD" THEN mktype = 4: mktype$ = "#"
-IF n$ = "_MK" THEN mktype = -1
-IF mktype THEN
-IF mktype <> -1 OR curarg = 2 THEN
-IF (sourcetyp AND ISOFFSET) THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-'both _MK and trad. process the following
-qtyp& = 0
-IF mktype$ = "%%" THEN ctype$ = "b": qtyp& = BYTETYPE - ISPOINTER
-IF mktype$ = "~%%" THEN ctype$ = "ub": qtyp& = UBYTETYPE - ISPOINTER
-IF mktype$ = "%" THEN ctype$ = "i": qtyp& = INTEGERTYPE - ISPOINTER
-IF mktype$ = "~%" THEN ctype$ = "ui": qtyp& = UINTEGERTYPE - ISPOINTER
-IF mktype$ = "&" THEN ctype$ = "l": qtyp& = LONGTYPE - ISPOINTER
-IF mktype$ = "~&" THEN ctype$ = "ul": qtyp& = ULONGTYPE - ISPOINTER
-IF mktype$ = "&&" THEN ctype$ = "i64": qtyp& = INTEGER64TYPE - ISPOINTER
-IF mktype$ = "~&&" THEN ctype$ = "ui64": qtyp& = UINTEGER64TYPE - ISPOINTER
-IF mktype$ = "!" THEN ctype$ = "s": qtyp& = SINGLETYPE - ISPOINTER
-IF mktype$ = "#" THEN ctype$ = "d": qtyp& = DOUBLETYPE - ISPOINTER
-IF mktype$ = "##" THEN ctype$ = "f": qtyp& = FLOATTYPE - ISPOINTER
-IF LEFT$(mktype$, 2) = "~`" THEN ctype$ = "ubit": qtyp& = UINTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(mktype$, LEN(mktype$) - 2))
-IF LEFT$(mktype$, 1) = "`" THEN ctype$ = "bit": qtyp& = INTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(mktype$, LEN(mktype$) - 1))
-IF qtyp& = 0 THEN Give_Error "_MK only accepts numeric types": EXIT FUNCTION
-IF size THEN
-r$ = ctype$ + "2string(" + str2(size) + ","
-ELSE
-r$ = ctype$ + "2string("
-END IF
-nocomma = 1
-targettyp = qtyp&
-END IF
-END IF
-
-'*special case CVI,CVL,CVS,CVD,_CV (part #2)
-cvtype = 0
-IF n$ = "CVI" THEN cvtype = 1: cvtype$ = "%"
-IF n$ = "CVL" THEN cvtype = 2: cvtype$ = "&"
-IF n$ = "CVS" THEN cvtype = 3: cvtype$ = "!"
-IF n$ = "CVD" THEN cvtype = 4: cvtype$ = "#"
-IF n$ = "_CV" THEN cvtype = -1
-IF cvtype THEN
-IF cvtype <> -1 OR curarg = 2 THEN
-IF (sourcetyp AND ISSTRING) = 0 THEN Give_Error n$ + " requires a STRING argument": EXIT FUNCTION
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-typ& = 0
-IF cvtype$ = "%%" THEN ctype$ = "b": typ& = BYTETYPE - ISPOINTER
-IF cvtype$ = "~%%" THEN ctype$ = "ub": typ& = UBYTETYPE - ISPOINTER
-IF cvtype$ = "%" THEN ctype$ = "i": typ& = INTEGERTYPE - ISPOINTER
-IF cvtype$ = "~%" THEN ctype$ = "ui": typ& = UINTEGERTYPE - ISPOINTER
-IF cvtype$ = "&" THEN ctype$ = "l": typ& = LONGTYPE - ISPOINTER
-IF cvtype$ = "~&" THEN ctype$ = "ul": typ& = ULONGTYPE - ISPOINTER
-IF cvtype$ = "&&" THEN ctype$ = "i64": typ& = INTEGER64TYPE - ISPOINTER
-IF cvtype$ = "~&&" THEN ctype$ = "ui64": typ& = UINTEGER64TYPE - ISPOINTER
-IF cvtype$ = "!" THEN ctype$ = "s": typ& = SINGLETYPE - ISPOINTER
-IF cvtype$ = "#" THEN ctype$ = "d": typ& = DOUBLETYPE - ISPOINTER
-IF cvtype$ = "##" THEN ctype$ = "f": typ& = FLOATTYPE - ISPOINTER
-IF LEFT$(cvtype$, 2) = "~`" THEN ctype$ = "ubit": typ& = UINTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(cvtype$, LEN(cvtype$) - 2))
-IF LEFT$(cvtype$, 1) = "`" THEN ctype$ = "bit": typ& = INTEGER64TYPE - ISPOINTER: size = VAL(RIGHT$(cvtype$, LEN(cvtype$) - 1))
-IF typ& = 0 THEN Give_Error "_CV cannot return STRING type!": EXIT FUNCTION
-IF ctype$ = "bit" OR ctype$ = "ubit" THEN
-r$ = "string2" + ctype$ + "(" + e$ + "," + str2(size) + ")"
-ELSE
-r$ = "string2" + ctype$ + "(" + e$ + ")"
-END IF
-GOTO evalfuncspecial
-END IF
-END IF
-
-'*special case
-IF RTRIM$(id2.n) = "STRING" THEN
-IF curarg = 2 THEN
-IF (sourcetyp AND ISSTRING) THEN
-IF (sourcetyp AND ISREFERENCE) THEN e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-sourcetyp = 64&
-e$ = "(" + e$ + "->chr[0])"
-END IF
-END IF
-END IF
-
-'*special case
-IF RTRIM$(id2.n) = "SADD" THEN
-IF (sourcetyp AND ISREFERENCE) = 0 THEN
-Give_Error "SADD only accepts variable-length string variables": EXIT FUNCTION
-END IF
-IF (sourcetyp AND ISFIXEDLENGTH) THEN
-Give_Error "SADD only accepts variable-length string variables": EXIT FUNCTION
-END IF
-IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
-recompile = 1
-cmemlist(VAL(e$)) = 1
-r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
-typ& = 64&
-GOTO evalfuncspecial
-END IF
-r$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-r$ = "((unsigned short)(" + r$ + "->chr-&cmem[1280]))"
-typ& = 64&
-GOTO evalfuncspecial
-END IF
-
-'*special case
-IF RTRIM$(id2.n) = "VARPTR" THEN
-IF (sourcetyp AND ISREFERENCE) = 0 THEN
-Give_Error "Expected reference to a variable/array": EXIT FUNCTION
-END IF
-
-IF RTRIM$(id2.musthave) = "$" THEN
-IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
-recompile = 1
-cmemlist(VAL(e$)) = 1
-r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
-typ& = ISSTRING
-GOTO evalfuncspecial
-END IF
-
-IF (sourcetyp AND ISARRAY) THEN
-IF (sourcetyp AND ISSTRING) = 0 THEN Give_Error "VARPTR$ only accepts variable-length string arrays": EXIT FUNCTION
-IF (sourcetyp AND ISFIXEDLENGTH) THEN Give_Error "VARPTR$ only accepts variable-length string arrays": EXIT FUNCTION
-END IF
-
-'must be a simple variable
-'!assuming it is in cmem in DBLOCK
-r$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN EXIT FUNCTION
-IF (sourcetyp AND ISSTRING) THEN
-IF (sourcetyp AND ISARRAY) THEN r$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-r$ = r$ + "->cmem_descriptor_offset"
-t = 3
-ELSE
-r$ = "((unsigned short)(((uint8*)" + r$ + ")-&cmem[1280]))"
-'*top bit on=unsigned
-'*second top bit on=bit-value (lower bits indicate the size)
-'BYTE=1
-'INTEGER=2
-'STRING=3
-'SINGLE=4
-'INT64=5
-'FLOAT=6
-'DOUBLE=8
-'LONG=20
-'BIT=64+n
-t = 0
-IF (sourcetyp AND ISUNSIGNED) THEN t = t + 128
-IF (sourcetyp AND ISOFFSETINBITS) THEN
-t = t + 64
-t = t + (sourcetyp AND 63)
-ELSE
-bits = sourcetyp AND 511
-IF (sourcetyp AND ISFLOAT) THEN
-IF bits = 32 THEN t = t + 4
-IF bits = 64 THEN t = t + 8
-IF bits = 256 THEN t = t + 6
-ELSE
-IF bits = 8 THEN t = t + 1
-IF bits = 16 THEN t = t + 2
-IF bits = 32 THEN t = t + 20
-IF bits = 64 THEN t = t + 5
-END IF
-END IF
-END IF
-r$ = "func_varptr_helper(" + str2(t) + "," + r$ + ")"
-typ& = ISSTRING
-GOTO evalfuncspecial
-END IF 'end of varptr$
-
-
-
-
-
-
-
-
-
-
-
-'VARPTR
-IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
-recompile = 1
-cmemlist(VAL(e$)) = 1
-r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
-typ& = 64&
-GOTO evalfuncspecial
-END IF
-
-IF (sourcetyp AND ISARRAY) THEN
-IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "VARPTR cannot reference _BIT type arrays": EXIT FUNCTION
-
-'string array?
-IF (sourcetyp AND ISSTRING) THEN
-IF (sourcetyp AND ISFIXEDLENGTH) THEN
-getid VAL(e$)
-IF Error_Happened THEN EXIT FUNCTION
-m = id.tsize
-index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3))
-typ = 64&
-r$ = "((" + index$ + ")*" + str2(m) + ")"
-GOTO evalfuncspecial
-ELSE
-'return the offset of the string's descriptor
-r$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-r$ = r$ + "->cmem_descriptor_offset"
-typ = 64&
-GOTO evalfuncspecial
-END IF
-END IF
-
-IF sourcetyp AND ISUDT THEN
-e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip idnumber
-e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip u
-o$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip e
-typ = 64&
-r$ = "(" + o$ + ")"
-GOTO evalfuncspecial
-END IF
-
-'non-UDT array
-m = (sourcetyp AND 511) \ 8 'calculate size multiplier
-index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3))
-typ = 64&
-r$ = "((" + index$ + ")*" + str2(m) + ")"
-GOTO evalfuncspecial
-
-END IF
-
-'not an array
-
-IF sourcetyp AND ISUDT THEN
-r$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip idnumber
-e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip u
-o$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip e
-typ = 64&
-
-'if sub/func arg, may not be in DBLOCK
-getid VAL(e$)
-IF Error_Happened THEN EXIT FUNCTION
-IF id.sfarg THEN 'could be in DBLOCK
-'note: segment could be the closest segment to UDT element or the base of DBLOCK
-r$ = "varptr_dblock_check(((uint8*)" + r$ + ")+(" + o$ + "))"
-ELSE 'definitely in DBLOCK
-'give offset relative to DBLOCK
-r$ = "((unsigned short)(((uint8*)" + r$ + ") - &cmem[1280] + (" + o$ + ") ))"
-END IF
-
-GOTO evalfuncspecial
-END IF
-
-typ = 64&
-r$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN EXIT FUNCTION
-IF (sourcetyp AND ISSTRING) THEN
-IF (sourcetyp AND ISFIXEDLENGTH) THEN
-
-'if sub/func arg, may not be in DBLOCK
-getid VAL(e$)
-IF Error_Happened THEN EXIT FUNCTION
-IF id.sfarg THEN 'could be in DBLOCK
-r$ = "varptr_dblock_check(" + r$ + "->chr)"
-ELSE 'definitely in DBLOCK
-r$ = "((unsigned short)(" + r$ + "->chr-&cmem[1280]))"
-END IF
-
-ELSE
-r$ = r$ + "->cmem_descriptor_offset"
-END IF
-GOTO evalfuncspecial
-END IF
-
-'single, simple variable
-'if sub/func arg, may not be in DBLOCK
-getid VAL(e$)
-IF Error_Happened THEN EXIT FUNCTION
-IF id.sfarg THEN 'could be in DBLOCK
-r$ = "varptr_dblock_check((uint8*)" + r$ + ")"
-ELSE 'definitely in DBLOCK
-r$ = "((unsigned short)(((uint8*)" + r$ + ")-&cmem[1280]))"
-END IF
-
-GOTO evalfuncspecial
-END IF
-
-'*special case*
-IF RTRIM$(id2.n) = "VARSEG" THEN
-IF (sourcetyp AND ISREFERENCE) = 0 THEN
-Give_Error "Expected reference to a variable/array": EXIT FUNCTION
-END IF
-IF (sourcetyp AND ISINCONVENTIONALMEMORY) = 0 THEN
-recompile = 1
-cmemlist(VAL(e$)) = 1
-r$ = "[CONVENTIONAL_MEMORY_REQUIRED]"
-typ& = 64&
-GOTO evalfuncspecial
-END IF
-'array?
-IF (sourcetyp AND ISARRAY) THEN
-IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
-IF (sourcetyp AND ISSTRING) THEN
-r$ = "80"
-typ = 64&
-GOTO evalfuncspecial
-END IF
-END IF
-typ = 64&
-r$ = "( ( ((ptrszint)(" + refer(e$, sourcetyp, 1) + "[0])) - ((ptrszint)(&cmem[0])) ) /16)"
-IF Error_Happened THEN EXIT FUNCTION
-GOTO evalfuncspecial
-END IF
-
-'single variable/(var-len)string/udt? (usually stored in DBLOCK)
-typ = 64&
-'if sub/func arg, may not be in DBLOCK
-getid VAL(e$)
-IF Error_Happened THEN EXIT FUNCTION
-IF id.sfarg <> 0 AND (sourcetyp AND ISSTRING) = 0 THEN
-IF sourcetyp AND ISUDT THEN
-r$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip idnumber
-e$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip u
-o$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'skip e
-r$ = "varseg_dblock_check(((uint8*)" + r$ + ")+(" + o$ + "))"
-ELSE
-r$ = "varseg_dblock_check((uint8*)" + refer(e$, sourcetyp, 1) + ")"
-IF Error_Happened THEN EXIT FUNCTION
-END IF
-ELSE
-'can be assumed to be in DBLOCK
-r$ = "80"
-END IF
-GOTO evalfuncspecial
-END IF 'varseg
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'note: this code has already been called...
-'------------------------------------------------------------------------------------------------------------
-'e2$ = e$
-'e$ = evaluate(e$, sourcetyp)
-'------------------------------------------------------------------------------------------------------------
-
-'note: this comment makes no sense...
-'any numeric variable, but it must be type-speficied
-
-IF targettyp = -2 THEN
-e$ = evaluatetotyp(e2$, -2)
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dontevaluate
-END IF '-2
-
-IF targettyp = -7 THEN
-e$ = evaluatetotyp(e2$, -7)
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dontevaluate
-END IF '-7
-
-IF targettyp = -8 THEN
-e$ = evaluatetotyp(e2$, -8)
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dontevaluate
-END IF '-8
-
-IF sourcetyp AND ISOFFSET THEN
-IF (targettyp AND ISOFFSET) = 0 THEN
-IF id2.internal_subfunc = 0 THEN Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-END IF
-END IF
-
-'note: this is used for functions like STR(...) which accept all types...
-explicitreference = 0
-IF targettyp = -1 THEN
-explicitreference = 1
-IF (sourcetyp AND ISSTRING) THEN Give_Error "Number required for function": EXIT FUNCTION
-targettyp = sourcetyp
-IF (targettyp AND ISPOINTER) THEN targettyp = targettyp - ISPOINTER
-END IF
-
-'pointer?
-IF (targettyp AND ISPOINTER) THEN
-IF dereference = 0 THEN 'check deferencing wasn't used
-
-
-
-'note: array pointer
-IF (targettyp AND ISARRAY) THEN
-IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected arrayname()": EXIT FUNCTION
-IF (sourcetyp AND ISARRAY) = 0 THEN Give_Error "Expected arrayname()": EXIT FUNCTION
-IF Debug THEN PRINT #9, "evaluatefunc:array reference:[" + e$ + "]"
-
-'check arrays are of same type
-targettyp2 = targettyp: sourcetyp2 = sourcetyp
-targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
-sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISSTRING + ISFIXEDLENGTH + ISFLOAT)
-IF sourcetyp2 <> targettyp2 THEN Give_Error "Incorrect array type passed to function": EXIT FUNCTION
-
-'check arrayname was followed by '()'
-IF targettyp AND ISUDT THEN
-IF Debug THEN PRINT #9, "evaluatefunc:array reference:udt reference:[" + e$ + "]"
-'get UDT info
-udtrefid = VAL(e$)
-getid udtrefid
-IF Error_Happened THEN EXIT FUNCTION
-udtrefi = INSTR(e$, sp3) 'end of id
-udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
-udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
-udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
-udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
-o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
-'note: most of the UDT info above is not required
-IF LEFT$(o$, 4) <> "(0)*" THEN Give_Error "Expected arrayname()": EXIT FUNCTION
-ELSE
-IF RIGHT$(e$, 2) <> sp3 + "0" THEN Give_Error "Expected arrayname()": EXIT FUNCTION
-END IF
-
-
-idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1))
-getid idnum
-IF Error_Happened THEN EXIT FUNCTION
-
-IF targettyp AND ISFIXEDLENGTH THEN
-targettypsize = CVL(MID$(id2.argsize, curarg * 4 - 4 + 1, 4))
-IF id.tsize <> targettypsize THEN Give_Error "Incorrect array type passed to function": EXIT FUNCTION
-END IF
-
-IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
-IF cmemlist(idnum) = 0 THEN
-cmemlist(idnum) = 1
-
-recompile = 1
-END IF
-END IF
-
-
-
-IF id.linkid = 0 THEN
-'if id.linkid is 0, it means the number of array elements is definietly
-'known of the array being passed, this is not some "fake"/unknown array.
-'using the numer of array elements of a fake array would be dangerous!
-
-IF nelereq = 0 THEN
-'only continue if the number of array elements required is unknown
-'and it needs to be set
-
-IF id.arrayelements <> -1 THEN
-nelereq = id.arrayelements
-MID$(id2.nelereq, curarg, 1) = CHR$(nelereq)
-END IF
-
-ids(targetid) = id2
-
-ELSE
-
-'the number of array elements required is known AND
-'the number of elements in the array to be passed is known
-
-
-
-'REMOVE FOR TESTING PURPOSES ONLY!!! SHOULD BE UNREM'd!
-'print id.arrayelements,nelereq
-' 1 , 2
-
-IF id.arrayelements <> nelereq THEN Give_Error "Passing arrays with a differing number of elements to a SUB/FUNCTION is not supported (yet)": EXIT FUNCTION
-
-
-
-END IF
-END IF
-
-
-e$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN EXIT FUNCTION
-GOTO dontevaluate
-END IF
-
-
-
-
-
-
-
-
-
-
-
-
-'note: not an array...
-
-'target is not an array
-
-IF (targettyp AND ISSTRING) = 0 THEN
-IF (sourcetyp AND ISREFERENCE) THEN
-idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
-
-targettyp2 = targettyp: sourcetyp2 = sourcetyp
-
-'get info about source/target
-arr = 0: IF (sourcetyp2 AND ISARRAY) THEN arr = 1
-passudtelement = 0: IF (targettyp2 AND ISUDT) = 0 AND (sourcetyp2 AND ISUDT) <> 0 THEN passudtelement = 1: sourcetyp2 = sourcetyp2 - ISUDT
-
-'remove flags irrelevant for comparison... ISPOINTER,ISREFERENCE,ISINCONVENTIONALMEMORY,ISARRAY
-targettyp2 = targettyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
-sourcetyp2 = sourcetyp2 AND (511 + ISOFFSETINBITS + ISUDT + ISFLOAT + ISSTRING)
-
-'compare types
-IF sourcetyp2 = targettyp2 THEN
-
-IF sourcetyp AND ISUDT THEN
-'udt/udt array
-
-'get info
-udtrefid = VAL(e$)
-getid udtrefid
-IF Error_Happened THEN EXIT FUNCTION
-udtrefi = INSTR(e$, sp3) 'end of id
-udtrefi2 = INSTR(udtrefi + 1, e$, sp3) 'end of u
-udtrefu = VAL(MID$(e$, udtrefi + 1, udtrefi2 - udtrefi - 1))
-udtrefi3 = INSTR(udtrefi2 + 1, e$, sp3) 'skip e
-udtrefe = VAL(MID$(e$, udtrefi2 + 1, udtrefi3 - udtrefi2 - 1))
-o$ = RIGHT$(e$, LEN(e$) - udtrefi3)
-'note: most of the UDT info above is not required
-
-IF arr THEN
-n2$ = scope$ + "ARRAY_UDT_" + RTRIM$(id.n) + "[0]"
-ELSE
-n2$ = scope$ + "UDT_" + RTRIM$(id.n)
-END IF
-
-e$ = "(void*)( ((char*)(" + n2$ + ")) + (" + o$ + ") )"
-
-'convert void* to target type*
-IF passudtelement THEN e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
-IF Error_Happened THEN EXIT FUNCTION
-
-ELSE
-'not a udt
-IF arr THEN
-IF (sourcetyp2 AND ISOFFSETINBITS) THEN Give_Error "Cannot pass BIT array offsets yet": EXIT FUNCTION
-e$ = "(&(" + refer(e$, sourcetyp, 0) + "))"
-IF Error_Happened THEN EXIT FUNCTION
-ELSE
-e$ = refer(e$, sourcetyp, 1)
-IF Error_Happened THEN EXIT FUNCTION
-END IF
-
-'note: signed/unsigned mismatch requires casting
-IF (sourcetyp AND ISUNSIGNED) <> (targettyp AND ISUNSIGNED) THEN
-e$ = "(" + typ2ctyp$(targettyp2 + (targettyp AND ISUNSIGNED), "") + "*)" + e$
-IF Error_Happened THEN EXIT FUNCTION
-END IF
-
-END IF 'udt?
-
-'force recompile if target needs to be in cmem and the source is not
-IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
-IF cmemlist(idnum) = 0 THEN
-cmemlist(idnum) = 1
-recompile = 1
-END IF
-END IF
-
-GOTO dontevaluate
-END IF 'similar
-
-'IF sourcetyp2 = targettyp2 THEN
-'IF arr THEN
-'IF (sourcetyp2 AND ISOFFSETINBITS) THEN Give_Error "Cannot pass BIT array offsets yet": EXIT FUNCTION
-'e$ = "(&(" + refer(e$, sourcetyp, 0) + "))"
-'ELSE
-'e$ = refer(e$, sourcetyp, 1)
-'END IF
-'GOTO dontevaluate
-'END IF
-
-END IF 'source is a reference
-
-ELSE 'string
-'its a string
-
-IF (sourcetyp AND ISREFERENCE) THEN
-idnum = VAL(LEFT$(e$, INSTR(e$, sp3) - 1)) 'id# of sourcetyp
-IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
-IF cmemlist(idnum) = 0 THEN
-cmemlist(idnum) = 1
-recompile = 1
-END IF
-END IF
-END IF 'reference
-
-END IF 'string
-
-END IF 'dereference was not used
-END IF 'pointer
-
-
-'note: Target is not a pointer...
-
-'IF (targettyp AND ISSTRING) = 0 THEN
-'IF (sourcetyp AND ISREFERENCE) THEN
-'targettyp2 = targettyp: sourcetyp2 = sourcetyp - ISREFERENCE
-'IF (sourcetyp2 AND ISINCONVENTIONALMEMORY) THEN sourcetyp2 = sourcetyp2 - ISINCONVENTIONALMEMORY
-'IF sourcetyp2 = targettyp2 THEN e$ = refer(e$, sourcetyp, 1): GOTO dontevaluate
-'END IF
-'END IF
-'END IF
-
-'String-numeric mismatch?
-IF targettyp AND ISSTRING THEN
-IF (sourcetyp AND ISSTRING) = 0 THEN
-nth = curarg
-IF omitarg_last <> 0 AND nth > omitarg_last THEN nth = nth - 1
-IF ids(targetid).args = 1 THEN Give_Error "String required for function": EXIT FUNCTION
-Give_Error str_nth$(nth) + " function argument requires a string": EXIT FUNCTION
-END IF
-END IF
-IF (targettyp AND ISSTRING) = 0 THEN
-IF sourcetyp AND ISSTRING THEN
-nth = curarg
-IF omitarg_last <> 0 AND nth > omitarg_last THEN nth = nth - 1
-IF ids(targetid).args = 1 THEN Give_Error "Number required for function": EXIT FUNCTION
-Give_Error str_nth$(nth) + " function argument requires a number": EXIT FUNCTION
-END IF
-END IF
-
-'change to "non-pointer" value
-IF (sourcetyp AND ISREFERENCE) THEN
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-END IF
-
-IF explicitreference = 0 THEN
-IF targettyp AND ISUDT THEN
-nth = curarg
-IF omitarg_last <> 0 AND nth > omitarg_last THEN nth = nth - 1
-x$ = "'" + RTRIM$(udtxcname(targettyp AND 511)) + "'"
-IF ids(targetid).args = 1 THEN Give_Error "TYPE " + x$ + " required for function": EXIT FUNCTION
-Give_Error str_nth$(nth) + " function argument requires TYPE " + x$: EXIT FUNCTION
-END IF
-ELSE
-IF sourcetyp AND ISUDT THEN Give_Error "Number required for function": EXIT FUNCTION
-END IF
-
-'round to integer if required
-IF (sourcetyp AND ISFLOAT) THEN
-IF (targettyp AND ISFLOAT) = 0 THEN
-'**32 rounding fix
-bits = targettyp AND 511
-IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
-IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
-IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
-END IF
-END IF
-
-IF explicitreference THEN
-IF (targettyp AND ISOFFSETINBITS) THEN
-'integer value can fit inside int64
-e$ = "(int64)(" + e$ + ")"
-ELSE
-IF (targettyp AND ISFLOAT) THEN
-IF (targettyp AND 511) = 32 THEN e$ = "(float)(" + e$ + ")"
-IF (targettyp AND 511) = 64 THEN e$ = "(double)(" + e$ + ")"
-IF (targettyp AND 511) = 256 THEN e$ = "(long double)(" + e$ + ")"
-ELSE
-IF (targettyp AND ISUNSIGNED) THEN
-IF (targettyp AND 511) = 8 THEN e$ = "(uint8)(" + e$ + ")"
-IF (targettyp AND 511) = 16 THEN e$ = "(uint16)(" + e$ + ")"
-IF (targettyp AND 511) = 32 THEN e$ = "(uint32)(" + e$ + ")"
-IF (targettyp AND 511) = 64 THEN e$ = "(uint64)(" + e$ + ")"
-ELSE
-IF (targettyp AND 511) = 8 THEN e$ = "(int8)(" + e$ + ")"
-IF (targettyp AND 511) = 16 THEN e$ = "(int16)(" + e$ + ")"
-IF (targettyp AND 511) = 32 THEN e$ = "(int32)(" + e$ + ")"
-IF (targettyp AND 511) = 64 THEN e$ = "(int64)(" + e$ + ")"
-END IF
-END IF 'float?
-END IF 'offset in bits?
-END IF 'explicit?
-
-
-IF (targettyp AND ISPOINTER) THEN 'pointer required
-IF (targettyp AND ISSTRING) THEN GOTO dontevaluate 'no changes required
-'20090703
-t$ = typ2ctyp$(targettyp, "")
-IF Error_Happened THEN EXIT FUNCTION
-v$ = "pass" + str2$(uniquenumber)
-'assume numeric type
-IF MID$(sfcmemargs(targetid), curarg, 1) = CHR$(1) THEN 'cmem required?
-bytesreq = ((targettyp AND 511) + 7) \ 8
-PRINT #defdatahandle, t$ + " *" + v$ + "=NULL;"
-PRINT #13, "if(" + v$ + "==NULL){"
-PRINT #13, "cmem_sp-=" + str2(bytesreq) + ";"
-PRINT #13, v$ + "=(" + t$ + "*)(dblock+cmem_sp);"
-PRINT #13, "if (cmem_spchr"
-END IF
-
-IF LTRIM$(RTRIM$(e$)) = "0" THEN e$ = "NULL"
-
-END IF
-
-r$ = r$ + e$
-
-'***special case****
-IF n$ = "_MEM" THEN
-IF args = 1 THEN
-IF curarg = 1 THEN r$ = r$ + ")": GOTO evalfuncspecial
-END IF
-IF args = 2 THEN
-IF curarg = 2 THEN r$ = r$ + ")": GOTO evalfuncspecial
-END IF
-END IF
-
-IF i <> n AND nocomma = 0 THEN r$ = r$ + ","
-nocomma = 0
-firsti = i + 1
-curarg = curarg + 1
-END IF
-
-IF (curarg >= omitarg_first AND curarg <= omitarg_last) AND i = n THEN
-targettyp = CVL(MID$(id2.arg, curarg * 4 - 4 + 1, 4))
-'IF (targettyp AND ISSTRING) THEN Give_Error "QB64 doesn't support optional string arguments for functions yet!": EXIT FUNCTION
-FOR fi = 1 TO omitargs: r$ = r$ + ",NULL": NEXT
-curarg = curarg + omitargs
-END IF
-
-NEXT
-END IF
-
-IF n$ = "UBOUND" OR n$ = "LBOUND" THEN
-IF r$ = ",NULL" THEN r$ = ",1"
-IF n$ = "UBOUND" THEN r2$ = "func_ubound(" ELSE r2$ = "func_lbound("
-e$ = refer$(ulboundarray$, sourcetyp, 1)
-IF Error_Happened THEN EXIT FUNCTION
-'note: ID contins refer'ed array info
-
-arrayelements = id.arrayelements '2009
-IF arrayelements = -1 THEN arrayelements = 1 '2009
-
-r$ = r2$ + e$ + r$ + "," + str2$(arrayelements) + ")"
-typ& = INTEGER64TYPE - ISPOINTER
-GOTO evalfuncspecial
+ IF r$ = ",NULL" THEN r$ = ",1"
+ IF n$ = "UBOUND" THEN r2$ = "func_ubound(" ELSE r2$ = "func_lbound("
+ e$ = refer$(ulboundarray$, sourcetyp, 1)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'note: ID contins refer'ed array info
+
+ arrayelements = id.arrayelements '2009
+ IF arrayelements = -1 THEN arrayelements = 1 '2009
+
+ r$ = r2$ + e$ + r$ + "," + str2$(arrayelements) + ")"
+ typ& = INTEGER64TYPE - ISPOINTER
+ GOTO evalfuncspecial
END IF
IF passomit THEN
-IF omitarg_first THEN r$ = r$ + ",0" ELSE r$ = r$ + ",1"
+ IF omitarg_first THEN r$ = r$ + ",0" ELSE r$ = r$ + ",1"
END IF
r$ = r$ + ")"
@@ -15776,29 +15983,29 @@ IF n$ = "ABS" THEN typ& = sourcetyp 'ABS Note: ABS() returns argument #1's type
'QB-like conversion of math functions returning floating point values
IF n$ = "SIN" OR n$ = "COS" OR n$ = "TAN" OR n$ = "ATN" OR n$ = "SQR" OR n$ = "LOG" THEN
-b = sourcetyp AND 511
-IF sourcetyp AND ISFLOAT THEN
-'Default is FLOATTYPE
-IF b = 64 THEN typ& = DOUBLETYPE - ISPOINTER
-IF b = 32 THEN typ& = SINGLETYPE - ISPOINTER
-ELSE
-'Default is FLOATTYPE
-IF b <= 32 THEN typ& = DOUBLETYPE - ISPOINTER
-IF b <= 16 THEN typ& = SINGLETYPE - ISPOINTER
-END IF
+ b = sourcetyp AND 511
+ IF sourcetyp AND ISFLOAT THEN
+ 'Default is FLOATTYPE
+ IF b = 64 THEN typ& = DOUBLETYPE - ISPOINTER
+ IF b = 32 THEN typ& = SINGLETYPE - ISPOINTER
+ ELSE
+ 'Default is FLOATTYPE
+ IF b <= 32 THEN typ& = DOUBLETYPE - ISPOINTER
+ IF b <= 16 THEN typ& = SINGLETYPE - ISPOINTER
+ END IF
END IF
IF id2.ret = ISUDT + (1) THEN
-'***special case***
-v$ = "func" + str2$(uniquenumber)
-PRINT #defdatahandle, "mem_block " + v$ + ";"
-r$ = "(" + v$ + "=" + r$ + ")"
+ '***special case***
+ v$ = "func" + str2$(uniquenumber)
+ PRINT #defdatahandle, "mem_block " + v$ + ";"
+ r$ = "(" + v$ + "=" + r$ + ")"
END IF
IF id2.ccall THEN
-IF LEFT$(r$, 11) = "( char* )" THEN
-r$ = "qbs_new_txt(" + r$ + ")"
-END IF
+ IF LEFT$(r$, 11) = "( char* )" THEN
+ r$ = "qbs_new_txt(" + r$ + ")"
+ END IF
END IF
IF Debug THEN PRINT #9, "evaluatefunc:out:"; r$
@@ -15814,29 +16021,29 @@ t = id.t: IF t = 0 THEN t = id.arraytype
bytes = (t AND 511) \ 8
IF t AND ISUDT THEN 'correct size for UDTs
-u = t AND 511
-bytes = udtxsize(u) \ 8
+ u = t AND 511
+ bytes = udtxsize(u) \ 8
END IF
IF t AND ISSTRING THEN 'correct size for strings
-IF t AND ISFIXEDLENGTH THEN
-bytes = id.tsize
-ELSE
-IF id.arraytype THEN Give_Error "Cannot determine size of variable-length string array": EXIT FUNCTION
-variablesize$ = scope$ + "STRING_" + RTRIM$(id.n) + "->len"
-EXIT FUNCTION
-END IF
+ IF t AND ISFIXEDLENGTH THEN
+ bytes = id.tsize
+ ELSE
+ IF id.arraytype THEN Give_Error "Cannot determine size of variable-length string array": EXIT FUNCTION
+ variablesize$ = scope$ + "STRING_" + RTRIM$(id.n) + "->len"
+ EXIT FUNCTION
+ END IF
END IF
IF id.arraytype THEN 'multiply size for arrays
-n$ = RTRIM$(id.callname)
-s$ = str2(bytes) + "*(" + n$ + "[2]&1)" 'note: multiplying by 0 if array not currently defined (affects dynamic arrays)
-arrayelements = id.arrayelements: IF arrayelements = -1 THEN arrayelements = 1 '2009
-FOR i2 = 1 TO arrayelements
-s$ = s$ + "*" + n$ + "[" + str2(i2 * 4 - 4 + 5) + "]"
-NEXT
-variablesize$ = "(" + s$ + ")"
-EXIT FUNCTION
+ n$ = RTRIM$(id.callname)
+ s$ = str2(bytes) + "*(" + n$ + "[2]&1)" 'note: multiplying by 0 if array not currently defined (affects dynamic arrays)
+ arrayelements = id.arrayelements: IF arrayelements = -1 THEN arrayelements = 1 '2009
+ FOR i2 = 1 TO arrayelements
+ s$ = s$ + "*" + n$ + "[" + str2(i2 * 4 - 4 + 5) + "]"
+ NEXT
+ variablesize$ = "(" + s$ + ")"
+ EXIT FUNCTION
END IF
variablesize$ = str2(bytes)
@@ -15852,121 +16059,121 @@ IF Error_Happened THEN EXIT FUNCTION
'Offset protection:
IF sourcetyp AND ISOFFSET THEN
-IF (targettyp AND ISOFFSET) = 0 AND targettyp >= 0 THEN
-Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
-END IF
+ IF (targettyp AND ISOFFSET) = 0 AND targettyp >= 0 THEN
+ Give_Error "Cannot convert _OFFSET type to other types": EXIT FUNCTION
+ END IF
END IF
'-5 size
'-6 offset
IF targettyp = -4 OR targettyp = -5 OR targettyp = -6 THEN '? -> byte_element(offset,element size in bytes)
-IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
-IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
+ IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
-' print "-4: evaluated as ["+e$+"]":sleep 1
+ ' print "-4: evaluated as ["+e$+"]":sleep 1
-IF (sourcetyp AND ISUDT) THEN 'User Defined Type -> byte_element(offset,bytes)
-idnumber = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-u = VAL(e$) 'closest parent
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-E = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-o$ = e$
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-n$ = "UDT_" + RTRIM$(id.n)
-IF id.arraytype THEN
-n$ = "ARRAY_" + n$ + "[0]"
-'whole array reference examplename()?
-IF LEFT$(o$, 3) = "(0)" THEN
-'use -2 type method
-GOTO method2usealludt
-END IF
-END IF
-'determine size of element
-IF E = 0 THEN 'no specific element, use size of entire type
-bytes$ = str2(udtxsize(u) \ 8)
-ELSE 'a specific element
-bytes$ = str2(udtesize(E) \ 8)
-END IF
-dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
-evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-IF targettyp = -6 THEN evaluatetotyp$ = dst$
-EXIT FUNCTION
-END IF
+ IF (sourcetyp AND ISUDT) THEN 'User Defined Type -> byte_element(offset,bytes)
+ idnumber = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ u = VAL(e$) 'closest parent
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ E = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ o$ = e$
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ n$ = "UDT_" + RTRIM$(id.n)
+ IF id.arraytype THEN
+ n$ = "ARRAY_" + n$ + "[0]"
+ 'whole array reference examplename()?
+ IF LEFT$(o$, 3) = "(0)" THEN
+ 'use -2 type method
+ GOTO method2usealludt
+ END IF
+ END IF
+ 'determine size of element
+ IF E = 0 THEN 'no specific element, use size of entire type
+ bytes$ = str2(udtxsize(u) \ 8)
+ ELSE 'a specific element
+ bytes$ = str2(udtesize(E) \ 8)
+ END IF
+ dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
+ evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ IF targettyp = -6 THEN evaluatetotyp$ = dst$
+ EXIT FUNCTION
+ END IF
-IF (sourcetyp AND ISARRAY) THEN 'Array reference -> byte_element(offset,bytes)
-'whole array reference examplename()?
-IF RIGHT$(e$, 2) = sp3 + "0" THEN
-'use -2 type method
-IF sourcetyp AND ISSTRING THEN
-IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
-Give_Error "Cannot pass array of variable-length strings": EXIT FUNCTION
-END IF
-END IF
-GOTO method2useall
-END IF
-'assume a specific element
-IF sourcetyp AND ISSTRING THEN
-IF sourcetyp AND ISFIXEDLENGTH THEN
-idnumber = VAL(e$)
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-bytes$ = str2(id.tsize)
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
-ELSE
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
+ IF (sourcetyp AND ISARRAY) THEN 'Array reference -> byte_element(offset,bytes)
+ 'whole array reference examplename()?
+ IF RIGHT$(e$, 2) = sp3 + "0" THEN
+ 'use -2 type method
+ IF sourcetyp AND ISSTRING THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
+ Give_Error "Cannot pass array of variable-length strings": EXIT FUNCTION
+ END IF
+ END IF
+ GOTO method2useall
+ END IF
+ 'assume a specific element
+ IF sourcetyp AND ISSTRING THEN
+ IF sourcetyp AND ISFIXEDLENGTH THEN
+ idnumber = VAL(e$)
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ bytes$ = str2(id.tsize)
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
+ ELSE
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + e$ + "->len," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = e$ + "->len"
-IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
-END IF
-EXIT FUNCTION
-END IF
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = "(&(" + e$ + "))"
-bytes$ = str2((sourcetyp AND 511) \ 8)
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + bytes$ + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-IF targettyp = -6 THEN evaluatetotyp$ = e$
-EXIT FUNCTION
-END IF
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + e$ + "->len," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = e$ + "->len"
+ IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
+ END IF
+ EXIT FUNCTION
+ END IF
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = "(&(" + e$ + "))"
+ bytes$ = str2((sourcetyp AND 511) \ 8)
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + bytes$ + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ IF targettyp = -6 THEN evaluatetotyp$ = e$
+ EXIT FUNCTION
+ END IF
-IF sourcetyp AND ISSTRING THEN 'String -> byte_element(offset,bytes)
-IF sourcetyp AND ISFIXEDLENGTH THEN
-idnumber = VAL(e$)
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-bytes$ = str2(id.tsize)
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-ELSE
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-bytes$ = e$ + "->len"
-END IF
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
-EXIT FUNCTION
-END IF
+ IF sourcetyp AND ISSTRING THEN 'String -> byte_element(offset,bytes)
+ IF sourcetyp AND ISFIXEDLENGTH THEN
+ idnumber = VAL(e$)
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ bytes$ = str2(id.tsize)
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ ELSE
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ bytes$ = e$ + "->len"
+ END IF
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
+ EXIT FUNCTION
+ END IF
-'Standard variable -> byte_element(offset,bytes)
-e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
-IF Error_Happened THEN EXIT FUNCTION
-size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + str2(size) + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = str2(size)
-IF targettyp = -6 THEN evaluatetotyp$ = e$
-EXIT FUNCTION
+ 'Standard variable -> byte_element(offset,bytes)
+ e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
+ IF Error_Happened THEN EXIT FUNCTION
+ size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + str2(size) + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = str2(size)
+ IF targettyp = -6 THEN evaluatetotyp$ = e$
+ EXIT FUNCTION
END IF '-4, -5, -6
@@ -15974,136 +16181,136 @@ END IF '-4, -5, -6
IF targettyp = -8 THEN '? -> _MEM structure helper {offset, fullsize, typeval, elementsize, sf_mem_lock|???}
-IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
-IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
+ IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
-IF (sourcetyp AND ISUDT) THEN 'User Defined Type -> byte_element(offset,bytes)
-idnumber = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-u = VAL(e$) 'closest parent
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-E = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-o$ = e$
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-n$ = "UDT_" + RTRIM$(id.n)
-IF id.arraytype THEN
-n$ = "ARRAY_" + n$ + "[0]"
-'whole array reference examplename()?
-IF LEFT$(o$, 3) = "(0)" THEN
-'use -7 type method
-GOTO method2usealludt__7
-END IF
-END IF
-'determine size of element
-IF E = 0 THEN 'no specific element, use size of entire type
-bytes$ = str2(udtxsize(u) \ 8)
-t1 = ISUDT + udtetype(u)
-ELSE 'a specific element
-bytes$ = str2(udtesize(E) \ 8)
-t1 = udtetype(E)
-END IF
-dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
-'evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
-'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-'IF targettyp = -6 THEN evaluatetotyp$ = dst$
+ IF (sourcetyp AND ISUDT) THEN 'User Defined Type -> byte_element(offset,bytes)
+ idnumber = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ u = VAL(e$) 'closest parent
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ E = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ o$ = e$
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ n$ = "UDT_" + RTRIM$(id.n)
+ IF id.arraytype THEN
+ n$ = "ARRAY_" + n$ + "[0]"
+ 'whole array reference examplename()?
+ IF LEFT$(o$, 3) = "(0)" THEN
+ 'use -7 type method
+ GOTO method2usealludt__7
+ END IF
+ END IF
+ 'determine size of element
+ IF E = 0 THEN 'no specific element, use size of entire type
+ bytes$ = str2(udtxsize(u) \ 8)
+ t1 = ISUDT + udtetype(u)
+ ELSE 'a specific element
+ bytes$ = str2(udtesize(E) \ 8)
+ t1 = udtetype(E)
+ END IF
+ dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
+ 'evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
+ 'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ 'IF targettyp = -6 THEN evaluatetotyp$ = dst$
-t = Type2MemTypeValue(t1)
-evaluatetotyp$ = "(ptrszint)" + dst$ + "," + bytes$ + "," + str2(t) + "," + bytes$ + ",sf_mem_lock"
+ t = Type2MemTypeValue(t1)
+ evaluatetotyp$ = "(ptrszint)" + dst$ + "," + bytes$ + "," + str2(t) + "," + bytes$ + ",sf_mem_lock"
-EXIT FUNCTION
-END IF
+ EXIT FUNCTION
+ END IF
-IF (sourcetyp AND ISARRAY) THEN 'Array reference -> byte_element(offset,bytes)
-'whole array reference examplename()?
-IF RIGHT$(e$, 2) = sp3 + "0" THEN
-'use -7 type method
-IF sourcetyp AND ISSTRING THEN
-IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
-Give_Error "Cannot pass array of variable-length strings": EXIT FUNCTION
-END IF
-END IF
-GOTO method2useall__7
-END IF
+ IF (sourcetyp AND ISARRAY) THEN 'Array reference -> byte_element(offset,bytes)
+ 'whole array reference examplename()?
+ IF RIGHT$(e$, 2) = sp3 + "0" THEN
+ 'use -7 type method
+ IF sourcetyp AND ISSTRING THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
+ Give_Error "Cannot pass array of variable-length strings": EXIT FUNCTION
+ END IF
+ END IF
+ GOTO method2useall__7
+ END IF
-idnumber = VAL(e$)
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-n$ = RTRIM$(id.callname)
-lk$ = "(mem_lock*)((ptrszint*)" + n$ + ")[" + str2(4 * id.arrayelements + 4 + 1 - 1) + "]"
+ idnumber = VAL(e$)
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ n$ = RTRIM$(id.callname)
+ lk$ = "(mem_lock*)((ptrszint*)" + n$ + ")[" + str2(4 * id.arrayelements + 4 + 1 - 1) + "]"
-'assume a specific element
+ 'assume a specific element
-IF sourcetyp AND ISSTRING THEN
-IF sourcetyp AND ISFIXEDLENGTH THEN
-bytes$ = str2(id.tsize)
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-'evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
-'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-'IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
+ IF sourcetyp AND ISSTRING THEN
+ IF sourcetyp AND ISFIXEDLENGTH THEN
+ bytes$ = str2(id.tsize)
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ 'evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
+ 'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ 'IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + e$ + "->chr," + bytes$ + "," + str2(t) + "," + bytes$ + "," + lk$
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + e$ + "->chr," + bytes$ + "," + str2(t) + "," + bytes$ + "," + lk$
-ELSE
+ ELSE
-Give_Error "_MEMELEMENT cannot reference variable-length strings": EXIT FUNCTION
+ Give_Error "_MEMELEMENT cannot reference variable-length strings": EXIT FUNCTION
-END IF
-EXIT FUNCTION
-END IF
+ END IF
+ EXIT FUNCTION
+ END IF
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = "(&(" + e$ + "))"
-bytes$ = str2((sourcetyp AND 511) \ 8)
-'evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + bytes$ + "," + NewByteElement$ + ")"
-'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-'IF targettyp = -6 THEN evaluatetotyp$ = e$
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = "(&(" + e$ + "))"
+ bytes$ = str2((sourcetyp AND 511) \ 8)
+ 'evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + bytes$ + "," + NewByteElement$ + ")"
+ 'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ 'IF targettyp = -6 THEN evaluatetotyp$ = e$
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + e$ + "," + bytes$ + "," + str2(t) + "," + bytes$ + "," + lk$
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + e$ + "," + bytes$ + "," + str2(t) + "," + bytes$ + "," + lk$
-EXIT FUNCTION
-END IF 'isarray
+ EXIT FUNCTION
+ END IF 'isarray
-IF sourcetyp AND ISSTRING THEN 'String -> byte_element(offset,bytes)
-IF sourcetyp AND ISFIXEDLENGTH THEN
-idnumber = VAL(e$)
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-bytes$ = str2(id.tsize)
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-ELSE
-Give_Error "_MEMELEMENT cannot reference variable-length strings": EXIT FUNCTION
-END IF
+ IF sourcetyp AND ISSTRING THEN 'String -> byte_element(offset,bytes)
+ IF sourcetyp AND ISFIXEDLENGTH THEN
+ idnumber = VAL(e$)
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ bytes$ = str2(id.tsize)
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ ELSE
+ Give_Error "_MEMELEMENT cannot reference variable-length strings": EXIT FUNCTION
+ END IF
-'evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
-'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-'IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
+ 'evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
+ 'IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ 'IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + e$ + "->chr," + bytes$ + "," + str2(t) + "," + bytes$ + ",sf_mem_lock"
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + e$ + "->chr," + bytes$ + "," + str2(t) + "," + bytes$ + ",sf_mem_lock"
-EXIT FUNCTION
-END IF
+ EXIT FUNCTION
+ END IF
-'Standard variable -> byte_element(offset,bytes)
-e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
-IF Error_Happened THEN EXIT FUNCTION
-size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
-'evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + str2(size) + "," + NewByteElement$ + ")"
-'IF targettyp = -5 THEN evaluatetotyp$ = str2(size)
-'IF targettyp = -6 THEN evaluatetotyp$ = e$
+ 'Standard variable -> byte_element(offset,bytes)
+ e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
+ IF Error_Happened THEN EXIT FUNCTION
+ size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
+ 'evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + str2(size) + "," + NewByteElement$ + ")"
+ 'IF targettyp = -5 THEN evaluatetotyp$ = str2(size)
+ 'IF targettyp = -6 THEN evaluatetotyp$ = e$
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + e$ + "," + str2(size) + "," + str2(t) + "," + str2(size) + ",sf_mem_lock"
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + e$ + "," + str2(size) + "," + str2(t) + "," + str2(size) + ",sf_mem_lock"
-EXIT FUNCTION
+ EXIT FUNCTION
END IF '-8
@@ -16117,210 +16324,210 @@ END IF '-8
IF targettyp = -7 THEN '? -> _MEM structure helper {offset, fullsize, typeval, elementsize, sf_mem_lock|???}
-method2useall__7:
-IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
-IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
+ method2useall__7:
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
+ IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
-'User Defined Type
-IF (sourcetyp AND ISUDT) THEN
-' print "CI: -2 type from a UDT":sleep 1
-idnumber = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-u = VAL(e$) 'closest parent
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-E = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ 'User Defined Type
+ IF (sourcetyp AND ISUDT) THEN
+ ' print "CI: -2 type from a UDT":sleep 1
+ idnumber = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ u = VAL(e$) 'closest parent
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ E = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-o$ = e$
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-n$ = "UDT_" + RTRIM$(id.n): IF id.arraytype THEN n$ = "ARRAY_" + n$ + "[0]"
-method2usealludt__7:
-bytes$ = variablesize$(-1) + "-(" + o$ + ")"
-IF Error_Happened THEN EXIT FUNCTION
-dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
+ o$ = e$
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ n$ = "UDT_" + RTRIM$(id.n): IF id.arraytype THEN n$ = "ARRAY_" + n$ + "[0]"
+ method2usealludt__7:
+ bytes$ = variablesize$(-1) + "-(" + o$ + ")"
+ IF Error_Happened THEN EXIT FUNCTION
+ dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
-'evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
+ 'evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
-'note: myudt.myelement results in a size of 1 because it is a continuous run of no consistent granularity
-IF E <> 0 THEN size = 1 ELSE size = udtxsize(u) \ 8
+ 'note: myudt.myelement results in a size of 1 because it is a continuous run of no consistent granularity
+ IF E <> 0 THEN size = 1 ELSE size = udtxsize(u) \ 8
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + dst$ + "," + bytes$ + "," + str2(t) + "," + str2(size) + ",sf_mem_lock"
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + dst$ + "," + bytes$ + "," + str2(t) + "," + str2(size) + ",sf_mem_lock"
-EXIT FUNCTION
-END IF
+ EXIT FUNCTION
+ END IF
-'Array reference
-IF (sourcetyp AND ISARRAY) THEN
-IF sourcetyp AND ISSTRING THEN
-IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
-Give_Error "_MEM cannot reference variable-length strings": EXIT FUNCTION
-END IF
-END IF
+ 'Array reference
+ IF (sourcetyp AND ISARRAY) THEN
+ IF sourcetyp AND ISSTRING THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
+ Give_Error "_MEM cannot reference variable-length strings": EXIT FUNCTION
+ END IF
+ END IF
-idnumber = VAL(e$)
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
+ idnumber = VAL(e$)
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
-n$ = RTRIM$(id.callname)
-lk$ = "(mem_lock*)((ptrszint*)" + n$ + ")[" + str2(4 * id.arrayelements + 4 + 1 - 1) + "]"
+ n$ = RTRIM$(id.callname)
+ lk$ = "(mem_lock*)((ptrszint*)" + n$ + ")[" + str2(4 * id.arrayelements + 4 + 1 - 1) + "]"
-tsize = id.tsize 'used later to determine element size of fixed length strings
-'note: array references consist of idnumber|unmultiplied-element-index
-index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'get element index
-bytes$ = variablesize$(-1)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
+ tsize = id.tsize 'used later to determine element size of fixed length strings
+ 'note: array references consist of idnumber|unmultiplied-element-index
+ index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'get element index
+ bytes$ = variablesize$(-1)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
-IF sourcetyp AND ISSTRING THEN
-e$ = "((" + e$ + ")->chr)" '[2013] handle fixed string arrays differently because they are already pointers
-ELSE
-e$ = "(&(" + e$ + "))"
-END IF
+ IF sourcetyp AND ISSTRING THEN
+ e$ = "((" + e$ + ")->chr)" '[2013] handle fixed string arrays differently because they are already pointers
+ ELSE
+ e$ = "(&(" + e$ + "))"
+ END IF
-' print "CI: array: e$["+e$+"], bytes$["+bytes$+"]":sleep 1
-'calculate size of elements
-IF sourcetyp AND ISSTRING THEN
-bytes = tsize
-ELSE
-bytes = (sourcetyp AND 511) \ 8
-END IF
-bytes$ = bytes$ + "-(" + str2(bytes) + "*(" + index$ + "))"
+ ' print "CI: array: e$["+e$+"], bytes$["+bytes$+"]":sleep 1
+ 'calculate size of elements
+ IF sourcetyp AND ISSTRING THEN
+ bytes = tsize
+ ELSE
+ bytes = (sourcetyp AND 511) \ 8
+ END IF
+ bytes$ = bytes$ + "-(" + str2(bytes) + "*(" + index$ + "))"
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + e$ + "," + bytes$ + "," + str2(t) + "," + str2(bytes) + "," + lk$
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + e$ + "," + bytes$ + "," + str2(t) + "," + str2(bytes) + "," + lk$
-EXIT FUNCTION
-END IF
+ EXIT FUNCTION
+ END IF
-'String
-IF sourcetyp AND ISSTRING THEN
-IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN Give_Error "_MEM cannot reference variable-length strings": EXIT FUNCTION
+ 'String
+ IF sourcetyp AND ISSTRING THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN Give_Error "_MEM cannot reference variable-length strings": EXIT FUNCTION
-idnumber = VAL(e$)
-getid idnumber: IF Error_Happened THEN EXIT FUNCTION
-bytes$ = str2(id.tsize)
-e$ = refer(e$, sourcetyp, 0): IF Error_Happened THEN EXIT FUNCTION
+ idnumber = VAL(e$)
+ getid idnumber: IF Error_Happened THEN EXIT FUNCTION
+ bytes$ = str2(id.tsize)
+ e$ = refer(e$, sourcetyp, 0): IF Error_Happened THEN EXIT FUNCTION
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + e$ + "->chr," + bytes$ + "," + str2(t) + "," + bytes$ + ",sf_mem_lock"
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + e$ + "->chr," + bytes$ + "," + str2(t) + "," + bytes$ + ",sf_mem_lock"
-EXIT FUNCTION
-END IF
+ EXIT FUNCTION
+ END IF
-'Standard variable -> byte_element(offset,bytes)
-e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
-IF Error_Happened THEN EXIT FUNCTION
-size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
+ 'Standard variable -> byte_element(offset,bytes)
+ e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
+ IF Error_Happened THEN EXIT FUNCTION
+ size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
-t = Type2MemTypeValue(sourcetyp)
-evaluatetotyp$ = "(ptrszint)" + e$ + "," + str2(size) + "," + str2(t) + "," + str2(size) + ",sf_mem_lock"
+ t = Type2MemTypeValue(sourcetyp)
+ evaluatetotyp$ = "(ptrszint)" + e$ + "," + str2(size) + "," + str2(t) + "," + str2(size) + ",sf_mem_lock"
-EXIT FUNCTION
+ EXIT FUNCTION
END IF '-7 _MEM structure helper
IF targettyp = -2 THEN '? -> byte_element(offset,max possible bytes)
-method2useall:
-' print "CI: eval2typ detected target type of -2 for ["+a2$+"] evaluated as ["+e$+"]":sleep 1
+ method2useall:
+ ' print "CI: eval2typ detected target type of -2 for ["+a2$+"] evaluated as ["+e$+"]":sleep 1
-IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
-IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
+ IF (sourcetyp AND ISREFERENCE) = 0 THEN Give_Error "Expected variable name/array element": EXIT FUNCTION
+ IF (sourcetyp AND ISOFFSETINBITS) THEN Give_Error "Variable/element cannot be BIT aligned": EXIT FUNCTION
-'User Defined Type -> byte_element(offset,bytes)
-IF (sourcetyp AND ISUDT) THEN
-' print "CI: -2 type from a UDT":sleep 1
-idnumber = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-u = VAL(e$) 'closest parent
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-E = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
-o$ = e$
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-n$ = "UDT_" + RTRIM$(id.n): IF id.arraytype THEN n$ = "ARRAY_" + n$ + "[0]"
-method2usealludt:
-bytes$ = variablesize$(-1) + "-(" + o$ + ")"
-IF Error_Happened THEN EXIT FUNCTION
-dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
-evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-IF targettyp = -6 THEN evaluatetotyp$ = dst$
-EXIT FUNCTION
-END IF
+ 'User Defined Type -> byte_element(offset,bytes)
+ IF (sourcetyp AND ISUDT) THEN
+ ' print "CI: -2 type from a UDT":sleep 1
+ idnumber = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ u = VAL(e$) 'closest parent
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ E = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i)
+ o$ = e$
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ n$ = "UDT_" + RTRIM$(id.n): IF id.arraytype THEN n$ = "ARRAY_" + n$ + "[0]"
+ method2usealludt:
+ bytes$ = variablesize$(-1) + "-(" + o$ + ")"
+ IF Error_Happened THEN EXIT FUNCTION
+ dst$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
+ evaluatetotyp$ = "byte_element((uint64)" + dst$ + "," + bytes$ + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ IF targettyp = -6 THEN evaluatetotyp$ = dst$
+ EXIT FUNCTION
+ END IF
-'Array reference -> byte_element(offset,bytes)
-IF (sourcetyp AND ISARRAY) THEN
-'array of variable length strings (special case, can only refer to single element)
-IF sourcetyp AND ISSTRING THEN
-IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + e$ + "->len," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = e$ + "->len"
-IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
-EXIT FUNCTION
-END IF
-END IF
-idnumber = VAL(e$)
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-tsize = id.tsize 'used later to determine element size of fixed length strings
-'note: array references consist of idnumber|unmultiplied-element-index
-index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'get element index
-bytes$ = variablesize$(-1)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = "(&(" + e$ + "))"
-' print "CI: array: e$["+e$+"], bytes$["+bytes$+"]":sleep 1
-'calculate size of elements
-IF sourcetyp AND ISSTRING THEN
-bytes = tsize
-ELSE
-bytes = (sourcetyp AND 511) \ 8
-END IF
-bytes$ = bytes$ + "-(" + str2(bytes) + "*(" + index$ + "))"
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + bytes$ + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-IF targettyp = -6 THEN evaluatetotyp$ = e$
-' print "CI: array ->["+"byte_element((uint64)" + e$ + "," + bytes$+ ","+NewByteElement$+")"+"]":sleep 1
-EXIT FUNCTION
-END IF
+ 'Array reference -> byte_element(offset,bytes)
+ IF (sourcetyp AND ISARRAY) THEN
+ 'array of variable length strings (special case, can only refer to single element)
+ IF sourcetyp AND ISSTRING THEN
+ IF (sourcetyp AND ISFIXEDLENGTH) = 0 THEN
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + e$ + "->len," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = e$ + "->len"
+ IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
+ EXIT FUNCTION
+ END IF
+ END IF
+ idnumber = VAL(e$)
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ tsize = id.tsize 'used later to determine element size of fixed length strings
+ 'note: array references consist of idnumber|unmultiplied-element-index
+ index$ = RIGHT$(e$, LEN(e$) - INSTR(e$, sp3)) 'get element index
+ bytes$ = variablesize$(-1)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = "(&(" + e$ + "))"
+ ' print "CI: array: e$["+e$+"], bytes$["+bytes$+"]":sleep 1
+ 'calculate size of elements
+ IF sourcetyp AND ISSTRING THEN
+ bytes = tsize
+ ELSE
+ bytes = (sourcetyp AND 511) \ 8
+ END IF
+ bytes$ = bytes$ + "-(" + str2(bytes) + "*(" + index$ + "))"
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + bytes$ + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ IF targettyp = -6 THEN evaluatetotyp$ = e$
+ ' print "CI: array ->["+"byte_element((uint64)" + e$ + "," + bytes$+ ","+NewByteElement$+")"+"]":sleep 1
+ EXIT FUNCTION
+ END IF
-'String -> byte_element(offset,bytes)
-IF sourcetyp AND ISSTRING THEN
-IF sourcetyp AND ISFIXEDLENGTH THEN
-idnumber = VAL(e$)
-getid idnumber
-IF Error_Happened THEN EXIT FUNCTION
-bytes$ = str2(id.tsize)
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-ELSE
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-bytes$ = e$ + "->len"
-END IF
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = bytes$
-IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
-EXIT FUNCTION
-END IF
+ 'String -> byte_element(offset,bytes)
+ IF sourcetyp AND ISSTRING THEN
+ IF sourcetyp AND ISFIXEDLENGTH THEN
+ idnumber = VAL(e$)
+ getid idnumber
+ IF Error_Happened THEN EXIT FUNCTION
+ bytes$ = str2(id.tsize)
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ ELSE
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ bytes$ = e$ + "->len"
+ END IF
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "->chr," + bytes$ + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = bytes$
+ IF targettyp = -6 THEN evaluatetotyp$ = e$ + "->chr"
+ EXIT FUNCTION
+ END IF
-'Standard variable -> byte_element(offset,bytes)
-e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
-IF Error_Happened THEN EXIT FUNCTION
-size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
-evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + str2(size) + "," + NewByteElement$ + ")"
-IF targettyp = -5 THEN evaluatetotyp$ = str2(size)
-IF targettyp = -6 THEN evaluatetotyp$ = e$
-EXIT FUNCTION
+ 'Standard variable -> byte_element(offset,bytes)
+ e$ = refer(e$, sourcetyp, 1) 'get the variable's formal name
+ IF Error_Happened THEN EXIT FUNCTION
+ size = (sourcetyp AND 511) \ 8 'calculate its size in bytes
+ evaluatetotyp$ = "byte_element((uint64)" + e$ + "," + str2(size) + "," + NewByteElement$ + ")"
+ IF targettyp = -5 THEN evaluatetotyp$ = str2(size)
+ IF targettyp = -6 THEN evaluatetotyp$ = e$
+ EXIT FUNCTION
END IF '-2 byte_element(offset,bytes)
@@ -16328,44 +16535,44 @@ END IF '-2 byte_element(offset,bytes)
'string?
IF (sourcetyp AND ISSTRING) <> (targettyp AND ISSTRING) THEN
-Give_Error "Illegal string-number conversion": EXIT FUNCTION
+ Give_Error "Illegal string-number conversion": EXIT FUNCTION
END IF
IF (sourcetyp AND ISSTRING) THEN
-evaluatetotyp$ = e$
-IF (sourcetyp AND ISREFERENCE) THEN
-evaluatetotyp$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
-END IF
-EXIT FUNCTION
+ evaluatetotyp$ = e$
+ IF (sourcetyp AND ISREFERENCE) THEN
+ evaluatetotyp$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
+ END IF
+ EXIT FUNCTION
END IF
'pointer required?
IF (targettyp AND ISPOINTER) THEN
-Give_Error "evaluatetotyp received a request for a pointer! (as yet unsupported)": EXIT FUNCTION
-'...
-Give_Error "Invalid pointer": EXIT FUNCTION
+ Give_Error "evaluatetotyp received a request for a pointer! (as yet unsupported)": EXIT FUNCTION
+ '...
+ Give_Error "Invalid pointer": EXIT FUNCTION
END IF
'change to "non-pointer" value
IF (sourcetyp AND ISREFERENCE) THEN
-e$ = refer(e$, sourcetyp, 0)
-IF Error_Happened THEN EXIT FUNCTION
+ e$ = refer(e$, sourcetyp, 0)
+ IF Error_Happened THEN EXIT FUNCTION
END IF
'check if successful
IF (sourcetyp AND ISPOINTER) THEN
-Give_Error "evaluatetotyp couldn't convert pointer type!": EXIT FUNCTION
+ Give_Error "evaluatetotyp couldn't convert pointer type!": EXIT FUNCTION
END IF
'round to integer if required
IF (sourcetyp AND ISFLOAT) THEN
-IF (targettyp AND ISFLOAT) = 0 THEN
-bits = targettyp AND 511
-'**32 rounding fix
-IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
-IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
-IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
-END IF
+ IF (targettyp AND ISFLOAT) = 0 THEN
+ bits = targettyp AND 511
+ '**32 rounding fix
+ IF bits <= 16 THEN e$ = "qbr_float_to_long(" + e$ + ")"
+ IF bits > 16 AND bits < 32 THEN e$ = "qbr_double_to_long(" + e$ + ")"
+ IF bits >= 32 THEN e$ = "qbr(" + e$ + ")"
+ END IF
END IF
evaluatetotyp$ = e$
@@ -16398,15 +16605,15 @@ i = INSTR(n$, "#"): IF i THEN GOTO gotsc
i = INSTR(n$, "$"): IF i THEN GOTO gotsc
gotsc:
IF i THEN
-sc$ = RIGHT$(n$, LEN(n$) - i + 1): n$ = LEFT$(n$, i - 1)
-IF sc$ = "`" OR sc$ = "~`" THEN sc$ = sc$ + "1" 'clarify abbreviated 1 bit reference
+ sc$ = RIGHT$(n$, LEN(n$) - i + 1): n$ = LEFT$(n$, i - 1)
+ IF sc$ = "`" OR sc$ = "~`" THEN sc$ = sc$ + "1" 'clarify abbreviated 1 bit reference
ELSE
-''' 'no symbol passed, so check what symbol could be assumed under the current DEF...
-''' v = ASC(n$): IF v = 95 THEN v = 27 ELSE v = v - 64
-''' IF v >= 1 AND v <= 27 THEN 'safeguard against n$ not being a standard name
-''' couldhavesc$ = defineextaz(v)
-''' IF couldhavesc$ = "`" OR couldhavesc$ = "~`" THEN couldhavesc$ = couldhavesc$ + "1" 'clarify abbreviated 1 bit reference
-''' END IF 'safeguard
+ ''' 'no symbol passed, so check what symbol could be assumed under the current DEF...
+ ''' v = ASC(n$): IF v = 95 THEN v = 27 ELSE v = v - 64
+ ''' IF v >= 1 AND v <= 27 THEN 'safeguard against n$ not being a standard name
+ ''' couldhavesc$ = defineextaz(v)
+ ''' IF couldhavesc$ = "`" OR couldhavesc$ = "~`" THEN couldhavesc$ = couldhavesc$ + "1" 'clarify abbreviated 1 bit reference
+ ''' END IF 'safeguard
END IF
'optomizations for later comparisons
@@ -16425,10 +16632,10 @@ IF LEN(n$) < 256 THEN n$ = n$ + SPACE$(256 - LEN(n$))
'NEW HASH SYSTEM
n$ = RTRIM$(n$)
IF findanother THEN
-hashretry:
-z = HashFindCont(unrequired, i)
+ hashretry:
+ z = HashFindCont(unrequired, i)
ELSE
-z = HashFindRev(n$, 1, unrequired, i)
+ z = HashFindRev(n$, 1, unrequired, i)
END IF
findidinternal = z
IF z = 0 THEN GOTO noid
@@ -16447,17 +16654,17 @@ findid = z
'in scope?
IF ids(i).subfunc = 0 AND ids(i).share = 0 THEN 'scope check required (not a shared variable or the name of a sub/function)
-IF ids(i).insubfunc <> insf$ THEN GOTO findidnomatch
+ IF ids(i).insubfunc <> insf$ THEN GOTO findidnomatch
END IF
'some subs require a second argument (eg. PUT #, DEF SEG, etc.)
IF ids(i).subfunc = 2 THEN
-IF ASC(ids(i).secondargmustbe) <> 32 THEN 'exists?
-IF secondarg$ <> ids(i).secondargmustbe THEN GOTO findidnomatch
-END IF
-IF ASC(ids(i).secondargcantbe) <> 32 THEN 'exists?
-IF secondarg$ = ids(i).secondargcantbe THEN GOTO findidnomatch
-END IF
+ IF ASC(ids(i).secondargmustbe) <> 32 THEN 'exists?
+ IF secondarg$ <> ids(i).secondargmustbe THEN GOTO findidnomatch
+ END IF
+ IF ASC(ids(i).secondargcantbe) <> 32 THEN 'exists?
+ IF secondarg$ = ids(i).secondargcantbe THEN GOTO findidnomatch
+ END IF
END IF 'second sub argument possible
'must have symbol?
@@ -16465,38 +16672,38 @@ END IF 'second sub argument possible
imusthave = CVI(ids(i).musthave) 'speed up checks of first 2 characters
amusthave = imusthave AND 255 'speed up checks of first character
IF amusthave <> 32 THEN
-IF scpassed THEN
-IF sc$ = ids(i).musthave THEN GOTO findidok
-END IF
-''' IF couldhavescpassed THEN
-''' IF couldhavesc$ = ids(i).musthave THEN GOTO findidok
-''' END IF
-'Q: why is the above triple-commented?
-'A: because if something must have a symbol to refer to it, then a could-have is
-' not sufficient, and it could mask shared variables in global scope
+ IF scpassed THEN
+ IF sc$ = ids(i).musthave THEN GOTO findidok
+ END IF
+ ''' IF couldhavescpassed THEN
+ ''' IF couldhavesc$ = ids(i).musthave THEN GOTO findidok
+ ''' END IF
+ 'Q: why is the above triple-commented?
+ 'A: because if something must have a symbol to refer to it, then a could-have is
+ ' not sufficient, and it could mask shared variables in global scope
-'note: symbol defined fixed length strings cannot be referred to by $ without an extension
-'note: sc$ and couldhavesc$ are already changed from ` to `1 to match stored musthave
-GOTO findidnomatch
+ 'note: symbol defined fixed length strings cannot be referred to by $ without an extension
+ 'note: sc$ and couldhavesc$ are already changed from ` to `1 to match stored musthave
+ GOTO findidnomatch
END IF
'may have symbol?
'typically for variables formally dim'd
'note: couldhavesc$ needn't be considered for mayhave checks
IF scpassed THEN 'symbol was passed, so it must match the mayhave symbol
-imayhave = CVI(ids(i).mayhave) 'speed up checks of first 2 characters
-amayhave = imayhave AND 255 'speed up checks of first character
-IF amayhave = 32 THEN GOTO findidnomatch 'it cannot have the symbol passed (nb. musthave symbols have already been ok'd)
-'note: variable length strings are not a problem here, as they can only have one possible extension
+ imayhave = CVI(ids(i).mayhave) 'speed up checks of first 2 characters
+ amayhave = imayhave AND 255 'speed up checks of first character
+ IF amayhave = 32 THEN GOTO findidnomatch 'it cannot have the symbol passed (nb. musthave symbols have already been ok'd)
+ 'note: variable length strings are not a problem here, as they can only have one possible extension
-IF amayhave = 36 THEN '"$"
-IF imayhave <> 8228 THEN '"$ "
-'it is a fixed length string
-IF CVI(sc$) = 8228 THEN GOTO findidok 'allow myvariable$ to become myvariable$10
-'allow later comparison to verify if extension is correct
-END IF
-END IF
-IF sc$ <> ids(i).mayhave THEN GOTO findidnomatch
+ IF amayhave = 36 THEN '"$"
+ IF imayhave <> 8228 THEN '"$ "
+ 'it is a fixed length string
+ IF CVI(sc$) = 8228 THEN GOTO findidok 'allow myvariable$ to become myvariable$10
+ 'allow later comparison to verify if extension is correct
+ END IF
+ END IF
+ IF sc$ <> ids(i).mayhave THEN GOTO findidnomatch
END IF 'scpassed
'return id
@@ -16536,69 +16743,69 @@ gotsc2:
n2$ = n$ + sc$
IF sc$ <> "" THEN
-'has an extension
-'note! findid must unambiguify ` to `5 or $ to $10 where applicable
-try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF id.arraytype THEN
-EXIT FUNCTION
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
+ 'has an extension
+ 'note! findid must unambiguify ` to `5 or $ to $10 where applicable
+ try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF id.arraytype THEN
+ EXIT FUNCTION
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
ELSE
-'no extension
+ 'no extension
-'1. pass as is, without any extension (local)
-try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF id.arraytype THEN
-IF subfuncn = 0 THEN EXIT FUNCTION
-IF id.insubfuncn = subfuncn THEN EXIT FUNCTION
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
+ '1. pass as is, without any extension (local)
+ try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF id.arraytype THEN
+ IF subfuncn = 0 THEN EXIT FUNCTION
+ IF id.insubfuncn = subfuncn THEN EXIT FUNCTION
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
-'2. that failed, so apply the _define'd extension and pass (local)
-a = ASC(UCASE$(n$)): IF a = 95 THEN a = 91
-a = a - 64 'so A=1, Z=27 and _=28
-n2$ = n$ + defineextaz(a)
-try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF id.arraytype THEN
-IF subfuncn = 0 THEN EXIT FUNCTION
-IF id.insubfuncn = subfuncn THEN EXIT FUNCTION
-EXIT FUNCTION
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
+ '2. that failed, so apply the _define'd extension and pass (local)
+ a = ASC(UCASE$(n$)): IF a = 95 THEN a = 91
+ a = a - 64 'so A=1, Z=27 and _=28
+ n2$ = n$ + defineextaz(a)
+ try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF id.arraytype THEN
+ IF subfuncn = 0 THEN EXIT FUNCTION
+ IF id.insubfuncn = subfuncn THEN EXIT FUNCTION
+ EXIT FUNCTION
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
-'3. pass as is, without any extension (global)
-n2$ = n$
-try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF id.arraytype THEN
-EXIT FUNCTION
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
+ '3. pass as is, without any extension (global)
+ n2$ = n$
+ try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF id.arraytype THEN
+ EXIT FUNCTION
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
-'4. that failed, so apply the _define'd extension and pass (global)
-a = ASC(UCASE$(n$)): IF a = 95 THEN a = 91
-a = a - 64 'so A=1, Z=27 and _=28
-n2$ = n$ + defineextaz(a)
-try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF id.arraytype THEN
-EXIT FUNCTION
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
+ '4. that failed, so apply the _define'd extension and pass (global)
+ a = ASC(UCASE$(n$)): IF a = 95 THEN a = 91
+ a = a - 64 'so A=1, Z=27 and _=28
+ n2$ = n$ + defineextaz(a)
+ try = findid(n2$): IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF id.arraytype THEN
+ EXIT FUNCTION
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(n2$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
END IF
FindArray = 0
@@ -16617,156 +16824,156 @@ n = numelements(a$) 'n is maintained throughout function
IF fooindwel = 1 THEN 'actions to take on initial call only
-'Quick check for duplicate binary operations
-uppercasea$ = UCASE$(a$) 'capitalize it once to reduce calls to ucase over and over
-FOR i = 1 TO n - 1
-temp1$ = getelement(uppercasea$, i)
-temp2$ = getelement(uppercasea$, i + 1)
-IF temp1$ = "AND" AND temp2$ = "AND" THEN Give_Error "Error: AND AND": EXIT FUNCTION
-IF temp1$ = "OR" AND temp2$ = "OR" THEN Give_Error "Error: OR OR": EXIT FUNCTION
-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
-NEXT
+ 'Quick check for duplicate binary operations
+ uppercasea$ = UCASE$(a$) 'capitalize it once to reduce calls to ucase over and over
+ FOR i = 1 TO n - 1
+ temp1$ = getelement(uppercasea$, i)
+ temp2$ = getelement(uppercasea$, i + 1)
+ IF temp1$ = "AND" AND temp2$ = "AND" THEN Give_Error "Error: AND AND": EXIT FUNCTION
+ IF temp1$ = "OR" AND temp2$ = "OR" THEN Give_Error "Error: OR OR": EXIT FUNCTION
+ 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
+ NEXT
-'----------------A. 'Quick' mismatched brackets check----------------
-b = 0
-a2$ = sp + a$ + sp
-b1$ = sp + "(" + sp
-b2$ = sp + ")" + sp
-i = 1
-findmmb:
-i1 = INSTR(i, a2$, b1$)
-i2 = INSTR(i, a2$, b2$)
-i3 = i1
-IF i2 THEN
-IF i1 = 0 THEN
-i3 = i2
-ELSE
-IF i2 < i1 THEN i3 = i2
-END IF
-END IF
-IF i3 THEN
-IF i3 = i1 THEN b = b + 1
-IF i3 = i2 THEN b = b - 1
-i = i3 + 2
-IF b < 0 THEN Give_Error "Missing (": EXIT FUNCTION
-GOTO findmmb
-END IF
-IF b > 0 THEN Give_Error "Missing )": EXIT FUNCTION
+ '----------------A. 'Quick' mismatched brackets check----------------
+ b = 0
+ a2$ = sp + a$ + sp
+ b1$ = sp + "(" + sp
+ b2$ = sp + ")" + sp
+ i = 1
+ findmmb:
+ i1 = INSTR(i, a2$, b1$)
+ i2 = INSTR(i, a2$, b2$)
+ i3 = i1
+ IF i2 THEN
+ IF i1 = 0 THEN
+ i3 = i2
+ ELSE
+ IF i2 < i1 THEN i3 = i2
+ END IF
+ END IF
+ IF i3 THEN
+ IF i3 = i1 THEN b = b + 1
+ IF i3 = i2 THEN b = b - 1
+ i = i3 + 2
+ IF b < 0 THEN Give_Error "Missing (": EXIT FUNCTION
+ GOTO findmmb
+ END IF
+ IF b > 0 THEN Give_Error "Missing )": EXIT FUNCTION
-'----------------B. 'Quick' correction of over-use of +,- ----------------
-'note: the results of this change are beneficial to foolayout
-a2$ = sp + a$ + sp
+ '----------------B. 'Quick' correction of over-use of +,- ----------------
+ 'note: the results of this change are beneficial to foolayout
+ a2$ = sp + a$ + sp
-'rule 1: change ++ to +
-rule1:
-i = INSTR(a2$, sp + "+" + sp + "+" + sp)
-IF i THEN
-a2$ = LEFT$(a2$, i + 2) + RIGHT$(a2$, LEN(a2$) - i - 4)
-a$ = MID$(a2$, 2, LEN(a2$) - 2)
-n = n - 1
-IF Debug THEN PRINT #9, "fixoperationorder:+/-:" + a$
-GOTO rule1
-END IF
+ 'rule 1: change ++ to +
+ rule1:
+ i = INSTR(a2$, sp + "+" + sp + "+" + sp)
+ IF i THEN
+ a2$ = LEFT$(a2$, i + 2) + RIGHT$(a2$, LEN(a2$) - i - 4)
+ a$ = MID$(a2$, 2, LEN(a2$) - 2)
+ n = n - 1
+ IF Debug THEN PRINT #9, "fixoperationorder:+/-:" + a$
+ GOTO rule1
+ END IF
-'rule 2: change -+ to -
-rule2:
-i = INSTR(a2$, sp + "-" + sp + "+" + sp)
-IF i THEN
-a2$ = LEFT$(a2$, i + 2) + RIGHT$(a2$, LEN(a2$) - i - 4)
-a$ = MID$(a2$, 2, LEN(a2$) - 2)
-n = n - 1
-IF Debug THEN PRINT #9, "fixoperationorder:+/-:" + a$
-GOTO rule2
-END IF
+ 'rule 2: change -+ to -
+ rule2:
+ i = INSTR(a2$, sp + "-" + sp + "+" + sp)
+ IF i THEN
+ a2$ = LEFT$(a2$, i + 2) + RIGHT$(a2$, LEN(a2$) - i - 4)
+ a$ = MID$(a2$, 2, LEN(a2$) - 2)
+ n = n - 1
+ IF Debug THEN PRINT #9, "fixoperationorder:+/-:" + a$
+ GOTO rule2
+ END IF
-'rule 3: change anyoperator-- to anyoperator
-rule3:
-IF INSTR(a2$, sp + "-" + sp + "-" + sp) THEN
-FOR i = 1 TO n - 2
-IF isoperator(getelement(a$, i)) THEN
-IF getelement(a$, i + 1) = "-" THEN
-IF getelement(a$, i + 2) = "-" THEN
-removeelements a$, i + 1, i + 2, 0
-a2$ = sp + a$ + sp
-n = n - 2
-IF Debug THEN PRINT #9, "fixoperationorder:+/-:" + a$
-GOTO rule3
-END IF
-END IF
-END IF
-NEXT
-END IF 'rule 3
+ 'rule 3: change anyoperator-- to anyoperator
+ rule3:
+ IF INSTR(a2$, sp + "-" + sp + "-" + sp) THEN
+ FOR i = 1 TO n - 2
+ IF isoperator(getelement(a$, i)) THEN
+ IF getelement(a$, i + 1) = "-" THEN
+ IF getelement(a$, i + 2) = "-" THEN
+ removeelements a$, i + 1, i + 2, 0
+ a2$ = sp + a$ + sp
+ n = n - 2
+ IF Debug THEN PRINT #9, "fixoperationorder:+/-:" + a$
+ GOTO rule3
+ END IF
+ END IF
+ END IF
+ NEXT
+ END IF 'rule 3
-'----------------C. 'Quick' location of negation----------------
-'note: the results of this change are beneficial to foolayout
+ '----------------C. 'Quick' location of negation----------------
+ 'note: the results of this change are beneficial to foolayout
-'for numbers...
-'before: anyoperator,-,number
-'after: anyoperator,-number
+ 'for numbers...
+ 'before: anyoperator,-,number
+ 'after: anyoperator,-number
-'for variables...
-'before: anyoperator,-,variable
-'after: anyoperator,ñ,variable
+ 'for variables...
+ 'before: anyoperator,-,variable
+ 'after: anyoperator,ñ,variable
-'exception for numbers followed by ^... (they will be bracketed up along with the ^ later)
-'before: anyoperator,-,number,^
-'after: anyoperator,ñ,number,^
+ 'exception for numbers followed by ^... (they will be bracketed up along with the ^ later)
+ 'before: anyoperator,-,number,^
+ 'after: anyoperator,ñ,number,^
-FOR i = 1 TO n - 1
-IF i > n - 1 THEN EXIT FOR 'n changes, so manually exit if required
+ FOR i = 1 TO n - 1
+ IF i > n - 1 THEN EXIT FOR 'n changes, so manually exit if required
-IF ASC(getelement(a$, i)) = 45 THEN '-
+ IF ASC(getelement(a$, i)) = 45 THEN '-
-neg = 0
-IF i = 1 THEN
-neg = 1
-ELSE
-a2$ = getelement(a$, i - 1)
-c = ASC(a2$)
-IF c = 40 OR c = 44 THEN '(,
-neg = 1
-ELSE
-IF isoperator(a2$) THEN neg = 1
-END IF '()
-END IF 'i=1
-IF neg = 1 THEN
+ neg = 0
+ IF i = 1 THEN
+ neg = 1
+ ELSE
+ a2$ = getelement(a$, i - 1)
+ c = ASC(a2$)
+ IF c = 40 OR c = 44 THEN '(,
+ neg = 1
+ ELSE
+ IF isoperator(a2$) THEN neg = 1
+ END IF '()
+ END IF 'i=1
+ IF neg = 1 THEN
-a2$ = getelement(a$, i + 1)
-c = ASC(a2$)
-IF c >= 48 AND c <= 57 THEN
-c2 = 0: IF i < n - 1 THEN c2 = ASC(getelement(a$, i + 2))
-IF c2 <> 94 THEN 'not ^
-'number...
-i2 = INSTR(a2$, ",")
-IF i2 AND ASC(a2$, i2 + 1) <> 38 THEN '&H/&O/&B values don't need the assumed negation
-a2$ = "-" + LEFT$(a2$, i2) + "-" + RIGHT$(a2$, LEN(a2$) - i2)
-ELSE
-a2$ = "-" + a2$
-END IF
-removeelements a$, i, i + 1, 0
-insertelements a$, i - 1, a2$
-n = n - 1
-IF Debug THEN PRINT #9, "fixoperationorder:negation:" + a$
+ a2$ = getelement(a$, i + 1)
+ c = ASC(a2$)
+ IF c >= 48 AND c <= 57 THEN
+ c2 = 0: IF i < n - 1 THEN c2 = ASC(getelement(a$, i + 2))
+ IF c2 <> 94 THEN 'not ^
+ 'number...
+ i2 = INSTR(a2$, ",")
+ IF i2 AND ASC(a2$, i2 + 1) <> 38 THEN '&H/&O/&B values don't need the assumed negation
+ a2$ = "-" + LEFT$(a2$, i2) + "-" + RIGHT$(a2$, LEN(a2$) - i2)
+ ELSE
+ a2$ = "-" + a2$
+ END IF
+ removeelements a$, i, i + 1, 0
+ insertelements a$, i - 1, a2$
+ n = n - 1
+ IF Debug THEN PRINT #9, "fixoperationorder:negation:" + a$
-GOTO negdone
+ GOTO negdone
-END IF
-END IF
+ END IF
+ END IF
-'not a number (or for exceptions)...
-removeelements a$, i, i, 0
-insertelements a$, i - 1, "ñ"
-IF Debug THEN PRINT #9, "fixoperationorder:negation:" + a$
+ 'not a number (or for exceptions)...
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, "ñ"
+ IF Debug THEN PRINT #9, "fixoperationorder:negation:" + a$
-END IF 'isoperator
-END IF '-
-negdone:
-NEXT
+ END IF 'isoperator
+ END IF '-
+ negdone:
+ NEXT
@@ -16778,39 +16985,39 @@ END IF 'fooindwel=1
pownegused = 0
powneg:
IF INSTR(a$, "^" + sp + "ñ") THEN 'quick check
-b = 0
-b1 = 0
-FOR i = 1 TO n
-a2$ = getelement(a$, i)
-c = ASC(a2$)
-IF c = 40 THEN b = b + 1
-IF c = 41 THEN b = b - 1
-IF b = 0 THEN
-IF b1 THEN
-IF isoperator(a2$) THEN
-IF a2$ <> "^" AND a2$ <> "ñ" THEN
-insertelements a$, i - 1, "}"
-insertelements a$, b1, "{"
-n = n + 2
-IF Debug THEN PRINT #9, "fixoperationorder:^-:" + a$
-GOTO powneg
-pownegused = 1
-END IF
-END IF
-END IF
-IF c = 94 THEN '^
-IF getelement$(a$, i + 1) = "ñ" THEN b1 = i: i = i + 1
-END IF
-END IF 'b=0
-NEXT i
-IF b1 THEN
-insertelements a$, b1, "{"
-a$ = a$ + sp + "}"
-n = n + 2
-IF Debug THEN PRINT #9, "fixoperationorder:^-:" + a$
-pownegused = 1
-GOTO powneg
-END IF
+ b = 0
+ b1 = 0
+ FOR i = 1 TO n
+ a2$ = getelement(a$, i)
+ c = ASC(a2$)
+ IF c = 40 THEN b = b + 1
+ IF c = 41 THEN b = b - 1
+ IF b = 0 THEN
+ IF b1 THEN
+ IF isoperator(a2$) THEN
+ IF a2$ <> "^" AND a2$ <> "ñ" THEN
+ insertelements a$, i - 1, "}"
+ insertelements a$, b1, "{"
+ n = n + 2
+ IF Debug THEN PRINT #9, "fixoperationorder:^-:" + a$
+ GOTO powneg
+ pownegused = 1
+ END IF
+ END IF
+ END IF
+ IF c = 94 THEN '^
+ IF getelement$(a$, i + 1) = "ñ" THEN b1 = i: i = i + 1
+ END IF
+ END IF 'b=0
+ NEXT i
+ IF b1 THEN
+ insertelements a$, b1, "{"
+ a$ = a$ + sp + "}"
+ n = n + 2
+ IF Debug THEN PRINT #9, "fixoperationorder:^-:" + a$
+ pownegused = 1
+ GOTO powneg
+ END IF
END IF 'quick check
@@ -16821,109 +17028,109 @@ lco = 255
hco = 0
b = 0
FOR i = 1 TO n
-a2$ = getelement(a$, i)
-c = ASC(a2$)
-IF c = 40 OR c = 123 THEN b = b + 1
-IF c = 41 OR c = 125 THEN b = b - 1
-IF b = 0 THEN
-op = isoperator(a2$)
-IF op THEN
-IF op < lco THEN lco = op
-IF op > hco THEN hco = op
-END IF
-END IF
+ a2$ = getelement(a$, i)
+ c = ASC(a2$)
+ IF c = 40 OR c = 123 THEN b = b + 1
+ IF c = 41 OR c = 125 THEN b = b - 1
+ IF b = 0 THEN
+ op = isoperator(a2$)
+ IF op THEN
+ IF op < lco THEN lco = op
+ IF op > hco THEN hco = op
+ END IF
+ END IF
NEXT
'----------------F. Add operator {}bracketting----------------
'apply bracketting only if required
IF hco <> 0 THEN 'operators were used
-IF lco <> hco THEN
-'brackets needed
+ IF lco <> hco THEN
+ 'brackets needed
-IF lco = 6 THEN 'NOT exception
-'Step 1: Add brackets as follows ~~~ ( NOT ( ~~~ NOT ~~~ NOT ~~~ NOT ~~~ ))
-'Step 2: Recheck line from beginning
-IF n = 1 THEN Give_Error "Expected NOT ...": EXIT FUNCTION
-b = 0
-FOR i = 1 TO n
-a2$ = getelement(a$, i)
-c = ASC(a2$)
-IF c = 40 OR c = 123 THEN b = b + 1
-IF c = 41 OR c = 125 THEN b = b - 1
-IF b = 0 THEN
-IF UCASE$(a2$) = "NOT" THEN
-IF i = n THEN Give_Error "Expected NOT ...": EXIT FUNCTION
-IF i = 1 THEN a$ = "NOT" + sp + "{" + sp + getelements$(a$, 2, n) + sp + "}": n = n + 2: GOTO lco_bracketting_done
-a$ = getelements$(a$, 1, i - 1) + sp + "{" + sp + "NOT" + sp + "{" + sp + getelements$(a$, i + 1, n) + sp + "}" + sp + "}"
-n = n + 4
-GOTO NOT_recheck
-END IF 'not
-END IF 'b=0
-NEXT
-END IF 'NOT exception
+ IF lco = 6 THEN 'NOT exception
+ 'Step 1: Add brackets as follows ~~~ ( NOT ( ~~~ NOT ~~~ NOT ~~~ NOT ~~~ ))
+ 'Step 2: Recheck line from beginning
+ IF n = 1 THEN Give_Error "Expected NOT ...": EXIT FUNCTION
+ b = 0
+ FOR i = 1 TO n
+ a2$ = getelement(a$, i)
+ c = ASC(a2$)
+ IF c = 40 OR c = 123 THEN b = b + 1
+ IF c = 41 OR c = 125 THEN b = b - 1
+ IF b = 0 THEN
+ IF UCASE$(a2$) = "NOT" THEN
+ IF i = n THEN Give_Error "Expected NOT ...": EXIT FUNCTION
+ IF i = 1 THEN a$ = "NOT" + sp + "{" + sp + getelements$(a$, 2, n) + sp + "}": n = n + 2: GOTO lco_bracketting_done
+ a$ = getelements$(a$, 1, i - 1) + sp + "{" + sp + "NOT" + sp + "{" + sp + getelements$(a$, i + 1, n) + sp + "}" + sp + "}"
+ n = n + 4
+ GOTO NOT_recheck
+ END IF 'not
+ END IF 'b=0
+ NEXT
+ END IF 'NOT exception
-n2 = n
-b = 0
-a3$ = "{"
-n = 1
-FOR i = 1 TO n2
-a2$ = getelement(a$, i)
-c = ASC(a2$)
-IF c = 40 OR c = 123 THEN b = b + 1
-IF c = 41 OR c = 125 THEN b = b - 1
-IF b = 0 THEN
-op = isoperator(a2$)
-IF op = lco THEN
-IF i = 1 THEN
-a3$ = a2$ + sp + "{"
-n = 2
-ELSE
-IF i = n2 THEN Give_Error "Expected variable/value after '" + UCASE$(a2$) + "'": EXIT FUNCTION
-a3$ = a3$ + sp + "}" + sp + a2$ + sp + "{"
-n = n + 3
-END IF
-GOTO fixop0
-END IF
+ n2 = n
+ b = 0
+ a3$ = "{"
+ n = 1
+ FOR i = 1 TO n2
+ a2$ = getelement(a$, i)
+ c = ASC(a2$)
+ IF c = 40 OR c = 123 THEN b = b + 1
+ IF c = 41 OR c = 125 THEN b = b - 1
+ IF b = 0 THEN
+ op = isoperator(a2$)
+ IF op = lco THEN
+ IF i = 1 THEN
+ a3$ = a2$ + sp + "{"
+ n = 2
+ ELSE
+ IF i = n2 THEN Give_Error "Expected variable/value after '" + UCASE$(a2$) + "'": EXIT FUNCTION
+ a3$ = a3$ + sp + "}" + sp + a2$ + sp + "{"
+ n = n + 3
+ END IF
+ GOTO fixop0
+ END IF
-END IF 'b=0
-a3$ = a3$ + sp + a2$
-n = n + 1
-fixop0:
-NEXT
-a3$ = a3$ + sp + "}"
-n = n + 1
-a$ = a3$
+ END IF 'b=0
+ a3$ = a3$ + sp + a2$
+ n = n + 1
+ fixop0:
+ NEXT
+ a3$ = a3$ + sp + "}"
+ n = n + 1
+ a$ = a3$
-lco_bracketting_done:
-IF Debug THEN PRINT #9, "fixoperationorder:lco bracketing["; lco; ","; hco; "]:" + a$
+ lco_bracketting_done:
+ IF Debug THEN PRINT #9, "fixoperationorder:lco bracketing["; lco; ","; hco; "]:" + a$
-'--------(F)G. Remove indwelling {}bracketting from power-negation--------
-IF pownegused THEN
-b = 0
-i = 0
-DO WHILE i <= n
-i = i + 1
-c = ASC(getelement(a$, i))
-IF c = 41 OR c = 125 THEN b = b - 1
-IF (c = 123 OR c = 125) AND b <> 0 THEN
-removeelements a$, i, i, 0
-n = n - 1
-i = i - 1
-IF Debug THEN PRINT #9, "fixoperationorder:^- {} removed:" + a$
-END IF
-IF c = 40 OR c = 123 THEN b = b + 1
-LOOP
-END IF 'pownegused
+ '--------(F)G. Remove indwelling {}bracketting from power-negation--------
+ IF pownegused THEN
+ b = 0
+ i = 0
+ DO WHILE i <= n
+ i = i + 1
+ c = ASC(getelement(a$, i))
+ IF c = 41 OR c = 125 THEN b = b - 1
+ IF (c = 123 OR c = 125) AND b <> 0 THEN
+ removeelements a$, i, i, 0
+ n = n - 1
+ i = i - 1
+ IF Debug THEN PRINT #9, "fixoperationorder:^- {} removed:" + a$
+ END IF
+ IF c = 40 OR c = 123 THEN b = b + 1
+ LOOP
+ END IF 'pownegused
-END IF 'lco <> hco
+ END IF 'lco <> hco
END IF 'hco <> 0
'--------Bracketting of multiple NOT/negation unary operators--------
IF LEFT$(a$, 4) = "ñ" + sp + "ñ" + sp THEN
-a$ = "ñ" + sp + "{" + sp + getelements$(a$, 2, n) + sp + "}": n = n + 2
+ a$ = "ñ" + sp + "{" + sp + getelements$(a$, 2, n) + sp + "}": n = n + 2
END IF
IF UCASE$(LEFT$(a$, 8)) = "NOT" + sp + "NOT" + sp THEN
-a$ = "NOT" + sp + "{" + sp + getelements$(a$, 2, n) + sp + "}": n = n + 2
+ a$ = "NOT" + sp + "{" + sp + getelements$(a$, 2, n) + sp + "}": n = n + 2
END IF
'----------------H. Identification/conversion of elements within bottom bracket level----------------
@@ -16937,462 +17144,462 @@ b = 0
c = 0
lastt = 0: lastti = 0
FOR i = 1 TO n
-f2$ = getelement(a$, i)
-lastc = c
-c = ASC(f2$)
-
-IF c = 40 OR c = 123 THEN
-IF c <> 40 OR b <> 0 THEN f2$ = "" 'skip temporary & indwelling brackets
-b = b + 1
-GOTO classdone
-END IF
-IF c = 41 OR c = 125 THEN
-
-b = b - 1
-
-'check for "("+sp+")" after literal-string, operator, number or nothing
-IF b = 0 THEN 'must be within the lowest level
-IF c = 41 THEN
-IF lastc = 40 THEN
-IF lastti = i - 2 OR lastti = 0 THEN
-IF lastt >= 0 AND lastt <= 3 THEN
-Give_Error "Unexpected (": EXIT FUNCTION
-END IF
-END IF
-END IF
-END IF
-END IF
-
-IF c <> 41 OR b <> 0 THEN f2$ = "" 'skip temporary & indwelling brackets
-GOTO classdone
-END IF
-
-IF b = 0 THEN
-
-'classifications/conversions:
-'1. quoted string ("....)
-'2. number
-'3. operator
-'4. constant
-'5. variable/array/udt/function (note: nothing can share the same name as a function except a label)
-
-
-'quoted string?
-IF c = 34 THEN '"
-lastt = 1: lastti = i
-
-'convert \\ to \
-'convert \??? to CHR$(&O???)
-x2 = 1
-x = INSTR(x2, f2$, "\")
-DO WHILE x
-c2 = ASC(f2$, x + 1)
-IF c2 = 92 THEN '\\
-f2$ = LEFT$(f2$, x) + RIGHT$(f2$, LEN(f2$) - x - 1) 'remove second \
-x2 = x + 1
-ELSE
-'octal triplet value
-c3 = (ASC(f2$, x + 3) - 48) + (ASC(f2$, x + 2) - 48) * 8 + (ASC(f2$, x + 1) - 48) * 64
-f2$ = LEFT$(f2$, x - 1) + CHR$(c3) + RIGHT$(f2$, LEN(f2$) - x - 3)
-x2 = x + 1
-END IF
-x = INSTR(x2, f2$, "\")
-LOOP
-'remove ',len' (if it exists)
-x = INSTR(2, f2$, CHR$(34) + ","): IF x THEN f2$ = LEFT$(f2$, x)
-GOTO classdone
-END IF
-
-'number?
-IF (c >= 48 AND c <= 57) OR c = 45 THEN
-lastt = 2: lastti = i
-
-x = INSTR(f2$, ",")
-IF x THEN
-removeelements a$, i, i, 0: insertelements a$, i - 1, LEFT$(f2$, x - 1)
-f2$ = RIGHT$(f2$, LEN(f2$) - x)
-END IF
-
-IF x = 0 THEN
-c2 = ASC(f2$, LEN(f2$))
-IF c2 < 48 OR c2 > 57 THEN
-x = 1 'extension given
-ELSE
-x = INSTR(f2$, "`")
-END IF
-END IF
-
-'add appropriate integer symbol if none present
-IF x = 0 THEN
-f3$ = f2$
-s$ = ""
-IF c = 45 THEN
-s$ = "&&"
-IF (f3$ < "-2147483648" AND LEN(f3$) = 11) OR LEN(f3$) < 11 THEN s$ = "&"
-IF (f3$ <= "-32768" AND LEN(f3$) = 6) OR LEN(f3$) < 6 THEN s$ = "%"
-ELSE
-s$ = "~&&"
-IF (f3$ <= "9223372036854775807" AND LEN(f3$) = 19) OR LEN(f3$) < 19 THEN s$ = "&&"
-IF (f3$ <= "2147483647" AND LEN(f3$) = 10) OR LEN(f3$) < 10 THEN s$ = "&"
-IF (f3$ <= "32767" AND LEN(f3$) = 5) OR LEN(f3$) < 5 THEN s$ = "%"
-END IF
-f3$ = f3$ + s$
-removeelements a$, i, i, 0: insertelements a$, i - 1, f3$
-END IF 'x=0
-
-GOTO classdone
-END IF
-
-'operator?
-IF isoperator(f2$) THEN
-lastt = 3: lastti = i
-IF LEN(f2$) > 1 THEN
-IF f2$ <> UCASE$(f2$) THEN
-f2$ = UCASE$(f2$)
-removeelements a$, i, i, 0
-insertelements a$, i - 1, f2$
-END IF
-END IF
-'append negation
-IF f2$ = "ñ" THEN f$ = f$ + sp + "-": GOTO classdone_special
-GOTO classdone
-END IF
-
-
-IF alphanumeric(c) THEN
-lastt = 4: lastti = i
-
-IF i < n THEN nextc = ASC(getelement(a$, i + 1)) ELSE nextc = 0
-
-' a constant?
-IF nextc <> 40 THEN '<>"(" (not an array)
-IF lastc <> 46 THEN '<>"." (not an element of a UDT)
-
-e$ = UCASE$(f2$)
-es$ = removesymbol$(e$)
-IF Error_Happened THEN EXIT FUNCTION
-
-hashfound = 0
-hashname$ = e$
-hashchkflags = HASHFLAG_CONSTANT
-hashres = HashFindRev(hashname$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-IF constsubfunc(hashresref) = subfuncn OR constsubfunc(hashresref) = 0 THEN
-IF constdefined(hashresref) THEN
-hashfound = 1
-EXIT DO
-END IF
-END IF
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-
-IF hashfound THEN
-i2 = hashresref
-'FOR i2 = constlast TO 0 STEP -1
-'IF e$ = constname(i2) THEN
-
-
-
-
-
-'is a STATIC variable overriding this constant?
-staticvariable = 0
-try = findid(e$ + es$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF id.arraytype = 0 THEN staticvariable = 1: EXIT DO 'if it's not an array, it's probably a static variable
-IF try = 2 THEN findanotherid = 1: try = findid(e$ + es$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-'add symbol and try again
-IF staticvariable = 0 THEN
-IF LEN(es$) = 0 THEN
-a = ASC(UCASE$(e$)): IF a = 95 THEN a = 91
-a = a - 64 'so A=1, Z=27 and _=28
-es2$ = defineextaz(a)
-try = findid(e$ + es2$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF id.arraytype = 0 THEN staticvariable = 1: EXIT DO 'if it's not an array, it's probably a static variable
-IF try = 2 THEN findanotherid = 1: try = findid(e$ + es2$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-END IF
-END IF
-
-IF staticvariable = 0 THEN
-
-t = consttype(i2)
-IF t AND ISSTRING THEN
-IF LEN(es$) > 0 AND es$ <> "$" THEN Give_Error "Type mismatch": EXIT FUNCTION
-e$ = conststring(i2)
-ELSE 'not a string
-IF LEN(es$) THEN et = typname2typ(es$) ELSE et = 0
-IF Error_Happened THEN EXIT FUNCTION
-IF et AND ISSTRING THEN Give_Error "Type mismatch": EXIT FUNCTION
-'convert value to general formats
-IF t AND ISFLOAT THEN
-v## = constfloat(i2)
-v&& = v##
-v~&& = v&&
-ELSE
-IF t AND ISUNSIGNED THEN
-v~&& = constuinteger(i2)
-v&& = v~&&
-v## = v&&
-ELSE
-v&& = constinteger(i2)
-v## = v&&
-v~&& = v&&
-END IF
-END IF
-'apply type conversion if necessary
-IF et THEN t = et
-'(todo: range checking)
-'convert value into string for returning
-IF t AND ISFLOAT THEN
-e$ = LTRIM$(RTRIM$(STR$(v##)))
-ELSE
-IF t AND ISUNSIGNED THEN
-e$ = LTRIM$(RTRIM$(STR$(v~&&)))
-ELSE
-e$ = LTRIM$(RTRIM$(STR$(v&&)))
-END IF
-END IF
-
-'floats returned by str$ must be converted to qb64 standard format
-IF t AND ISFLOAT THEN
-t2 = t AND 511
-'find E,D or F
-s$ = ""
-IF INSTR(e$, "E") THEN s$ = "E"
-IF INSTR(e$, "D") THEN s$ = "D"
-IF INSTR(e$, "F") THEN s$ = "F"
-IF LEN(s$) THEN
-'E,D,F found
-x = INSTR(e$, s$)
-'as incorrect type letter may have been returned by STR$, override it
-IF t2 = 32 THEN s$ = "E"
-IF t2 = 64 THEN s$ = "D"
-IF t2 = 256 THEN s$ = "F"
-MID$(e$, x, 1) = s$
-IF INSTR(e$, ".") = 0 THEN e$ = LEFT$(e$, x - 1) + ".0" + RIGHT$(e$, LEN(e$) - x + 1): x = x + 2
-IF LEFT$(e$, 1) = "." THEN e$ = "0" + e$
-IF LEFT$(e$, 2) = "-." THEN e$ = "-0" + RIGHT$(e$, LEN(e$) - 1)
-IF INSTR(e$, "+") = 0 AND INSTR(e$, "-") = 0 THEN
-e$ = LEFT$(e$, x) + "+" + RIGHT$(e$, LEN(e$) - x)
-END IF
-ELSE
-'E,D,F not found
-IF INSTR(e$, ".") = 0 THEN e$ = e$ + ".0"
-IF LEFT$(e$, 1) = "." THEN e$ = "0" + e$
-IF LEFT$(e$, 2) = "-." THEN e$ = "-0" + RIGHT$(e$, LEN(e$) - 1)
-IF t2 = 32 THEN e$ = e$ + "E+0"
-IF t2 = 64 THEN e$ = e$ + "D+0"
-IF t2 = 256 THEN e$ = e$ + "F+0"
-END IF
-ELSE
-s$ = typevalue2symbol$(t)
-IF Error_Happened THEN EXIT FUNCTION
-e$ = e$ + s$ 'simply append symbol to integer
-END IF
-
-END IF 'not a string
-
-removeelements a$, i, i, 0
-insertelements a$, i - 1, e$
-'alter f2$ here to original casing
-f2$ = constcname(i2) + es$
-GOTO classdone
-
-END IF 'not static
-'END IF 'same name
-'NEXT
-END IF 'hashfound
-END IF 'not udt element
-END IF 'not array
-
-'variable/array/udt?
-u$ = f2$
-
-try_string$ = f2$
-try_string2$ = try_string$ 'pure version of try_string$
-
-FOR try_method = 1 TO 4
-try_string$ = try_string2$
-IF try_method = 2 OR try_method = 4 THEN
-dtyp$ = removesymbol(try_string$)
-IF LEN(dtyp$) = 0 THEN
-IF isoperator(try_string$) = 0 THEN
-IF isvalidvariable(try_string$) THEN
-IF LEFT$(try_string$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(try_string$)) - 64
-try_string$ = try_string$ + defineextaz(v)
-END IF
-END IF
-ELSE
-try_string$ = try_string2$
-END IF
-END IF
-try = findid(try_string$)
-IF Error_Happened THEN EXIT FUNCTION
-DO WHILE try
-IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
-
-IF Debug THEN PRINT #9, "found id matching " + f2$
-
-IF nextc = 40 THEN '(
-
-'function or array?
-IF id.arraytype <> 0 OR id.subfunc = 1 THEN
-'note: even if it's an array of UDTs, the bracketted index will follow immediately
-
-'correct name
-f3$ = f2$
-s$ = removesymbol$(f3$)
-IF Error_Happened THEN EXIT FUNCTION
-f2$ = RTRIM$(id.cn) + s$
-removeelements a$, i, i, 0
-insertelements a$, i - 1, UCASE$(f2$)
-f$ = f$ + f2$ + sp + "(" + sp
-
-'skip (but record with nothing inside them) brackets
-b2 = 1 'already in first bracket
-FOR i2 = i + 2 TO n
-c2 = ASC(getelement(a$, i2))
-IF c2 = 40 THEN b2 = b2 + 1
-IF c2 = 41 THEN b2 = b2 - 1
-IF b2 = 0 THEN EXIT FOR 'note: mismatched brackets check ensures this always succeeds
-f$ = f$ + sp
-NEXT
-
-'adjust i accordingly
-i = i2
-
-f$ = f$ + ")"
-
-'jump to UDT section if array is of UDT type (and elements are referenced)
-IF id.arraytype AND ISUDT THEN
-IF i < n THEN nextc = ASC(getelement(a$, i + 1)) ELSE nextc = 0
-IF nextc = 46 THEN t = id.arraytype: GOTO fooudt
-END IF
-
-f$ = f$ + sp
-GOTO classdone_special
-END IF 'id.arraytype
-END IF 'nextc "("
-
-IF nextc <> 40 THEN 'not "(" (this avoids confusing simple variables with arrays)
-IF id.t <> 0 OR id.subfunc = 1 THEN 'simple variable or function (without parameters)
-
-IF id.t AND ISUDT THEN
-'note: it may or may not be followed by a period (eg. if whole udt is being referred to)
-'check if next item is a period
-
-'correct name
-f2$ = RTRIM$(id.cn) + removesymbol$(f2$)
-IF Error_Happened THEN EXIT FUNCTION
-removeelements a$, i, i, 0
-insertelements a$, i - 1, UCASE$(f2$)
-f$ = f$ + f2$
-
-
-
-IF nextc <> 46 THEN f$ = f$ + sp: GOTO classdone_special 'no sub-elements referenced
-t = id.t
-
-fooudt:
-
-f$ = f$ + sp + "." + sp
-E = udtxnext(t AND 511) 'next element to check
-i = i + 2
-
-'loop
-
-'"." encountered, i must be an element
-IF i > n THEN Give_Error "Expected .element": EXIT FUNCTION
-f2$ = getelement(a$, i)
-s$ = removesymbol$(f2$)
-IF Error_Happened THEN EXIT FUNCTION
-u$ = UCASE$(f2$) + SPACE$(256 - LEN(f2$)) 'fast scanning
-
-'is f$ the same as element e?
-fooudtnexte:
-IF udtename(E) = u$ THEN
-'match found
-'todo: check symbol(s$) matches element's type
-
-'correct name
-f2$ = RTRIM$(udtecname(E)) + s$
-removeelements a$, i, i, 0
-insertelements a$, i - 1, UCASE$(f2$)
-f$ = f$ + f2$
-
-IF i = n THEN f$ = f$ + sp: GOTO classdone_special
-nextc = ASC(getelement(a$, i + 1))
-IF nextc <> 46 THEN f$ = f$ + sp: GOTO classdone_special 'no sub-elements referenced
-'sub-element exists
-t = udtetype(E)
-IF (t AND ISUDT) = 0 THEN Give_Error "Invalid . after element": EXIT FUNCTION
-GOTO fooudt
-
-END IF 'match found
-
-'no, so check next element
-E = udtenext(E)
-IF E = 0 THEN Give_Error "Element not defined": EXIT FUNCTION
-GOTO fooudtnexte
-
-END IF 'udt
-
-'non array/udt based variable
-f3$ = f2$
-s$ = removesymbol$(f3$)
-IF Error_Happened THEN EXIT FUNCTION
-f2$ = RTRIM$(id.cn) + s$
-'change was is returned to uppercase
-removeelements a$, i, i, 0
-insertelements a$, i - 1, UCASE$(f2$)
-GOTO CouldNotClassify
-END IF 'id.t
-
-END IF 'nextc not "("
-
-END IF
-IF try = 2 THEN findanotherid = 1: try = findid(try_string$) ELSE try = 0
-IF Error_Happened THEN EXIT FUNCTION
-LOOP
-NEXT 'try method (1-4)
-CouldNotClassify:
-
-'alphanumeric, but item name is unknown... is it an internal type? if so, use capitals
-f3$ = UCASE$(f2$)
-internaltype = 0
-IF f3$ = "STRING" THEN internaltype = 1
-IF f3$ = "_UNSIGNED" THEN internaltype = 1
-IF f3$ = "_BIT" THEN internaltype = 1
-IF f3$ = "_BYTE" THEN internaltype = 1
-IF f3$ = "INTEGER" THEN internaltype = 1
-IF f3$ = "LONG" THEN internaltype = 1
-IF f3$ = "_INTEGER64" THEN internaltype = 1
-IF f3$ = "SINGLE" THEN internaltype = 1
-IF f3$ = "DOUBLE" THEN internaltype = 1
-IF f3$ = "_FLOAT" THEN internaltype = 1
-IF f3$ = "_OFFSET" THEN internaltype = 1
-IF internaltype = 1 THEN
-f2$ = f3$
-removeelements a$, i, i, 0
-insertelements a$, i - 1, f3$
-GOTO classdone
-END IF
-
-GOTO classdone
-END IF 'alphanumeric
-
-classdone:
-f$ = f$ + f2$
-END IF 'b=0
-f$ = f$ + sp
-classdone_special:
+ f2$ = getelement(a$, i)
+ lastc = c
+ c = ASC(f2$)
+
+ IF c = 40 OR c = 123 THEN
+ IF c <> 40 OR b <> 0 THEN f2$ = "" 'skip temporary & indwelling brackets
+ b = b + 1
+ GOTO classdone
+ END IF
+ IF c = 41 OR c = 125 THEN
+
+ b = b - 1
+
+ 'check for "("+sp+")" after literal-string, operator, number or nothing
+ IF b = 0 THEN 'must be within the lowest level
+ IF c = 41 THEN
+ IF lastc = 40 THEN
+ IF lastti = i - 2 OR lastti = 0 THEN
+ IF lastt >= 0 AND lastt <= 3 THEN
+ Give_Error "Unexpected (": EXIT FUNCTION
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+
+ IF c <> 41 OR b <> 0 THEN f2$ = "" 'skip temporary & indwelling brackets
+ GOTO classdone
+ END IF
+
+ IF b = 0 THEN
+
+ 'classifications/conversions:
+ '1. quoted string ("....)
+ '2. number
+ '3. operator
+ '4. constant
+ '5. variable/array/udt/function (note: nothing can share the same name as a function except a label)
+
+
+ 'quoted string?
+ IF c = 34 THEN '"
+ lastt = 1: lastti = i
+
+ 'convert \\ to \
+ 'convert \??? to CHR$(&O???)
+ x2 = 1
+ x = INSTR(x2, f2$, "\")
+ DO WHILE x
+ c2 = ASC(f2$, x + 1)
+ IF c2 = 92 THEN '\\
+ f2$ = LEFT$(f2$, x) + RIGHT$(f2$, LEN(f2$) - x - 1) 'remove second \
+ x2 = x + 1
+ ELSE
+ 'octal triplet value
+ c3 = (ASC(f2$, x + 3) - 48) + (ASC(f2$, x + 2) - 48) * 8 + (ASC(f2$, x + 1) - 48) * 64
+ f2$ = LEFT$(f2$, x - 1) + CHR$(c3) + RIGHT$(f2$, LEN(f2$) - x - 3)
+ x2 = x + 1
+ END IF
+ x = INSTR(x2, f2$, "\")
+ LOOP
+ 'remove ',len' (if it exists)
+ x = INSTR(2, f2$, CHR$(34) + ","): IF x THEN f2$ = LEFT$(f2$, x)
+ GOTO classdone
+ END IF
+
+ 'number?
+ IF (c >= 48 AND c <= 57) OR c = 45 THEN
+ lastt = 2: lastti = i
+
+ x = INSTR(f2$, ",")
+ IF x THEN
+ removeelements a$, i, i, 0: insertelements a$, i - 1, LEFT$(f2$, x - 1)
+ f2$ = RIGHT$(f2$, LEN(f2$) - x)
+ END IF
+
+ IF x = 0 THEN
+ c2 = ASC(f2$, LEN(f2$))
+ IF c2 < 48 OR c2 > 57 THEN
+ x = 1 'extension given
+ ELSE
+ x = INSTR(f2$, "`")
+ END IF
+ END IF
+
+ 'add appropriate integer symbol if none present
+ IF x = 0 THEN
+ f3$ = f2$
+ s$ = ""
+ IF c = 45 THEN
+ s$ = "&&"
+ IF (f3$ < "-2147483648" AND LEN(f3$) = 11) OR LEN(f3$) < 11 THEN s$ = "&"
+ IF (f3$ <= "-32768" AND LEN(f3$) = 6) OR LEN(f3$) < 6 THEN s$ = "%"
+ ELSE
+ s$ = "~&&"
+ IF (f3$ <= "9223372036854775807" AND LEN(f3$) = 19) OR LEN(f3$) < 19 THEN s$ = "&&"
+ IF (f3$ <= "2147483647" AND LEN(f3$) = 10) OR LEN(f3$) < 10 THEN s$ = "&"
+ IF (f3$ <= "32767" AND LEN(f3$) = 5) OR LEN(f3$) < 5 THEN s$ = "%"
+ END IF
+ f3$ = f3$ + s$
+ removeelements a$, i, i, 0: insertelements a$, i - 1, f3$
+ END IF 'x=0
+
+ GOTO classdone
+ END IF
+
+ 'operator?
+ IF isoperator(f2$) THEN
+ lastt = 3: lastti = i
+ IF LEN(f2$) > 1 THEN
+ IF f2$ <> UCASE$(f2$) THEN
+ f2$ = UCASE$(f2$)
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, f2$
+ END IF
+ END IF
+ 'append negation
+ IF f2$ = "ñ" THEN f$ = f$ + sp + "-": GOTO classdone_special
+ GOTO classdone
+ END IF
+
+
+ IF alphanumeric(c) THEN
+ lastt = 4: lastti = i
+
+ IF i < n THEN nextc = ASC(getelement(a$, i + 1)) ELSE nextc = 0
+
+ ' a constant?
+ IF nextc <> 40 THEN '<>"(" (not an array)
+ IF lastc <> 46 THEN '<>"." (not an element of a UDT)
+
+ e$ = UCASE$(f2$)
+ es$ = removesymbol$(e$)
+ IF Error_Happened THEN EXIT FUNCTION
+
+ hashfound = 0
+ hashname$ = e$
+ hashchkflags = HASHFLAG_CONSTANT
+ hashres = HashFindRev(hashname$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ IF constsubfunc(hashresref) = subfuncn OR constsubfunc(hashresref) = 0 THEN
+ IF constdefined(hashresref) THEN
+ hashfound = 1
+ EXIT DO
+ END IF
+ END IF
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+
+ IF hashfound THEN
+ i2 = hashresref
+ 'FOR i2 = constlast TO 0 STEP -1
+ 'IF e$ = constname(i2) THEN
+
+
+
+
+
+ 'is a STATIC variable overriding this constant?
+ staticvariable = 0
+ try = findid(e$ + es$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF id.arraytype = 0 THEN staticvariable = 1: EXIT DO 'if it's not an array, it's probably a static variable
+ IF try = 2 THEN findanotherid = 1: try = findid(e$ + es$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ 'add symbol and try again
+ IF staticvariable = 0 THEN
+ IF LEN(es$) = 0 THEN
+ a = ASC(UCASE$(e$)): IF a = 95 THEN a = 91
+ a = a - 64 'so A=1, Z=27 and _=28
+ es2$ = defineextaz(a)
+ try = findid(e$ + es2$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF id.arraytype = 0 THEN staticvariable = 1: EXIT DO 'if it's not an array, it's probably a static variable
+ IF try = 2 THEN findanotherid = 1: try = findid(e$ + es2$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ END IF
+ END IF
+
+ IF staticvariable = 0 THEN
+
+ t = consttype(i2)
+ IF t AND ISSTRING THEN
+ IF LEN(es$) > 0 AND es$ <> "$" THEN Give_Error "Type mismatch": EXIT FUNCTION
+ e$ = conststring(i2)
+ ELSE 'not a string
+ IF LEN(es$) THEN et = typname2typ(es$) ELSE et = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ IF et AND ISSTRING THEN Give_Error "Type mismatch": EXIT FUNCTION
+ 'convert value to general formats
+ IF t AND ISFLOAT THEN
+ v## = constfloat(i2)
+ v&& = v##
+ v~&& = v&&
+ ELSE
+ IF t AND ISUNSIGNED THEN
+ v~&& = constuinteger(i2)
+ v&& = v~&&
+ v## = v&&
+ ELSE
+ v&& = constinteger(i2)
+ v## = v&&
+ v~&& = v&&
+ END IF
+ END IF
+ 'apply type conversion if necessary
+ IF et THEN t = et
+ '(todo: range checking)
+ 'convert value into string for returning
+ IF t AND ISFLOAT THEN
+ e$ = LTRIM$(RTRIM$(STR$(v##)))
+ ELSE
+ IF t AND ISUNSIGNED THEN
+ e$ = LTRIM$(RTRIM$(STR$(v~&&)))
+ ELSE
+ e$ = LTRIM$(RTRIM$(STR$(v&&)))
+ END IF
+ END IF
+
+ 'floats returned by str$ must be converted to qb64 standard format
+ IF t AND ISFLOAT THEN
+ t2 = t AND 511
+ 'find E,D or F
+ s$ = ""
+ IF INSTR(e$, "E") THEN s$ = "E"
+ IF INSTR(e$, "D") THEN s$ = "D"
+ IF INSTR(e$, "F") THEN s$ = "F"
+ IF LEN(s$) THEN
+ 'E,D,F found
+ x = INSTR(e$, s$)
+ 'as incorrect type letter may have been returned by STR$, override it
+ IF t2 = 32 THEN s$ = "E"
+ IF t2 = 64 THEN s$ = "D"
+ IF t2 = 256 THEN s$ = "F"
+ MID$(e$, x, 1) = s$
+ IF INSTR(e$, ".") = 0 THEN e$ = LEFT$(e$, x - 1) + ".0" + RIGHT$(e$, LEN(e$) - x + 1): x = x + 2
+ IF LEFT$(e$, 1) = "." THEN e$ = "0" + e$
+ IF LEFT$(e$, 2) = "-." THEN e$ = "-0" + RIGHT$(e$, LEN(e$) - 1)
+ IF INSTR(e$, "+") = 0 AND INSTR(e$, "-") = 0 THEN
+ e$ = LEFT$(e$, x) + "+" + RIGHT$(e$, LEN(e$) - x)
+ END IF
+ ELSE
+ 'E,D,F not found
+ IF INSTR(e$, ".") = 0 THEN e$ = e$ + ".0"
+ IF LEFT$(e$, 1) = "." THEN e$ = "0" + e$
+ IF LEFT$(e$, 2) = "-." THEN e$ = "-0" + RIGHT$(e$, LEN(e$) - 1)
+ IF t2 = 32 THEN e$ = e$ + "E+0"
+ IF t2 = 64 THEN e$ = e$ + "D+0"
+ IF t2 = 256 THEN e$ = e$ + "F+0"
+ END IF
+ ELSE
+ s$ = typevalue2symbol$(t)
+ IF Error_Happened THEN EXIT FUNCTION
+ e$ = e$ + s$ 'simply append symbol to integer
+ END IF
+
+ END IF 'not a string
+
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, e$
+ 'alter f2$ here to original casing
+ f2$ = constcname(i2) + es$
+ GOTO classdone
+
+ END IF 'not static
+ 'END IF 'same name
+ 'NEXT
+ END IF 'hashfound
+ END IF 'not udt element
+ END IF 'not array
+
+ 'variable/array/udt?
+ u$ = f2$
+
+ try_string$ = f2$
+ try_string2$ = try_string$ 'pure version of try_string$
+
+ FOR try_method = 1 TO 4
+ try_string$ = try_string2$
+ IF try_method = 2 OR try_method = 4 THEN
+ dtyp$ = removesymbol(try_string$)
+ IF LEN(dtyp$) = 0 THEN
+ IF isoperator(try_string$) = 0 THEN
+ IF isvalidvariable(try_string$) THEN
+ IF LEFT$(try_string$, 1) = "_" THEN v = 27 ELSE v = ASC(UCASE$(try_string$)) - 64
+ try_string$ = try_string$ + defineextaz(v)
+ END IF
+ END IF
+ ELSE
+ try_string$ = try_string2$
+ END IF
+ END IF
+ try = findid(try_string$)
+ IF Error_Happened THEN EXIT FUNCTION
+ DO WHILE try
+ IF (subfuncn = id.insubfuncn AND try_method <= 2) OR try_method >= 3 THEN
+
+ IF Debug THEN PRINT #9, "found id matching " + f2$
+
+ IF nextc = 40 THEN '(
+
+ 'function or array?
+ IF id.arraytype <> 0 OR id.subfunc = 1 THEN
+ 'note: even if it's an array of UDTs, the bracketted index will follow immediately
+
+ 'correct name
+ f3$ = f2$
+ s$ = removesymbol$(f3$)
+ IF Error_Happened THEN EXIT FUNCTION
+ f2$ = RTRIM$(id.cn) + s$
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, UCASE$(f2$)
+ f$ = f$ + f2$ + sp + "(" + sp
+
+ 'skip (but record with nothing inside them) brackets
+ b2 = 1 'already in first bracket
+ FOR i2 = i + 2 TO n
+ c2 = ASC(getelement(a$, i2))
+ IF c2 = 40 THEN b2 = b2 + 1
+ IF c2 = 41 THEN b2 = b2 - 1
+ IF b2 = 0 THEN EXIT FOR 'note: mismatched brackets check ensures this always succeeds
+ f$ = f$ + sp
+ NEXT
+
+ 'adjust i accordingly
+ i = i2
+
+ f$ = f$ + ")"
+
+ 'jump to UDT section if array is of UDT type (and elements are referenced)
+ IF id.arraytype AND ISUDT THEN
+ IF i < n THEN nextc = ASC(getelement(a$, i + 1)) ELSE nextc = 0
+ IF nextc = 46 THEN t = id.arraytype: GOTO fooudt
+ END IF
+
+ f$ = f$ + sp
+ GOTO classdone_special
+ END IF 'id.arraytype
+ END IF 'nextc "("
+
+ IF nextc <> 40 THEN 'not "(" (this avoids confusing simple variables with arrays)
+ IF id.t <> 0 OR id.subfunc = 1 THEN 'simple variable or function (without parameters)
+
+ IF id.t AND ISUDT THEN
+ 'note: it may or may not be followed by a period (eg. if whole udt is being referred to)
+ 'check if next item is a period
+
+ 'correct name
+ f2$ = RTRIM$(id.cn) + removesymbol$(f2$)
+ IF Error_Happened THEN EXIT FUNCTION
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, UCASE$(f2$)
+ f$ = f$ + f2$
+
+
+
+ IF nextc <> 46 THEN f$ = f$ + sp: GOTO classdone_special 'no sub-elements referenced
+ t = id.t
+
+ fooudt:
+
+ f$ = f$ + sp + "." + sp
+ E = udtxnext(t AND 511) 'next element to check
+ i = i + 2
+
+ 'loop
+
+ '"." encountered, i must be an element
+ IF i > n THEN Give_Error "Expected .element": EXIT FUNCTION
+ f2$ = getelement(a$, i)
+ s$ = removesymbol$(f2$)
+ IF Error_Happened THEN EXIT FUNCTION
+ u$ = UCASE$(f2$) + SPACE$(256 - LEN(f2$)) 'fast scanning
+
+ 'is f$ the same as element e?
+ fooudtnexte:
+ IF udtename(E) = u$ THEN
+ 'match found
+ 'todo: check symbol(s$) matches element's type
+
+ 'correct name
+ f2$ = RTRIM$(udtecname(E)) + s$
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, UCASE$(f2$)
+ f$ = f$ + f2$
+
+ IF i = n THEN f$ = f$ + sp: GOTO classdone_special
+ nextc = ASC(getelement(a$, i + 1))
+ IF nextc <> 46 THEN f$ = f$ + sp: GOTO classdone_special 'no sub-elements referenced
+ 'sub-element exists
+ t = udtetype(E)
+ IF (t AND ISUDT) = 0 THEN Give_Error "Invalid . after element": EXIT FUNCTION
+ GOTO fooudt
+
+ END IF 'match found
+
+ 'no, so check next element
+ E = udtenext(E)
+ IF E = 0 THEN Give_Error "Element not defined": EXIT FUNCTION
+ GOTO fooudtnexte
+
+ END IF 'udt
+
+ 'non array/udt based variable
+ f3$ = f2$
+ s$ = removesymbol$(f3$)
+ IF Error_Happened THEN EXIT FUNCTION
+ f2$ = RTRIM$(id.cn) + s$
+ 'change was is returned to uppercase
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, UCASE$(f2$)
+ GOTO CouldNotClassify
+ END IF 'id.t
+
+ END IF 'nextc not "("
+
+ END IF
+ IF try = 2 THEN findanotherid = 1: try = findid(try_string$) ELSE try = 0
+ IF Error_Happened THEN EXIT FUNCTION
+ LOOP
+ NEXT 'try method (1-4)
+ CouldNotClassify:
+
+ 'alphanumeric, but item name is unknown... is it an internal type? if so, use capitals
+ f3$ = UCASE$(f2$)
+ internaltype = 0
+ IF f3$ = "STRING" THEN internaltype = 1
+ IF f3$ = "_UNSIGNED" THEN internaltype = 1
+ IF f3$ = "_BIT" THEN internaltype = 1
+ IF f3$ = "_BYTE" THEN internaltype = 1
+ IF f3$ = "INTEGER" THEN internaltype = 1
+ IF f3$ = "LONG" THEN internaltype = 1
+ IF f3$ = "_INTEGER64" THEN internaltype = 1
+ IF f3$ = "SINGLE" THEN internaltype = 1
+ IF f3$ = "DOUBLE" THEN internaltype = 1
+ IF f3$ = "_FLOAT" THEN internaltype = 1
+ IF f3$ = "_OFFSET" THEN internaltype = 1
+ IF internaltype = 1 THEN
+ f2$ = f3$
+ removeelements a$, i, i, 0
+ insertelements a$, i - 1, f3$
+ GOTO classdone
+ END IF
+
+ GOTO classdone
+ END IF 'alphanumeric
+
+ classdone:
+ f$ = f$ + f2$
+ END IF 'b=0
+ f$ = f$ + sp
+ classdone_special:
NEXT
IF LEN(f$) THEN f$ = LEFT$(f$, LEN(f$) - 1) 'remove trailing 'sp'
@@ -17412,97 +17619,97 @@ aa$ = ""
n = numelements(a$)
FOR i = 1 TO n
-openbracket = 0
+ openbracket = 0
-a2$ = getelement(a$, i)
+ a2$ = getelement(a$, i)
-c = ASC(a2$)
+ c = ASC(a2$)
-IF c = 40 OR c = 123 THEN '({
-b = b + 1
+ IF c = 40 OR c = 123 THEN '({
+ b = b + 1
-IF b = 1 THEN
+ IF b = 1 THEN
-p1 = i + 1
-aa$ = aa$ + "(" + sp
+ p1 = i + 1
+ aa$ = aa$ + "(" + sp
-END IF
+ END IF
-openbracket = 1
+ openbracket = 1
-GOTO foopass
+ GOTO foopass
-END IF '({
+ END IF '({
-IF c = 44 THEN ',
-IF b = 1 THEN
-GOTO foopassit
-END IF
-END IF
+ IF c = 44 THEN ',
+ IF b = 1 THEN
+ GOTO foopassit
+ END IF
+ END IF
-IF c = 41 OR c = 125 THEN ')}
-b = b - 1
+ IF c = 41 OR c = 125 THEN ')}
+ b = b - 1
-IF b = 0 THEN
-foopassit:
-IF p1 <> i THEN
-foo$ = fixoperationorder(getelements(a$, p1, i - 1))
-IF Error_Happened THEN EXIT FUNCTION
-IF LEN(foo$) THEN
-aa$ = aa$ + foo$ + sp
-IF c = 125 THEN ff$ = ff$ + tlayout$ + sp ELSE ff$ = ff$ + tlayout$ + sp2 'spacing between ) } , varies
-END IF
-END IF
-IF c = 44 THEN aa$ = aa$ + "," + sp: ff$ = ff$ + "," + sp ELSE aa$ = aa$ + ")" + sp
-p1 = i + 1
-END IF
+ IF b = 0 THEN
+ foopassit:
+ IF p1 <> i THEN
+ foo$ = fixoperationorder(getelements(a$, p1, i - 1))
+ IF Error_Happened THEN EXIT FUNCTION
+ IF LEN(foo$) THEN
+ aa$ = aa$ + foo$ + sp
+ IF c = 125 THEN ff$ = ff$ + tlayout$ + sp ELSE ff$ = ff$ + tlayout$ + sp2 'spacing between ) } , varies
+ END IF
+ END IF
+ IF c = 44 THEN aa$ = aa$ + "," + sp: ff$ = ff$ + "," + sp ELSE aa$ = aa$ + ")" + sp
+ p1 = i + 1
+ END IF
-GOTO foopass
-END IF ')}
+ GOTO foopass
+ END IF ')}
-IF b = 0 THEN aa$ = aa$ + a2$ + sp
+ IF b = 0 THEN aa$ = aa$ + a2$ + sp
-foopass:
+ foopass:
-f2$ = getelementspecial(f$, i)
-IF Error_Happened THEN EXIT FUNCTION
-IF LEN(f2$) THEN
+ f2$ = getelementspecial(f$, i)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF LEN(f2$) THEN
-'use sp2 to join items connected by a period
-IF c = 46 THEN '"."
-IF i > 1 AND i < n THEN 'stupidity check
-IF LEN(ff$) THEN MID$(ff$, LEN(ff$), 1) = sp2 'convert last spacer to a sp2
-ff$ = ff$ + "." + sp2
-GOTO fooloopnxt
-END IF
-END IF
+ 'use sp2 to join items connected by a period
+ IF c = 46 THEN '"."
+ IF i > 1 AND i < n THEN 'stupidity check
+ IF LEN(ff$) THEN MID$(ff$, LEN(ff$), 1) = sp2 'convert last spacer to a sp2
+ ff$ = ff$ + "." + sp2
+ GOTO fooloopnxt
+ END IF
+ END IF
-'spacing just before (
-IF openbracket THEN
+ 'spacing just before (
+ IF openbracket THEN
-'convert last spacer?
-IF i <> 1 THEN
-IF isoperator(getelement$(a$, i - 1)) = 0 THEN
-MID$(ff$, LEN(ff$), 1) = sp2
-END IF
-END IF
-ff$ = ff$ + f2$ + sp2
-ELSE 'not openbracket
-ff$ = ff$ + f2$ + sp
-END IF
+ 'convert last spacer?
+ IF i <> 1 THEN
+ IF isoperator(getelement$(a$, i - 1)) = 0 THEN
+ MID$(ff$, LEN(ff$), 1) = sp2
+ END IF
+ END IF
+ ff$ = ff$ + f2$ + sp2
+ ELSE 'not openbracket
+ ff$ = ff$ + f2$ + sp
+ END IF
-END IF 'len(f2$)
+ END IF 'len(f2$)
-fooloopnxt:
+ fooloopnxt:
NEXT
@@ -17532,17 +17739,17 @@ i = INSTR(p, a$, sp)
'avoid sp inside "..."
i2 = INSTR(p, a$, CHR$(34))
IF i2 < i AND i2 <> 0 THEN
-i3 = INSTR(i2 + 1, a$, CHR$(34)): IF i3 = 0 THEN Give_Error "Expected " + CHR$(34): EXIT FUNCTION
-i = INSTR(i3, a$, sp)
+ i3 = INSTR(i2 + 1, a$, CHR$(34)): IF i3 = 0 THEN Give_Error "Expected " + CHR$(34): EXIT FUNCTION
+ i = INSTR(i3, a$, sp)
END IF
IF elenum = n THEN
-IF i THEN
-getelementspecial$ = MID$(a$, p, i - p)
-ELSE
-getelementspecial$ = RIGHT$(a$, LEN(a$) - p + 1)
-END IF
-EXIT FUNCTION
+ IF i THEN
+ getelementspecial$ = MID$(a$, p, i - p)
+ ELSE
+ getelementspecial$ = RIGHT$(a$, LEN(a$) - p + 1)
+ END IF
+ EXIT FUNCTION
END IF
IF i = 0 THEN EXIT FUNCTION 'no more elements!
@@ -17562,12 +17769,12 @@ getelementnext:
i = INSTR(p, a$, sp)
IF elenum = n THEN
-IF i THEN
-getelement$ = MID$(a$, p, i - p)
-ELSE
-getelement$ = RIGHT$(a$, LEN(a$) - p + 1)
-END IF
-EXIT FUNCTION
+ IF i THEN
+ getelement$ = MID$(a$, p, i - p)
+ ELSE
+ getelement$ = RIGHT$(a$, LEN(a$) - p + 1)
+ END IF
+ EXIT FUNCTION
END IF
IF i = 0 THEN EXIT FUNCTION 'no more elements!
@@ -17583,15 +17790,15 @@ p = 1
getelementsnext:
i = INSTR(p, a$, sp)
IF n = i1 THEN
-i1pos = p
+ i1pos = p
END IF
IF n = i2 THEN
-IF i THEN
-getelements$ = MID$(a$, i1pos, i - i1pos)
-ELSE
-getelements$ = RIGHT$(a$, LEN(a$) - i1pos + 1)
-END IF
-EXIT FUNCTION
+ IF i THEN
+ getelements$ = MID$(a$, i1pos, i - i1pos)
+ ELSE
+ getelements$ = RIGHT$(a$, LEN(a$) - i1pos + 1)
+ END IF
+ EXIT FUNCTION
END IF
n = n + 1
p = i + 1
@@ -17608,12 +17815,12 @@ END SUB
SUB insertelements (a$, i, elements$)
IF i = 0 THEN
-IF a$ = "" THEN
-a$ = elements$
-EXIT SUB
-END IF
-a$ = elements$ + sp + a$
-EXIT SUB
+ IF a$ = "" THEN
+ a$ = elements$
+ EXIT SUB
+ END IF
+ a$ = elements$ + sp + a$
+ EXIT SUB
END IF
a2$ = ""
@@ -17623,9 +17830,9 @@ n = numelements(a$)
FOR i2 = 1 TO n
-IF i2 > 1 THEN a2$ = a2$ + sp
-a2$ = a2$ + getelement$(a$, i2)
-IF i = i2 THEN a2$ = a2$ + sp + elements$
+ IF i2 > 1 THEN a2$ = a2$ + sp
+ a2$ = a2$ + getelement$(a$, i2)
+ IF i = i2 THEN a2$ = a2$ + sp + elements$
NEXT
a$ = a2$
@@ -17635,19 +17842,19 @@ END SUB
FUNCTION isnumber (a$)
IF LEN(a$) = 0 THEN EXIT FUNCTION
FOR i = 1 TO LEN(a$)
-a = ASC(MID$(a$, i, 1))
-IF a = 45 THEN
-IF i <> 1 THEN EXIT FUNCTION
-GOTO isnumok
-END IF
-IF a = 46 THEN
-IF dp = 1 THEN EXIT FUNCTION
-dp = 1
-GOTO isnumok
-END IF
-IF a >= 48 AND a <= 57 THEN v = 1: GOTO isnumok
-EXIT FUNCTION
-isnumok:
+ a = ASC(MID$(a$, i, 1))
+ IF a = 45 THEN
+ IF i <> 1 THEN EXIT FUNCTION
+ GOTO isnumok
+ END IF
+ IF a = 46 THEN
+ IF dp = 1 THEN EXIT FUNCTION
+ dp = 1
+ GOTO isnumok
+ END IF
+ IF a >= 48 AND a <= 57 THEN v = 1: GOTO isnumok
+ EXIT FUNCTION
+ isnumok:
NEXT
isnumber = 1
END FUNCTION
@@ -17688,26 +17895,26 @@ FUNCTION isuinteger (i$)
IF LEN(i$) = 0 THEN EXIT FUNCTION
IF ASC(i$, 1) = 48 AND LEN(i$) > 1 THEN EXIT FUNCTION
FOR c = 1 TO LEN(i$)
-v = ASC(i$, c)
-IF v < 48 OR v > 57 THEN EXIT FUNCTION
+ v = ASC(i$, c)
+ IF v < 48 OR v > 57 THEN EXIT FUNCTION
NEXT
isuinteger = -1
END FUNCTION
FUNCTION isvalidvariable (a$)
FOR i = 1 TO LEN(a$)
-c = ASC(a$, i)
-t = 0
-IF c >= 48 AND c <= 57 THEN t = 1 'numeric
-IF c >= 65 AND c <= 90 THEN t = 2 'uppercase
-IF c >= 97 AND c <= 122 THEN t = 2 'lowercase
-IF c = 95 THEN t = 2 '_ underscore
-IF t = 2 OR (t = 1 AND i > 1) THEN
-'valid (continue)
-ELSE
-IF i = 1 THEN isvalidvariable = 0: EXIT FUNCTION
-EXIT FOR
-END IF
+ c = ASC(a$, i)
+ t = 0
+ IF c >= 48 AND c <= 57 THEN t = 1 'numeric
+ IF c >= 65 AND c <= 90 THEN t = 2 'uppercase
+ IF c >= 97 AND c <= 122 THEN t = 2 'lowercase
+ IF c = 95 THEN t = 2 '_ underscore
+ IF t = 2 OR (t = 1 AND i > 1) THEN
+ 'valid (continue)
+ ELSE
+ IF i = 1 THEN isvalidvariable = 0: EXIT FUNCTION
+ EXIT FOR
+ END IF
NEXT
isvalidvariable = 1
@@ -17750,598 +17957,598 @@ c$ = CHR$(c) '***remove later***
'----------------quoted string----------------
IF c = 34 THEN '"
-a2$ = a2$ + sp + CHR$(34)
-p1 = i + 1
-FOR i2 = i + 1 TO n - 2
-c2 = ASC(a$, i2)
+ a2$ = a2$ + sp + CHR$(34)
+ p1 = i + 1
+ FOR i2 = i + 1 TO n - 2
+ c2 = ASC(a$, i2)
-IF c2 = 34 THEN
-a2$ = a2$ + MID$(ca$, p1, i2 - p1 + 1) + "," + str2$(i2 - (i + 1))
-i = i2 + 1
-EXIT FOR
-END IF
+ IF c2 = 34 THEN
+ a2$ = a2$ + MID$(ca$, p1, i2 - p1 + 1) + "," + str2$(i2 - (i + 1))
+ i = i2 + 1
+ EXIT FOR
+ END IF
-IF c2 = 92 THEN '\
-a2$ = a2$ + MID$(ca$, p1, i2 - p1) + "\\"
-p1 = i2 + 1
-END IF
+ IF c2 = 92 THEN '\
+ a2$ = a2$ + MID$(ca$, p1, i2 - p1) + "\\"
+ p1 = i2 + 1
+ END IF
-IF c2 < 32 OR c2 > 126 THEN
-o$ = OCT$(c2)
-IF LEN(o$) < 3 THEN
-o$ = "0" + o$
-IF LEN(o$) < 3 THEN o$ = "0" + o$
-END IF
-a2$ = a2$ + MID$(ca$, p1, i2 - p1) + "\" + o$
-p1 = i2 + 1
-END IF
+ IF c2 < 32 OR c2 > 126 THEN
+ o$ = OCT$(c2)
+ IF LEN(o$) < 3 THEN
+ o$ = "0" + o$
+ IF LEN(o$) < 3 THEN o$ = "0" + o$
+ END IF
+ a2$ = a2$ + MID$(ca$, p1, i2 - p1) + "\" + o$
+ p1 = i2 + 1
+ END IF
-NEXT
+ NEXT
-IF i2 = n - 1 THEN 'no closing "
-a2$ = a2$ + MID$(ca$, p1, (n - 2) - p1 + 1) + CHR$(34) + "," + str2$((n - 2) - (i + 1) + 1)
-i = n - 1
-END IF
+ IF i2 = n - 1 THEN 'no closing "
+ a2$ = a2$ + MID$(ca$, p1, (n - 2) - p1 + 1) + CHR$(34) + "," + str2$((n - 2) - (i + 1) + 1)
+ i = n - 1
+ END IF
-GOTO lineformatnext
+ GOTO lineformatnext
END IF
'----------------number----------------
firsti = i
IF c = 46 THEN
-c2$ = MID$(a$, i + 1, 1): c2 = ASC(c2$)
-IF (c2 >= 48 AND c2 <= 57) THEN GOTO lfnumber
+ c2$ = MID$(a$, i + 1, 1): c2 = ASC(c2$)
+ IF (c2 >= 48 AND c2 <= 57) THEN GOTO lfnumber
END IF
IF (c >= 48 AND c <= 57) THEN '0-9
-lfnumber:
+ lfnumber:
-'handle 'IF a=1 THEN a=2 ELSE 100' by assuming numeric after ELSE to be a
-IF RIGHT$(a2$, 5) = sp + "ELSE" THEN
-a2$ = a2$ + sp + "GOTO"
-END IF
+ 'handle 'IF a=1 THEN a=2 ELSE 100' by assuming numeric after ELSE to be a
+ IF RIGHT$(a2$, 5) = sp + "ELSE" THEN
+ a2$ = a2$ + sp + "GOTO"
+ END IF
-'Number will be converted to the following format:
-' 999999 . 99999 E + 999
-'[whole$][dp(0/1)][frac$][ed(1/2)][pm(1/-1)][ex$]
-' 0 1 2 3 <-mode
+ 'Number will be converted to the following format:
+ ' 999999 . 99999 E + 999
+ '[whole$][dp(0/1)][frac$][ed(1/2)][pm(1/-1)][ex$]
+ ' 0 1 2 3 <-mode
-mode = 0
-whole$ = ""
-dp = 0
-frac$ = ""
-ed = 0 'E=1, D=2, F=3
-pm = 1
-ex$ = ""
+ mode = 0
+ whole$ = ""
+ dp = 0
+ frac$ = ""
+ ed = 0 'E=1, D=2, F=3
+ pm = 1
+ ex$ = ""
-lfreadnumber:
-valid = 0
+ lfreadnumber:
+ valid = 0
-IF c = 46 THEN
-IF mode = 0 THEN valid = 1: dp = 1: mode = 1
-END IF
+ IF c = 46 THEN
+ IF mode = 0 THEN valid = 1: dp = 1: mode = 1
+ END IF
-IF c >= 48 AND c <= 57 THEN '0-9
-valid = 1
-IF mode = 0 THEN whole$ = whole$ + c$
-IF mode = 1 THEN frac$ = frac$ + c$
-IF mode = 2 THEN mode = 3
-IF mode = 3 THEN ex$ = ex$ + c$
-END IF
+ IF c >= 48 AND c <= 57 THEN '0-9
+ valid = 1
+ IF mode = 0 THEN whole$ = whole$ + c$
+ IF mode = 1 THEN frac$ = frac$ + c$
+ IF mode = 2 THEN mode = 3
+ IF mode = 3 THEN ex$ = ex$ + c$
+ END IF
-IF c = 69 OR c = 68 OR c = 70 THEN 'E,D,F
-IF mode < 2 THEN
-valid = 1
-IF c = 69 THEN ed = 1
-IF c = 68 THEN ed = 2
-IF c = 70 THEN ed = 3
-mode = 2
-END IF
-END IF
+ IF c = 69 OR c = 68 OR c = 70 THEN 'E,D,F
+ IF mode < 2 THEN
+ valid = 1
+ IF c = 69 THEN ed = 1
+ IF c = 68 THEN ed = 2
+ IF c = 70 THEN ed = 3
+ mode = 2
+ END IF
+ END IF
-IF c = 43 OR c = 45 THEN '+,-
-IF mode = 2 THEN
-valid = 1
-IF c = 45 THEN pm = -1
-mode = 3
-END IF
-END IF
+ IF c = 43 OR c = 45 THEN '+,-
+ IF mode = 2 THEN
+ valid = 1
+ IF c = 45 THEN pm = -1
+ mode = 3
+ END IF
+ END IF
-IF valid THEN
-IF i <= n THEN i = i + 1: c$ = MID$(a$, i, 1): c = ASC(c$): GOTO lfreadnumber
-END IF
+ IF valid THEN
+ IF i <= n THEN i = i + 1: c$ = MID$(a$, i, 1): c = ASC(c$): GOTO lfreadnumber
+ END IF
-'cull leading 0s off whole$
-DO WHILE LEFT$(whole$, 1) = "0": whole$ = RIGHT$(whole$, LEN(whole$) - 1): LOOP
-'cull trailing 0s off frac$
-DO WHILE RIGHT$(frac$, 1) = "0": frac$ = LEFT$(frac$, LEN(frac$) - 1): LOOP
-'cull leading 0s off ex$
-DO WHILE LEFT$(ex$, 1) = "0": ex$ = RIGHT$(ex$, LEN(ex$) - 1): LOOP
+ 'cull leading 0s off whole$
+ DO WHILE LEFT$(whole$, 1) = "0": whole$ = RIGHT$(whole$, LEN(whole$) - 1): LOOP
+ 'cull trailing 0s off frac$
+ DO WHILE RIGHT$(frac$, 1) = "0": frac$ = LEFT$(frac$, LEN(frac$) - 1): LOOP
+ 'cull leading 0s off ex$
+ DO WHILE LEFT$(ex$, 1) = "0": ex$ = RIGHT$(ex$, LEN(ex$) - 1): LOOP
-IF dp <> 0 OR ed <> 0 THEN float = 1 ELSE float = 0
+ IF dp <> 0 OR ed <> 0 THEN float = 1 ELSE float = 0
-extused = 1
+ extused = 1
-IF ed THEN e$ = "": GOTO lffoundext 'no extensions valid after E/D/F specified
+ IF ed THEN e$ = "": GOTO lffoundext 'no extensions valid after E/D/F specified
-'3-character extensions
-IF i <= n - 2 THEN
-e$ = MID$(a$, i, 3)
-IF e$ = "~%%" AND float = 0 THEN i = i + 3: GOTO lffoundext
-IF e$ = "~&&" AND float = 0 THEN i = i + 3: GOTO lffoundext
-IF e$ = "~%&" AND float = 0 THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-END IF
-'2-character extensions
-IF i <= n - 1 THEN
-e$ = MID$(a$, i, 2)
-IF e$ = "%%" AND float = 0 THEN i = i + 2: GOTO lffoundext
-IF e$ = "~%" AND float = 0 THEN i = i + 2: GOTO lffoundext
-IF e$ = "&&" AND float = 0 THEN i = i + 2: GOTO lffoundext
-IF e$ = "~&" AND float = 0 THEN i = i + 2: GOTO lffoundext
-IF e$ = "%&" AND float = 0 THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-IF e$ = "##" THEN
-i = i + 2
-ed = 3
-e$ = ""
-GOTO lffoundext
-END IF
-IF e$ = "~`" THEN
-i = i + 2
-GOTO lffoundbitext
-END IF
-END IF
-'1-character extensions
-IF i <= n THEN
-e$ = MID$(a$, i, 1)
-IF e$ = "%" AND float = 0 THEN i = i + 1: GOTO lffoundext
-IF e$ = "&" AND float = 0 THEN i = i + 1: GOTO lffoundext
-IF e$ = "!" THEN
-i = i + 1
-ed = 1
-e$ = ""
-GOTO lffoundext
-END IF
-IF e$ = "#" THEN
-i = i + 1
-ed = 2
-e$ = ""
-GOTO lffoundext
-END IF
-IF e$ = "`" THEN
-i = i + 1
-lffoundbitext:
-bitn$ = ""
-DO WHILE i <= n
-c2 = ASC(MID$(a$, i, 1))
-IF c2 >= 48 AND c2 <= 57 THEN
-bitn$ = bitn$ + CHR$(c2)
-i = i + 1
-ELSE
-EXIT DO
-END IF
-LOOP
-IF bitn$ = "" THEN bitn$ = "1"
-'cull leading 0s off bitn$
-DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
-e$ = e$ + bitn$
-GOTO lffoundext
-END IF
-END IF
+ '3-character extensions
+ IF i <= n - 2 THEN
+ e$ = MID$(a$, i, 3)
+ IF e$ = "~%%" AND float = 0 THEN i = i + 3: GOTO lffoundext
+ IF e$ = "~&&" AND float = 0 THEN i = i + 3: GOTO lffoundext
+ IF e$ = "~%&" AND float = 0 THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ END IF
+ '2-character extensions
+ IF i <= n - 1 THEN
+ e$ = MID$(a$, i, 2)
+ IF e$ = "%%" AND float = 0 THEN i = i + 2: GOTO lffoundext
+ IF e$ = "~%" AND float = 0 THEN i = i + 2: GOTO lffoundext
+ IF e$ = "&&" AND float = 0 THEN i = i + 2: GOTO lffoundext
+ IF e$ = "~&" AND float = 0 THEN i = i + 2: GOTO lffoundext
+ IF e$ = "%&" AND float = 0 THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ IF e$ = "##" THEN
+ i = i + 2
+ ed = 3
+ e$ = ""
+ GOTO lffoundext
+ END IF
+ IF e$ = "~`" THEN
+ i = i + 2
+ GOTO lffoundbitext
+ END IF
+ END IF
+ '1-character extensions
+ IF i <= n THEN
+ e$ = MID$(a$, i, 1)
+ IF e$ = "%" AND float = 0 THEN i = i + 1: GOTO lffoundext
+ IF e$ = "&" AND float = 0 THEN i = i + 1: GOTO lffoundext
+ IF e$ = "!" THEN
+ i = i + 1
+ ed = 1
+ e$ = ""
+ GOTO lffoundext
+ END IF
+ IF e$ = "#" THEN
+ i = i + 1
+ ed = 2
+ e$ = ""
+ GOTO lffoundext
+ END IF
+ IF e$ = "`" THEN
+ i = i + 1
+ lffoundbitext:
+ bitn$ = ""
+ DO WHILE i <= n
+ c2 = ASC(MID$(a$, i, 1))
+ IF c2 >= 48 AND c2 <= 57 THEN
+ bitn$ = bitn$ + CHR$(c2)
+ i = i + 1
+ ELSE
+ EXIT DO
+ END IF
+ LOOP
+ IF bitn$ = "" THEN bitn$ = "1"
+ 'cull leading 0s off bitn$
+ DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
+ e$ = e$ + bitn$
+ GOTO lffoundext
+ END IF
+ END IF
-IF float THEN 'floating point types CAN be assumed
-'calculate first significant digit offset & number of significant digits
-IF whole$ <> "" THEN
-offset = LEN(whole$) - 1
-sigdigits = LEN(whole$) + LEN(frac$)
-ELSE
-IF frac$ <> "" THEN
-offset = -1
-sigdigits = LEN(frac$)
-FOR i2 = 1 TO LEN(frac$)
-IF MID$(frac$, i2, 1) <> "0" THEN EXIT FOR
-offset = offset - 1
-sigdigits = sigdigits - 1
-NEXT
-ELSE
-'number is 0
-offset = 0
-sigdigits = 0
-END IF
-END IF
-sigdig$ = RIGHT$(whole$ + frac$, sigdigits)
-'SINGLE?
-IF sigdigits <= 7 THEN 'QBASIC interprets anything with more than 7 sig. digits as a DOUBLE
-IF offset <= 38 AND offset >= -38 THEN 'anything outside this range cannot be represented as a SINGLE
-IF offset = 38 THEN
-IF sigdig$ > "3402823" THEN GOTO lfxsingle
-END IF
-IF offset = -38 THEN
-IF sigdig$ < "1175494" THEN GOTO lfxsingle
-END IF
-ed = 1
-e$ = ""
-GOTO lffoundext
-END IF
-END IF
-lfxsingle:
-'DOUBLE?
-IF sigdigits <= 16 THEN 'QB64 handles DOUBLES with 16-digit precision
-IF offset <= 308 AND offset >= -308 THEN 'anything outside this range cannot be represented as a DOUBLE
-IF offset = 308 THEN
-IF sigdig$ > "1797693134862315" THEN GOTO lfxdouble
-END IF
-IF offset = -308 THEN
-IF sigdig$ < "2225073858507201" THEN GOTO lfxdouble
-END IF
-ed = 2
-e$ = ""
-GOTO lffoundext
-END IF
-END IF
-lfxdouble:
-'assume _FLOAT
-ed = 3
-e$ = "": GOTO lffoundext
-END IF
+ IF float THEN 'floating point types CAN be assumed
+ 'calculate first significant digit offset & number of significant digits
+ IF whole$ <> "" THEN
+ offset = LEN(whole$) - 1
+ sigdigits = LEN(whole$) + LEN(frac$)
+ ELSE
+ IF frac$ <> "" THEN
+ offset = -1
+ sigdigits = LEN(frac$)
+ FOR i2 = 1 TO LEN(frac$)
+ IF MID$(frac$, i2, 1) <> "0" THEN EXIT FOR
+ offset = offset - 1
+ sigdigits = sigdigits - 1
+ NEXT
+ ELSE
+ 'number is 0
+ offset = 0
+ sigdigits = 0
+ END IF
+ END IF
+ sigdig$ = RIGHT$(whole$ + frac$, sigdigits)
+ 'SINGLE?
+ IF sigdigits <= 7 THEN 'QBASIC interprets anything with more than 7 sig. digits as a DOUBLE
+ IF offset <= 38 AND offset >= -38 THEN 'anything outside this range cannot be represented as a SINGLE
+ IF offset = 38 THEN
+ IF sigdig$ > "3402823" THEN GOTO lfxsingle
+ END IF
+ IF offset = -38 THEN
+ IF sigdig$ < "1175494" THEN GOTO lfxsingle
+ END IF
+ ed = 1
+ e$ = ""
+ GOTO lffoundext
+ END IF
+ END IF
+ lfxsingle:
+ 'DOUBLE?
+ IF sigdigits <= 16 THEN 'QB64 handles DOUBLES with 16-digit precision
+ IF offset <= 308 AND offset >= -308 THEN 'anything outside this range cannot be represented as a DOUBLE
+ IF offset = 308 THEN
+ IF sigdig$ > "1797693134862315" THEN GOTO lfxdouble
+ END IF
+ IF offset = -308 THEN
+ IF sigdig$ < "2225073858507201" THEN GOTO lfxdouble
+ END IF
+ ed = 2
+ e$ = ""
+ GOTO lffoundext
+ END IF
+ END IF
+ lfxdouble:
+ 'assume _FLOAT
+ ed = 3
+ e$ = "": GOTO lffoundext
+ END IF
-extused = 0
-e$ = ""
-lffoundext:
+ extused = 0
+ e$ = ""
+ lffoundext:
-'make sure a leading numberic character exists
-IF whole$ = "" THEN whole$ = "0"
-'if a float, ensure frac$<>"" and dp=1
-IF float THEN
-dp = 1
-IF frac$ = "" THEN frac$ = "0"
-END IF
-'if ed is specified, make sure ex$ exists
-IF ed <> 0 AND ex$ = "" THEN ex$ = "0"
+ 'make sure a leading numberic character exists
+ IF whole$ = "" THEN whole$ = "0"
+ 'if a float, ensure frac$<>"" and dp=1
+ IF float THEN
+ dp = 1
+ IF frac$ = "" THEN frac$ = "0"
+ END IF
+ 'if ed is specified, make sure ex$ exists
+ IF ed <> 0 AND ex$ = "" THEN ex$ = "0"
-a2$ = a2$ + sp
-a2$ = a2$ + whole$
-IF dp THEN a2$ = a2$ + "." + frac$
-IF ed THEN
-IF ed = 1 THEN a2$ = a2$ + "E"
-IF ed = 2 THEN a2$ = a2$ + "D"
-IF ed = 3 THEN a2$ = a2$ + "F"
-IF pm = -1 AND ex$ <> "0" THEN a2$ = a2$ + "-" ELSE a2$ = a2$ + "+"
-a2$ = a2$ + ex$
-END IF
-a2$ = a2$ + e$
+ a2$ = a2$ + sp
+ a2$ = a2$ + whole$
+ IF dp THEN a2$ = a2$ + "." + frac$
+ IF ed THEN
+ IF ed = 1 THEN a2$ = a2$ + "E"
+ IF ed = 2 THEN a2$ = a2$ + "D"
+ IF ed = 3 THEN a2$ = a2$ + "F"
+ IF pm = -1 AND ex$ <> "0" THEN a2$ = a2$ + "-" ELSE a2$ = a2$ + "+"
+ a2$ = a2$ + ex$
+ END IF
+ a2$ = a2$ + e$
-IF extused THEN a2$ = a2$ + "," + MID$(a$, firsti, i - firsti)
+ IF extused THEN a2$ = a2$ + "," + MID$(a$, firsti, i - firsti)
-GOTO lineformatnext
+ GOTO lineformatnext
END IF
'----------------(number)&H...----------------
'note: the final value, not the number of hex characters, sets the default type
IF c = 38 THEN '&
-IF MID$(a$, i + 1, 1) = "H" THEN
-i = i + 2
-hx$ = ""
-lfreadhex:
-IF i <= n THEN
-c$ = MID$(a$, i, 1): c = ASC(c$)
-IF (c >= 48 AND c <= 57) OR (c >= 65 AND c <= 70) THEN hx$ = hx$ + c$: i = i + 1: GOTO lfreadhex
-END IF
-fullhx$ = "&H" + hx$
+ IF MID$(a$, i + 1, 1) = "H" THEN
+ i = i + 2
+ hx$ = ""
+ lfreadhex:
+ IF i <= n THEN
+ c$ = MID$(a$, i, 1): c = ASC(c$)
+ IF (c >= 48 AND c <= 57) OR (c >= 65 AND c <= 70) THEN hx$ = hx$ + c$: i = i + 1: GOTO lfreadhex
+ END IF
+ fullhx$ = "&H" + hx$
-'cull leading 0s off hx$
-DO WHILE LEFT$(hx$, 1) = "0": hx$ = RIGHT$(hx$, LEN(hx$) - 1): LOOP
-IF hx$ = "" THEN hx$ = "0"
+ 'cull leading 0s off hx$
+ DO WHILE LEFT$(hx$, 1) = "0": hx$ = RIGHT$(hx$, LEN(hx$) - 1): LOOP
+ IF hx$ = "" THEN hx$ = "0"
-bitn$ = ""
-'3-character extensions
-IF i <= n - 2 THEN
-e$ = MID$(a$, i, 3)
-IF e$ = "~%%" THEN i = i + 3: GOTO lfhxext
-IF e$ = "~&&" THEN i = i + 3: GOTO lfhxext
-IF e$ = "~%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-END IF
-'2-character extensions
-IF i <= n - 1 THEN
-e$ = MID$(a$, i, 2)
-IF e$ = "%%" THEN i = i + 2: GOTO lfhxext
-IF e$ = "~%" THEN i = i + 2: GOTO lfhxext
-IF e$ = "&&" THEN i = i + 2: GOTO lfhxext
-IF e$ = "%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-IF e$ = "~&" THEN i = i + 2: GOTO lfhxext
-IF e$ = "~`" THEN
-i = i + 2
-GOTO lfhxbitext
-END IF
-END IF
-'1-character extensions
-IF i <= n THEN
-e$ = MID$(a$, i, 1)
-IF e$ = "%" THEN i = i + 1: GOTO lfhxext
-IF e$ = "&" THEN i = i + 1: GOTO lfhxext
-IF e$ = "`" THEN
-i = i + 1
-lfhxbitext:
-DO WHILE i <= n
-c2 = ASC(MID$(a$, i, 1))
-IF c2 >= 48 AND c2 <= 57 THEN
-bitn$ = bitn$ + CHR$(c2)
-i = i + 1
-ELSE
-EXIT DO
-END IF
-LOOP
-IF bitn$ = "" THEN bitn$ = "1"
-'cull leading 0s off bitn$
-DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
-GOTO lfhxext
-END IF
-END IF
-'if no valid extension context was given, assume one
-'note: leading 0s have been culled, so LEN(hx$) reflects its values size
-e$ = "&&"
-IF LEN(hx$) <= 8 THEN e$ = "&" 'as in QBASIC, signed values must be used
-IF LEN(hx$) <= 4 THEN e$ = "%" 'as in QBASIC, signed values must be used
-GOTO lfhxext2
-lfhxext:
-fullhx$ = fullhx$ + e$ + bitn$
-lfhxext2:
+ bitn$ = ""
+ '3-character extensions
+ IF i <= n - 2 THEN
+ e$ = MID$(a$, i, 3)
+ IF e$ = "~%%" THEN i = i + 3: GOTO lfhxext
+ IF e$ = "~&&" THEN i = i + 3: GOTO lfhxext
+ IF e$ = "~%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ END IF
+ '2-character extensions
+ IF i <= n - 1 THEN
+ e$ = MID$(a$, i, 2)
+ IF e$ = "%%" THEN i = i + 2: GOTO lfhxext
+ IF e$ = "~%" THEN i = i + 2: GOTO lfhxext
+ IF e$ = "&&" THEN i = i + 2: GOTO lfhxext
+ IF e$ = "%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ IF e$ = "~&" THEN i = i + 2: GOTO lfhxext
+ IF e$ = "~`" THEN
+ i = i + 2
+ GOTO lfhxbitext
+ END IF
+ END IF
+ '1-character extensions
+ IF i <= n THEN
+ e$ = MID$(a$, i, 1)
+ IF e$ = "%" THEN i = i + 1: GOTO lfhxext
+ IF e$ = "&" THEN i = i + 1: GOTO lfhxext
+ IF e$ = "`" THEN
+ i = i + 1
+ lfhxbitext:
+ DO WHILE i <= n
+ c2 = ASC(MID$(a$, i, 1))
+ IF c2 >= 48 AND c2 <= 57 THEN
+ bitn$ = bitn$ + CHR$(c2)
+ i = i + 1
+ ELSE
+ EXIT DO
+ END IF
+ LOOP
+ IF bitn$ = "" THEN bitn$ = "1"
+ 'cull leading 0s off bitn$
+ DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
+ GOTO lfhxext
+ END IF
+ END IF
+ 'if no valid extension context was given, assume one
+ 'note: leading 0s have been culled, so LEN(hx$) reflects its values size
+ e$ = "&&"
+ IF LEN(hx$) <= 8 THEN e$ = "&" 'as in QBASIC, signed values must be used
+ IF LEN(hx$) <= 4 THEN e$ = "%" 'as in QBASIC, signed values must be used
+ GOTO lfhxext2
+ lfhxext:
+ fullhx$ = fullhx$ + e$ + bitn$
+ lfhxext2:
-'build 8-byte unsigned integer rep. of hx$
-IF LEN(hx$) > 16 THEN Give_Error "Overflow": EXIT FUNCTION
-v~&& = 0
-FOR i2 = 1 TO LEN(hx$)
-v2 = ASC(MID$(hx$, i2, 1))
-IF v2 <= 57 THEN v2 = v2 - 48 ELSE v2 = v2 - 65 + 10
-v~&& = v~&& * 16 + v2
-NEXT
+ 'build 8-byte unsigned integer rep. of hx$
+ IF LEN(hx$) > 16 THEN Give_Error "Overflow": EXIT FUNCTION
+ v~&& = 0
+ FOR i2 = 1 TO LEN(hx$)
+ v2 = ASC(MID$(hx$, i2, 1))
+ IF v2 <= 57 THEN v2 = v2 - 48 ELSE v2 = v2 - 65 + 10
+ v~&& = v~&& * 16 + v2
+ NEXT
-finishhexoctbin:
-num$ = str2u64$(v~&&) 'correct for unsigned values (overflow of unsigned can be checked later)
-IF LEFT$(e$, 1) <> "~" THEN 'note: range checking will be performed later in fixop.order
-'signed
+ finishhexoctbin:
+ num$ = str2u64$(v~&&) 'correct for unsigned values (overflow of unsigned can be checked later)
+ IF LEFT$(e$, 1) <> "~" THEN 'note: range checking will be performed later in fixop.order
+ 'signed
-IF e$ = "%%" THEN
-IF v~&& > 127 THEN
-IF v~&& > 255 THEN Give_Error "Overflow": EXIT FUNCTION
-v~&& = ((NOT v~&&) AND 255) + 1
-num$ = "-" + sp + str2u64$(v~&&)
-END IF
-END IF
+ IF e$ = "%%" THEN
+ IF v~&& > 127 THEN
+ IF v~&& > 255 THEN Give_Error "Overflow": EXIT FUNCTION
+ v~&& = ((NOT v~&&) AND 255) + 1
+ num$ = "-" + sp + str2u64$(v~&&)
+ END IF
+ END IF
-IF e$ = "%" THEN
-IF v~&& > 32767 THEN
-IF v~&& > 65535 THEN Give_Error "Overflow": EXIT FUNCTION
-v~&& = ((NOT v~&&) AND 65535) + 1
-num$ = "-" + sp + str2u64$(v~&&)
-END IF
-END IF
+ IF e$ = "%" THEN
+ IF v~&& > 32767 THEN
+ IF v~&& > 65535 THEN Give_Error "Overflow": EXIT FUNCTION
+ v~&& = ((NOT v~&&) AND 65535) + 1
+ num$ = "-" + sp + str2u64$(v~&&)
+ END IF
+ END IF
-IF e$ = "&" THEN
-IF v~&& > 2147483647 THEN
-IF v~&& > 4294967295 THEN Give_Error "Overflow": EXIT FUNCTION
-v~&& = ((NOT v~&&) AND 4294967295) + 1
-num$ = "-" + sp + str2u64$(v~&&)
-END IF
-END IF
+ IF e$ = "&" THEN
+ IF v~&& > 2147483647 THEN
+ IF v~&& > 4294967295 THEN Give_Error "Overflow": EXIT FUNCTION
+ v~&& = ((NOT v~&&) AND 4294967295) + 1
+ num$ = "-" + sp + str2u64$(v~&&)
+ END IF
+ END IF
-IF e$ = "&&" THEN
-IF v~&& > 9223372036854775807 THEN
-'note: no error checking necessary
-v~&& = (NOT v~&&) + 1
-num$ = "-" + sp + str2u64$(v~&&)
-END IF
-END IF
+ IF e$ = "&&" THEN
+ IF v~&& > 9223372036854775807 THEN
+ 'note: no error checking necessary
+ v~&& = (NOT v~&&) + 1
+ num$ = "-" + sp + str2u64$(v~&&)
+ END IF
+ END IF
-IF e$ = "`" THEN
-vbitn = VAL(bitn$)
-h~&& = 1: FOR i2 = 1 TO vbitn - 1: h~&& = h~&& * 2: NEXT: h~&& = h~&& - 1 'build h~&&
-IF v~&& > h~&& THEN
-h~&& = 1: FOR i2 = 1 TO vbitn: h~&& = h~&& * 2: NEXT: h~&& = h~&& - 1 'build h~&&
-IF v~&& > h~&& THEN Give_Error "Overflow": EXIT FUNCTION
-v~&& = ((NOT v~&&) AND h~&&) + 1
-num$ = "-" + sp + str2u64$(v~&&)
-END IF
-END IF
+ IF e$ = "`" THEN
+ vbitn = VAL(bitn$)
+ h~&& = 1: FOR i2 = 1 TO vbitn - 1: h~&& = h~&& * 2: NEXT: h~&& = h~&& - 1 'build h~&&
+ IF v~&& > h~&& THEN
+ h~&& = 1: FOR i2 = 1 TO vbitn: h~&& = h~&& * 2: NEXT: h~&& = h~&& - 1 'build h~&&
+ IF v~&& > h~&& THEN Give_Error "Overflow": EXIT FUNCTION
+ v~&& = ((NOT v~&&) AND h~&&) + 1
+ num$ = "-" + sp + str2u64$(v~&&)
+ END IF
+ END IF
-END IF '<>"~"
+ END IF '<>"~"
-a2$ = a2$ + sp + num$ + e$ + bitn$ + "," + fullhx$
+ a2$ = a2$ + sp + num$ + e$ + bitn$ + "," + fullhx$
-GOTO lineformatnext
-END IF
+ GOTO lineformatnext
+ END IF
END IF
'----------------(number)&O...----------------
'note: the final value, not the number of oct characters, sets the default type
IF c = 38 THEN '&
-IF MID$(a$, i + 1, 1) = "O" THEN
-i = i + 2
-'note: to avoid mistakes, hx$ is used instead of 'ot$'
-hx$ = ""
-lfreadoct:
-IF i <= n THEN
-c$ = MID$(a$, i, 1): c = ASC(c$)
-IF c >= 48 AND c <= 55 THEN hx$ = hx$ + c$: i = i + 1: GOTO lfreadoct
-END IF
-fullhx$ = "&O" + hx$
+ IF MID$(a$, i + 1, 1) = "O" THEN
+ i = i + 2
+ 'note: to avoid mistakes, hx$ is used instead of 'ot$'
+ hx$ = ""
+ lfreadoct:
+ IF i <= n THEN
+ c$ = MID$(a$, i, 1): c = ASC(c$)
+ IF c >= 48 AND c <= 55 THEN hx$ = hx$ + c$: i = i + 1: GOTO lfreadoct
+ END IF
+ fullhx$ = "&O" + hx$
-'cull leading 0s off hx$
-DO WHILE LEFT$(hx$, 1) = "0": hx$ = RIGHT$(hx$, LEN(hx$) - 1): LOOP
-IF hx$ = "" THEN hx$ = "0"
+ 'cull leading 0s off hx$
+ DO WHILE LEFT$(hx$, 1) = "0": hx$ = RIGHT$(hx$, LEN(hx$) - 1): LOOP
+ IF hx$ = "" THEN hx$ = "0"
-bitn$ = ""
-'3-character extensions
-IF i <= n - 2 THEN
-e$ = MID$(a$, i, 3)
-IF e$ = "~%%" THEN i = i + 3: GOTO lfotext
-IF e$ = "~&&" THEN i = i + 3: GOTO lfotext
-IF e$ = "~%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-END IF
-'2-character extensions
-IF i <= n - 1 THEN
-e$ = MID$(a$, i, 2)
-IF e$ = "%%" THEN i = i + 2: GOTO lfotext
-IF e$ = "~%" THEN i = i + 2: GOTO lfotext
-IF e$ = "&&" THEN i = i + 2: GOTO lfotext
-IF e$ = "%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-IF e$ = "~&" THEN i = i + 2: GOTO lfotext
-IF e$ = "~`" THEN
-i = i + 2
-GOTO lfotbitext
-END IF
-END IF
-'1-character extensions
-IF i <= n THEN
-e$ = MID$(a$, i, 1)
-IF e$ = "%" THEN i = i + 1: GOTO lfotext
-IF e$ = "&" THEN i = i + 1: GOTO lfotext
-IF e$ = "`" THEN
-i = i + 1
-lfotbitext:
-bitn$ = ""
-DO WHILE i <= n
-c2 = ASC(MID$(a$, i, 1))
-IF c2 >= 48 AND c2 <= 57 THEN
-bitn$ = bitn$ + CHR$(c2)
-i = i + 1
-ELSE
-EXIT DO
-END IF
-LOOP
-IF bitn$ = "" THEN bitn$ = "1"
-'cull leading 0s off bitn$
-DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
-GOTO lfotext
-END IF
-END IF
-'if no valid extension context was given, assume one
-'note: leading 0s have been culled, so LEN(hx$) reflects its values size
-e$ = "&&"
-'37777777777
-IF LEN(hx$) <= 11 THEN
-IF LEN(hx$) < 11 OR ASC(LEFT$(hx$, 1)) <= 51 THEN e$ = "&"
-END IF
-'177777
-IF LEN(hx$) <= 6 THEN
-IF LEN(hx$) < 6 OR LEFT$(hx$, 1) = "1" THEN e$ = "%"
-END IF
+ bitn$ = ""
+ '3-character extensions
+ IF i <= n - 2 THEN
+ e$ = MID$(a$, i, 3)
+ IF e$ = "~%%" THEN i = i + 3: GOTO lfotext
+ IF e$ = "~&&" THEN i = i + 3: GOTO lfotext
+ IF e$ = "~%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ END IF
+ '2-character extensions
+ IF i <= n - 1 THEN
+ e$ = MID$(a$, i, 2)
+ IF e$ = "%%" THEN i = i + 2: GOTO lfotext
+ IF e$ = "~%" THEN i = i + 2: GOTO lfotext
+ IF e$ = "&&" THEN i = i + 2: GOTO lfotext
+ IF e$ = "%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ IF e$ = "~&" THEN i = i + 2: GOTO lfotext
+ IF e$ = "~`" THEN
+ i = i + 2
+ GOTO lfotbitext
+ END IF
+ END IF
+ '1-character extensions
+ IF i <= n THEN
+ e$ = MID$(a$, i, 1)
+ IF e$ = "%" THEN i = i + 1: GOTO lfotext
+ IF e$ = "&" THEN i = i + 1: GOTO lfotext
+ IF e$ = "`" THEN
+ i = i + 1
+ lfotbitext:
+ bitn$ = ""
+ DO WHILE i <= n
+ c2 = ASC(MID$(a$, i, 1))
+ IF c2 >= 48 AND c2 <= 57 THEN
+ bitn$ = bitn$ + CHR$(c2)
+ i = i + 1
+ ELSE
+ EXIT DO
+ END IF
+ LOOP
+ IF bitn$ = "" THEN bitn$ = "1"
+ 'cull leading 0s off bitn$
+ DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
+ GOTO lfotext
+ END IF
+ END IF
+ 'if no valid extension context was given, assume one
+ 'note: leading 0s have been culled, so LEN(hx$) reflects its values size
+ e$ = "&&"
+ '37777777777
+ IF LEN(hx$) <= 11 THEN
+ IF LEN(hx$) < 11 OR ASC(LEFT$(hx$, 1)) <= 51 THEN e$ = "&"
+ END IF
+ '177777
+ IF LEN(hx$) <= 6 THEN
+ IF LEN(hx$) < 6 OR LEFT$(hx$, 1) = "1" THEN e$ = "%"
+ END IF
-GOTO lfotext2
-lfotext:
-fullhx$ = fullhx$ + e$ + bitn$
-lfotext2:
+ GOTO lfotext2
+ lfotext:
+ fullhx$ = fullhx$ + e$ + bitn$
+ lfotext2:
-'build 8-byte unsigned integer rep. of hx$
-'1777777777777777777777 (22 digits)
-IF LEN(hx$) > 22 THEN Give_Error "Overflow": EXIT FUNCTION
-IF LEN(hx$) = 22 THEN
-IF LEFT$(hx$, 1) <> "1" THEN Give_Error "Overflow": EXIT FUNCTION
-END IF
-'********change v& to v~&&********
-v~&& = 0
-FOR i2 = 1 TO LEN(hx$)
-v2 = ASC(MID$(hx$, i2, 1))
-v2 = v2 - 48
-v~&& = v~&& * 8 + v2
-NEXT
+ 'build 8-byte unsigned integer rep. of hx$
+ '1777777777777777777777 (22 digits)
+ IF LEN(hx$) > 22 THEN Give_Error "Overflow": EXIT FUNCTION
+ IF LEN(hx$) = 22 THEN
+ IF LEFT$(hx$, 1) <> "1" THEN Give_Error "Overflow": EXIT FUNCTION
+ END IF
+ '********change v& to v~&&********
+ v~&& = 0
+ FOR i2 = 1 TO LEN(hx$)
+ v2 = ASC(MID$(hx$, i2, 1))
+ v2 = v2 - 48
+ v~&& = v~&& * 8 + v2
+ NEXT
-GOTO finishhexoctbin
-END IF
+ GOTO finishhexoctbin
+ END IF
END IF
'----------------(number)&B...----------------
'note: the final value, not the number of bin characters, sets the default type
IF c = 38 THEN '&
-IF MID$(a$, i + 1, 1) = "B" THEN
-i = i + 2
-'note: to avoid mistakes, hx$ is used instead of 'bi$'
-hx$ = ""
-lfreadbin:
-IF i <= n THEN
-c$ = MID$(a$, i, 1): c = ASC(c$)
-IF c >= 48 AND c <= 49 THEN hx$ = hx$ + c$: i = i + 1: GOTO lfreadbin
-END IF
-fullhx$ = "&B" + hx$
+ IF MID$(a$, i + 1, 1) = "B" THEN
+ i = i + 2
+ 'note: to avoid mistakes, hx$ is used instead of 'bi$'
+ hx$ = ""
+ lfreadbin:
+ IF i <= n THEN
+ c$ = MID$(a$, i, 1): c = ASC(c$)
+ IF c >= 48 AND c <= 49 THEN hx$ = hx$ + c$: i = i + 1: GOTO lfreadbin
+ END IF
+ fullhx$ = "&B" + hx$
-'cull leading 0s off hx$
-DO WHILE LEFT$(hx$, 1) = "0": hx$ = RIGHT$(hx$, LEN(hx$) - 1): LOOP
-IF hx$ = "" THEN hx$ = "0"
+ 'cull leading 0s off hx$
+ DO WHILE LEFT$(hx$, 1) = "0": hx$ = RIGHT$(hx$, LEN(hx$) - 1): LOOP
+ IF hx$ = "" THEN hx$ = "0"
-bitn$ = ""
-'3-character extensions
-IF i <= n - 2 THEN
-e$ = MID$(a$, i, 3)
-IF e$ = "~%%" THEN i = i + 3: GOTO lfbiext
-IF e$ = "~&&" THEN i = i + 3: GOTO lfbiext
-IF e$ = "~%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-END IF
-'2-character extensions
-IF i <= n - 1 THEN
-e$ = MID$(a$, i, 2)
-IF e$ = "%%" THEN i = i + 2: GOTO lfbiext
-IF e$ = "~%" THEN i = i + 2: GOTO lfbiext
-IF e$ = "&&" THEN i = i + 2: GOTO lfbiext
-IF e$ = "%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
-IF e$ = "~&" THEN i = i + 2: GOTO lfbiext
-IF e$ = "~`" THEN
-i = i + 2
-GOTO lfbibitext
-END IF
-END IF
+ bitn$ = ""
+ '3-character extensions
+ IF i <= n - 2 THEN
+ e$ = MID$(a$, i, 3)
+ IF e$ = "~%%" THEN i = i + 3: GOTO lfbiext
+ IF e$ = "~&&" THEN i = i + 3: GOTO lfbiext
+ IF e$ = "~%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ END IF
+ '2-character extensions
+ IF i <= n - 1 THEN
+ e$ = MID$(a$, i, 2)
+ IF e$ = "%%" THEN i = i + 2: GOTO lfbiext
+ IF e$ = "~%" THEN i = i + 2: GOTO lfbiext
+ IF e$ = "&&" THEN i = i + 2: GOTO lfbiext
+ IF e$ = "%&" THEN Give_Error "Cannot use _OFFSET symbols after numbers": EXIT FUNCTION
+ IF e$ = "~&" THEN i = i + 2: GOTO lfbiext
+ IF e$ = "~`" THEN
+ i = i + 2
+ GOTO lfbibitext
+ END IF
+ END IF
-'1-character extensions
-IF i <= n THEN
-e$ = MID$(a$, i, 1)
-IF e$ = "%" THEN i = i + 1: GOTO lfbiext
-IF e$ = "&" THEN i = i + 1: GOTO lfbiext
-IF e$ = "`" THEN
-i = i + 1
-lfbibitext:
-bitn$ = ""
-DO WHILE i <= n
-c2 = ASC(MID$(a$, i, 1))
-IF c2 >= 48 AND c2 <= 57 THEN
-bitn$ = bitn$ + CHR$(c2)
-i = i + 1
-ELSE
-EXIT DO
-END IF
-LOOP
-IF bitn$ = "" THEN bitn$ = "1"
-'cull leading 0s off bitn$
-DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
-GOTO lfbiext
-END IF
-END IF
-'if no valid extension context was given, assume one
-'note: leading 0s have been culled, so LEN(hx$) reflects its values size
-e$ = "&&"
-IF LEN(hx$) <= 32 THEN e$ = "&"
-IF LEN(hx$) <= 16 THEN e$ = "%"
+ '1-character extensions
+ IF i <= n THEN
+ e$ = MID$(a$, i, 1)
+ IF e$ = "%" THEN i = i + 1: GOTO lfbiext
+ IF e$ = "&" THEN i = i + 1: GOTO lfbiext
+ IF e$ = "`" THEN
+ i = i + 1
+ lfbibitext:
+ bitn$ = ""
+ DO WHILE i <= n
+ c2 = ASC(MID$(a$, i, 1))
+ IF c2 >= 48 AND c2 <= 57 THEN
+ bitn$ = bitn$ + CHR$(c2)
+ i = i + 1
+ ELSE
+ EXIT DO
+ END IF
+ LOOP
+ IF bitn$ = "" THEN bitn$ = "1"
+ 'cull leading 0s off bitn$
+ DO WHILE LEFT$(bitn$, 1) = "0": bitn$ = RIGHT$(bitn$, LEN(bitn$) - 1): LOOP
+ GOTO lfbiext
+ END IF
+ END IF
+ 'if no valid extension context was given, assume one
+ 'note: leading 0s have been culled, so LEN(hx$) reflects its values size
+ e$ = "&&"
+ IF LEN(hx$) <= 32 THEN e$ = "&"
+ IF LEN(hx$) <= 16 THEN e$ = "%"
-GOTO lfbiext2
-lfbiext:
-fullhx$ = fullhx$ + e$ + bitn$
-lfbiext2:
+ GOTO lfbiext2
+ lfbiext:
+ fullhx$ = fullhx$ + e$ + bitn$
+ lfbiext2:
-'build 8-byte unsigned integer rep. of hx$
-IF LEN(hx$) > 64 THEN Give_Error "Overflow": EXIT FUNCTION
+ 'build 8-byte unsigned integer rep. of hx$
+ IF LEN(hx$) > 64 THEN Give_Error "Overflow": EXIT FUNCTION
-v~&& = 0
-FOR i2 = 1 TO LEN(hx$)
-v2 = ASC(MID$(hx$, i2, 1))
-v2 = v2 - 48
-v~&& = v~&& * 2 + v2
-NEXT
+ v~&& = 0
+ FOR i2 = 1 TO LEN(hx$)
+ v2 = ASC(MID$(hx$, i2, 1))
+ v2 = v2 - 48
+ v~&& = v~&& * 2 + v2
+ NEXT
-GOTO finishhexoctbin
-END IF
+ GOTO finishhexoctbin
+ END IF
END IF
@@ -18351,210 +18558,210 @@ IF c = 38 THEN Give_Error "Expected &H... or &O...": EXIT FUNCTION
'----------------variable/name----------------
'*trailing _ is treated as a seperate line extension*
IF (c >= 65 AND c <= 90) OR c = 95 THEN 'A-Z(a-z) or _
-IF c = 95 THEN p2 = 0 ELSE p2 = i
-FOR i2 = i + 1 TO n
-c2 = ASC(a$, i2)
-IF NOT alphanumeric(c2) THEN EXIT FOR
-IF c2 <> 95 THEN p2 = i2
-NEXT
-IF p2 THEN 'not just underscores!
-'char is from i to p2
-n2 = p2 - i + 1
-a3$ = MID$(a$, i, n2)
+ IF c = 95 THEN p2 = 0 ELSE p2 = i
+ FOR i2 = i + 1 TO n
+ c2 = ASC(a$, i2)
+ IF NOT alphanumeric(c2) THEN EXIT FOR
+ IF c2 <> 95 THEN p2 = i2
+ NEXT
+ IF p2 THEN 'not just underscores!
+ 'char is from i to p2
+ n2 = p2 - i + 1
+ a3$ = MID$(a$, i, n2)
-'----(variable/name)rem----
-IF n2 = 3 THEN
-IF a3$ = "REM" THEN
-i = i + n2
-IF i < n THEN
-c = ASC(a$, i)
-IF c = 46 THEN a2$ = a2$ + sp + MID$(ca$, i - n2, n2): GOTO extcheck 'rem.Variable is a valid variable name in QB45
-END IF
+ '----(variable/name)rem----
+ IF n2 = 3 THEN
+ IF a3$ = "REM" THEN
+ i = i + n2
+ IF i < n THEN
+ c = ASC(a$, i)
+ IF c = 46 THEN a2$ = a2$ + sp + MID$(ca$, i - n2, n2): GOTO extcheck 'rem.Variable is a valid variable name in QB45
+ END IF
-'note: In QBASIC 'IF cond THEN REM comment' counts as a single line IF statement, however use of ' instead of REM does not
-IF UCASE$(RIGHT$(a2$, 5)) = sp + "THEN" THEN a2$ = a2$ + sp + "'" 'add nop
-layoutcomment = "REM"
-GOTO comment
-END IF
-END IF
+ 'note: In QBASIC 'IF cond THEN REM comment' counts as a single line IF statement, however use of ' instead of REM does not
+ IF UCASE$(RIGHT$(a2$, 5)) = sp + "THEN" THEN a2$ = a2$ + sp + "'" 'add nop
+ layoutcomment = "REM"
+ GOTO comment
+ END IF
+ END IF
-'----(variable/name)data----
-IF n2 = 4 THEN
-IF a3$ = "DATA" THEN
-x$ = ""
-i = i + n2
-IF i < n THEN
-c = ASC(a$, i)
-IF c = 46 THEN a2$ = a2$ + sp + MID$(ca$, i - n2, n2): GOTO extcheck 'data.Variable is a valid variable name in QB45
-END IF
+ '----(variable/name)data----
+ IF n2 = 4 THEN
+ IF a3$ = "DATA" THEN
+ x$ = ""
+ i = i + n2
+ IF i < n THEN
+ c = ASC(a$, i)
+ IF c = 46 THEN a2$ = a2$ + sp + MID$(ca$, i - n2, n2): GOTO extcheck 'data.Variable is a valid variable name in QB45
+ END IF
-scan = 0
-speechmarks = 0
-commanext = 0
-finaldata = 0
-e$ = ""
-p1 = 0
-p2 = 0
-nextdatachr:
-IF i < n THEN
-c = ASC(a$, i)
-IF c = 9 OR c = 32 THEN
-IF scan = 0 THEN GOTO skipwhitespace
-END IF
+ scan = 0
+ speechmarks = 0
+ commanext = 0
+ finaldata = 0
+ e$ = ""
+ p1 = 0
+ p2 = 0
+ nextdatachr:
+ IF i < n THEN
+ c = ASC(a$, i)
+ IF c = 9 OR c = 32 THEN
+ IF scan = 0 THEN GOTO skipwhitespace
+ END IF
-IF c = 58 THEN '":"
-IF speechmarks = 0 THEN finaldata = 1: GOTO adddata
-END IF
+ IF c = 58 THEN '":"
+ IF speechmarks = 0 THEN finaldata = 1: GOTO adddata
+ END IF
-IF c = 44 THEN '","
-IF speechmarks = 0 THEN
-adddata:
-IF prepass = 0 THEN
-IF p1 THEN
-'FOR i2 = p1 TO p2
-' DATA_add ASC(ca$, i2)
-'NEXT
-x$ = x$ + MID$(ca$, p1, p2 - p1 + 1)
-END IF
-'assume closing "
-IF speechmarks THEN
-'DATA_add 34
-x$ = x$ + CHR$(34)
-END IF
-'append comma
-'DATA_add 44
-x$ = x$ + CHR$(44)
-END IF
-IF finaldata = 1 THEN GOTO finisheddata
-e$ = ""
-p1 = 0
-p2 = 0
-speechmarks = 0
-scan = 0
-commanext = 0
-i = i + 1
-GOTO nextdatachr
-END IF
-END IF '","
+ IF c = 44 THEN '","
+ IF speechmarks = 0 THEN
+ adddata:
+ IF prepass = 0 THEN
+ IF p1 THEN
+ 'FOR i2 = p1 TO p2
+ ' DATA_add ASC(ca$, i2)
+ 'NEXT
+ x$ = x$ + MID$(ca$, p1, p2 - p1 + 1)
+ END IF
+ 'assume closing "
+ IF speechmarks THEN
+ 'DATA_add 34
+ x$ = x$ + CHR$(34)
+ END IF
+ 'append comma
+ 'DATA_add 44
+ x$ = x$ + CHR$(44)
+ END IF
+ IF finaldata = 1 THEN GOTO finisheddata
+ e$ = ""
+ p1 = 0
+ p2 = 0
+ speechmarks = 0
+ scan = 0
+ commanext = 0
+ i = i + 1
+ GOTO nextdatachr
+ END IF
+ END IF '","
-IF commanext = 1 THEN
-IF c <> 32 AND c <> 9 THEN Give_Error "Expected , after quoted string in DATA statement": EXIT FUNCTION
-END IF
+ IF commanext = 1 THEN
+ IF c <> 32 AND c <> 9 THEN Give_Error "Expected , after quoted string in DATA statement": EXIT FUNCTION
+ END IF
-IF c = 34 THEN
-IF speechmarks = 1 THEN
-commanext = 1
-speechmarks = 0
-END IF
-IF scan = 0 THEN speechmarks = 1
-END IF
+ IF c = 34 THEN
+ IF speechmarks = 1 THEN
+ commanext = 1
+ speechmarks = 0
+ END IF
+ IF scan = 0 THEN speechmarks = 1
+ END IF
-scan = 1
+ scan = 1
-IF p1 = 0 THEN p1 = i: p2 = i
-IF c <> 9 AND c <> 32 THEN p2 = i
+ IF p1 = 0 THEN p1 = i: p2 = i
+ IF c <> 9 AND c <> 32 THEN p2 = i
-skipwhitespace:
-i = i + 1: GOTO nextdatachr
-END IF 'i 40 THEN Give_Error "Identifier longer than 40 character limit": EXIT FUNCTION
-c3 = ASC(a$, i)
-m = 0
-IF c3 = 126 THEN '"~"
-e2$ = MID$(a$, i + 1, 2)
-IF e2$ = "&&" THEN e2$ = "~&&": GOTO lfgetve
-IF e2$ = "%%" THEN e2$ = "~%%": GOTO lfgetve
-IF e2$ = "%&" THEN e2$ = "~%&": GOTO lfgetve
-e2$ = CHR$(ASC(e2$))
-IF e2$ = "&" THEN e2$ = "~&": GOTO lfgetve
-IF e2$ = "%" THEN e2$ = "~%": GOTO lfgetve
-IF e2$ = "`" THEN m = 1: e2$ = "~`": GOTO lfgetve
-END IF
-IF c3 = 37 THEN
-c4 = ASC(a$, i + 1)
-IF c4 = 37 THEN e2$ = "%%": GOTO lfgetve
-IF c4 = 38 THEN e2$ = "%&": GOTO lfgetve
-e2$ = "%": GOTO lfgetve
-END IF
-IF c3 = 38 THEN
-c4 = ASC(a$, i + 1)
-IF c4 = 38 THEN e2$ = "&&": GOTO lfgetve
-e2$ = "&": GOTO lfgetve
-END IF
-IF c3 = 33 THEN e2$ = "!": GOTO lfgetve
-IF c3 = 35 THEN
-c4 = ASC(a$, i + 1)
-IF c4 = 35 THEN e2$ = "##": GOTO lfgetve
-e2$ = "#": GOTO lfgetve
-END IF
-IF c3 = 36 THEN m = 1: e2$ = "$": GOTO lfgetve
-IF c3 = 96 THEN m = 1: e2$ = "`": GOTO lfgetve
-'(no symbol)
+ '----(variable/name)extensions----
+ extcheck:
+ IF n2 > 40 THEN Give_Error "Identifier longer than 40 character limit": EXIT FUNCTION
+ c3 = ASC(a$, i)
+ m = 0
+ IF c3 = 126 THEN '"~"
+ e2$ = MID$(a$, i + 1, 2)
+ IF e2$ = "&&" THEN e2$ = "~&&": GOTO lfgetve
+ IF e2$ = "%%" THEN e2$ = "~%%": GOTO lfgetve
+ IF e2$ = "%&" THEN e2$ = "~%&": GOTO lfgetve
+ e2$ = CHR$(ASC(e2$))
+ IF e2$ = "&" THEN e2$ = "~&": GOTO lfgetve
+ IF e2$ = "%" THEN e2$ = "~%": GOTO lfgetve
+ IF e2$ = "`" THEN m = 1: e2$ = "~`": GOTO lfgetve
+ END IF
+ IF c3 = 37 THEN
+ c4 = ASC(a$, i + 1)
+ IF c4 = 37 THEN e2$ = "%%": GOTO lfgetve
+ IF c4 = 38 THEN e2$ = "%&": GOTO lfgetve
+ e2$ = "%": GOTO lfgetve
+ END IF
+ IF c3 = 38 THEN
+ c4 = ASC(a$, i + 1)
+ IF c4 = 38 THEN e2$ = "&&": GOTO lfgetve
+ e2$ = "&": GOTO lfgetve
+ END IF
+ IF c3 = 33 THEN e2$ = "!": GOTO lfgetve
+ IF c3 = 35 THEN
+ c4 = ASC(a$, i + 1)
+ IF c4 = 35 THEN e2$ = "##": GOTO lfgetve
+ e2$ = "#": GOTO lfgetve
+ END IF
+ IF c3 = 36 THEN m = 1: e2$ = "$": GOTO lfgetve
+ IF c3 = 96 THEN m = 1: e2$ = "`": GOTO lfgetve
+ '(no symbol)
-'cater for unusual names/labels (eg a.0b%)
-IF ASC(a$, i) = 46 THEN '"."
-c2 = ASC(a$, i + 1)
-IF c2 >= 48 AND c2 <= 57 THEN
-'scan until no further alphanumerics
-p2 = i + 1
-FOR i2 = i + 2 TO n
-c = ASC(a$, i2)
+ 'cater for unusual names/labels (eg a.0b%)
+ IF ASC(a$, i) = 46 THEN '"."
+ c2 = ASC(a$, i + 1)
+ IF c2 >= 48 AND c2 <= 57 THEN
+ 'scan until no further alphanumerics
+ p2 = i + 1
+ FOR i2 = i + 2 TO n
+ c = ASC(a$, i2)
-IF NOT alphanumeric(c) THEN EXIT FOR
-IF c <> 95 THEN p2 = i2 'don't including trailing _
-NEXT
-a2$ = a2$ + sp + "." + sp + MID$(ca$, i + 1, p2 - (i + 1) + 1) 'case sensitive
-n2 = n2 + 1 + (p2 - (i + 1) + 1)
-i = p2 + 1
-GOTO extcheck 'it may have an extension or be continued with another "."
-END IF
-END IF
+ IF NOT alphanumeric(c) THEN EXIT FOR
+ IF c <> 95 THEN p2 = i2 'don't including trailing _
+ NEXT
+ a2$ = a2$ + sp + "." + sp + MID$(ca$, i + 1, p2 - (i + 1) + 1) 'case sensitive
+ n2 = n2 + 1 + (p2 - (i + 1) + 1)
+ i = p2 + 1
+ GOTO extcheck 'it may have an extension or be continued with another "."
+ END IF
+ END IF
-GOTO lineformatnext
+ GOTO lineformatnext
-lfgetve:
-i = i + LEN(e2$)
-a2$ = a2$ + e2$
-IF m THEN 'allow digits after symbol
-lfgetvd:
-IF i < n THEN
-c = ASC(a$, i)
-IF c >= 48 AND c <= 57 THEN a2$ = a2$ + CHR$(c): i = i + 1: GOTO lfgetvd
-END IF
-END IF 'm
+ lfgetve:
+ i = i + LEN(e2$)
+ a2$ = a2$ + e2$
+ IF m THEN 'allow digits after symbol
+ lfgetvd:
+ IF i < n THEN
+ c = ASC(a$, i)
+ IF c >= 48 AND c <= 57 THEN a2$ = a2$ + CHR$(c): i = i + 1: GOTO lfgetvd
+ END IF
+ END IF 'm
-GOTO lineformatnext
+ GOTO lineformatnext
-END IF 'p2
+ END IF 'p2
END IF 'variable/name
'----------------variable/name end----------------
@@ -18564,31 +18771,31 @@ IF c = 32 OR c = 9 THEN i = i + 1: GOTO lineformatnext
'----------------symbols----------------
'--------single characters--------
IF lfsinglechar(c) THEN
-IF (c = 60) OR (c = 61) OR (c = 62) THEN
-count = 0
-DO
-count = count + 1
-IF i + count >= LEN(a$) - 2 THEN EXIT DO
-LOOP UNTIL ASC(a$, i + count) <> 32
-c2 = ASC(a$, i + count)
-IF c = 60 THEN '<
-IF c2 = 61 THEN a2$ = a2$ + sp + "<=": i = i + count + 1: GOTO lineformatnext
-IF c2 = 62 THEN a2$ = a2$ + sp + "<>": i = i + count + 1: GOTO lineformatnext
-ELSEIF c = 62 THEN '>
-IF c2 = 61 THEN a2$ = a2$ + sp + ">=": i = i + count + 1: GOTO lineformatnext
-IF c2 = 60 THEN a2$ = a2$ + sp + "<>": i = i + count + 1: GOTO lineformatnext '>< to <>
-ELSEIF c = 61 THEN '=
-IF c2 = 62 THEN a2$ = a2$ + sp + ">=": i = i + count + 1: GOTO lineformatnext '=> to >=
-IF c2 = 60 THEN a2$ = a2$ + sp + "<=": i = i + count + 1: GOTO lineformatnext '=< to <=
-END IF
-END IF
+ IF (c = 60) OR (c = 61) OR (c = 62) THEN
+ count = 0
+ DO
+ count = count + 1
+ IF i + count >= LEN(a$) - 2 THEN EXIT DO
+ LOOP UNTIL ASC(a$, i + count) <> 32
+ c2 = ASC(a$, i + count)
+ IF c = 60 THEN '<
+ IF c2 = 61 THEN a2$ = a2$ + sp + "<=": i = i + count + 1: GOTO lineformatnext
+ IF c2 = 62 THEN a2$ = a2$ + sp + "<>": i = i + count + 1: GOTO lineformatnext
+ ELSEIF c = 62 THEN '>
+ IF c2 = 61 THEN a2$ = a2$ + sp + ">=": i = i + count + 1: GOTO lineformatnext
+ IF c2 = 60 THEN a2$ = a2$ + sp + "<>": i = i + count + 1: GOTO lineformatnext '>< to <>
+ ELSEIF c = 61 THEN '=
+ IF c2 = 62 THEN a2$ = a2$ + sp + ">=": i = i + count + 1: GOTO lineformatnext '=> to >=
+ IF c2 = 60 THEN a2$ = a2$ + sp + "<=": i = i + count + 1: GOTO lineformatnext '=< to <=
+ END IF
+ END IF
-IF c = 36 AND LEN(a2$) THEN GOTO badusage '$
+ IF c = 36 AND LEN(a2$) THEN GOTO badusage '$
-a2$ = a2$ + sp + CHR$(c)
-i = i + 1
-GOTO lineformatnext
+ a2$ = a2$ + sp + CHR$(c)
+ i = i + 1
+ GOTO lineformatnext
END IF
badusage:
@@ -18611,53 +18818,53 @@ IF ac <> 36 THEN GOTO lineformatdone2
nocasec$ = LTRIM$(RIGHT$(ca$, LEN(ca$) - i + 1))
memmode = 0
FOR x = 1 TO LEN(c$)
-mcnext:
-IF MID$(c$, x, 1) = "$" THEN
+ mcnext:
+ IF MID$(c$, x, 1) = "$" THEN
-'note: $STATICksdcdweh$DYNAMIC is valid!
+ 'note: $STATICksdcdweh$DYNAMIC is valid!
-IF MID$(c$, x, 7) = "$STATIC" THEN
-memmode = 1
-xx = INSTR(x + 1, c$, "$")
-if xx=0 then exit for else
-x = xx: GOTO mcnext
-END IF
+ IF MID$(c$, x, 7) = "$STATIC" THEN
+ memmode = 1
+ xx = INSTR(x + 1, c$, "$")
+ if xx=0 then exit for else
+ x = xx: GOTO mcnext
+ END IF
-IF MID$(c$, x, 8) = "$DYNAMIC" THEN
-memmode = 2
-xx = INSTR(x + 1, c$, "$")
-IF xx = 0 THEN EXIT FOR
-x = xx: GOTO mcnext
-END IF
+ IF MID$(c$, x, 8) = "$DYNAMIC" THEN
+ memmode = 2
+ xx = INSTR(x + 1, c$, "$")
+ IF xx = 0 THEN EXIT FOR
+ x = xx: GOTO mcnext
+ END IF
-IF MID$(c$, x, 8) = "$INCLUDE" THEN
-IF Cloud THEN Give_Error "Feature not supported on QLOUD": EXIT FUNCTION
-'note: INCLUDE adds the file AFTER the line it is on has been processed
-'note: No other metacommands can follow the INCLUDE metacommand!
-'skip spaces until :
-FOR xx = x + 8 TO LEN(c$)
-ac = ASC(MID$(c$, xx, 1))
-IF ac = 58 THEN EXIT FOR ':
-IF ac <> 32 AND ac <> 9 THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
-NEXT
-x = xx
-'skip spaces until '
-FOR xx = x + 1 TO LEN(c$)
-ac = ASC(MID$(c$, xx, 1))
-IF ac = 39 THEN EXIT FOR 'character:'
-IF ac <> 32 AND ac <> 9 THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
-NEXT
-x = xx
-xx = INSTR(x + 1, c$, "'")
-IF xx = 0 THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
-addmetainclude$ = MID$(nocasec$, x + 1, xx - x - 1)
-IF addmetainclude$ = "" THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
-GOTO mcfinal
-END IF
+ IF MID$(c$, x, 8) = "$INCLUDE" THEN
+ IF Cloud THEN Give_Error "Feature not supported on QLOUD": EXIT FUNCTION
+ 'note: INCLUDE adds the file AFTER the line it is on has been processed
+ 'note: No other metacommands can follow the INCLUDE metacommand!
+ 'skip spaces until :
+ FOR xx = x + 8 TO LEN(c$)
+ ac = ASC(MID$(c$, xx, 1))
+ IF ac = 58 THEN EXIT FOR ':
+ IF ac <> 32 AND ac <> 9 THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
+ NEXT
+ x = xx
+ 'skip spaces until '
+ FOR xx = x + 1 TO LEN(c$)
+ ac = ASC(MID$(c$, xx, 1))
+ IF ac = 39 THEN EXIT FOR 'character:'
+ IF ac <> 32 AND ac <> 9 THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
+ NEXT
+ x = xx
+ xx = INSTR(x + 1, c$, "'")
+ IF xx = 0 THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
+ addmetainclude$ = MID$(nocasec$, x + 1, xx - x - 1)
+ IF addmetainclude$ = "" THEN Give_Error "Expected $INCLUDE:'filename'": EXIT FUNCTION
+ GOTO mcfinal
+ END IF
-'add more metacommands here
+ 'add more metacommands here
-END IF '$
+ END IF '$
NEXT
mcfinal:
@@ -18673,43 +18880,43 @@ lineformatdone:
'line continuation?
'note: line continuation in idemode is illegal
IF LEN(a2$) THEN
-IF RIGHT$(a2$, 1) = "_" THEN
+ IF RIGHT$(a2$, 1) = "_" THEN
-linecontinuation = 1 'avoids auto-format glitches
-layout$ = ""
+ linecontinuation = 1 'avoids auto-format glitches
+ layout$ = ""
-'remove _ from the end of the building string
-IF LEN(a2$) >= 2 THEN
-IF RIGHT$(a2$, 2) = sp + "_" THEN a2$ = LEFT$(a2$, LEN(a2$) - 1)
-END IF
-a2$ = LEFT$(a2$, LEN(a2$) - 1)
+ 'remove _ from the end of the building string
+ IF LEN(a2$) >= 2 THEN
+ IF RIGHT$(a2$, 2) = sp + "_" THEN a2$ = LEFT$(a2$, LEN(a2$) - 1)
+ END IF
+ a2$ = LEFT$(a2$, LEN(a2$) - 1)
-IF inclevel THEN
-fh = 99 + inclevel
-IF EOF(fh) THEN GOTO lineformatdone2
-LINE INPUT #fh, a$
-inclinenumber(inclevel) = inclinenumber(inclevel) + 1
-GOTO includecont 'note: should not increase linenumber
-END IF
+ IF inclevel THEN
+ fh = 99 + inclevel
+ IF EOF(fh) THEN GOTO lineformatdone2
+ LINE INPUT #fh, a$
+ inclinenumber(inclevel) = inclinenumber(inclevel) + 1
+ GOTO includecont 'note: should not increase linenumber
+ END IF
-IF idemode THEN
-idecommand$ = CHR$(100)
-ignore = ide(0)
-ideerror = 0
-a$ = idereturn$
-IF a$ = "" THEN GOTO lineformatdone2
-ELSE
-a$ = lineinput3$
-IF a$ = CHR$(13) THEN GOTO lineformatdone2
-END IF
+ IF idemode THEN
+ idecommand$ = CHR$(100)
+ ignore = ide(0)
+ ideerror = 0
+ a$ = idereturn$
+ IF a$ = "" THEN GOTO lineformatdone2
+ ELSE
+ a$ = lineinput3$
+ IF a$ = CHR$(13) THEN GOTO lineformatdone2
+ END IF
-linenumber = linenumber + 1
+ linenumber = linenumber + 1
-includecont:
+ includecont:
-contline = 1
-GOTO continueline
-END IF
+ contline = 1
+ GOTO continueline
+ END IF
END IF
lineformatdone2:
@@ -18760,17 +18967,17 @@ lhs = 7: rhs = 7: result = 0
'string operator
IF (typ AND ISSTRING) THEN
-lhs = 4: rhs = 4
-result = 4
-IF operator$ = "+" THEN info$ = "qbs_add": operatorusage = 2: EXIT FUNCTION
-result = 8
-IF operator$ = "=" THEN info$ = "qbs_equal": operatorusage = 2: EXIT FUNCTION
-IF operator$ = "<>" THEN info$ = "qbs_notequal": operatorusage = 2: EXIT FUNCTION
-IF operator$ = ">" THEN info$ = "qbs_greaterthan": operatorusage = 2: EXIT FUNCTION
-IF operator$ = "<" THEN info$ = "qbs_lessthan": operatorusage = 2: EXIT FUNCTION
-IF operator$ = ">=" THEN info$ = "qbs_greaterorequal": operatorusage = 2: EXIT FUNCTION
-IF operator$ = "<=" THEN info$ = "qbs_lessorequal": operatorusage = 2: EXIT FUNCTION
-IF Debug THEN PRINT #9, "INVALID STRING OPERATOR!": END
+ lhs = 4: rhs = 4
+ result = 4
+ IF operator$ = "+" THEN info$ = "qbs_add": operatorusage = 2: EXIT FUNCTION
+ result = 8
+ IF operator$ = "=" THEN info$ = "qbs_equal": operatorusage = 2: EXIT FUNCTION
+ IF operator$ = "<>" THEN info$ = "qbs_notequal": operatorusage = 2: EXIT FUNCTION
+ IF operator$ = ">" THEN info$ = "qbs_greaterthan": operatorusage = 2: EXIT FUNCTION
+ IF operator$ = "<" THEN info$ = "qbs_lessthan": operatorusage = 2: EXIT FUNCTION
+ IF operator$ = ">=" THEN info$ = "qbs_greaterorequal": operatorusage = 2: EXIT FUNCTION
+ IF operator$ = "<=" THEN info$ = "qbs_lessorequal": operatorusage = 2: EXIT FUNCTION
+ IF Debug THEN PRINT #9, "INVALID STRING OPERATOR!": END
END IF
'assume numeric operator
@@ -18778,20 +18985,20 @@ lhs = 1 + 2: rhs = 1 + 2
IF operator$ = "^" THEN result = 2: info$ = "pow2": operatorusage = 2: EXIT FUNCTION
IF operator$ = "ñ" THEN info$ = "-": operatorusage = 5: EXIT FUNCTION
IF operator$ = "/" THEN
-info$ = "/ ": operatorusage = 1
-'for / division, either the lhs or the rhs must be a float to make
-'c++ return a result in floating point form
-IF (typ AND ISFLOAT) THEN
-'lhs is a float
-lhs = 2
-rhs = 1 + 2
-ELSE
-'lhs isn't a float!
-lhs = 1 + 2
-rhs = 2
-END IF
-result = 2
-EXIT FUNCTION
+ info$ = "/ ": operatorusage = 1
+ 'for / division, either the lhs or the rhs must be a float to make
+ 'c++ return a result in floating point form
+ IF (typ AND ISFLOAT) THEN
+ 'lhs is a float
+ lhs = 2
+ rhs = 1 + 2
+ ELSE
+ 'lhs isn't a float!
+ lhs = 1 + 2
+ rhs = 2
+ END IF
+ result = 2
+ EXIT FUNCTION
END IF
IF operator$ = "*" THEN info$ = "*": operatorusage = 1: EXIT FUNCTION
IF operator$ = "+" THEN info$ = "+": operatorusage = 1: EXIT FUNCTION
@@ -18831,156 +19038,156 @@ a$ = a2$
'retrieve ID
i = INSTR(a$, sp3)
IF i THEN
-idnumber = VAL(LEFT$(a$, i - 1)): a$ = RIGHT$(a$, LEN(a$) - i)
+ idnumber = VAL(LEFT$(a$, i - 1)): a$ = RIGHT$(a$, LEN(a$) - i)
ELSE
-idnumber = VAL(a$)
+ idnumber = VAL(a$)
END IF
getid idnumber
IF Error_Happened THEN EXIT FUNCTION
'UDT?
IF typ AND ISUDT THEN
-IF method = 1 THEN
-n$ = "UDT_" + RTRIM$(id.n)
-IF id.t = 0 THEN n$ = "ARRAY_" + n$
-n$ = scope$ + n$
-refer$ = n$
-EXIT FUNCTION
-END IF
+ IF method = 1 THEN
+ n$ = "UDT_" + RTRIM$(id.n)
+ IF id.t = 0 THEN n$ = "ARRAY_" + n$
+ n$ = scope$ + n$
+ refer$ = n$
+ EXIT FUNCTION
+ END IF
-'print "UDTSUBSTRING[idX|u|e|o]:"+a$
+ 'print "UDTSUBSTRING[idX|u|e|o]:"+a$
-u = VAL(a$)
-i = INSTR(a$, sp3): a$ = RIGHT$(a$, LEN(a$) - i): E = VAL(a$)
-i = INSTR(a$, sp3): o$ = RIGHT$(a$, LEN(a$) - i)
-n$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n$ = "ARRAY_" + n$ + "[0]"
-IF E = 0 THEN Give_Error "User defined types in expressions are invalid": EXIT FUNCTION
-IF typ AND ISOFFSETINBITS THEN Give_Error "Cannot resolve bit-length variables inside user defined types yet": EXIT FUNCTION
+ u = VAL(a$)
+ i = INSTR(a$, sp3): a$ = RIGHT$(a$, LEN(a$) - i): E = VAL(a$)
+ i = INSTR(a$, sp3): o$ = RIGHT$(a$, LEN(a$) - i)
+ n$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n$ = "ARRAY_" + n$ + "[0]"
+ IF E = 0 THEN Give_Error "User defined types in expressions are invalid": EXIT FUNCTION
+ IF typ AND ISOFFSETINBITS THEN Give_Error "Cannot resolve bit-length variables inside user defined types yet": EXIT FUNCTION
-IF typ AND ISSTRING THEN
-o2$ = "(((uint8*)" + scope$ + n$ + ")+(" + o$ + "))"
-r$ = "qbs_new_fixed(" + o2$ + "," + str2(udtetypesize(E)) + ",1)"
-typ = STRINGTYPE + ISFIXEDLENGTH 'ISPOINTER retained, it is still a pointer!
-ELSE
-typ = typ - ISUDT - ISREFERENCE - ISPOINTER
-IF typ AND ISARRAY THEN typ = typ - ISARRAY
-t$ = typ2ctyp$(typ, "")
-IF Error_Happened THEN EXIT FUNCTION
-o2$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
-r$ = "*" + "(" + t$ + "*)" + o2$
-END IF
+ IF typ AND ISSTRING THEN
+ o2$ = "(((uint8*)" + scope$ + n$ + ")+(" + o$ + "))"
+ r$ = "qbs_new_fixed(" + o2$ + "," + str2(udtetypesize(E)) + ",1)"
+ typ = STRINGTYPE + ISFIXEDLENGTH 'ISPOINTER retained, it is still a pointer!
+ ELSE
+ typ = typ - ISUDT - ISREFERENCE - ISPOINTER
+ IF typ AND ISARRAY THEN typ = typ - ISARRAY
+ t$ = typ2ctyp$(typ, "")
+ IF Error_Happened THEN EXIT FUNCTION
+ o2$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
+ r$ = "*" + "(" + t$ + "*)" + o2$
+ END IF
-'print "REFER:"+r$+","+str2$(typ)
-refer$ = r$
-EXIT FUNCTION
+ 'print "REFER:"+r$+","+str2$(typ)
+ refer$ = r$
+ EXIT FUNCTION
END IF
'array?
IF id.arraytype THEN
-n$ = RTRIM$(id.callname)
-IF method = 1 THEN
-refer$ = n$
-typ = typbak
-EXIT FUNCTION
-END IF
-typ = typ - ISPOINTER - ISREFERENCE 'typ now looks like a regular value
+ n$ = RTRIM$(id.callname)
+ IF method = 1 THEN
+ refer$ = n$
+ typ = typbak
+ EXIT FUNCTION
+ END IF
+ typ = typ - ISPOINTER - ISREFERENCE 'typ now looks like a regular value
-IF (typ AND ISSTRING) THEN
-IF (typ AND ISFIXEDLENGTH) THEN
-offset$ = "&((uint8*)(" + n$ + "[0]))[(" + a$ + ")*" + str2(id.tsize) + "]"
-r$ = "qbs_new_fixed(" + offset$ + "," + str2(id.tsize) + ",1)"
-ELSE
-r$ = "((qbs*)(((uint64*)(" + n$ + "[0]))[" + a$ + "]))"
-END IF
-stringprocessinghappened = 1
-refer$ = r$
-EXIT FUNCTION
-END IF
+ IF (typ AND ISSTRING) THEN
+ IF (typ AND ISFIXEDLENGTH) THEN
+ offset$ = "&((uint8*)(" + n$ + "[0]))[(" + a$ + ")*" + str2(id.tsize) + "]"
+ r$ = "qbs_new_fixed(" + offset$ + "," + str2(id.tsize) + ",1)"
+ ELSE
+ r$ = "((qbs*)(((uint64*)(" + n$ + "[0]))[" + a$ + "]))"
+ END IF
+ stringprocessinghappened = 1
+ refer$ = r$
+ EXIT FUNCTION
+ END IF
-IF (typ AND ISOFFSETINBITS) THEN
-'IF (typ AND ISUNSIGNED) THEN r$ = "getubits_" ELSE r$ = "getbits_"
-'r$ = r$ + str2(typ AND 511) + "("
-IF (typ AND ISUNSIGNED) THEN r$ = "getubits" ELSE r$ = "getbits"
-r$ = r$ + "(" + str2(typ AND 511) + ","
-r$ = r$ + "(uint8*)(" + n$ + "[0])" + ","
-r$ = r$ + a$ + ")"
-refer$ = r$
-EXIT FUNCTION
-ELSE
-t$ = ""
-IF (typ AND ISFLOAT) THEN
-IF (typ AND 511) = 32 THEN t$ = "float"
-IF (typ AND 511) = 64 THEN t$ = "double"
-IF (typ AND 511) = 256 THEN t$ = "long double"
-ELSE
-IF (typ AND ISUNSIGNED) THEN
-IF (typ AND 511) = 8 THEN t$ = "uint8"
-IF (typ AND 511) = 16 THEN t$ = "uint16"
-IF (typ AND 511) = 32 THEN t$ = "uint32"
-IF (typ AND 511) = 64 THEN t$ = "uint64"
-IF typ AND ISOFFSET THEN t$ = "uptrszint"
-ELSE
-IF (typ AND 511) = 8 THEN t$ = "int8"
-IF (typ AND 511) = 16 THEN t$ = "int16"
-IF (typ AND 511) = 32 THEN t$ = "int32"
-IF (typ AND 511) = 64 THEN t$ = "int64"
-IF typ AND ISOFFSET THEN t$ = "ptrszint"
-END IF
-END IF
-END IF
-IF t$ = "" THEN Give_Error "Cannot find C type to return array data": EXIT FUNCTION
-r$ = "((" + t$ + "*)(" + n$ + "[0]))[" + a$ + "]"
-refer$ = r$
-EXIT FUNCTION
+ IF (typ AND ISOFFSETINBITS) THEN
+ 'IF (typ AND ISUNSIGNED) THEN r$ = "getubits_" ELSE r$ = "getbits_"
+ 'r$ = r$ + str2(typ AND 511) + "("
+ IF (typ AND ISUNSIGNED) THEN r$ = "getubits" ELSE r$ = "getbits"
+ r$ = r$ + "(" + str2(typ AND 511) + ","
+ r$ = r$ + "(uint8*)(" + n$ + "[0])" + ","
+ r$ = r$ + a$ + ")"
+ refer$ = r$
+ EXIT FUNCTION
+ ELSE
+ t$ = ""
+ IF (typ AND ISFLOAT) THEN
+ IF (typ AND 511) = 32 THEN t$ = "float"
+ IF (typ AND 511) = 64 THEN t$ = "double"
+ IF (typ AND 511) = 256 THEN t$ = "long double"
+ ELSE
+ IF (typ AND ISUNSIGNED) THEN
+ IF (typ AND 511) = 8 THEN t$ = "uint8"
+ IF (typ AND 511) = 16 THEN t$ = "uint16"
+ IF (typ AND 511) = 32 THEN t$ = "uint32"
+ IF (typ AND 511) = 64 THEN t$ = "uint64"
+ IF typ AND ISOFFSET THEN t$ = "uptrszint"
+ ELSE
+ IF (typ AND 511) = 8 THEN t$ = "int8"
+ IF (typ AND 511) = 16 THEN t$ = "int16"
+ IF (typ AND 511) = 32 THEN t$ = "int32"
+ IF (typ AND 511) = 64 THEN t$ = "int64"
+ IF typ AND ISOFFSET THEN t$ = "ptrszint"
+ END IF
+ END IF
+ END IF
+ IF t$ = "" THEN Give_Error "Cannot find C type to return array data": EXIT FUNCTION
+ r$ = "((" + t$ + "*)(" + n$ + "[0]))[" + a$ + "]"
+ refer$ = r$
+ EXIT FUNCTION
END IF 'array
'variable?
IF id.t THEN
-r$ = RTRIM$(id.n)
-t = id.t
-'remove irrelavant flags
-IF (t AND ISINCONVENTIONALMEMORY) THEN t = t - ISINCONVENTIONALMEMORY
-'string?
-IF (t AND ISSTRING) THEN
-IF (t AND ISFIXEDLENGTH) THEN
-r$ = scope$ + "STRING" + str2(id.tsize) + "_" + r$: GOTO ref
-END IF
-r$ = scope$ + "STRING_" + r$: GOTO ref
-END IF
-'bit-length single variable?
-IF (t AND ISOFFSETINBITS) THEN
-IF (t AND ISUNSIGNED) THEN
-r$ = "*" + scope$ + "UBIT" + str2(t AND 511) + "_" + r$
-ELSE
-r$ = "*" + scope$ + "BIT" + str2(t AND 511) + "_" + r$
-END IF
-GOTO ref
-END IF
-IF t = BYTETYPE THEN r$ = "*" + scope$ + "BYTE_" + r$: GOTO ref
-IF t = UBYTETYPE THEN r$ = "*" + scope$ + "UBYTE_" + r$: GOTO ref
-IF t = INTEGERTYPE THEN r$ = "*" + scope$ + "INTEGER_" + r$: GOTO ref
-IF t = UINTEGERTYPE THEN r$ = "*" + scope$ + "UINTEGER_" + r$: GOTO ref
-IF t = LONGTYPE THEN r$ = "*" + scope$ + "LONG_" + r$: GOTO ref
-IF t = ULONGTYPE THEN r$ = "*" + scope$ + "ULONG_" + r$: GOTO ref
-IF t = INTEGER64TYPE THEN r$ = "*" + scope$ + "INTEGER64_" + r$: GOTO ref
-IF t = UINTEGER64TYPE THEN r$ = "*" + scope$ + "UINTEGER64_" + r$: GOTO ref
-IF t = SINGLETYPE THEN r$ = "*" + scope$ + "SINGLE_" + r$: GOTO ref
-IF t = DOUBLETYPE THEN r$ = "*" + scope$ + "DOUBLE_" + r$: GOTO ref
-IF t = FLOATTYPE THEN r$ = "*" + scope$ + "FLOAT_" + r$: GOTO ref
-IF t = OFFSETTYPE THEN r$ = "*" + scope$ + "OFFSET_" + r$: GOTO ref
-IF t = UOFFSETTYPE THEN r$ = "*" + scope$ + "UOFFSET_" + r$: GOTO ref
-ref:
-IF (t AND ISSTRING) THEN stringprocessinghappened = 1
-IF (t AND ISPOINTER) THEN t = t - ISPOINTER
-typ = t
-IF method = 1 THEN
-IF LEFT$(r$, 1) = "*" THEN r$ = RIGHT$(r$, LEN(r$) - 1)
-typ = typbak
-END IF
-refer$ = r$
-EXIT FUNCTION
+ r$ = RTRIM$(id.n)
+ t = id.t
+ 'remove irrelavant flags
+ IF (t AND ISINCONVENTIONALMEMORY) THEN t = t - ISINCONVENTIONALMEMORY
+ 'string?
+ IF (t AND ISSTRING) THEN
+ IF (t AND ISFIXEDLENGTH) THEN
+ r$ = scope$ + "STRING" + str2(id.tsize) + "_" + r$: GOTO ref
+ END IF
+ r$ = scope$ + "STRING_" + r$: GOTO ref
+ END IF
+ 'bit-length single variable?
+ IF (t AND ISOFFSETINBITS) THEN
+ IF (t AND ISUNSIGNED) THEN
+ r$ = "*" + scope$ + "UBIT" + str2(t AND 511) + "_" + r$
+ ELSE
+ r$ = "*" + scope$ + "BIT" + str2(t AND 511) + "_" + r$
+ END IF
+ GOTO ref
+ END IF
+ IF t = BYTETYPE THEN r$ = "*" + scope$ + "BYTE_" + r$: GOTO ref
+ IF t = UBYTETYPE THEN r$ = "*" + scope$ + "UBYTE_" + r$: GOTO ref
+ IF t = INTEGERTYPE THEN r$ = "*" + scope$ + "INTEGER_" + r$: GOTO ref
+ IF t = UINTEGERTYPE THEN r$ = "*" + scope$ + "UINTEGER_" + r$: GOTO ref
+ IF t = LONGTYPE THEN r$ = "*" + scope$ + "LONG_" + r$: GOTO ref
+ IF t = ULONGTYPE THEN r$ = "*" + scope$ + "ULONG_" + r$: GOTO ref
+ IF t = INTEGER64TYPE THEN r$ = "*" + scope$ + "INTEGER64_" + r$: GOTO ref
+ IF t = UINTEGER64TYPE THEN r$ = "*" + scope$ + "UINTEGER64_" + r$: GOTO ref
+ IF t = SINGLETYPE THEN r$ = "*" + scope$ + "SINGLE_" + r$: GOTO ref
+ IF t = DOUBLETYPE THEN r$ = "*" + scope$ + "DOUBLE_" + r$: GOTO ref
+ IF t = FLOATTYPE THEN r$ = "*" + scope$ + "FLOAT_" + r$: GOTO ref
+ IF t = OFFSETTYPE THEN r$ = "*" + scope$ + "OFFSET_" + r$: GOTO ref
+ IF t = UOFFSETTYPE THEN r$ = "*" + scope$ + "UOFFSET_" + r$: GOTO ref
+ ref:
+ IF (t AND ISSTRING) THEN stringprocessinghappened = 1
+ IF (t AND ISPOINTER) THEN t = t - ISPOINTER
+ typ = t
+ IF method = 1 THEN
+ IF LEFT$(r$, 1) = "*" THEN r$ = RIGHT$(r$, LEN(r$) - 1)
+ typ = typbak
+ END IF
+ refer$ = r$
+ EXIT FUNCTION
END IF 'variable
@@ -18991,31 +19198,31 @@ SUB regid
idn = idn + 1
IF idn > ids_max THEN
-ids_max = ids_max * 2
-REDIM _PRESERVE ids(1 TO ids_max) AS idstruct
-REDIM _PRESERVE cmemlist(1 TO ids_max + 1) AS INTEGER
-REDIM _PRESERVE sfcmemargs(1 TO ids_max + 1) AS STRING * 100
-REDIM _PRESERVE arrayelementslist(1 TO ids_max + 1) AS INTEGER
+ ids_max = ids_max * 2
+ REDIM _PRESERVE ids(1 TO ids_max) AS idstruct
+ REDIM _PRESERVE cmemlist(1 TO ids_max + 1) AS INTEGER
+ REDIM _PRESERVE sfcmemargs(1 TO ids_max + 1) AS STRING * 100
+ REDIM _PRESERVE arrayelementslist(1 TO ids_max + 1) AS INTEGER
END IF
n$ = RTRIM$(id.n)
IF reginternalsubfunc = 0 THEN
-IF validname(n$) = 0 THEN Give_Error "Invalid name": EXIT SUB
+ IF validname(n$) = 0 THEN Give_Error "Invalid name": EXIT SUB
END IF
'register case sensitive name if none given
IF ASC(id.cn) = 32 THEN
-n$ = RTRIM$(id.n)
-id.n = UCASE$(n$)
-id.cn = n$
+ n$ = RTRIM$(id.n)
+ id.n = UCASE$(n$)
+ id.cn = n$
END IF
IF LEN(Refactor_Source) THEN
-n$ = RTRIM$(id.n)
-IF UCASE$(n$) = UCASE$(Refactor_Source) THEN
-id.cn = Refactor_Dest
-END IF
+ n$ = RTRIM$(id.n)
+ IF UCASE$(n$) = UCASE$(Refactor_Source) THEN
+ id.cn = Refactor_Dest
+ END IF
END IF
@@ -19024,9 +19231,9 @@ id.insubfuncn = subfuncn
'note: cannot be STATIC and SHARED at the same time
IF dimshared THEN
-id.share = dimshared
+ id.share = dimshared
ELSE
-IF dimstatic THEN id.staticscope = 1
+ IF dimstatic THEN id.staticscope = 1
END IF
ids(idn) = id
@@ -19039,183 +19246,183 @@ hashflags = 1
'sub/function?
'Note: QBASIC does not allow: Internal type names (INTEGER,LONG,...)
IF id.subfunc THEN
-ids(currentid).internal_subfunc = reginternalsubfunc
-IF id.subfunc = 1 THEN hashflags = hashflags + HASHFLAG_FUNCTION ELSE hashflags = hashflags + HASHFLAG_SUB
-IF reginternalsubfunc = 0 THEN 'allow internal definition of subs/functions without checks
-hashchkflags = HASHFLAG_RESERVED + HASHFLAG_CONSTANT
-IF id.subfunc = 1 THEN hashchkflags = hashchkflags + HASHFLAG_FUNCTION ELSE hashchkflags = hashchkflags + HASHFLAG_SUB
-hashres = HashFind(n$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-IF hashres THEN
-'Note: Numeric sub/function names like 'mid' do not clash with Internal string sub/function names
-' like 'MID$' because MID$ always requires a '$'. For user defined string sub/function names
-' the '$' would be optional so the rule should not be applied there.
-allow = 0
-IF hashresflags AND (HASHFLAG_FUNCTION + HASHFLAG_SUB) THEN
-IF RTRIM$(ids(hashresref).musthave) = "$" THEN
-IF INSTR(ids(currentid).mayhave, "$") = 0 THEN allow = 1
-END IF
-END IF
-IF allow = 0 THEN Give_Error "Name already in use": EXIT SUB
-END IF 'hashres
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-END IF 'reginternalsubfunc = 0
+ ids(currentid).internal_subfunc = reginternalsubfunc
+ IF id.subfunc = 1 THEN hashflags = hashflags + HASHFLAG_FUNCTION ELSE hashflags = hashflags + HASHFLAG_SUB
+ IF reginternalsubfunc = 0 THEN 'allow internal definition of subs/functions without checks
+ hashchkflags = HASHFLAG_RESERVED + HASHFLAG_CONSTANT
+ IF id.subfunc = 1 THEN hashchkflags = hashchkflags + HASHFLAG_FUNCTION ELSE hashchkflags = hashchkflags + HASHFLAG_SUB
+ hashres = HashFind(n$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ IF hashres THEN
+ 'Note: Numeric sub/function names like 'mid' do not clash with Internal string sub/function names
+ ' like 'MID$' because MID$ always requires a '$'. For user defined string sub/function names
+ ' the '$' would be optional so the rule should not be applied there.
+ allow = 0
+ IF hashresflags AND (HASHFLAG_FUNCTION + HASHFLAG_SUB) THEN
+ IF RTRIM$(ids(hashresref).musthave) = "$" THEN
+ IF INSTR(ids(currentid).mayhave, "$") = 0 THEN allow = 1
+ END IF
+ END IF
+ IF allow = 0 THEN Give_Error "Name already in use": EXIT SUB
+ END IF 'hashres
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+ END IF 'reginternalsubfunc = 0
END IF
'variable?
IF id.t THEN
-hashflags = hashflags + HASHFLAG_VARIABLE
-IF reginternalvariable = 0 THEN
-allow = 0
-var_recheck:
-IF ASC(id.musthave) = 32 THEN astype2 = 1 '"AS type" declaration?
-scope2 = subfuncn
-hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_CONSTANT + HASHFLAG_VARIABLE
-hashres = HashFind(n$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
+ hashflags = hashflags + HASHFLAG_VARIABLE
+ IF reginternalvariable = 0 THEN
+ allow = 0
+ var_recheck:
+ IF ASC(id.musthave) = 32 THEN astype2 = 1 '"AS type" declaration?
+ scope2 = subfuncn
+ hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_CONSTANT + HASHFLAG_VARIABLE
+ hashres = HashFind(n$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
-'conflict with reserved word?
-IF hashresflags AND HASHFLAG_RESERVED THEN
-musthave$ = RTRIM$(id.musthave)
-IF INSTR(musthave$, "$") THEN
-'All reserved words can be used as variables in QBASIC if "$" is appended to the variable name!
-'(allow)
-ELSE
-Give_Error "Name already in use": EXIT SUB 'Conflicts with reserved word
-END IF
-END IF 'HASHFLAG_RESERVED
+ 'conflict with reserved word?
+ IF hashresflags AND HASHFLAG_RESERVED THEN
+ musthave$ = RTRIM$(id.musthave)
+ IF INSTR(musthave$, "$") THEN
+ 'All reserved words can be used as variables in QBASIC if "$" is appended to the variable name!
+ '(allow)
+ ELSE
+ Give_Error "Name already in use": EXIT SUB 'Conflicts with reserved word
+ END IF
+ END IF 'HASHFLAG_RESERVED
-'conflict with sub/function?
-IF hashresflags AND (HASHFLAG_FUNCTION + HASHFLAG_SUB) THEN
-IF ids(hashresref).internal_subfunc = 0 THEN Give_Error "Name already in use": EXIT SUB 'QBASIC doesn't allow a variable of the same name as a user-defined sub/func
-IF RTRIM$(id.n) = "WIDTH" AND ids(hashresref).subfunc = 2 THEN GOTO varname_exception
-musthave$ = RTRIM$(id.musthave)
-IF LEN(musthave$) = 0 THEN
-IF RTRIM$(ids(hashresref).musthave) = "$" THEN
-'a sub/func requiring "$" can co-exist with implicit numeric variables
-IF INSTR(id.mayhave, "$") THEN Give_Error "Name already in use": EXIT SUB
-ELSE
-Give_Error "Name already in use": EXIT SUB 'Implicitly defined variables cannot conflict with sub/func names
-END IF
-END IF 'len(musthave$)=0
-IF INSTR(musthave$, "$") THEN
-IF RTRIM$(ids(hashresref).musthave) = "$" THEN Give_Error "Name already in use": EXIT SUB 'A sub/function name already exists as a string
-'(allow)
-ELSE
-IF RTRIM$(ids(hashresref).musthave) <> "$" THEN Give_Error "Name already in use": EXIT SUB 'A non-"$" sub/func name already exists with this name
-END IF
-END IF 'HASHFLAG_FUNCTION + HASHFLAG_SUB
+ 'conflict with sub/function?
+ IF hashresflags AND (HASHFLAG_FUNCTION + HASHFLAG_SUB) THEN
+ IF ids(hashresref).internal_subfunc = 0 THEN Give_Error "Name already in use": EXIT SUB 'QBASIC doesn't allow a variable of the same name as a user-defined sub/func
+ IF RTRIM$(id.n) = "WIDTH" AND ids(hashresref).subfunc = 2 THEN GOTO varname_exception
+ musthave$ = RTRIM$(id.musthave)
+ IF LEN(musthave$) = 0 THEN
+ IF RTRIM$(ids(hashresref).musthave) = "$" THEN
+ 'a sub/func requiring "$" can co-exist with implicit numeric variables
+ IF INSTR(id.mayhave, "$") THEN Give_Error "Name already in use": EXIT SUB
+ ELSE
+ Give_Error "Name already in use": EXIT SUB 'Implicitly defined variables cannot conflict with sub/func names
+ END IF
+ END IF 'len(musthave$)=0
+ IF INSTR(musthave$, "$") THEN
+ IF RTRIM$(ids(hashresref).musthave) = "$" THEN Give_Error "Name already in use": EXIT SUB 'A sub/function name already exists as a string
+ '(allow)
+ ELSE
+ IF RTRIM$(ids(hashresref).musthave) <> "$" THEN Give_Error "Name already in use": EXIT SUB 'A non-"$" sub/func name already exists with this name
+ END IF
+ END IF 'HASHFLAG_FUNCTION + HASHFLAG_SUB
-'conflict with constant?
-IF hashresflags AND HASHFLAG_CONSTANT THEN
-scope1 = constsubfunc(hashresref)
-IF (scope1 = 0 AND AllowLocalName = 0) OR scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
-END IF
+ 'conflict with constant?
+ IF hashresflags AND HASHFLAG_CONSTANT THEN
+ scope1 = constsubfunc(hashresref)
+ IF (scope1 = 0 AND AllowLocalName = 0) OR scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
+ END IF
-'conflict with variable?
-IF hashresflags AND HASHFLAG_VARIABLE THEN
-astype1 = 0: IF ASC(ids(hashresref).musthave) = 32 THEN astype1 = 1
-scope1 = ids(hashresref).insubfuncn
-IF astype1 = 1 AND astype2 = 1 THEN
-IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
-END IF
-'same type?
-IF id.t = ids(hashresref).t THEN
-IF id.tsize = ids(hashresref).tsize THEN
-IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
-END IF
-END IF
-'will astype'd fixed STRING-variable mask a non-fixed string?
-IF id.t AND ISFIXEDLENGTH THEN
-IF astype2 = 1 THEN
-IF ids(hashresref).t AND ISSTRING THEN
-IF (ids(hashresref).t AND ISFIXEDLENGTH) = 0 THEN
-IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
-END IF
-END IF
-END IF
-END IF
-END IF
+ 'conflict with variable?
+ IF hashresflags AND HASHFLAG_VARIABLE THEN
+ astype1 = 0: IF ASC(ids(hashresref).musthave) = 32 THEN astype1 = 1
+ scope1 = ids(hashresref).insubfuncn
+ IF astype1 = 1 AND astype2 = 1 THEN
+ IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
+ END IF
+ 'same type?
+ IF id.t = ids(hashresref).t THEN
+ IF id.tsize = ids(hashresref).tsize THEN
+ IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
+ END IF
+ END IF
+ 'will astype'd fixed STRING-variable mask a non-fixed string?
+ IF id.t AND ISFIXEDLENGTH THEN
+ IF astype2 = 1 THEN
+ IF ids(hashresref).t AND ISSTRING THEN
+ IF (ids(hashresref).t AND ISFIXEDLENGTH) = 0 THEN
+ IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
-varname_exception:
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-END IF 'reginternalvariable
+ varname_exception:
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+ END IF 'reginternalvariable
END IF 'variable
'array?
IF id.arraytype THEN
-hashflags = hashflags + HASHFLAG_ARRAY
-allow = 0
-ary_recheck:
-scope2 = subfuncn
-IF ASC(id.musthave) = 32 THEN astype2 = 1 '"AS type" declaration?
-hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_ARRAY
-hashres = HashFind(n$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
+ hashflags = hashflags + HASHFLAG_ARRAY
+ allow = 0
+ ary_recheck:
+ scope2 = subfuncn
+ IF ASC(id.musthave) = 32 THEN astype2 = 1 '"AS type" declaration?
+ hashchkflags = HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION + HASHFLAG_ARRAY
+ hashres = HashFind(n$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
-'conflict with reserved word?
-IF hashresflags AND HASHFLAG_RESERVED THEN
-musthave$ = RTRIM$(id.musthave)
-IF INSTR(musthave$, "$") THEN
-'All reserved words can be used as variables in QBASIC if "$" is appended to the variable name!
-'(allow)
-ELSE
-Give_Error "Name already in use": EXIT SUB 'Conflicts with reserved word
-END IF
-END IF 'HASHFLAG_RESERVED
+ 'conflict with reserved word?
+ IF hashresflags AND HASHFLAG_RESERVED THEN
+ musthave$ = RTRIM$(id.musthave)
+ IF INSTR(musthave$, "$") THEN
+ 'All reserved words can be used as variables in QBASIC if "$" is appended to the variable name!
+ '(allow)
+ ELSE
+ Give_Error "Name already in use": EXIT SUB 'Conflicts with reserved word
+ END IF
+ END IF 'HASHFLAG_RESERVED
-'conflict with sub/function?
-IF hashresflags AND (HASHFLAG_FUNCTION + HASHFLAG_SUB) THEN
-IF ids(hashresref).internal_subfunc = 0 THEN Give_Error "Name already in use": EXIT SUB 'QBASIC doesn't allow a variable of the same name as a user-defined sub/func
-IF RTRIM$(id.n) = "WIDTH" AND ids(hashresref).subfunc = 2 THEN GOTO arrayname_exception
-musthave$ = RTRIM$(id.musthave)
+ 'conflict with sub/function?
+ IF hashresflags AND (HASHFLAG_FUNCTION + HASHFLAG_SUB) THEN
+ IF ids(hashresref).internal_subfunc = 0 THEN Give_Error "Name already in use": EXIT SUB 'QBASIC doesn't allow a variable of the same name as a user-defined sub/func
+ IF RTRIM$(id.n) = "WIDTH" AND ids(hashresref).subfunc = 2 THEN GOTO arrayname_exception
+ musthave$ = RTRIM$(id.musthave)
-IF LEN(musthave$) = 0 THEN
-IF RTRIM$(ids(hashresref).musthave) = "$" THEN
-'a sub/func requiring "$" can co-exist with implicit numeric variables
-IF INSTR(id.mayhave, "$") THEN Give_Error "Name already in use": EXIT SUB
-ELSE
-Give_Error "Name already in use": EXIT SUB 'Implicitly defined variables cannot conflict with sub/func names
-END IF
-END IF 'len(musthave$)=0
-IF INSTR(musthave$, "$") THEN
-IF RTRIM$(ids(hashresref).musthave) = "$" THEN Give_Error "Name already in use": EXIT SUB 'A sub/function name already exists as a string
-'(allow)
-ELSE
-IF RTRIM$(ids(hashresref).musthave) <> "$" THEN Give_Error "Name already in use": EXIT SUB 'A non-"$" sub/func name already exists with this name
-END IF
-END IF 'HASHFLAG_FUNCTION + HASHFLAG_SUB
+ IF LEN(musthave$) = 0 THEN
+ IF RTRIM$(ids(hashresref).musthave) = "$" THEN
+ 'a sub/func requiring "$" can co-exist with implicit numeric variables
+ IF INSTR(id.mayhave, "$") THEN Give_Error "Name already in use": EXIT SUB
+ ELSE
+ Give_Error "Name already in use": EXIT SUB 'Implicitly defined variables cannot conflict with sub/func names
+ END IF
+ END IF 'len(musthave$)=0
+ IF INSTR(musthave$, "$") THEN
+ IF RTRIM$(ids(hashresref).musthave) = "$" THEN Give_Error "Name already in use": EXIT SUB 'A sub/function name already exists as a string
+ '(allow)
+ ELSE
+ IF RTRIM$(ids(hashresref).musthave) <> "$" THEN Give_Error "Name already in use": EXIT SUB 'A non-"$" sub/func name already exists with this name
+ END IF
+ END IF 'HASHFLAG_FUNCTION + HASHFLAG_SUB
-'conflict with array?
-IF hashresflags AND HASHFLAG_ARRAY THEN
-astype1 = 0: IF ASC(ids(hashresref).musthave) = 32 THEN astype1 = 1
-scope1 = ids(hashresref).insubfuncn
-IF astype1 = 1 AND astype2 = 1 THEN
-IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
-END IF
-'same type?
-IF id.arraytype = ids(hashresref).arraytype THEN
-IF id.tsize = ids(hashresref).tsize THEN
-IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
-END IF
-END IF
-'will astype'd fixed STRING-variable mask a non-fixed string?
-IF id.arraytype AND ISFIXEDLENGTH THEN
-IF astype2 = 1 THEN
-IF ids(hashresref).arraytype AND ISSTRING THEN
-IF (ids(hashresref).arraytype AND ISFIXEDLENGTH) = 0 THEN
-IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
-END IF
-END IF
-END IF
-END IF
-END IF
+ 'conflict with array?
+ IF hashresflags AND HASHFLAG_ARRAY THEN
+ astype1 = 0: IF ASC(ids(hashresref).musthave) = 32 THEN astype1 = 1
+ scope1 = ids(hashresref).insubfuncn
+ IF astype1 = 1 AND astype2 = 1 THEN
+ IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
+ END IF
+ 'same type?
+ IF id.arraytype = ids(hashresref).arraytype THEN
+ IF id.tsize = ids(hashresref).tsize THEN
+ IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
+ END IF
+ END IF
+ 'will astype'd fixed STRING-variable mask a non-fixed string?
+ IF id.arraytype AND ISFIXEDLENGTH THEN
+ IF astype2 = 1 THEN
+ IF ids(hashresref).arraytype AND ISSTRING THEN
+ IF (ids(hashresref).arraytype AND ISFIXEDLENGTH) = 0 THEN
+ IF scope1 = scope2 THEN Give_Error "Name already in use": EXIT SUB
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
-arrayname_exception:
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
+ arrayname_exception:
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
END IF 'array
'add it to the hash table
@@ -19261,11 +19468,11 @@ a2$ = ""
n = numelements(a$)
FOR i = 1 TO n
-IF i < first OR i > last THEN
-a2$ = a2$ + sp + getelement(a$, i)
-ELSE
-IF keepindexing THEN a2$ = a2$ + sp
-END IF
+ IF i < first OR i > last THEN
+ a2$ = a2$ + sp + getelement(a$, i)
+ ELSE
+ IF keepindexing THEN a2$ = a2$ + sp
+ END IF
NEXT
IF LEFT$(a2$, 1) = sp THEN a2$ = RIGHT$(a2$, LEN(a2$) - 1)
@@ -19283,77 +19490,77 @@ IF LEN(s$) = 0 THEN EXIT FUNCTION
a = ASC(s$)
l = LEN(s$)
IF a = 37 THEN '%
-IF l = 1 THEN symboltype = 16: EXIT FUNCTION
-IF l > 2 THEN EXIT FUNCTION
-IF ASC(s$, 2) = 37 THEN symboltype = 8: EXIT FUNCTION
-IF ASC(s$, 2) = 38 THEN symboltype = OFFSETTYPE - ISPOINTER: EXIT FUNCTION '%&
-EXIT FUNCTION
+ IF l = 1 THEN symboltype = 16: EXIT FUNCTION
+ IF l > 2 THEN EXIT FUNCTION
+ IF ASC(s$, 2) = 37 THEN symboltype = 8: EXIT FUNCTION
+ IF ASC(s$, 2) = 38 THEN symboltype = OFFSETTYPE - ISPOINTER: EXIT FUNCTION '%&
+ EXIT FUNCTION
END IF
IF a = 38 THEN '&
-IF l = 1 THEN symboltype = 32: EXIT FUNCTION
-IF l > 2 THEN EXIT FUNCTION
-IF ASC(s$, 2) = 38 THEN symboltype = 64: EXIT FUNCTION
-EXIT FUNCTION
+ IF l = 1 THEN symboltype = 32: EXIT FUNCTION
+ IF l > 2 THEN EXIT FUNCTION
+ IF ASC(s$, 2) = 38 THEN symboltype = 64: EXIT FUNCTION
+ EXIT FUNCTION
END IF
IF a = 33 THEN '!
-IF l = 1 THEN symboltype = 32 + ISFLOAT: EXIT FUNCTION
-EXIT FUNCTION
+ IF l = 1 THEN symboltype = 32 + ISFLOAT: EXIT FUNCTION
+ EXIT FUNCTION
END IF
IF a = 35 THEN '#
-IF l = 1 THEN symboltype = 64 + ISFLOAT: EXIT FUNCTION
-IF l > 2 THEN EXIT FUNCTION
-IF ASC(s$, 2) = 35 THEN symboltype = 64 + ISFLOAT: EXIT FUNCTION
-EXIT FUNCTION
+ IF l = 1 THEN symboltype = 64 + ISFLOAT: EXIT FUNCTION
+ IF l > 2 THEN EXIT FUNCTION
+ IF ASC(s$, 2) = 35 THEN symboltype = 64 + ISFLOAT: EXIT FUNCTION
+ EXIT FUNCTION
END IF
IF a = 36 THEN '$
-IF l = 1 THEN symboltype = ISSTRING: EXIT FUNCTION
-IF isuinteger(RIGHT$(s$, l - 1)) THEN
-IF l >= (1 + 10) THEN
-IF l > (1 + 10) THEN EXIT FUNCTION
-IF s$ > "$2147483647" THEN EXIT FUNCTION
-END IF
-symboltype_size = VAL(RIGHT$(s$, l - 1))
-symboltype = ISSTRING + ISFIXEDLENGTH
-EXIT FUNCTION
-END IF
-EXIT FUNCTION
+ IF l = 1 THEN symboltype = ISSTRING: EXIT FUNCTION
+ IF isuinteger(RIGHT$(s$, l - 1)) THEN
+ IF l >= (1 + 10) THEN
+ IF l > (1 + 10) THEN EXIT FUNCTION
+ IF s$ > "$2147483647" THEN EXIT FUNCTION
+ END IF
+ symboltype_size = VAL(RIGHT$(s$, l - 1))
+ symboltype = ISSTRING + ISFIXEDLENGTH
+ EXIT FUNCTION
+ END IF
+ EXIT FUNCTION
END IF
IF a = 96 THEN '`
-IF l = 1 THEN symboltype = 1 + ISOFFSETINBITS: EXIT FUNCTION
-IF isuinteger(RIGHT$(s$, l - 1)) THEN
-IF l > 3 THEN EXIT FUNCTION
-n = VAL(RIGHT$(s$, l - 1))
-IF n > 56 THEN EXIT FUNCTION
-symboltype = n + ISOFFSETINBITS: EXIT FUNCTION
-END IF
-EXIT FUNCTION
+ IF l = 1 THEN symboltype = 1 + ISOFFSETINBITS: EXIT FUNCTION
+ IF isuinteger(RIGHT$(s$, l - 1)) THEN
+ IF l > 3 THEN EXIT FUNCTION
+ n = VAL(RIGHT$(s$, l - 1))
+ IF n > 56 THEN EXIT FUNCTION
+ symboltype = n + ISOFFSETINBITS: EXIT FUNCTION
+ END IF
+ EXIT FUNCTION
END IF
IF a = 126 THEN '~
-IF l = 1 THEN EXIT FUNCTION
-a = ASC(s$, 2)
-IF a = 37 THEN '%
-IF l = 2 THEN symboltype = 16 + ISUNSIGNED: EXIT FUNCTION
-IF l > 3 THEN EXIT FUNCTION
-IF ASC(s$, 3) = 37 THEN symboltype = 8 + ISUNSIGNED: EXIT FUNCTION
-IF ASC(s$, 3) = 38 THEN symboltype = UOFFSETTYPE - ISPOINTER: EXIT FUNCTION '~%&
-EXIT FUNCTION
-END IF
-IF a = 38 THEN '&
-IF l = 2 THEN symboltype = 32 + ISUNSIGNED: EXIT FUNCTION
-IF l > 3 THEN EXIT FUNCTION
-IF ASC(s$, 3) = 38 THEN symboltype = 64 + ISUNSIGNED: EXIT FUNCTION
-EXIT FUNCTION
-END IF
-IF a = 96 THEN '`
-IF l = 2 THEN symboltype = 1 + ISOFFSETINBITS + ISUNSIGNED: EXIT FUNCTION
-IF isuinteger(RIGHT$(s$, l - 2)) THEN
-IF l > 4 THEN EXIT FUNCTION
-n = VAL(RIGHT$(s$, l - 2))
-IF n > 56 THEN EXIT FUNCTION
-symboltype = n + ISOFFSETINBITS + ISUNSIGNED: EXIT FUNCTION
-END IF
-EXIT FUNCTION
-END IF
+ IF l = 1 THEN EXIT FUNCTION
+ a = ASC(s$, 2)
+ IF a = 37 THEN '%
+ IF l = 2 THEN symboltype = 16 + ISUNSIGNED: EXIT FUNCTION
+ IF l > 3 THEN EXIT FUNCTION
+ IF ASC(s$, 3) = 37 THEN symboltype = 8 + ISUNSIGNED: EXIT FUNCTION
+ IF ASC(s$, 3) = 38 THEN symboltype = UOFFSETTYPE - ISPOINTER: EXIT FUNCTION '~%&
+ EXIT FUNCTION
+ END IF
+ IF a = 38 THEN '&
+ IF l = 2 THEN symboltype = 32 + ISUNSIGNED: EXIT FUNCTION
+ IF l > 3 THEN EXIT FUNCTION
+ IF ASC(s$, 3) = 38 THEN symboltype = 64 + ISUNSIGNED: EXIT FUNCTION
+ EXIT FUNCTION
+ END IF
+ IF a = 96 THEN '`
+ IF l = 2 THEN symboltype = 1 + ISOFFSETINBITS + ISUNSIGNED: EXIT FUNCTION
+ IF isuinteger(RIGHT$(s$, l - 2)) THEN
+ IF l > 4 THEN EXIT FUNCTION
+ n = VAL(RIGHT$(s$, l - 2))
+ IF n > 56 THEN EXIT FUNCTION
+ symboltype = n + ISOFFSETINBITS + ISUNSIGNED: EXIT FUNCTION
+ END IF
+ EXIT FUNCTION
+ END IF
END IF '~
END FUNCTION
@@ -19385,13 +19592,13 @@ pass& = 0
FOR i = 1 TO OptMax: separgs(i) = "": NEXT
FOR i = 1 TO OptMax + 1: separgslayout(i) = "": NEXT
FOR i = 1 TO OptMax
-Lev(i) = 0
-EntryLev(i) = 0
-DitchLev(i) = 0
-DontPass(i) = 0
-TempList(i) = 0
-PassRule(i) = 0
-LevelEntered(i) = 0
+ Lev(i) = 0
+ EntryLev(i) = 0
+ DitchLev(i) = 0
+ DontPass(i) = 0
+ TempList(i) = 0
+ PassRule(i) = 0
+ LevelEntered(i) = 0
NEXT
DIM id2 AS idstruct
@@ -19406,9 +19613,9 @@ s$ = RTRIM$(s$)
'build a special format if none exists
IF s$ = "" THEN
-FOR i = 1 TO id2.args
-IF i <> 1 THEN s$ = s$ + ",?" ELSE s$ = "?"
-NEXT
+ FOR i = 1 TO id2.args
+ IF i <> 1 THEN s$ = s$ + ",?" ELSE s$ = "?"
+ NEXT
END IF
'note: dim'd arrays moved to global to prevent high recreation cost
@@ -19420,107 +19627,107 @@ level = 0
lastt = 0
ditchlevel = 0
FOR i = 1 TO LEN(s$)
-s2$ = MID$(s$, i, 1)
+ s2$ = MID$(s$, i, 1)
-IF s2$ = "[" THEN
-level = level + 1
-LevelEntered(level) = 0
-GOTO nextsymbol
-END IF
+ IF s2$ = "[" THEN
+ level = level + 1
+ LevelEntered(level) = 0
+ GOTO nextsymbol
+ END IF
-IF s2$ = "]" THEN
-level = level - 1
-IF level < ditchlevel THEN ditchlevel = level
-GOTO nextsymbol
-END IF
+ IF s2$ = "]" THEN
+ level = level - 1
+ IF level < ditchlevel THEN ditchlevel = level
+ GOTO nextsymbol
+ END IF
-IF s2$ = "{" THEN
-lastt = lastt + 1: Lev(lastt) = level: PassRule(lastt) = 0
-DitchLev(lastt) = ditchlevel: ditchlevel = level 'store & reset ditch level
-i = i + 1
-i2 = INSTR(i, s$, "}")
-numopts = 0
-nextopt:
-numopts = numopts + 1
-i3 = INSTR(i + 1, s$, "|")
-IF i3 <> 0 AND i3 < i2 THEN
-Opt(lastt, numopts) = MID$(s$, i, i3 - i)
-i = i3 + 1: GOTO nextopt
-END IF
-Opt(lastt, numopts) = MID$(s$, i, i2 - i)
-T(lastt) = numopts
-'calculate words in each option
-FOR x = 1 TO T(lastt)
-w = 1
-x2 = 1
-newword:
-IF INSTR(x2, RTRIM$(Opt(lastt, x)), " ") THEN w = w + 1: x2 = INSTR(x2, RTRIM$(Opt(lastt, x)), " ") + 1: GOTO newword
-OptWords(lastt, x) = w
-NEXT
-i = i2
+ IF s2$ = "{" THEN
+ lastt = lastt + 1: Lev(lastt) = level: PassRule(lastt) = 0
+ DitchLev(lastt) = ditchlevel: ditchlevel = level 'store & reset ditch level
+ i = i + 1
+ i2 = INSTR(i, s$, "}")
+ numopts = 0
+ nextopt:
+ numopts = numopts + 1
+ i3 = INSTR(i + 1, s$, "|")
+ IF i3 <> 0 AND i3 < i2 THEN
+ Opt(lastt, numopts) = MID$(s$, i, i3 - i)
+ i = i3 + 1: GOTO nextopt
+ END IF
+ Opt(lastt, numopts) = MID$(s$, i, i2 - i)
+ T(lastt) = numopts
+ 'calculate words in each option
+ FOR x = 1 TO T(lastt)
+ w = 1
+ x2 = 1
+ newword:
+ IF INSTR(x2, RTRIM$(Opt(lastt, x)), " ") THEN w = w + 1: x2 = INSTR(x2, RTRIM$(Opt(lastt, x)), " ") + 1: GOTO newword
+ OptWords(lastt, x) = w
+ NEXT
+ i = i2
-'set entry level routine
-EntryLev(lastt) = level 'default level when continuing a previously entered level
-IF LevelEntered(level) = 0 THEN
-EntryLev(lastt) = 0
-FOR i2 = 1 TO level - 1
-IF LevelEntered(i2) = 1 THEN EntryLev(lastt) = i2
-NEXT
-END IF
-LevelEntered(level) = 1
+ 'set entry level routine
+ EntryLev(lastt) = level 'default level when continuing a previously entered level
+ IF LevelEntered(level) = 0 THEN
+ EntryLev(lastt) = 0
+ FOR i2 = 1 TO level - 1
+ IF LevelEntered(i2) = 1 THEN EntryLev(lastt) = i2
+ NEXT
+ END IF
+ LevelEntered(level) = 1
-GOTO nextsymbol
-END IF
+ GOTO nextsymbol
+ END IF
-IF s2$ = "?" THEN
-lastt = lastt + 1: Lev(lastt) = level: PassRule(lastt) = 0
-DitchLev(lastt) = ditchlevel: ditchlevel = level 'store & reset ditch level
-T(lastt) = 0
-'set entry level routine
-EntryLev(lastt) = level 'default level when continuing a previously entered level
-IF LevelEntered(level) = 0 THEN
-EntryLev(lastt) = 0
-FOR i2 = 1 TO level - 1
-IF LevelEntered(i2) = 1 THEN EntryLev(lastt) = i2
-NEXT
-END IF
-LevelEntered(level) = 1
+ IF s2$ = "?" THEN
+ lastt = lastt + 1: Lev(lastt) = level: PassRule(lastt) = 0
+ DitchLev(lastt) = ditchlevel: ditchlevel = level 'store & reset ditch level
+ T(lastt) = 0
+ 'set entry level routine
+ EntryLev(lastt) = level 'default level when continuing a previously entered level
+ IF LevelEntered(level) = 0 THEN
+ EntryLev(lastt) = 0
+ FOR i2 = 1 TO level - 1
+ IF LevelEntered(i2) = 1 THEN EntryLev(lastt) = i2
+ NEXT
+ END IF
+ LevelEntered(level) = 1
-GOTO nextsymbol
-END IF
+ GOTO nextsymbol
+ END IF
-'assume "special" character (like ( ) , . - etc.)
-lastt = lastt + 1: Lev(lastt) = level: PassRule(lastt) = 0
-DitchLev(lastt) = ditchlevel: ditchlevel = level 'store & reset ditch level
-T(lastt) = 1: Opt(lastt, 1) = s2$: OptWords(lastt, 1) = 1: DontPass(lastt) = 1
+ 'assume "special" character (like ( ) , . - etc.)
+ lastt = lastt + 1: Lev(lastt) = level: PassRule(lastt) = 0
+ DitchLev(lastt) = ditchlevel: ditchlevel = level 'store & reset ditch level
+ T(lastt) = 1: Opt(lastt, 1) = s2$: OptWords(lastt, 1) = 1: DontPass(lastt) = 1
-'set entry level routine
-EntryLev(lastt) = level 'default level when continuing a previously entered level
-IF LevelEntered(level) = 0 THEN
-EntryLev(lastt) = 0
-FOR i2 = 1 TO level - 1
-IF LevelEntered(i2) = 1 THEN EntryLev(lastt) = i2
-NEXT
-END IF
-LevelEntered(level) = 1
+ 'set entry level routine
+ EntryLev(lastt) = level 'default level when continuing a previously entered level
+ IF LevelEntered(level) = 0 THEN
+ EntryLev(lastt) = 0
+ FOR i2 = 1 TO level - 1
+ IF LevelEntered(i2) = 1 THEN EntryLev(lastt) = i2
+ NEXT
+ END IF
+ LevelEntered(level) = 1
-GOTO nextsymbol
+ GOTO nextsymbol
-nextsymbol:
+ nextsymbol:
NEXT
IF Debug THEN
-PRINT #9, "--------SEPERATE ARGUMENTS REPORT #1:1--------"
-FOR i = 1 TO lastt
-PRINT #9, i, "OPT=" + CHR$(34) + RTRIM$(Opt(i, 1)) + CHR$(34)
-PRINT #9, i, "OPTWORDS="; OptWords(i, 1)
-PRINT #9, i, "T="; T(i)
-PRINT #9, i, "DONTPASS="; DontPass(i)
-PRINT #9, i, "PASSRULE="; PassRule(i)
-PRINT #9, i, "LEV="; Lev(i)
-PRINT #9, i, "ENTRYLEV="; EntryLev(i)
-NEXT
+ PRINT #9, "--------SEPERATE ARGUMENTS REPORT #1:1--------"
+ FOR i = 1 TO lastt
+ PRINT #9, i, "OPT=" + CHR$(34) + RTRIM$(Opt(i, 1)) + CHR$(34)
+ PRINT #9, i, "OPTWORDS="; OptWords(i, 1)
+ PRINT #9, i, "T="; T(i)
+ PRINT #9, i, "DONTPASS="; DontPass(i)
+ PRINT #9, i, "PASSRULE="; PassRule(i)
+ PRINT #9, i, "LEV="; Lev(i)
+ PRINT #9, i, "ENTRYLEV="; EntryLev(i)
+ NEXT
END IF
@@ -19528,22 +19735,22 @@ END IF
'This sets any {}blocks with only one option/word (eg. {PRINT}) at the lowest level to dontpass()=1
'because their content is manadatory and there is no choice as to which word to use
FOR x = 1 TO lastt
-IF Lev(x) = 0 THEN
-IF T(x) = 1 THEN DontPass(x) = 1
-END IF
+ IF Lev(x) = 0 THEN
+ IF T(x) = 1 THEN DontPass(x) = 1
+ END IF
NEXT
IF Debug THEN
-PRINT #9, "--------SEPERATE ARGUMENTS REPORT #1:2--------"
-FOR i = 1 TO lastt
-PRINT #9, i, "OPT=" + CHR$(34) + RTRIM$(Opt(i, 1)) + CHR$(34)
-PRINT #9, i, "OPTWORDS="; OptWords(i, 1)
-PRINT #9, i, "T="; T(i)
-PRINT #9, i, "DONTPASS="; DontPass(i)
-PRINT #9, i, "PASSRULE="; PassRule(i)
-PRINT #9, i, "LEV="; Lev(i)
-PRINT #9, i, "ENTRYLEV="; EntryLev(i)
-NEXT
+ PRINT #9, "--------SEPERATE ARGUMENTS REPORT #1:2--------"
+ FOR i = 1 TO lastt
+ PRINT #9, i, "OPT=" + CHR$(34) + RTRIM$(Opt(i, 1)) + CHR$(34)
+ PRINT #9, i, "OPTWORDS="; OptWords(i, 1)
+ PRINT #9, i, "T="; T(i)
+ PRINT #9, i, "DONTPASS="; DontPass(i)
+ PRINT #9, i, "PASSRULE="; PassRule(i)
+ PRINT #9, i, "LEV="; Lev(i)
+ PRINT #9, i, "ENTRYLEV="; EntryLev(i)
+ NEXT
END IF
@@ -19558,121 +19765,121 @@ MustPassOptNeedsFlag = 0 '{}blocks don't need a flag, ? blocks do
templistn = 0
FOR l = 1 TO 32767
-scannextlevel = 0
-FOR x = 1 TO lastt
-IF Lev(x) > l THEN scannextlevel = 1
+ scannextlevel = 0
+ FOR x = 1 TO lastt
+ IF Lev(x) > l THEN scannextlevel = 1
-IF x1 THEN
-IF EntryLev(x) < l THEN 'end of block reached
-IF MustPassOpt THEN
-'If there's an opt () which must be passed that will be identified,
-'all the 1 option {}blocks can be assumed...
-IF MustPassOptNeedsFlag THEN
-'The MustPassOpt requires a flag, so use the same flag for everything
-FOR x2 = 1 TO templistn
-PassRule(TempList(x2)) = PassFlag
-NEXT
-PassFlag = PassFlag * 2
-ELSE
-'The MustPassOpt is a {}block which doesn't need a flag, so everything else needs to
-'reference it
-FOR x2 = 1 TO templistn
-IF TempList(x2) <> MustPassOpt THEN PassRule(TempList(x2)) = -MustPassOpt
-NEXT
-END IF
-ELSE
-'if not, use a unique flag for everything in this block
-FOR x2 = 1 TO templistn: PassRule(TempList(x2)) = PassFlag: NEXT
-IF templistn <> 0 THEN PassFlag = PassFlag * 2
-END IF
-x1 = 0
-END IF
-END IF
+ IF x1 THEN
+ IF EntryLev(x) < l THEN 'end of block reached
+ IF MustPassOpt THEN
+ 'If there's an opt () which must be passed that will be identified,
+ 'all the 1 option {}blocks can be assumed...
+ IF MustPassOptNeedsFlag THEN
+ 'The MustPassOpt requires a flag, so use the same flag for everything
+ FOR x2 = 1 TO templistn
+ PassRule(TempList(x2)) = PassFlag
+ NEXT
+ PassFlag = PassFlag * 2
+ ELSE
+ 'The MustPassOpt is a {}block which doesn't need a flag, so everything else needs to
+ 'reference it
+ FOR x2 = 1 TO templistn
+ IF TempList(x2) <> MustPassOpt THEN PassRule(TempList(x2)) = -MustPassOpt
+ NEXT
+ END IF
+ ELSE
+ 'if not, use a unique flag for everything in this block
+ FOR x2 = 1 TO templistn: PassRule(TempList(x2)) = PassFlag: NEXT
+ IF templistn <> 0 THEN PassFlag = PassFlag * 2
+ END IF
+ x1 = 0
+ END IF
+ END IF
-IF Lev(x) = l THEN 'on same level
-IF EntryLev(x) < l THEN 'just (re)entered this level (not continuing along it)
-x1 = x 'set x1 to the starting element of this level
-MustPassOpt = 0
-templistn = 0
-END IF
-END IF
+ IF Lev(x) = l THEN 'on same level
+ IF EntryLev(x) < l THEN 'just (re)entered this level (not continuing along it)
+ x1 = x 'set x1 to the starting element of this level
+ MustPassOpt = 0
+ templistn = 0
+ END IF
+ END IF
-IF x1 THEN
-IF Lev(x) = l THEN 'same level
+ IF x1 THEN
+ IF Lev(x) = l THEN 'same level
-IF T(x) <> 1 THEN
-'It isn't a symbol or a {}block with only one option therefore this opt () must be passed
-IF MustPassOpt = 0 THEN
-MustPassOpt = x 'Only record the first instance (it MAY require a flag)
-IF T(x) = 0 THEN MustPassOptNeedsFlag = 1 ELSE MustPassOptNeedsFlag = 0
-ELSE
-'Update current MustPassOpt to non-flag-based {}block if possible (to save flag usage)
-'(Consider [{A|B}?], where a flag is not required)
-IF MustPassOptNeedsFlag = 1 THEN
-IF T(x) > 1 THEN
-MustPassOpt = x: MustPassOptNeedsFlag = 0
-END IF
-END IF
-END IF
-'add to list
-templistn = templistn + 1: TempList(templistn) = x
-END IF
+ IF T(x) <> 1 THEN
+ 'It isn't a symbol or a {}block with only one option therefore this opt () must be passed
+ IF MustPassOpt = 0 THEN
+ MustPassOpt = x 'Only record the first instance (it MAY require a flag)
+ IF T(x) = 0 THEN MustPassOptNeedsFlag = 1 ELSE MustPassOptNeedsFlag = 0
+ ELSE
+ 'Update current MustPassOpt to non-flag-based {}block if possible (to save flag usage)
+ '(Consider [{A|B}?], where a flag is not required)
+ IF MustPassOptNeedsFlag = 1 THEN
+ IF T(x) > 1 THEN
+ MustPassOpt = x: MustPassOptNeedsFlag = 0
+ END IF
+ END IF
+ END IF
+ 'add to list
+ templistn = templistn + 1: TempList(templistn) = x
+ END IF
-IF T(x) = 1 THEN
-'It is a symbol or a {}block with only one option
-'a {}block with only one option MAY not need to be passed
-'depending on if anything else is in this block could make the existance of this opt () assumed
-'Note: Symbols which are not encapsulated inside a {}block never need to be passed
-' Symbols already have dontpass() set to 1
-IF DontPass(x) = 0 THEN templistn = templistn + 1: TempList(templistn) = x: DontPass(x) = 1
-END IF
+ IF T(x) = 1 THEN
+ 'It is a symbol or a {}block with only one option
+ 'a {}block with only one option MAY not need to be passed
+ 'depending on if anything else is in this block could make the existance of this opt () assumed
+ 'Note: Symbols which are not encapsulated inside a {}block never need to be passed
+ ' Symbols already have dontpass() set to 1
+ IF DontPass(x) = 0 THEN templistn = templistn + 1: TempList(templistn) = x: DontPass(x) = 1
+ END IF
-END IF
-END IF
+ END IF
+ END IF
-NEXT
+ NEXT
-'scan last run (mostly just a copy of code from above)
-IF x1 THEN
-IF MustPassOpt THEN
-'If there's an opt () which must be passed that will be identified,
-'all the 1 option {}blocks can be assumed...
-IF MustPassOptNeedsFlag THEN
-'The MustPassOpt requires a flag, so use the same flag for everything
-FOR x2 = 1 TO templistn
-PassRule(TempList(x2)) = PassFlag
-NEXT
-PassFlag = PassFlag * 2
-ELSE
-'The MustPassOpt is a {}block which doesn't need a flag, so everything else needs to
-'reference it
-FOR x2 = 1 TO templistn
-IF TempList(x2) <> MustPassOpt THEN PassRule(TempList(x2)) = -MustPassOpt
-NEXT
-END IF
-ELSE
-'if not, use a unique flag for everything in this block
-FOR x2 = 1 TO templistn: PassRule(TempList(x2)) = PassFlag: NEXT
-IF templistn <> 0 THEN PassFlag = PassFlag * 2
-END IF
-x1 = 0
-END IF
+ 'scan last run (mostly just a copy of code from above)
+ IF x1 THEN
+ IF MustPassOpt THEN
+ 'If there's an opt () which must be passed that will be identified,
+ 'all the 1 option {}blocks can be assumed...
+ IF MustPassOptNeedsFlag THEN
+ 'The MustPassOpt requires a flag, so use the same flag for everything
+ FOR x2 = 1 TO templistn
+ PassRule(TempList(x2)) = PassFlag
+ NEXT
+ PassFlag = PassFlag * 2
+ ELSE
+ 'The MustPassOpt is a {}block which doesn't need a flag, so everything else needs to
+ 'reference it
+ FOR x2 = 1 TO templistn
+ IF TempList(x2) <> MustPassOpt THEN PassRule(TempList(x2)) = -MustPassOpt
+ NEXT
+ END IF
+ ELSE
+ 'if not, use a unique flag for everything in this block
+ FOR x2 = 1 TO templistn: PassRule(TempList(x2)) = PassFlag: NEXT
+ IF templistn <> 0 THEN PassFlag = PassFlag * 2
+ END IF
+ x1 = 0
+ END IF
-IF scannextlevel = 0 THEN EXIT FOR
+ IF scannextlevel = 0 THEN EXIT FOR
NEXT
IF Debug THEN
-PRINT #9, "--------SEPERATE ARGUMENTS REPORT #1:3--------"
-FOR i = 1 TO lastt
-PRINT #9, i, "OPT=" + CHR$(34) + RTRIM$(Opt(i, 1)) + CHR$(34)
-PRINT #9, i, "OPTWORDS="; OptWords(i, 1)
-PRINT #9, i, "T="; T(i)
-PRINT #9, i, "DONTPASS="; DontPass(i)
-PRINT #9, i, "PASSRULE="; PassRule(i)
-PRINT #9, i, "LEV="; Lev(i)
-PRINT #9, i, "ENTRYLEV="; EntryLev(i)
-NEXT
+ PRINT #9, "--------SEPERATE ARGUMENTS REPORT #1:3--------"
+ FOR i = 1 TO lastt
+ PRINT #9, i, "OPT=" + CHR$(34) + RTRIM$(Opt(i, 1)) + CHR$(34)
+ PRINT #9, i, "OPTWORDS="; OptWords(i, 1)
+ PRINT #9, i, "T="; T(i)
+ PRINT #9, i, "DONTPASS="; DontPass(i)
+ PRINT #9, i, "PASSRULE="; PassRule(i)
+ PRINT #9, i, "LEV="; Lev(i)
+ PRINT #9, i, "ENTRYLEV="; EntryLev(i)
+ NEXT
END IF
@@ -19713,212 +19920,212 @@ level = 0
Expression = 0
FOR x = 1 TO lastt
-ContinueScan:
+ ContinueScan:
-IF DitchLev(x) < level THEN 'dropping down to a lower level
-'we can only go as low as the 'ditch' will allow us, which will limit our options
-level = DitchLev(x)
-END IF
+ IF DitchLev(x) < level THEN 'dropping down to a lower level
+ 'we can only go as low as the 'ditch' will allow us, which will limit our options
+ level = DitchLev(x)
+ END IF
-IF EntryLev(x) <= level THEN 'possible to enter level
+ IF EntryLev(x) <= level THEN 'possible to enter level
-'But was this optional or were we forced to be on this level?
-IF EntryLev(x) < Lev(x) THEN
-optional = 1
-IF level > EntryLev(x) THEN optional = 0
-ELSE
-'entrylev=lev
-optional = 0
-END IF
+ 'But was this optional or were we forced to be on this level?
+ IF EntryLev(x) < Lev(x) THEN
+ optional = 1
+ IF level > EntryLev(x) THEN optional = 0
+ ELSE
+ 'entrylev=lev
+ optional = 0
+ END IF
-t = T(x)
+ t = T(x)
-IF t = 0 THEN 'A "?" expression
-IF Expression THEN
-'*********backtrack************
-'We are tracking an expression which we assumed would be present but was not
-GOTO Backtrack
-'******************************
-END IF
-IF optional THEN
-Branches = Branches + 1
-BranchFormatPos(Branches) = x
-BranchTaken(Branches) = 1
-BranchInputPos(Branches) = i
-BranchWithExpression(Branches) = 0
-BranchLevel(Branches) = level
-level = Lev(x)
-END IF
-Expression = x
-END IF 'A "?" expression
+ IF t = 0 THEN 'A "?" expression
+ IF Expression THEN
+ '*********backtrack************
+ 'We are tracking an expression which we assumed would be present but was not
+ GOTO Backtrack
+ '******************************
+ END IF
+ IF optional THEN
+ Branches = Branches + 1
+ BranchFormatPos(Branches) = x
+ BranchTaken(Branches) = 1
+ BranchInputPos(Branches) = i
+ BranchWithExpression(Branches) = 0
+ BranchLevel(Branches) = level
+ level = Lev(x)
+ END IF
+ Expression = x
+ END IF 'A "?" expression
-IF t THEN
+ IF t THEN
-currentlev = level
+ currentlev = level
-'Add new branch if new level will be entered
-IF optional THEN
-Branches = Branches + 1
-BranchFormatPos(Branches) = x
-BranchTaken(Branches) = 1
-BranchInputPos(Branches) = i
-BranchWithExpression(Branches) = Expression
-BranchLevel(Branches) = level
-END IF
+ 'Add new branch if new level will be entered
+ IF optional THEN
+ Branches = Branches + 1
+ BranchFormatPos(Branches) = x
+ BranchTaken(Branches) = 1
+ BranchInputPos(Branches) = i
+ BranchWithExpression(Branches) = Expression
+ BranchLevel(Branches) = level
+ END IF
-'Scan for Opt () options
-i1 = i: i2 = i
-IF Expression THEN i2 = n
-'Scan a$ for opt () x
-'Note: Finding the closest opt option is necessary
-'Note: This needs to be bracket sensitive
-OutOfRange = 2147483647
-position = OutOfRange
-which = 0
-IF i <= n THEN 'Past end of contect check
-FOR o = 1 TO t
-words = OptWords(x, o)
-b = 0
-FOR i3 = i1 TO i2
-IF i3 + words - 1 <= n THEN 'enough elements exist
-c$ = getelement$(a$, i3)
-IF b = 0 THEN
-'Build comparison string (spacing elements)
-FOR w = 2 TO words
-c$ = c$ + " " + getelement$(a$, i3 + w - 1)
-NEXT w
-'Compare
-IF c$ = RTRIM$(Opt(x, o)) THEN
-'Record Match
-IF i3 < position THEN
-position = i3
-which = o
-bvalue = b
-EXIT FOR 'Exit the i3 loop
-END IF 'position check
-END IF 'match
-END IF
+ 'Scan for Opt () options
+ i1 = i: i2 = i
+ IF Expression THEN i2 = n
+ 'Scan a$ for opt () x
+ 'Note: Finding the closest opt option is necessary
+ 'Note: This needs to be bracket sensitive
+ OutOfRange = 2147483647
+ position = OutOfRange
+ which = 0
+ IF i <= n THEN 'Past end of contect check
+ FOR o = 1 TO t
+ words = OptWords(x, o)
+ b = 0
+ FOR i3 = i1 TO i2
+ IF i3 + words - 1 <= n THEN 'enough elements exist
+ c$ = getelement$(a$, i3)
+ IF b = 0 THEN
+ 'Build comparison string (spacing elements)
+ FOR w = 2 TO words
+ c$ = c$ + " " + getelement$(a$, i3 + w - 1)
+ NEXT w
+ 'Compare
+ IF c$ = RTRIM$(Opt(x, o)) THEN
+ 'Record Match
+ IF i3 < position THEN
+ position = i3
+ which = o
+ bvalue = b
+ EXIT FOR 'Exit the i3 loop
+ END IF 'position check
+ END IF 'match
+ END IF
-IF ASC(c$) = 44 AND b = 0 THEN
-EXIT FOR 'Expressions cannot contain a "," in their base level
-'Because this wasn't interceppted by the above code it isn't the Opt either
-END IF
-IF ASC(c$) = 40 THEN
-b = b + 1
-END IF
-IF ASC(c$) = 41 THEN
-b = b - 1
-IF b = -1 THEN EXIT FOR 'Exited current bracketting level, making any following match invalid
-END IF
+ IF ASC(c$) = 44 AND b = 0 THEN
+ EXIT FOR 'Expressions cannot contain a "," in their base level
+ 'Because this wasn't interceppted by the above code it isn't the Opt either
+ END IF
+ IF ASC(c$) = 40 THEN
+ b = b + 1
+ END IF
+ IF ASC(c$) = 41 THEN
+ b = b - 1
+ IF b = -1 THEN EXIT FOR 'Exited current bracketting level, making any following match invalid
+ END IF
-END IF 'enough elements exist
-NEXT i3
-NEXT o
-END IF 'Past end of contect check
+ END IF 'enough elements exist
+ NEXT i3
+ NEXT o
+ END IF 'Past end of contect check
-IF position <> OutOfRange THEN 'Found?
-'Found...
-level = Lev(x) 'Adjust level
-IF Expression THEN
-'Found...Expression...
-'Has an expression been provided?
-IF position > i AND bvalue = 0 THEN
-'Found...Expression...Provided...
-separgs(Expression) = getelements$(ca$, i, position - 1)
-Expression = 0
-i = position
-ELSE
-'Found...Expression...Omitted...
-'*********backtrack************
-GOTO OptCheckBacktrack
-'******************************
-END IF
-END IF 'Expression
-i = i + OptWords(x, which)
-separgslayout(x) = CHR$(LEN(RTRIM$(Opt(x, which)))) + RTRIM$(Opt(x, which))
-separgs(x) = CHR$(0) + str2(which)
-ELSE
-'Not Found...
-'*********backtrack************
-OptCheckBacktrack:
-'Was this optional?
-IF Lev(x) > EntryLev(x) THEN 'Optional Opt ()?
-'Not Found...Optional...
-'Simply don't enter the optional higher level and continue as normal
-BranchTaken(Branches) = 0
-level = currentlev 'We aren't entering the level after all, so our level should remain at the opt's entrylevel
-ELSE
-Backtrack:
-'Not Found...Mandatory...
-'1)Erase previous branches where both options have been tried
-FOR branch = Branches TO 1 STEP -1 'Remove branches until last taken branch is found
-IF BranchTaken(branch) THEN EXIT FOR
-Branches = Branches - 1 'Remove branch (it has already been tried with both possible combinations)
-NEXT
-IF Branches = 0 THEN 'All options have been exhausted
-seperateargs_error = 1
-seperateargs_error_message = "Syntax error"
-EXIT FUNCTION
-END IF
-'2)Toggle taken branch to untaken and revert
-BranchTaken(Branches) = 0 'toggle branch to untaken
-Expression = BranchWithExpression(Branches)
-i = BranchInputPos(Branches)
-x = BranchFormatPos(Branches)
-level = BranchLevel(Branches)
-'3)Erase any content created after revert position
-IF Expression THEN separgs(Expression) = "null"
-FOR x2 = x TO lastt
-separgs(x2) = "null"
-separgslayout(x2) = ""
-NEXT
-END IF 'Optional Opt ()?
-'******************************
+ IF position <> OutOfRange THEN 'Found?
+ 'Found...
+ level = Lev(x) 'Adjust level
+ IF Expression THEN
+ 'Found...Expression...
+ 'Has an expression been provided?
+ IF position > i AND bvalue = 0 THEN
+ 'Found...Expression...Provided...
+ separgs(Expression) = getelements$(ca$, i, position - 1)
+ Expression = 0
+ i = position
+ ELSE
+ 'Found...Expression...Omitted...
+ '*********backtrack************
+ GOTO OptCheckBacktrack
+ '******************************
+ END IF
+ END IF 'Expression
+ i = i + OptWords(x, which)
+ separgslayout(x) = CHR$(LEN(RTRIM$(Opt(x, which)))) + RTRIM$(Opt(x, which))
+ separgs(x) = CHR$(0) + str2(which)
+ ELSE
+ 'Not Found...
+ '*********backtrack************
+ OptCheckBacktrack:
+ 'Was this optional?
+ IF Lev(x) > EntryLev(x) THEN 'Optional Opt ()?
+ 'Not Found...Optional...
+ 'Simply don't enter the optional higher level and continue as normal
+ BranchTaken(Branches) = 0
+ level = currentlev 'We aren't entering the level after all, so our level should remain at the opt's entrylevel
+ ELSE
+ Backtrack:
+ 'Not Found...Mandatory...
+ '1)Erase previous branches where both options have been tried
+ FOR branch = Branches TO 1 STEP -1 'Remove branches until last taken branch is found
+ IF BranchTaken(branch) THEN EXIT FOR
+ Branches = Branches - 1 'Remove branch (it has already been tried with both possible combinations)
+ NEXT
+ IF Branches = 0 THEN 'All options have been exhausted
+ seperateargs_error = 1
+ seperateargs_error_message = "Syntax error"
+ EXIT FUNCTION
+ END IF
+ '2)Toggle taken branch to untaken and revert
+ BranchTaken(Branches) = 0 'toggle branch to untaken
+ Expression = BranchWithExpression(Branches)
+ i = BranchInputPos(Branches)
+ x = BranchFormatPos(Branches)
+ level = BranchLevel(Branches)
+ '3)Erase any content created after revert position
+ IF Expression THEN separgs(Expression) = "null"
+ FOR x2 = x TO lastt
+ separgs(x2) = "null"
+ separgslayout(x2) = ""
+ NEXT
+ END IF 'Optional Opt ()?
+ '******************************
-END IF 'Found?
+ END IF 'Found?
-END IF 't
+ END IF 't
-END IF 'possible to enter level
+ END IF 'possible to enter level
NEXT x
'Final expression?
IF Expression THEN
-IF i <= n THEN
-separgs(Expression) = getelements$(ca$, i, n)
+ IF i <= n THEN
+ separgs(Expression) = getelements$(ca$, i, n)
-'can this be an expression?
-'check it passes bracketting and comma rules
-b = 0
-FOR i2 = i TO n
-c$ = getelement$(a$, i2)
-IF ASC(c$) = 44 AND b = 0 THEN
-GOTO Backtrack
-END IF
-IF ASC(c$) = 40 THEN
-b = b + 1
-END IF
-IF ASC(c$) = 41 THEN
-b = b - 1
-IF b = -1 THEN GOTO Backtrack
-END IF
-NEXT
-IF b <> 0 THEN GOTO Backtrack
+ 'can this be an expression?
+ 'check it passes bracketting and comma rules
+ b = 0
+ FOR i2 = i TO n
+ c$ = getelement$(a$, i2)
+ IF ASC(c$) = 44 AND b = 0 THEN
+ GOTO Backtrack
+ END IF
+ IF ASC(c$) = 40 THEN
+ b = b + 1
+ END IF
+ IF ASC(c$) = 41 THEN
+ b = b - 1
+ IF b = -1 THEN GOTO Backtrack
+ END IF
+ NEXT
+ IF b <> 0 THEN GOTO Backtrack
-i = n + 1 'So it passes the test below
-ELSE
-GOTO Backtrack
-END IF
+ i = n + 1 'So it passes the test below
+ ELSE
+ GOTO Backtrack
+ END IF
END IF 'Expression
IF i <> n + 1 THEN GOTO Backtrack 'Trailing content?
IF Debug THEN
-PRINT #9, "--------SEPERATE ARGUMENTS REPORT #2--------"
-FOR i = 1 TO lastt
-PRINT #9, i, separgs(i)
-NEXT
+ PRINT #9, "--------SEPERATE ARGUMENTS REPORT #2--------"
+ FOR i = 1 TO lastt
+ PRINT #9, i, separgs(i)
+ NEXT
END IF
' DIM PassRule(1 TO 100) AS LONG
@@ -19936,38 +20143,38 @@ x = 1 'The new index to move compacted content to within separgs()
FOR i = 1 TO lastt
-IF DontPass(i) = 0 THEN
+ IF DontPass(i) = 0 THEN
-IF PassRule(i) > 0 THEN
-IF separgs(i) <> "null" THEN pass& = pass& OR PassRule(i) 'build 'passed' flags
-END IF
+ IF PassRule(i) > 0 THEN
+ IF separgs(i) <> "null" THEN pass& = pass& OR PassRule(i) 'build 'passed' flags
+ END IF
-separgs(x) = separgs(i)
-separgslayout(x) = separgslayout(i)
+ separgs(x) = separgs(i)
+ separgslayout(x) = separgslayout(i)
-IF LEN(separgs(x)) THEN
-IF ASC(separgs(x)) = 0 THEN
-'switch omit layout tag from item to layout info
-separgs(x) = RIGHT$(separgs(x), LEN(separgs(x)) - 1)
-separgslayout(x) = separgslayout(x) + CHR$(0)
-END IF
-END IF
+ IF LEN(separgs(x)) THEN
+ IF ASC(separgs(x)) = 0 THEN
+ 'switch omit layout tag from item to layout info
+ separgs(x) = RIGHT$(separgs(x), LEN(separgs(x)) - 1)
+ separgslayout(x) = separgslayout(x) + CHR$(0)
+ END IF
+ END IF
-IF separgs(x) = "null" THEN separgs(x) = "NULL"
-x = x + 1
+ IF separgs(x) = "null" THEN separgs(x) = "NULL"
+ x = x + 1
-ELSE
-'its gonna be skipped!
-'add layout to the next one to be safe
+ ELSE
+ 'its gonna be skipped!
+ 'add layout to the next one to be safe
-'for syntax such as [{HELLO}] which uses a flag instead of being passed
-IF PassRule(i) > 0 THEN
-IF separgs(i) <> "null" THEN pass& = pass& OR PassRule(i) 'build 'passed' flags
-END IF
+ 'for syntax such as [{HELLO}] which uses a flag instead of being passed
+ IF PassRule(i) > 0 THEN
+ IF separgs(i) <> "null" THEN pass& = pass& OR PassRule(i) 'build 'passed' flags
+ END IF
-separgslayout(i + 1) = separgslayout(i) + separgslayout(i + 1)
+ separgslayout(i + 1) = separgslayout(i) + separgslayout(i + 1)
-END IF
+ END IF
NEXT
separgslayout(x) = separgslayout(i) 'set final layout
@@ -19992,9 +20199,9 @@ tl$ = tlayout$
'retrieve ID
i = INSTR(a$, sp3)
IF i THEN
-idnumber = VAL(LEFT$(a$, i - 1)): a$ = RIGHT$(a$, LEN(a$) - i)
+ idnumber = VAL(LEFT$(a$, i - 1)): a$ = RIGHT$(a$, LEN(a$) - i)
ELSE
-idnumber = VAL(a$)
+ idnumber = VAL(a$)
END IF
getid idnumber
IF Error_Happened THEN EXIT SUB
@@ -20003,253 +20210,253 @@ IF Error_Happened THEN EXIT SUB
'UDT?
IF typ AND ISUDT THEN
-'print "setrefer-ing a UDT!"
-u = VAL(a$)
-i = INSTR(a$, sp3): a$ = RIGHT$(a$, LEN(a$) - i): E = VAL(a$)
-i = INSTR(a$, sp3): o$ = RIGHT$(a$, LEN(a$) - i)
-n$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n$ = "ARRAY_" + n$ + "[0]"
+ 'print "setrefer-ing a UDT!"
+ u = VAL(a$)
+ i = INSTR(a$, sp3): a$ = RIGHT$(a$, LEN(a$) - i): E = VAL(a$)
+ i = INSTR(a$, sp3): o$ = RIGHT$(a$, LEN(a$) - i)
+ n$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n$ = "ARRAY_" + n$ + "[0]"
-IF Cloud = 0 THEN
-IF E <> 0 AND u = 1 THEN 'Setting _MEM type elements is not allowed!
-Give_Error "Cannot set read-only element of _MEM TYPE": EXIT SUB
-END IF
-END IF
+ IF Cloud = 0 THEN
+ IF E <> 0 AND u = 1 THEN 'Setting _MEM type elements is not allowed!
+ Give_Error "Cannot set read-only element of _MEM TYPE": EXIT SUB
+ END IF
+ END IF
-IF E = 0 THEN
-'use u and u's size
+ IF E = 0 THEN
+ 'use u and u's size
-IF method <> 0 THEN Give_Error "Unexpected internal code reference to UDT": EXIT SUB
-lhsscope$ = scope$
-e$ = evaluate(e$, t2)
-IF Error_Happened THEN EXIT SUB
-IF (t2 AND ISUDT) = 0 THEN Give_Error "Expected = similar user defined type": EXIT SUB
+ IF method <> 0 THEN Give_Error "Unexpected internal code reference to UDT": EXIT SUB
+ lhsscope$ = scope$
+ e$ = evaluate(e$, t2)
+ IF Error_Happened THEN EXIT SUB
+ IF (t2 AND ISUDT) = 0 THEN Give_Error "Expected = similar user defined type": EXIT SUB
-IF (t2 AND ISREFERENCE) = 0 THEN
-IF t2 AND ISPOINTER THEN
-src$ = "((char*)" + e$ + ")"
-e2 = 0: u2 = t2 AND 511
-ELSE
-src$ = "((char*)&" + e$ + ")"
-e2 = 0: u2 = t2 AND 511
-END IF
-GOTO directudt
-END IF
+ IF (t2 AND ISREFERENCE) = 0 THEN
+ IF t2 AND ISPOINTER THEN
+ src$ = "((char*)" + e$ + ")"
+ e2 = 0: u2 = t2 AND 511
+ ELSE
+ src$ = "((char*)&" + e$ + ")"
+ e2 = 0: u2 = t2 AND 511
+ END IF
+ GOTO directudt
+ END IF
-'****problem****
-idnumber2 = VAL(e$)
-getid idnumber2
+ '****problem****
+ idnumber2 = VAL(e$)
+ getid idnumber2
-IF Error_Happened THEN EXIT SUB
-n2$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n2$ = "ARRAY_" + n2$ + "[0]"
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): u2 = VAL(e$)
-i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): e2 = VAL(e$)
-i = INSTR(e$, sp3): o2$ = RIGHT$(e$, LEN(e$) - i)
-'WARNING: u2 may need minor modifications based on e to see if they are the same
+ IF Error_Happened THEN EXIT SUB
+ n2$ = "UDT_" + RTRIM$(id.n): IF id.t = 0 THEN n2$ = "ARRAY_" + n2$ + "[0]"
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): u2 = VAL(e$)
+ i = INSTR(e$, sp3): e$ = RIGHT$(e$, LEN(e$) - i): e2 = VAL(e$)
+ i = INSTR(e$, sp3): o2$ = RIGHT$(e$, LEN(e$) - i)
+ 'WARNING: u2 may need minor modifications based on e to see if they are the same
-'we have now established we have 2 pointers to similar data types!
-'ASSUME BYTE TYPE!!!
-src$ = "(((char*)" + scope$ + n2$ + ")+(" + o2$ + "))"
-directudt:
-IF u <> u2 OR e2 <> 0 THEN Give_Error "Expected = similar user defined type": EXIT SUB
+ 'we have now established we have 2 pointers to similar data types!
+ 'ASSUME BYTE TYPE!!!
+ src$ = "(((char*)" + scope$ + n2$ + ")+(" + o2$ + "))"
+ directudt:
+ IF u <> u2 OR e2 <> 0 THEN Give_Error "Expected = similar user defined type": EXIT SUB
-dst$ = "(((char*)" + lhsscope$ + n$ + ")+(" + o$ + "))"
-siz$ = str2$(udtxsize(u) \ 8)
+ dst$ = "(((char*)" + lhsscope$ + n$ + ")+(" + o$ + "))"
+ siz$ = str2$(udtxsize(u) \ 8)
-PRINT #12, "memcpy(" + dst$ + "," + src$ + "," + siz$ + ");"
+ PRINT #12, "memcpy(" + dst$ + "," + src$ + "," + siz$ + ");"
-'print "setFULLUDTrefer!"
+ 'print "setFULLUDTrefer!"
-tlayout$ = tl$
-EXIT SUB
+ tlayout$ = tl$
+ EXIT SUB
-END IF 'e=0
+ END IF 'e=0
-IF typ AND ISOFFSETINBITS THEN Give_Error "Cannot resolve bit-length variables inside user defined types yet": EXIT SUB
-IF typ AND ISSTRING THEN
-o2$ = "(((uint8*)" + scope$ + n$ + ")+(" + o$ + "))"
-r$ = "qbs_new_fixed(" + o2$ + "," + str2(udtetypesize(E)) + ",1)"
-IF method = 0 THEN e$ = evaluatetotyp(e$, STRINGTYPE - ISPOINTER)
-IF Error_Happened THEN EXIT SUB
-PRINT #12, "qbs_set(" + r$ + "," + e$ + ");"
-ELSE
-typ = typ - ISUDT - ISREFERENCE - ISPOINTER
-IF typ AND ISARRAY THEN typ = typ - ISARRAY
-t$ = typ2ctyp$(typ, "")
-IF Error_Happened THEN EXIT SUB
-o2$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
-r$ = "*" + "(" + t$ + "*)" + o2$
-IF method = 0 THEN e$ = evaluatetotyp(e$, typ)
-IF Error_Happened THEN EXIT SUB
-PRINT #12, r$ + "=" + e$ + ";"
-END IF
+ IF typ AND ISOFFSETINBITS THEN Give_Error "Cannot resolve bit-length variables inside user defined types yet": EXIT SUB
+ IF typ AND ISSTRING THEN
+ o2$ = "(((uint8*)" + scope$ + n$ + ")+(" + o$ + "))"
+ r$ = "qbs_new_fixed(" + o2$ + "," + str2(udtetypesize(E)) + ",1)"
+ IF method = 0 THEN e$ = evaluatetotyp(e$, STRINGTYPE - ISPOINTER)
+ IF Error_Happened THEN EXIT SUB
+ PRINT #12, "qbs_set(" + r$ + "," + e$ + ");"
+ ELSE
+ typ = typ - ISUDT - ISREFERENCE - ISPOINTER
+ IF typ AND ISARRAY THEN typ = typ - ISARRAY
+ t$ = typ2ctyp$(typ, "")
+ IF Error_Happened THEN EXIT SUB
+ o2$ = "(((char*)" + scope$ + n$ + ")+(" + o$ + "))"
+ r$ = "*" + "(" + t$ + "*)" + o2$
+ IF method = 0 THEN e$ = evaluatetotyp(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ PRINT #12, r$ + "=" + e$ + ";"
+ END IF
-'print "setUDTrefer:"+r$,e$
-tlayout$ = tl$
-EXIT SUB
+ 'print "setUDTrefer:"+r$,e$
+ tlayout$ = tl$
+ EXIT SUB
END IF
'array?
IF id.arraytype THEN
-n$ = RTRIM$(id.callname)
-typ = typ - ISPOINTER - ISREFERENCE 'typ now looks like a regular value
+ n$ = RTRIM$(id.callname)
+ typ = typ - ISPOINTER - ISREFERENCE 'typ now looks like a regular value
-IF (typ AND ISSTRING) THEN
-IF (typ AND ISFIXEDLENGTH) THEN
-offset$ = "&((uint8*)(" + n$ + "[0]))[tmp_long*" + str2(id.tsize) + "]"
-r$ = "qbs_new_fixed(" + offset$ + "," + str2(id.tsize) + ",1)"
-PRINT #12, "tmp_long=" + a$ + ";"
-IF method = 0 THEN
-l$ = "if (!new_error) qbs_set(" + r$ + "," + evaluatetotyp(e$, typ) + ");"
-IF Error_Happened THEN EXIT SUB
-ELSE
-l$ = "if (!new_error) qbs_set(" + r$ + "," + e$ + ");"
-END IF
-PRINT #12, l$
-ELSE
-PRINT #12, "tmp_long=" + a$ + ";"
-IF method = 0 THEN
-l$ = "if (!new_error) qbs_set( ((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]))," + evaluatetotyp(e$, typ) + ");"
-IF Error_Happened THEN EXIT SUB
-ELSE
-l$ = "if (!new_error) qbs_set( ((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]))," + e$ + ");"
-END IF
-PRINT #12, l$
-END IF
-stringprocessinghappened = 1
-tlayout$ = tl$
-EXIT SUB
-END IF
+ IF (typ AND ISSTRING) THEN
+ IF (typ AND ISFIXEDLENGTH) THEN
+ offset$ = "&((uint8*)(" + n$ + "[0]))[tmp_long*" + str2(id.tsize) + "]"
+ r$ = "qbs_new_fixed(" + offset$ + "," + str2(id.tsize) + ",1)"
+ PRINT #12, "tmp_long=" + a$ + ";"
+ IF method = 0 THEN
+ l$ = "if (!new_error) qbs_set(" + r$ + "," + evaluatetotyp(e$, typ) + ");"
+ IF Error_Happened THEN EXIT SUB
+ ELSE
+ l$ = "if (!new_error) qbs_set(" + r$ + "," + e$ + ");"
+ END IF
+ PRINT #12, l$
+ ELSE
+ PRINT #12, "tmp_long=" + a$ + ";"
+ IF method = 0 THEN
+ l$ = "if (!new_error) qbs_set( ((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]))," + evaluatetotyp(e$, typ) + ");"
+ IF Error_Happened THEN EXIT SUB
+ ELSE
+ l$ = "if (!new_error) qbs_set( ((qbs*)(((uint64*)(" + n$ + "[0]))[tmp_long]))," + e$ + ");"
+ END IF
+ PRINT #12, l$
+ END IF
+ stringprocessinghappened = 1
+ tlayout$ = tl$
+ EXIT SUB
+ END IF
-IF (typ AND ISOFFSETINBITS) THEN
-'r$ = "setbits_" + str2(typ AND 511) + "("
-r$ = "setbits(" + str2(typ AND 511) + ","
-r$ = r$ + "(uint8*)(" + n$ + "[0])" + ",tmp_long,"
-PRINT #12, "tmp_long=" + a$ + ";"
-IF method = 0 THEN
-l$ = "if (!new_error) " + r$ + evaluatetotyp(e$, typ) + ");"
-IF Error_Happened THEN EXIT SUB
-ELSE
-l$ = "if (!new_error) " + r$ + e$ + ");"
-END IF
-PRINT #12, l$
-tlayout$ = tl$
-EXIT SUB
-ELSE
-t$ = ""
-IF (typ AND ISFLOAT) THEN
-IF (typ AND 511) = 32 THEN t$ = "float"
-IF (typ AND 511) = 64 THEN t$ = "double"
-IF (typ AND 511) = 256 THEN t$ = "long double"
-ELSE
-IF (typ AND ISUNSIGNED) THEN
-IF (typ AND 511) = 8 THEN t$ = "uint8"
-IF (typ AND 511) = 16 THEN t$ = "uint16"
-IF (typ AND 511) = 32 THEN t$ = "uint32"
-IF (typ AND 511) = 64 THEN t$ = "uint64"
-IF typ AND ISOFFSET THEN t$ = "uptrszint"
-ELSE
-IF (typ AND 511) = 8 THEN t$ = "int8"
-IF (typ AND 511) = 16 THEN t$ = "int16"
-IF (typ AND 511) = 32 THEN t$ = "int32"
-IF (typ AND 511) = 64 THEN t$ = "int64"
-IF typ AND ISOFFSET THEN t$ = "ptrszint"
-END IF
-END IF
-END IF
-IF t$ = "" THEN Give_Error "Cannot find C type to return array data": EXIT SUB
-PRINT #12, "tmp_long=" + a$ + ";"
-IF method = 0 THEN
-l$ = "if (!new_error) ((" + t$ + "*)(" + n$ + "[0]))[tmp_long]=" + evaluatetotyp(e$, typ) + ";"
-IF Error_Happened THEN EXIT SUB
-ELSE
-l$ = "if (!new_error) ((" + t$ + "*)(" + n$ + "[0]))[tmp_long]=" + e$ + ";"
-END IF
+ IF (typ AND ISOFFSETINBITS) THEN
+ 'r$ = "setbits_" + str2(typ AND 511) + "("
+ r$ = "setbits(" + str2(typ AND 511) + ","
+ r$ = r$ + "(uint8*)(" + n$ + "[0])" + ",tmp_long,"
+ PRINT #12, "tmp_long=" + a$ + ";"
+ IF method = 0 THEN
+ l$ = "if (!new_error) " + r$ + evaluatetotyp(e$, typ) + ");"
+ IF Error_Happened THEN EXIT SUB
+ ELSE
+ l$ = "if (!new_error) " + r$ + e$ + ");"
+ END IF
+ PRINT #12, l$
+ tlayout$ = tl$
+ EXIT SUB
+ ELSE
+ t$ = ""
+ IF (typ AND ISFLOAT) THEN
+ IF (typ AND 511) = 32 THEN t$ = "float"
+ IF (typ AND 511) = 64 THEN t$ = "double"
+ IF (typ AND 511) = 256 THEN t$ = "long double"
+ ELSE
+ IF (typ AND ISUNSIGNED) THEN
+ IF (typ AND 511) = 8 THEN t$ = "uint8"
+ IF (typ AND 511) = 16 THEN t$ = "uint16"
+ IF (typ AND 511) = 32 THEN t$ = "uint32"
+ IF (typ AND 511) = 64 THEN t$ = "uint64"
+ IF typ AND ISOFFSET THEN t$ = "uptrszint"
+ ELSE
+ IF (typ AND 511) = 8 THEN t$ = "int8"
+ IF (typ AND 511) = 16 THEN t$ = "int16"
+ IF (typ AND 511) = 32 THEN t$ = "int32"
+ IF (typ AND 511) = 64 THEN t$ = "int64"
+ IF typ AND ISOFFSET THEN t$ = "ptrszint"
+ END IF
+ END IF
+ END IF
+ IF t$ = "" THEN Give_Error "Cannot find C type to return array data": EXIT SUB
+ PRINT #12, "tmp_long=" + a$ + ";"
+ IF method = 0 THEN
+ l$ = "if (!new_error) ((" + t$ + "*)(" + n$ + "[0]))[tmp_long]=" + evaluatetotyp(e$, typ) + ";"
+ IF Error_Happened THEN EXIT SUB
+ ELSE
+ l$ = "if (!new_error) ((" + t$ + "*)(" + n$ + "[0]))[tmp_long]=" + e$ + ";"
+ END IF
-PRINT #12, l$
-tlayout$ = tl$
-EXIT SUB
+ PRINT #12, l$
+ tlayout$ = tl$
+ EXIT SUB
END IF 'array
'variable?
IF id.t THEN
-r$ = RTRIM$(id.n)
-t = id.t
-'remove irrelavant flags
-IF (t AND ISINCONVENTIONALMEMORY) THEN t = t - ISINCONVENTIONALMEMORY
-typ = t
+ r$ = RTRIM$(id.n)
+ t = id.t
+ 'remove irrelavant flags
+ IF (t AND ISINCONVENTIONALMEMORY) THEN t = t - ISINCONVENTIONALMEMORY
+ typ = t
-'string variable?
-IF (t AND ISSTRING) THEN
-IF (t AND ISFIXEDLENGTH) THEN
-r$ = scope$ + "STRING" + str2(id.tsize) + "_" + r$
-ELSE
-r$ = scope$ + "STRING_" + r$
-END IF
-IF method = 0 THEN e$ = evaluatetotyp(e$, ISSTRING)
-IF Error_Happened THEN EXIT SUB
-PRINT #12, "qbs_set(" + r$ + "," + e$ + ");"
-PRINT #12, cleanupstringprocessingcall$ + "0);"
-IF arrayprocessinghappened THEN arrayprocessinghappened = 0
-tlayout$ = tl$
-EXIT SUB
-END IF
+ 'string variable?
+ IF (t AND ISSTRING) THEN
+ IF (t AND ISFIXEDLENGTH) THEN
+ r$ = scope$ + "STRING" + str2(id.tsize) + "_" + r$
+ ELSE
+ r$ = scope$ + "STRING_" + r$
+ END IF
+ IF method = 0 THEN e$ = evaluatetotyp(e$, ISSTRING)
+ IF Error_Happened THEN EXIT SUB
+ PRINT #12, "qbs_set(" + r$ + "," + e$ + ");"
+ PRINT #12, cleanupstringprocessingcall$ + "0);"
+ IF arrayprocessinghappened THEN arrayprocessinghappened = 0
+ tlayout$ = tl$
+ EXIT SUB
+ END IF
-'bit-length variable?
-IF (t AND ISOFFSETINBITS) THEN
-b = t AND 511
-IF (t AND ISUNSIGNED) THEN
-r$ = "*" + scope$ + "UBIT" + str2(t AND 511) + "_" + r$
-IF method = 0 THEN e$ = evaluatetotyp(e$, 64& + ISUNSIGNED)
-IF Error_Happened THEN EXIT SUB
-l$ = r$ + "=(" + e$ + ")&" + str2(bitmask(b)) + ";"
-PRINT #12, l$
-ELSE
-r$ = "*" + scope$ + "BIT" + str2(t AND 511) + "_" + r$
-IF method = 0 THEN e$ = evaluatetotyp(e$, 64&)
-IF Error_Happened THEN EXIT SUB
-l$ = "if ((" + r$ + "=" + e$ + ")&" + str2(2 ^ (b - 1)) + "){"
-PRINT #12, l$
-'signed bit is set
-l$ = r$ + "|=" + str2(bitmaskinv(b)) + ";"
-PRINT #12, l$
-PRINT #12, "}else{"
-'signed bit is not set
-l$ = r$ + "&=" + str2(bitmask(b)) + ";"
-PRINT #12, l$
-PRINT #12, "}"
-END IF
-IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
-IF arrayprocessinghappened THEN arrayprocessinghappened = 0
-tlayout$ = tl$
-EXIT SUB
-END IF
+ 'bit-length variable?
+ IF (t AND ISOFFSETINBITS) THEN
+ b = t AND 511
+ IF (t AND ISUNSIGNED) THEN
+ r$ = "*" + scope$ + "UBIT" + str2(t AND 511) + "_" + r$
+ IF method = 0 THEN e$ = evaluatetotyp(e$, 64& + ISUNSIGNED)
+ IF Error_Happened THEN EXIT SUB
+ l$ = r$ + "=(" + e$ + ")&" + str2(bitmask(b)) + ";"
+ PRINT #12, l$
+ ELSE
+ r$ = "*" + scope$ + "BIT" + str2(t AND 511) + "_" + r$
+ IF method = 0 THEN e$ = evaluatetotyp(e$, 64&)
+ IF Error_Happened THEN EXIT SUB
+ l$ = "if ((" + r$ + "=" + e$ + ")&" + str2(2 ^ (b - 1)) + "){"
+ PRINT #12, l$
+ 'signed bit is set
+ l$ = r$ + "|=" + str2(bitmaskinv(b)) + ";"
+ PRINT #12, l$
+ PRINT #12, "}else{"
+ 'signed bit is not set
+ l$ = r$ + "&=" + str2(bitmask(b)) + ";"
+ PRINT #12, l$
+ PRINT #12, "}"
+ END IF
+ IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
+ IF arrayprocessinghappened THEN arrayprocessinghappened = 0
+ tlayout$ = tl$
+ EXIT SUB
+ END IF
-'standard variable?
-IF t = BYTETYPE THEN r$ = "*" + scope$ + "BYTE_" + r$: GOTO sref
-IF t = UBYTETYPE THEN r$ = "*" + scope$ + "UBYTE_" + r$: GOTO sref
-IF t = INTEGERTYPE THEN r$ = "*" + scope$ + "INTEGER_" + r$: GOTO sref
-IF t = UINTEGERTYPE THEN r$ = "*" + scope$ + "UINTEGER_" + r$: GOTO sref
-IF t = LONGTYPE THEN r$ = "*" + scope$ + "LONG_" + r$: GOTO sref
-IF t = ULONGTYPE THEN r$ = "*" + scope$ + "ULONG_" + r$: GOTO sref
-IF t = INTEGER64TYPE THEN r$ = "*" + scope$ + "INTEGER64_" + r$: GOTO sref
-IF t = UINTEGER64TYPE THEN r$ = "*" + scope$ + "UINTEGER64_" + r$: GOTO sref
-IF t = SINGLETYPE THEN r$ = "*" + scope$ + "SINGLE_" + r$: GOTO sref
-IF t = DOUBLETYPE THEN r$ = "*" + scope$ + "DOUBLE_" + r$: GOTO sref
-IF t = FLOATTYPE THEN r$ = "*" + scope$ + "FLOAT_" + r$: GOTO sref
-IF t = OFFSETTYPE THEN r$ = "*" + scope$ + "OFFSET_" + r$: GOTO sref
-IF t = UOFFSETTYPE THEN r$ = "*" + scope$ + "UOFFSET_" + r$: GOTO sref
-sref:
-t2 = t - ISPOINTER
-IF method = 0 THEN e$ = evaluatetotyp(e$, t2)
-IF Error_Happened THEN EXIT SUB
-l$ = r$ + "=" + e$ + ";"
-PRINT #12, l$
-IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
-IF arrayprocessinghappened THEN arrayprocessinghappened = 0
-tlayout$ = tl$
-EXIT SUB
+ 'standard variable?
+ IF t = BYTETYPE THEN r$ = "*" + scope$ + "BYTE_" + r$: GOTO sref
+ IF t = UBYTETYPE THEN r$ = "*" + scope$ + "UBYTE_" + r$: GOTO sref
+ IF t = INTEGERTYPE THEN r$ = "*" + scope$ + "INTEGER_" + r$: GOTO sref
+ IF t = UINTEGERTYPE THEN r$ = "*" + scope$ + "UINTEGER_" + r$: GOTO sref
+ IF t = LONGTYPE THEN r$ = "*" + scope$ + "LONG_" + r$: GOTO sref
+ IF t = ULONGTYPE THEN r$ = "*" + scope$ + "ULONG_" + r$: GOTO sref
+ IF t = INTEGER64TYPE THEN r$ = "*" + scope$ + "INTEGER64_" + r$: GOTO sref
+ IF t = UINTEGER64TYPE THEN r$ = "*" + scope$ + "UINTEGER64_" + r$: GOTO sref
+ IF t = SINGLETYPE THEN r$ = "*" + scope$ + "SINGLE_" + r$: GOTO sref
+ IF t = DOUBLETYPE THEN r$ = "*" + scope$ + "DOUBLE_" + r$: GOTO sref
+ IF t = FLOATTYPE THEN r$ = "*" + scope$ + "FLOAT_" + r$: GOTO sref
+ IF t = OFFSETTYPE THEN r$ = "*" + scope$ + "OFFSET_" + r$: GOTO sref
+ IF t = UOFFSETTYPE THEN r$ = "*" + scope$ + "UOFFSET_" + r$: GOTO sref
+ sref:
+ t2 = t - ISPOINTER
+ IF method = 0 THEN e$ = evaluatetotyp(e$, t2)
+ IF Error_Happened THEN EXIT SUB
+ l$ = r$ + "=" + e$ + ";"
+ PRINT #12, l$
+ IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
+ IF arrayprocessinghappened THEN arrayprocessinghappened = 0
+ tlayout$ = tl$
+ EXIT SUB
END IF 'variable
tlayout$ = tl$
@@ -20274,31 +20481,31 @@ ctyp$ = ""
'ii. as a typ symbol (eg. "~%") in tstr
'iii. as a typ name (eg. _UNSIGNED INTEGER) in tstr
IF tstr$ = "" THEN
-IF (t AND ISARRAY) THEN EXIT FUNCTION 'cannot return array types
-IF (t AND ISSTRING) THEN typ2ctyp$ = "qbs": EXIT FUNCTION
-b = t AND 511
-IF (t AND ISUDT) THEN typ2ctyp$ = "void": EXIT FUNCTION
-IF (t AND ISOFFSETINBITS) THEN
-IF b <= 32 THEN ctyp$ = "int32" ELSE ctyp$ = "int64"
-IF (t AND ISUNSIGNED) THEN ctyp$ = "u" + ctyp$
-typ2ctyp$ = ctyp$: EXIT FUNCTION
-END IF
-IF (t AND ISFLOAT) THEN
-IF b = 32 THEN ctyp$ = "float"
-IF b = 64 THEN ctyp$ = "double"
-IF b = 256 THEN ctyp$ = "long double"
-ELSE
-IF b = 8 THEN ctyp$ = "int8"
-IF b = 16 THEN ctyp$ = "int16"
-IF b = 32 THEN ctyp$ = "int32"
-IF b = 64 THEN ctyp$ = "int64"
-IF typ AND ISOFFSET THEN ctyp$ = "ptrszint"
-IF (t AND ISUNSIGNED) THEN ctyp$ = "u" + ctyp$
-END IF
-IF t AND ISOFFSET THEN
-ctyp$ = "ptrszint": IF (t AND ISUNSIGNED) THEN ctyp$ = "uptrszint"
-END IF
-typ2ctyp$ = ctyp$: EXIT FUNCTION
+ IF (t AND ISARRAY) THEN EXIT FUNCTION 'cannot return array types
+ IF (t AND ISSTRING) THEN typ2ctyp$ = "qbs": EXIT FUNCTION
+ b = t AND 511
+ IF (t AND ISUDT) THEN typ2ctyp$ = "void": EXIT FUNCTION
+ IF (t AND ISOFFSETINBITS) THEN
+ IF b <= 32 THEN ctyp$ = "int32" ELSE ctyp$ = "int64"
+ IF (t AND ISUNSIGNED) THEN ctyp$ = "u" + ctyp$
+ typ2ctyp$ = ctyp$: EXIT FUNCTION
+ END IF
+ IF (t AND ISFLOAT) THEN
+ IF b = 32 THEN ctyp$ = "float"
+ IF b = 64 THEN ctyp$ = "double"
+ IF b = 256 THEN ctyp$ = "long double"
+ ELSE
+ IF b = 8 THEN ctyp$ = "int8"
+ IF b = 16 THEN ctyp$ = "int16"
+ IF b = 32 THEN ctyp$ = "int32"
+ IF b = 64 THEN ctyp$ = "int64"
+ IF typ AND ISOFFSET THEN ctyp$ = "ptrszint"
+ IF (t AND ISUNSIGNED) THEN ctyp$ = "u" + ctyp$
+ END IF
+ IF t AND ISOFFSET THEN
+ ctyp$ = "ptrszint": IF (t AND ISUNSIGNED) THEN ctyp$ = "uptrszint"
+ END IF
+ typ2ctyp$ = ctyp$: EXIT FUNCTION
END IF
ts$ = tstr$
@@ -20309,36 +20516,36 @@ IF ts$ = "#" THEN ctyp$ = "double"
IF ts$ = "##" THEN ctyp$ = "long double"
IF LEFT$(ts$, 1) = "~" THEN unsgn = 1: ts$ = RIGHT$(ts$, LEN(ts$) - 1)
IF LEFT$(ts$, 1) = "`" THEN
-n$ = RIGHT$(ts$, LEN(ts$) - 1)
-b = 1
-IF n$ <> "" THEN
-IF isuinteger(n$) = 0 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
-b = VAL(n$)
-IF b > 57 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
-END IF
-IF b <= 32 THEN ctyp$ = "int32" ELSE ctyp$ = "int64"
-IF unsgn THEN ctyp$ = "u" + ctyp$
-typ2ctyp$ = ctyp$: EXIT FUNCTION
+ n$ = RIGHT$(ts$, LEN(ts$) - 1)
+ b = 1
+ IF n$ <> "" THEN
+ IF isuinteger(n$) = 0 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
+ b = VAL(n$)
+ IF b > 57 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
+ END IF
+ IF b <= 32 THEN ctyp$ = "int32" ELSE ctyp$ = "int64"
+ IF unsgn THEN ctyp$ = "u" + ctyp$
+ typ2ctyp$ = ctyp$: EXIT FUNCTION
END IF
IF ts$ = "%&" THEN
-typ2ctyp$ = "ptrszint": IF (t AND ISUNSIGNED) THEN typ2ctyp$ = "uptrszint"
-EXIT FUNCTION
+ typ2ctyp$ = "ptrszint": IF (t AND ISUNSIGNED) THEN typ2ctyp$ = "uptrszint"
+ EXIT FUNCTION
END IF
IF ts$ = "%%" THEN ctyp$ = "int8"
IF ts$ = "%" THEN ctyp$ = "int16"
IF ts$ = "&" THEN ctyp$ = "int32"
IF ts$ = "&&" THEN ctyp$ = "int64"
IF ctyp$ <> "" THEN
-IF unsgn THEN ctyp$ = "u" + ctyp$
-typ2ctyp$ = ctyp$: EXIT FUNCTION
+ IF unsgn THEN ctyp$ = "u" + ctyp$
+ typ2ctyp$ = ctyp$: EXIT FUNCTION
END IF
'is tstr$ a named type? (eg. 'LONG')
s$ = type2symbol$(tstr$)
IF Error_Happened THEN EXIT FUNCTION
IF LEN(s$) THEN
-typ2ctyp$ = typ2ctyp$(0, s$)
-IF Error_Happened THEN EXIT FUNCTION
-EXIT FUNCTION
+ typ2ctyp$ = typ2ctyp$(0, s$)
+ IF Error_Happened THEN EXIT FUNCTION
+ EXIT FUNCTION
END IF
Give_Error "Invalid type": EXIT FUNCTION
@@ -20348,7 +20555,7 @@ END FUNCTION
FUNCTION type2symbol$ (typ$)
t$ = typ$
FOR i = 1 TO LEN(t$)
-IF MID$(t$, i, 1) = sp THEN MID$(t$, i, 1) = " "
+ IF MID$(t$, i, 1) = sp THEN MID$(t$, i, 1) = " "
NEXT
e$ = "Cannot convert type (" + typ$ + ") to symbol"
t2$ = "_UNSIGNED _BIT": s$ = "~`1": IF LEFT$(t$, LEN(t2$)) = t2$ THEN GOTO t2sfound
@@ -20371,20 +20578,20 @@ Give_Error e$: EXIT FUNCTION
t2sfound:
type2symbol$ = s$
IF LEN(t2$) <> LEN(t$) THEN
-IF s$ <> "$" AND s$ <> "~`1" AND s$ <> "`1" THEN Give_Error e$: EXIT FUNCTION
-t$ = RIGHT$(t$, LEN(t$) - LEN(t2$))
-IF LEFT$(t$, 3) <> " * " THEN Give_Error e$: EXIT FUNCTION
-t$ = RIGHT$(t$, LEN(t$) - 3)
-IF isuinteger(t$) = 0 THEN Give_Error e$: EXIT FUNCTION
-v = VAL(t$)
-IF v = 0 THEN Give_Error e$: EXIT FUNCTION
-IF s$ <> "$" AND v > 56 THEN Give_Error e$: EXIT FUNCTION
-IF s$ = "$" THEN
-s$ = s$ + str2$(v)
-ELSE
-s$ = LEFT$(s$, LEN(s$) - 1) + str2$(v)
-END IF
-type2symbol$ = s$
+ IF s$ <> "$" AND s$ <> "~`1" AND s$ <> "`1" THEN Give_Error e$: EXIT FUNCTION
+ t$ = RIGHT$(t$, LEN(t$) - LEN(t2$))
+ IF LEFT$(t$, 3) <> " * " THEN Give_Error e$: EXIT FUNCTION
+ t$ = RIGHT$(t$, LEN(t$) - 3)
+ IF isuinteger(t$) = 0 THEN Give_Error e$: EXIT FUNCTION
+ v = VAL(t$)
+ IF v = 0 THEN Give_Error e$: EXIT FUNCTION
+ IF s$ <> "$" AND v > 56 THEN Give_Error e$: EXIT FUNCTION
+ IF s$ = "$" THEN
+ s$ = s$ + str2$(v)
+ ELSE
+ s$ = LEFT$(s$, LEN(s$) - 1) + str2$(v)
+ END IF
+ type2symbol$ = s$
END IF
END FUNCTION
@@ -20409,13 +20616,13 @@ IF ts$ = "##" THEN typname2typ& = FLOATTYPE: EXIT FUNCTION
'fixed length string?
IF LEFT$(ts$, 1) = "$" THEN
-n$ = RIGHT$(ts$, LEN(ts$) - 1)
-IF isuinteger(n$) = 0 THEN Give_Error "Invalid index after STRING * type": EXIT FUNCTION
-b = VAL(n$)
-IF b = 0 THEN Give_Error "Invalid index after STRING * type": EXIT FUNCTION
-typname2typsize = b
-typname2typ& = STRINGTYPE + ISFIXEDLENGTH
-EXIT FUNCTION
+ n$ = RIGHT$(ts$, LEN(ts$) - 1)
+ IF isuinteger(n$) = 0 THEN Give_Error "Invalid index after STRING * type": EXIT FUNCTION
+ b = VAL(n$)
+ IF b = 0 THEN Give_Error "Invalid index after STRING * type": EXIT FUNCTION
+ typname2typsize = b
+ typname2typ& = STRINGTYPE + ISFIXEDLENGTH
+ EXIT FUNCTION
END IF
'unsigned?
@@ -20423,15 +20630,15 @@ IF LEFT$(ts$, 1) = "~" THEN unsgn = 1: ts$ = RIGHT$(ts$, LEN(ts$) - 1)
'bit-type?
IF LEFT$(ts$, 1) = "`" THEN
-n$ = RIGHT$(ts$, LEN(ts$) - 1)
-b = 1
-IF n$ <> "" THEN
-IF isuinteger(n$) = 0 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
-b = VAL(n$)
-IF b > 56 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
-END IF
-IF unsgn THEN typname2typ& = UBITTYPE + (b - 1) ELSE typname2typ& = BITTYPE + (b - 1)
-EXIT FUNCTION
+ n$ = RIGHT$(ts$, LEN(ts$) - 1)
+ b = 1
+ IF n$ <> "" THEN
+ IF isuinteger(n$) = 0 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
+ b = VAL(n$)
+ IF b > 56 THEN Give_Error "Invalid index after _BIT type": EXIT FUNCTION
+ END IF
+ IF unsgn THEN typname2typ& = UBITTYPE + (b - 1) ELSE typname2typ& = BITTYPE + (b - 1)
+ EXIT FUNCTION
END IF
t = 0
@@ -20442,67 +20649,67 @@ IF ts$ = "&&" THEN t = INTEGER64TYPE
IF ts$ = "%&" THEN t = OFFSETTYPE
IF t THEN
-IF unsgn THEN t = t + ISUNSIGNED
-typname2typ& = t: EXIT FUNCTION
+ IF unsgn THEN t = t + ISUNSIGNED
+ typname2typ& = t: EXIT FUNCTION
END IF
'not a valid symbol
'type name?
FOR i = 1 TO LEN(t$)
-IF MID$(t$, i, 1) = sp THEN MID$(t$, i, 1) = " "
+ IF MID$(t$, i, 1) = sp THEN MID$(t$, i, 1) = " "
NEXT
IF t$ = "STRING" THEN typname2typ& = STRINGTYPE: EXIT FUNCTION
IF LEFT$(t$, 9) = "STRING * " THEN
-n$ = RIGHT$(t$, LEN(t$) - 9)
+ n$ = RIGHT$(t$, LEN(t$) - 9)
-'constant check 2011
-hashfound = 0
-hashname$ = n$
-hashchkflags = HASHFLAG_CONSTANT
-hashres = HashFindRev(hashname$, hashchkflags, hashresflags, hashresref)
-DO WHILE hashres
-IF constsubfunc(hashresref) = subfuncn OR constsubfunc(hashresref) = 0 THEN
-IF constdefined(hashresref) THEN
-hashfound = 1
-EXIT DO
-END IF
-END IF
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
-IF hashfound THEN
-i2 = hashresref
-t = consttype(i2)
-IF t AND ISSTRING THEN Give_Error "Expected STRING * numeric-constant": EXIT FUNCTION
-'convert value to general formats
-IF t AND ISFLOAT THEN
-v## = constfloat(i2)
-v&& = v##
-v~&& = v&&
-ELSE
-IF t AND ISUNSIGNED THEN
-v~&& = constuinteger(i2)
-v&& = v~&&
-v## = v&&
-ELSE
-v&& = constinteger(i2)
-v## = v&&
-v~&& = v&&
-END IF
-END IF
-IF v&& < 1 OR v&& > 9999999999 THEN Give_Error "STRING * out-of-range constant": EXIT FUNCTION
-b = v&&
-GOTO constantlenstr
-END IF
+ 'constant check 2011
+ hashfound = 0
+ hashname$ = n$
+ hashchkflags = HASHFLAG_CONSTANT
+ hashres = HashFindRev(hashname$, hashchkflags, hashresflags, hashresref)
+ DO WHILE hashres
+ IF constsubfunc(hashresref) = subfuncn OR constsubfunc(hashresref) = 0 THEN
+ IF constdefined(hashresref) THEN
+ hashfound = 1
+ EXIT DO
+ END IF
+ END IF
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
+ IF hashfound THEN
+ i2 = hashresref
+ t = consttype(i2)
+ IF t AND ISSTRING THEN Give_Error "Expected STRING * numeric-constant": EXIT FUNCTION
+ 'convert value to general formats
+ IF t AND ISFLOAT THEN
+ v## = constfloat(i2)
+ v&& = v##
+ v~&& = v&&
+ ELSE
+ IF t AND ISUNSIGNED THEN
+ v~&& = constuinteger(i2)
+ v&& = v~&&
+ v## = v&&
+ ELSE
+ v&& = constinteger(i2)
+ v## = v&&
+ v~&& = v&&
+ END IF
+ END IF
+ IF v&& < 1 OR v&& > 9999999999 THEN Give_Error "STRING * out-of-range constant": EXIT FUNCTION
+ b = v&&
+ GOTO constantlenstr
+ END IF
-IF isuinteger(n$) = 0 OR LEN(n$) > 10 THEN Give_Error "Invalid number/constant after STRING * type": EXIT FUNCTION
-b = VAL(n$)
-IF b = 0 OR LEN(n$) > 10 THEN Give_Error "Invalid number after STRING * type": EXIT FUNCTION
-constantlenstr:
-typname2typsize = b
-typname2typ& = STRINGTYPE + ISFIXEDLENGTH
-EXIT FUNCTION
+ IF isuinteger(n$) = 0 OR LEN(n$) > 10 THEN Give_Error "Invalid number/constant after STRING * type": EXIT FUNCTION
+ b = VAL(n$)
+ IF b = 0 OR LEN(n$) > 10 THEN Give_Error "Invalid number after STRING * type": EXIT FUNCTION
+ constantlenstr:
+ typname2typsize = b
+ typname2typ& = STRINGTYPE + ISFIXEDLENGTH
+ EXIT FUNCTION
END IF
IF t$ = "SINGLE" THEN typname2typ& = SINGLETYPE: EXIT FUNCTION
@@ -20510,19 +20717,19 @@ IF t$ = "DOUBLE" THEN typname2typ& = DOUBLETYPE: EXIT FUNCTION
IF t$ = "_FLOAT" THEN typname2typ& = FLOATTYPE: EXIT FUNCTION
IF LEFT$(t$, 10) = "_UNSIGNED " THEN u = 1: t$ = RIGHT$(t$, LEN(t$) - 10)
IF LEFT$(t$, 4) = "_BIT" THEN
-IF t$ = "_BIT" THEN
-IF u THEN typname2typ& = UBITTYPE ELSE typname2typ& = BITTYPE
-EXIT FUNCTION
-END IF
-IF LEFT$(t$, 7) <> "_BIT * " THEN Give_Error "Expected _BIT * number": EXIT FUNCTION
+ IF t$ = "_BIT" THEN
+ IF u THEN typname2typ& = UBITTYPE ELSE typname2typ& = BITTYPE
+ EXIT FUNCTION
+ END IF
+ IF LEFT$(t$, 7) <> "_BIT * " THEN Give_Error "Expected _BIT * number": EXIT FUNCTION
-n$ = RIGHT$(t$, LEN(t$) - 7)
-IF isuinteger(n$) = 0 THEN Give_Error "Invalid size after _BIT *": EXIT FUNCTION
-b = VAL(n$)
-IF b = 0 OR b > 56 THEN Give_Error "Invalid size after _BIT *": EXIT FUNCTION
-t = BITTYPE - 1 + b: IF u THEN t = t + ISUNSIGNED
-typname2typ& = t
-EXIT FUNCTION
+ n$ = RIGHT$(t$, LEN(t$) - 7)
+ IF isuinteger(n$) = 0 THEN Give_Error "Invalid size after _BIT *": EXIT FUNCTION
+ b = VAL(n$)
+ IF b = 0 OR b > 56 THEN Give_Error "Invalid size after _BIT *": EXIT FUNCTION
+ t = BITTYPE - 1 + b: IF u THEN t = t + ISUNSIGNED
+ typname2typ& = t
+ EXIT FUNCTION
END IF
t = 0
@@ -20532,18 +20739,18 @@ IF t$ = "LONG" THEN t = LONGTYPE
IF t$ = "_INTEGER64" THEN t = INTEGER64TYPE
IF t$ = "_OFFSET" THEN t = OFFSETTYPE
IF t THEN
-IF u THEN t = t + ISUNSIGNED
-typname2typ& = t
-EXIT FUNCTION
+ IF u THEN t = t + ISUNSIGNED
+ typname2typ& = t
+ EXIT FUNCTION
END IF
IF u THEN EXIT FUNCTION '_UNSIGNED (nothing)
'UDT?
FOR i = 1 TO lasttype
-IF t$ = RTRIM$(udtxname(i)) THEN
-typname2typ& = ISUDT + ISPOINTER + i
-EXIT FUNCTION
-END IF
+ IF t$ = RTRIM$(udtxname(i)) THEN
+ typname2typ& = ISUDT + ISPOINTER + i
+ EXIT FUNCTION
+ END IF
NEXT
'return 0 (failed)
@@ -20565,90 +20772,90 @@ n = numelements(label$)
IF n = 1 THEN
-'Note: Reserved words and internal sub/function names are invalid
-hashres = HashFind(label$, HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION, hashresflags, hashresref)
-DO WHILE hashres
-IF hashresflags AND (HASHFLAG_SUB + HASHFLAG_FUNCTION) THEN
-IF ids(hashresref).internal_subfunc THEN EXIT FUNCTION
+ 'Note: Reserved words and internal sub/function names are invalid
+ hashres = HashFind(label$, HASHFLAG_RESERVED + HASHFLAG_SUB + HASHFLAG_FUNCTION, hashresflags, hashresref)
+ DO WHILE hashres
+ IF hashresflags AND (HASHFLAG_SUB + HASHFLAG_FUNCTION) THEN
+ IF ids(hashresref).internal_subfunc THEN EXIT FUNCTION
-IF hashresflags AND HASHFLAG_SUB THEN 'could be a label or a sub call!
+ IF hashresflags AND HASHFLAG_SUB THEN 'could be a label or a sub call!
-'analyze format
-IF ASC(ids(hashresref).specialformat) = 32 THEN
-IF ids(hashresref).args = 0 THEN onecommandsub = 1 ELSE onecommandsub = 0
-ELSE
-IF ASC(ids(hashresref).specialformat) <> 91 THEN '"["
-onecommandsub = 0
-ELSE
-onecommandsub = 1
-a$ = RTRIM$(ids(hashresref).specialformat)
-b = 1
-FOR x = 2 TO LEN(a$)
-a = ASC(a$, x)
-IF a = 91 THEN b = b + 1
-IF a = 93 THEN b = b - 1
-IF b = 0 AND x <> LEN(a$) THEN onecommandsub = 0: EXIT FOR
-NEXT
-END IF
-END IF
-IF create <> 0 AND onecommandsub = 1 THEN
-IF INSTR(SubNameLabels$, sp + UCASE$(label$) + sp) = 0 THEN PossibleSubNameLabels$ = PossibleSubNameLabels$ + UCASE$(label$) + sp: EXIT FUNCTION 'treat as sub call
-END IF
+ 'analyze format
+ IF ASC(ids(hashresref).specialformat) = 32 THEN
+ IF ids(hashresref).args = 0 THEN onecommandsub = 1 ELSE onecommandsub = 0
+ ELSE
+ IF ASC(ids(hashresref).specialformat) <> 91 THEN '"["
+ onecommandsub = 0
+ ELSE
+ onecommandsub = 1
+ a$ = RTRIM$(ids(hashresref).specialformat)
+ b = 1
+ FOR x = 2 TO LEN(a$)
+ a = ASC(a$, x)
+ IF a = 91 THEN b = b + 1
+ IF a = 93 THEN b = b - 1
+ IF b = 0 AND x <> LEN(a$) THEN onecommandsub = 0: EXIT FOR
+ NEXT
+ END IF
+ END IF
+ IF create <> 0 AND onecommandsub = 1 THEN
+ IF INSTR(SubNameLabels$, sp + UCASE$(label$) + sp) = 0 THEN PossibleSubNameLabels$ = PossibleSubNameLabels$ + UCASE$(label$) + sp: EXIT FUNCTION 'treat as sub call
+ END IF
-END IF 'sub name
+ END IF 'sub name
-ELSE
-'reserved
-EXIT FUNCTION
-END IF
-IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
-LOOP
+ ELSE
+ 'reserved
+ EXIT FUNCTION
+ END IF
+ IF hashres <> 1 THEN hashres = HashFindCont(hashresflags, hashresref) ELSE hashres = 0
+ LOOP
-'Numeric label?
-'quasi numbers are possible, but:
-'a) They may only have one decimal place
-'b) They must be typed with the exact same characters to match
-t$ = label$
-'numeric?
-a = ASC(t$)
-IF (a >= 48 AND a <= 57) OR a = 46 THEN
+ 'Numeric label?
+ 'quasi numbers are possible, but:
+ 'a) They may only have one decimal place
+ 'b) They must be typed with the exact same characters to match
+ t$ = label$
+ 'numeric?
+ a = ASC(t$)
+ IF (a >= 48 AND a <= 57) OR a = 46 THEN
-'refer to original formatting if possible (eg. 1.10 not 1.1)
-x = INSTR(t$, CHR$(44))
-IF x THEN
-t$ = RIGHT$(t$, LEN(t$) - x)
-END IF
+ 'refer to original formatting if possible (eg. 1.10 not 1.1)
+ x = INSTR(t$, CHR$(44))
+ IF x THEN
+ t$ = RIGHT$(t$, LEN(t$) - x)
+ END IF
-'note: The symbols ! and # are valid trailing symbols in QBASIC, regardless of the number's size,
-' so they are allowed in QB64 for compatibility reasons
-addsymbol$ = removesymbol$(t$)
-IF Error_Happened THEN EXIT FUNCTION
-IF LEN(addsymbol$) THEN
-IF INSTR(addsymbol$, "$") THEN EXIT FUNCTION
-IF addsymbol$ <> "#" AND addsymbol$ <> "!" THEN addsymbol$ = ""
-END IF
+ 'note: The symbols ! and # are valid trailing symbols in QBASIC, regardless of the number's size,
+ ' so they are allowed in QB64 for compatibility reasons
+ addsymbol$ = removesymbol$(t$)
+ IF Error_Happened THEN EXIT FUNCTION
+ IF LEN(addsymbol$) THEN
+ IF INSTR(addsymbol$, "$") THEN EXIT FUNCTION
+ IF addsymbol$ <> "#" AND addsymbol$ <> "!" THEN addsymbol$ = ""
+ END IF
-IF a = 46 THEN dp = 1
-FOR x = 2 TO LEN(t$)
-a = ASC(MID$(t$, x, 1))
-IF a = 46 THEN dp = dp + 1
-IF (a < 48 OR a > 57) AND a <> 46 THEN EXIT FUNCTION 'not numeric
-NEXT x
-IF dp > 1 THEN EXIT FUNCTION 'too many decimal points
-IF dp = 1 AND LEN(t$) = 1 THEN EXIT FUNCTION 'cant have '.' as a label
+ IF a = 46 THEN dp = 1
+ FOR x = 2 TO LEN(t$)
+ a = ASC(MID$(t$, x, 1))
+ IF a = 46 THEN dp = dp + 1
+ IF (a < 48 OR a > 57) AND a <> 46 THEN EXIT FUNCTION 'not numeric
+ NEXT x
+ IF dp > 1 THEN EXIT FUNCTION 'too many decimal points
+ IF dp = 1 AND LEN(t$) = 1 THEN EXIT FUNCTION 'cant have '.' as a label
-tlayout$ = t$ + addsymbol$
+ tlayout$ = t$ + addsymbol$
-i = INSTR(t$, "."): IF i THEN MID$(t$, i, 1) = "p"
-IF addsymbol$ = "#" THEN t$ = t$ + "d"
-IF addsymbol$ = "!" THEN t$ = t$ + "s"
+ i = INSTR(t$, "."): IF i THEN MID$(t$, i, 1) = "p"
+ IF addsymbol$ = "#" THEN t$ = t$ + "d"
+ IF addsymbol$ = "!" THEN t$ = t$ + "s"
-IF LEN(t$) > 40 THEN EXIT FUNCTION
+ IF LEN(t$) > 40 THEN EXIT FUNCTION
-LABEL2$ = t$
-validlabel = 1
-EXIT FUNCTION
-END IF 'numeric
+ LABEL2$ = t$
+ validlabel = 1
+ EXIT FUNCTION
+ END IF 'numeric
END IF 'n=1
@@ -20658,8 +20865,8 @@ END IF 'n=1
'structure check (???.???.???.???)
IF (n AND 1) = 0 THEN EXIT FUNCTION 'must be an odd number of elements
FOR nx = 2 TO n - 1 STEP 2
-a$ = getelement$(LABEL2$, nx)
-IF a$ <> "." THEN EXIT FUNCTION 'every 2nd element must be a period
+ a$ = getelement$(LABEL2$, nx)
+ IF a$ <> "." THEN EXIT FUNCTION 'every 2nd element must be a period
NEXT
'cannot begin with numeric
@@ -20668,15 +20875,15 @@ c = ASC(clabel$): IF c >= 48 AND c <= 57 THEN EXIT FUNCTION
'elements check
label3$ = ""
FOR nx = 1 TO n STEP 2
-label$ = getelement$(clabel$, nx)
+ label$ = getelement$(clabel$, nx)
-'alpha-numeric?
-FOR x = 1 TO LEN(label$)
-IF alphanumeric(ASC(label$, x)) = 0 THEN EXIT FUNCTION
-NEXT
+ 'alpha-numeric?
+ FOR x = 1 TO LEN(label$)
+ IF alphanumeric(ASC(label$, x)) = 0 THEN EXIT FUNCTION
+ NEXT
-'build label
-IF label3$ = "" THEN label3$ = UCASE$(label$): tlayout$ = label$ ELSE label3$ = label3$ + fix046$ + UCASE$(label$): tlayout$ = tlayout$ + "." + label$
+ 'build label
+ IF label3$ = "" THEN label3$ = UCASE$(label$): tlayout$ = label$ ELSE label3$ = label3$ + fix046$ + UCASE$(label$): tlayout$ = tlayout$ + "." + label$
NEXT nx
validlabel = 1
@@ -20715,14 +20922,14 @@ IF n = 2 THEN Give_Error "Expected # ... , ...": EXIT SUB
a3$ = ""
b = 0
FOR i = 3 TO n
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF a2$ = "," AND b = 0 THEN
-IF a3$ = "" THEN Give_Error "Expected # ... , ...": EXIT SUB
-GOTO printgotfn
-END IF
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF a2$ = "," AND b = 0 THEN
+ IF a3$ = "" THEN Give_Error "Expected # ... , ...": EXIT SUB
+ GOTO printgotfn
+ END IF
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
NEXT
Give_Error "Expected # ... ,": EXIT SUB
printgotfn:
@@ -20737,190 +20944,190 @@ i = i + 1
'PRINT USING? (file)
IF n >= i THEN
-IF getelement(a$, i) = "USING" THEN
-'get format string
-fpujump:
-l$ = l$ + sp + "USING"
-e$ = "": b = 0: puformat$ = ""
-FOR i = i + 1 TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = "," THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
-IF a2$ = ";" THEN
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-l$ = l$ + sp + tlayout$ + sp2 + ";"
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISSTRING) = 0 THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
-puformat$ = e$
-EXIT FOR
-END IF ';
-END IF 'b
-IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-NEXT
-IF puformat$ = "" THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
-IF i = n THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
-'create build string
-PRINT #12, "tqbs=qbs_new(0,0);"
-'set format start/index variable
-PRINT #12, "tmp_long=0;" 'scan format from beginning
-'create string to hold format in for multiple references
-puf$ = "print_using_format" + u$
-IF subfunc = "" THEN
-PRINT #13, "static qbs *" + puf$ + ";"
-ELSE
-PRINT #13, "qbs *" + puf$ + ";"
-END IF
-PRINT #12, puf$ + "=qbs_new(0,0); qbs_set(" + puf$ + "," + puformat$ + ");"
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-'print expressions
-b = 0
-e$ = ""
-last = 0
-FOR i = i + 1 TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = ";" OR a2$ = "," THEN
-fprintulast:
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-IF typ AND ISSTRING THEN
+ IF getelement(a$, i) = "USING" THEN
+ 'get format string
+ fpujump:
+ l$ = l$ + sp + "USING"
+ e$ = "": b = 0: puformat$ = ""
+ FOR i = i + 1 TO n
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = "," THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
+ IF a2$ = ";" THEN
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ l$ = l$ + sp + tlayout$ + sp2 + ";"
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISSTRING) = 0 THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
+ puformat$ = e$
+ EXIT FOR
+ END IF ';
+ END IF 'b
+ IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ NEXT
+ IF puformat$ = "" THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
+ IF i = n THEN Give_Error "Expected PRINT USING #filenumber, formatstring ; ...": EXIT SUB
+ 'create build string
+ PRINT #12, "tqbs=qbs_new(0,0);"
+ 'set format start/index variable
+ PRINT #12, "tmp_long=0;" 'scan format from beginning
+ 'create string to hold format in for multiple references
+ puf$ = "print_using_format" + u$
+ IF subfunc = "" THEN
+ PRINT #13, "static qbs *" + puf$ + ";"
+ ELSE
+ PRINT #13, "qbs *" + puf$ + ";"
+ END IF
+ PRINT #12, puf$ + "=qbs_new(0,0); qbs_set(" + puf$ + "," + puformat$ + ");"
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ 'print expressions
+ b = 0
+ e$ = ""
+ last = 0
+ FOR i = i + 1 TO n
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = ";" OR a2$ = "," THEN
+ fprintulast:
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ IF typ AND ISSTRING THEN
-IF LEFT$(e$, 9) = "func_tab(" OR LEFT$(e$, 9) = "func_spc(" THEN
+ IF LEFT$(e$, 9) = "func_tab(" OR LEFT$(e$, 9) = "func_spc(" THEN
-'TAB/SPC exception
-'note: position in format-string must be maintained
-'-print any string up until now
-PRINT #12, "sub_file_print(tmp_fileno,tqbs,0,0,0);"
-'-print e$
-PRINT #12, "qbs_set(tqbs," + e$ + ");"
-PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
-PRINT #12, "sub_file_print(tmp_fileno,tqbs,0,0,0);"
-'-set length of tqbs to 0
-PRINT #12, "tqbs->len=0;"
+ 'TAB/SPC exception
+ 'note: position in format-string must be maintained
+ '-print any string up until now
+ PRINT #12, "sub_file_print(tmp_fileno,tqbs,0,0,0);"
+ '-print e$
+ PRINT #12, "qbs_set(tqbs," + e$ + ");"
+ PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
+ PRINT #12, "sub_file_print(tmp_fileno,tqbs,0,0,0);"
+ '-set length of tqbs to 0
+ PRINT #12, "tqbs->len=0;"
-ELSE
+ ELSE
-'regular string
-PRINT #12, "tmp_long=print_using(" + puf$ + ",tmp_long,tqbs," + e$ + ");"
+ 'regular string
+ PRINT #12, "tmp_long=print_using(" + puf$ + ",tmp_long,tqbs," + e$ + ");"
-END IF
+ END IF
-ELSE 'not a string
-IF typ AND ISFLOAT THEN
-IF (typ AND 511) = 32 THEN PRINT #12, "tmp_long=print_using_single(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-IF (typ AND 511) = 64 THEN PRINT #12, "tmp_long=print_using_double(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-IF (typ AND 511) > 64 THEN PRINT #12, "tmp_long=print_using_float(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-ELSE
-IF ((typ AND 511) = 64) AND (typ AND ISUNSIGNED) <> 0 THEN
-PRINT #12, "tmp_long=print_using_uinteger64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-ELSE
-PRINT #12, "tmp_long=print_using_integer64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-END IF
-END IF
-END IF 'string/not string
-PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
-e$ = ""
-IF last THEN EXIT FOR
-GOTO fprintunext
-END IF
-END IF
-IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-fprintunext:
-NEXT
-IF e$ <> "" THEN a2$ = "": last = 1: GOTO fprintulast
-PRINT #12, "skip_pu" + u$ + ":"
-'check for errors
-PRINT #12, "if (new_error){"
-PRINT #12, "g_tmp_long=new_error; new_error=0; sub_file_print(tmp_fileno,tqbs,0,0,0); new_error=g_tmp_long;"
-PRINT #12, "}else{"
-IF a2$ = "," OR a2$ = ";" THEN nl = 0 ELSE nl = 1 'note: a2$ is set to the last element of a$
-PRINT #12, "sub_file_print(tmp_fileno,tqbs,0,0," + str2$(nl) + ");"
-PRINT #12, "}"
-PRINT #12, "qbs_free(tqbs);"
-PRINT #12, "qbs_free(" + puf$ + ");"
-PRINT #12, "skip" + u$ + ":"
-PRINT #12, cleanupstringprocessingcall$ + "0);"
-PRINT #12, "tab_spc_cr_size=1;"
-tlayout$ = l$
-EXIT SUB
-END IF
+ ELSE 'not a string
+ IF typ AND ISFLOAT THEN
+ IF (typ AND 511) = 32 THEN PRINT #12, "tmp_long=print_using_single(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ IF (typ AND 511) = 64 THEN PRINT #12, "tmp_long=print_using_double(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ IF (typ AND 511) > 64 THEN PRINT #12, "tmp_long=print_using_float(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ ELSE
+ IF ((typ AND 511) = 64) AND (typ AND ISUNSIGNED) <> 0 THEN
+ PRINT #12, "tmp_long=print_using_uinteger64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ ELSE
+ PRINT #12, "tmp_long=print_using_integer64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ END IF
+ END IF
+ END IF 'string/not string
+ PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
+ e$ = ""
+ IF last THEN EXIT FOR
+ GOTO fprintunext
+ END IF
+ END IF
+ IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ fprintunext:
+ NEXT
+ IF e$ <> "" THEN a2$ = "": last = 1: GOTO fprintulast
+ PRINT #12, "skip_pu" + u$ + ":"
+ 'check for errors
+ PRINT #12, "if (new_error){"
+ PRINT #12, "g_tmp_long=new_error; new_error=0; sub_file_print(tmp_fileno,tqbs,0,0,0); new_error=g_tmp_long;"
+ PRINT #12, "}else{"
+ IF a2$ = "," OR a2$ = ";" THEN nl = 0 ELSE nl = 1 'note: a2$ is set to the last element of a$
+ PRINT #12, "sub_file_print(tmp_fileno,tqbs,0,0," + str2$(nl) + ");"
+ PRINT #12, "}"
+ PRINT #12, "qbs_free(tqbs);"
+ PRINT #12, "qbs_free(" + puf$ + ");"
+ PRINT #12, "skip" + u$ + ":"
+ PRINT #12, cleanupstringprocessingcall$ + "0);"
+ PRINT #12, "tab_spc_cr_size=1;"
+ tlayout$ = l$
+ EXIT SUB
+ END IF
END IF
'end of print using code
IF i > n THEN
-PRINT #12, "sub_file_print(tmp_fileno,nothingstring,0,0,1);"
-GOTO printblankline
+ PRINT #12, "sub_file_print(tmp_fileno,nothingstring,0,0,1);"
+ GOTO printblankline
END IF
b = 0
e$ = ""
last = 0
FOR i = i TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = ";" OR a2$ = "," OR UCASE$(a2$) = "USING" THEN
-printfilelast:
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = ";" OR a2$ = "," OR UCASE$(a2$) = "USING" THEN
+ printfilelast:
-IF UCASE$(a2$) = "USING" THEN
-IF e$ <> "" THEN gotofpu = 1 ELSE GOTO fpujump
-END IF
+ IF UCASE$(a2$) = "USING" THEN
+ IF e$ <> "" THEN gotofpu = 1 ELSE GOTO fpujump
+ END IF
-IF a2$ = "," THEN usetab = 1 ELSE usetab = 0
-IF last = 1 THEN newline = 1 ELSE newline = 0
-extraspace = 0
+ IF a2$ = "," THEN usetab = 1 ELSE usetab = 0
+ IF last = 1 THEN newline = 1 ELSE newline = 0
+ extraspace = 0
-IF LEN(e$) THEN
-ebak$ = e$
-pnrtnum = 0
-printfilenumber:
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-IF pnrtnum = 0 THEN
-IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
-END IF
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISSTRING) = 0 THEN
-e$ = "STR$" + sp + "(" + sp + ebak$ + sp + ")"
-extraspace = 1
-pnrtnum = 1
-GOTO printfilenumber 'force re-evaluation
-END IF
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-'format: string, (1/0) extraspace, (1/0) tab, (1/0)begin a new line
-PRINT #12, "sub_file_print(tmp_fileno," + e$ + ","; extraspace; ","; usetab; ","; newline; ");"
-ELSE 'len(e$)=0
-IF a2$ = "," THEN l$ = l$ + sp + a2$
-IF a2$ = ";" THEN
-IF RIGHT$(l$, 1) <> ";" THEN l$ = l$ + sp + a2$ 'concat ;; to ;
-END IF
-IF usetab THEN PRINT #12, "sub_file_print(tmp_fileno,nothingstring,0,1,0);"
-END IF 'len(e$)
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ IF LEN(e$) THEN
+ ebak$ = e$
+ pnrtnum = 0
+ printfilenumber:
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ IF pnrtnum = 0 THEN
+ IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
+ END IF
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISSTRING) = 0 THEN
+ e$ = "STR$" + sp + "(" + sp + ebak$ + sp + ")"
+ extraspace = 1
+ pnrtnum = 1
+ GOTO printfilenumber 'force re-evaluation
+ END IF
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ 'format: string, (1/0) extraspace, (1/0) tab, (1/0)begin a new line
+ PRINT #12, "sub_file_print(tmp_fileno," + e$ + ","; extraspace; ","; usetab; ","; newline; ");"
+ ELSE 'len(e$)=0
+ IF a2$ = "," THEN l$ = l$ + sp + a2$
+ IF a2$ = ";" THEN
+ IF RIGHT$(l$, 1) <> ";" THEN l$ = l$ + sp + a2$ 'concat ;; to ;
+ END IF
+ IF usetab THEN PRINT #12, "sub_file_print(tmp_fileno,nothingstring,0,1,0);"
+ END IF 'len(e$)
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
-e$ = ""
-IF gotofpu THEN GOTO fpujump
-IF last THEN EXIT FOR
-GOTO printfilenext
-END IF ', or ;
-END IF 'b=0
-IF e$ <> "" THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-printfilenext:
+ e$ = ""
+ IF gotofpu THEN GOTO fpujump
+ IF last THEN EXIT FOR
+ GOTO printfilenext
+ END IF ', or ;
+ END IF 'b=0
+ IF e$ <> "" THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ printfilenext:
NEXT
IF e$ <> "" THEN a2$ = "": last = 1: GOTO printfilelast
printblankline:
@@ -20938,14 +21145,14 @@ IF n = 2 THEN Give_Error "Expected # ...": EXIT SUB
a3$ = ""
b = 0
FOR i = 3 TO n
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF a2$ = "," AND b = 0 THEN
-IF a3$ = "" THEN Give_Error "Expected # ... , ...": EXIT SUB
-GOTO writegotfn
-END IF
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF a2$ = "," AND b = 0 THEN
+ IF a3$ = "" THEN Give_Error "Expected # ... , ...": EXIT SUB
+ GOTO writegotfn
+ END IF
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
NEXT
Give_Error "Expected # ... ,": EXIT SUB
writegotfn:
@@ -20958,56 +21165,56 @@ PRINT #12, "tab_fileno=tmp_fileno=" + e$ + ";"
PRINT #12, "if (new_error) goto skip" + u$ + ";"
i = i + 1
IF i > n THEN
-PRINT #12, "sub_file_print(tmp_fileno,nothingstring,0,0,1);"
-GOTO writeblankline
+ PRINT #12, "sub_file_print(tmp_fileno,nothingstring,0,0,1);"
+ GOTO writeblankline
END IF
b = 0
e$ = ""
last = 0
FOR i = i TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = "," THEN
-writefilelast:
-IF last = 1 THEN newline = 1 ELSE newline = 0
-ebak$ = e$
-reevaled = 0
-writefilenumber:
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-IF reevaled = 0 THEN
-l$ = l$ + sp + tlayout$
-IF last = 0 THEN l$ = l$ + sp2 + ","
-END IF
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF reevaled = 0 THEN
-IF (typ AND ISSTRING) = 0 THEN
-e$ = "LTRIM$" + sp + "(" + sp + "STR$" + sp + "(" + sp + ebak$ + sp + ")" + sp + ")"
-IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
-reevaled = 1
-GOTO writefilenumber 'force re-evaluation
-ELSE
-e$ = CHR$(34) + "\042" + CHR$(34) + ",1" + sp + "+" + sp + ebak$ + sp + "+" + sp + CHR$(34) + "\042" + CHR$(34) + ",1"
-IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
-reevaled = 1
-GOTO writefilenumber 'force re-evaluation
-END IF
-END IF
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-'format: string, (1/0) extraspace, (1/0) tab, (1/0)begin a new line
-PRINT #12, "sub_file_print(tmp_fileno," + e$ + ",0,0,"; newline; ");"
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-e$ = ""
-IF last THEN EXIT FOR
-GOTO writefilenext
-END IF ',
-END IF 'b=0
-IF e$ <> "" THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-writefilenext:
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = "," THEN
+ writefilelast:
+ IF last = 1 THEN newline = 1 ELSE newline = 0
+ ebak$ = e$
+ reevaled = 0
+ writefilenumber:
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ IF reevaled = 0 THEN
+ l$ = l$ + sp + tlayout$
+ IF last = 0 THEN l$ = l$ + sp2 + ","
+ END IF
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF reevaled = 0 THEN
+ IF (typ AND ISSTRING) = 0 THEN
+ e$ = "LTRIM$" + sp + "(" + sp + "STR$" + sp + "(" + sp + ebak$ + sp + ")" + sp + ")"
+ IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
+ reevaled = 1
+ GOTO writefilenumber 'force re-evaluation
+ ELSE
+ e$ = CHR$(34) + "\042" + CHR$(34) + ",1" + sp + "+" + sp + ebak$ + sp + "+" + sp + CHR$(34) + "\042" + CHR$(34) + ",1"
+ IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
+ reevaled = 1
+ GOTO writefilenumber 'force re-evaluation
+ END IF
+ END IF
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ 'format: string, (1/0) extraspace, (1/0) tab, (1/0)begin a new line
+ PRINT #12, "sub_file_print(tmp_fileno," + e$ + ",0,0,"; newline; ");"
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ e$ = ""
+ IF last THEN EXIT FOR
+ GOTO writefilenext
+ END IF ',
+ END IF 'b=0
+ IF e$ <> "" THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ writefilenext:
NEXT
IF e$ <> "" THEN a2$ = ",": last = 1: GOTO writefilelast
writeblankline:
@@ -21026,25 +21233,25 @@ v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
x = 1
labchk200:
IF v THEN
-s = Labels(r).Scope
-IF s = subfuncn OR s = -1 THEN 'same scope?
-IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk200
-END IF
+ s = Labels(r).Scope
+ IF s = subfuncn OR s = -1 THEN 'same scope?
+ IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk200
+ END IF
END IF
IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd a2$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = subfuncn
-Labels(r).Error_Line = linenumber
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd a2$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = subfuncn
+ Labels(r).Error_Line = linenumber
END IF 'x
l$ = "GOSUB" + sp + tlayout$
@@ -21067,10 +21274,10 @@ IF n < 4 THEN Give_Error "Expected ON expression GOTO/GOSUB label,label,...": EX
l$ = "ON"
b = 0
FOR i = 2 TO n
-e2$ = getelement$(a$, i)
-IF e2$ = "(" THEN b = b + 1
-IF e2$ = ")" THEN b = b - 1
-IF e2$ = "GOTO" OR e2$ = "GOSUB" THEN EXIT FOR
+ e2$ = getelement$(a$, i)
+ IF e2$ = "(" THEN b = b + 1
+ IF e2$ = ")" THEN b = b - 1
+ IF e2$ = "GOTO" OR e2$ = "GOSUB" THEN EXIT FOR
NEXT
IF i >= n OR i = 2 THEN Give_Error "Expected ON expression GOTO/GOSUB label,label,...": EXIT SUB
e$ = getelements$(ca$, 2, i - 1)
@@ -21085,7 +21292,7 @@ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
IF Error_Happened THEN EXIT SUB
IF (typ AND ISSTRING) THEN Give_Error "Expected numeric expression": EXIT SUB
IF (typ AND ISFLOAT) THEN
-e$ = "qbr_float_to_long(" + e$ + ")"
+ e$ = "qbr_float_to_long(" + e$ + ")"
END IF
l$ = l$ + sp + e2$
u$ = str2$(uniquenumber)
@@ -21094,63 +21301,63 @@ PRINT #12, "ongo_" + u$ + "=" + e$ + ";"
ln = 1
labelwaslast = 0
FOR i = i + 1 TO n
-e$ = getelement$(ca$, i)
-IF e$ = "," THEN
-l$ = l$ + sp2 + ","
-IF i = n THEN Give_Error "Trailing , invalid": EXIT SUB
-ln = ln + 1
-labelwaslast = 0
-ELSE
-IF labelwaslast THEN Give_Error "Expected ,": EXIT SUB
-IF validlabel(e$) = 0 THEN Give_Error "Invalid label!": EXIT SUB
+ e$ = getelement$(ca$, i)
+ IF e$ = "," THEN
+ l$ = l$ + sp2 + ","
+ IF i = n THEN Give_Error "Trailing , invalid": EXIT SUB
+ ln = ln + 1
+ labelwaslast = 0
+ ELSE
+ IF labelwaslast THEN Give_Error "Expected ,": EXIT SUB
+ IF validlabel(e$) = 0 THEN Give_Error "Invalid label!": EXIT SUB
-v = HashFind(e$, HASHFLAG_LABEL, ignore, r)
-x = 1
-labchk507:
-IF v THEN
-s = Labels(r).Scope
-IF s = subfuncn OR s = -1 THEN 'same scope?
-IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
-x = 0 'already defined
-tlayout$ = RTRIM$(Labels(r).cn)
-ELSE
-IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk507
-END IF
-END IF
-IF x THEN
-'does not exist
-nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
-Labels(nLabels) = Empty_Label
-HashAdd e$, HASHFLAG_LABEL, nLabels
-r = nLabels
-Labels(r).State = 0
-Labels(r).cn = tlayout$
-Labels(r).Scope = subfuncn
-Labels(r).Error_Line = linenumber
-END IF 'x
+ v = HashFind(e$, HASHFLAG_LABEL, ignore, r)
+ x = 1
+ labchk507:
+ IF v THEN
+ s = Labels(r).Scope
+ IF s = subfuncn OR s = -1 THEN 'same scope?
+ IF s = -1 THEN Labels(r).Scope = subfuncn 'acquire scope
+ x = 0 'already defined
+ tlayout$ = RTRIM$(Labels(r).cn)
+ ELSE
+ IF v = 2 THEN v = HashFindCont(ignore, r): GOTO labchk507
+ END IF
+ END IF
+ IF x THEN
+ 'does not exist
+ nLabels = nLabels + 1: IF nLabels > Labels_Ubound THEN Labels_Ubound = Labels_Ubound * 2: REDIM _PRESERVE Labels(1 TO Labels_Ubound) AS Label_Type
+ Labels(nLabels) = Empty_Label
+ HashAdd e$, HASHFLAG_LABEL, nLabels
+ r = nLabels
+ Labels(r).State = 0
+ Labels(r).cn = tlayout$
+ Labels(r).Scope = subfuncn
+ Labels(r).Error_Line = linenumber
+ END IF 'x
-l$ = l$ + sp + tlayout$
-IF g THEN 'gosub
-lb$ = e$
-PRINT #12, "if (ongo_" + u$ + "==" + str2$(ln) + "){"
-'note: This code fragment also used by ON ... GOTO/GOSUB
-'assume label is reachable (revise)
-PRINT #12, "return_point[next_return_point++]=" + str2(gosubid) + ";"
-PRINT #12, "if (next_return_point>=return_points) more_return_points();"
-PRINT #12, "goto LABEL_" + lb$ + ";"
-'add return point jump
-PRINT #15, "case " + str2(gosubid) + ":"
-PRINT #15, "goto RETURN_" + str2(gosubid) + ";"
-PRINT #15, "break;"
-PRINT #12, "RETURN_" + str2(gosubid) + ":;"
-gosubid = gosubid + 1
-PRINT #12, "goto ongo_" + u$ + "_skip;"
-PRINT #12, "}"
-ELSE 'goto
-PRINT #12, "if (ongo_" + u$ + "==" + str2$(ln) + ") goto LABEL_" + e$ + ";"
-END IF
-labelwaslast = 1
-END IF
+ l$ = l$ + sp + tlayout$
+ IF g THEN 'gosub
+ lb$ = e$
+ PRINT #12, "if (ongo_" + u$ + "==" + str2$(ln) + "){"
+ 'note: This code fragment also used by ON ... GOTO/GOSUB
+ 'assume label is reachable (revise)
+ PRINT #12, "return_point[next_return_point++]=" + str2(gosubid) + ";"
+ PRINT #12, "if (next_return_point>=return_points) more_return_points();"
+ PRINT #12, "goto LABEL_" + lb$ + ";"
+ 'add return point jump
+ PRINT #15, "case " + str2(gosubid) + ":"
+ PRINT #15, "goto RETURN_" + str2(gosubid) + ";"
+ PRINT #15, "break;"
+ PRINT #12, "RETURN_" + str2(gosubid) + ":;"
+ gosubid = gosubid + 1
+ PRINT #12, "goto ongo_" + u$ + "_skip;"
+ PRINT #12, "}"
+ ELSE 'goto
+ PRINT #12, "if (ongo_" + u$ + "==" + str2$(ln) + ") goto LABEL_" + e$ + ";"
+ END IF
+ labelwaslast = 1
+ END IF
NEXT
PRINT #12, "if (ongo_" + u$ + "<0) error(5);"
IF g = 1 THEN PRINT #12, "ongo_" + u$ + "_skip:;"
@@ -21165,133 +21372,133 @@ IF ASC(a$) = 76 THEN lp = 1: lp$ = "l": l$ = "LPRINT": PRINT #12, "tab_LPRINT=1;
'PRINT USING?
IF n >= 2 THEN
-IF getelement(a$, 2) = "USING" THEN
-'get format string
-i = 3
-pujump:
-l$ = l$ + sp + "USING"
-e$ = "": b = 0: puformat$ = ""
-FOR i = i TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = "," THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
-IF a2$ = ";" THEN
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-l$ = l$ + sp + tlayout$ + sp2 + ";"
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISSTRING) = 0 THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
-puformat$ = e$
-EXIT FOR
-END IF ';
-END IF 'b
-IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-NEXT
-IF puformat$ = "" THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
-IF i = n THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
-'create build string
-PRINT #12, "tqbs=qbs_new(0,0);"
-'set format start/index variable
-PRINT #12, "tmp_long=0;" 'scan format from beginning
+ IF getelement(a$, 2) = "USING" THEN
+ 'get format string
+ i = 3
+ pujump:
+ l$ = l$ + sp + "USING"
+ e$ = "": b = 0: puformat$ = ""
+ FOR i = i TO n
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = "," THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
+ IF a2$ = ";" THEN
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ l$ = l$ + sp + tlayout$ + sp2 + ";"
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISSTRING) = 0 THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
+ puformat$ = e$
+ EXIT FOR
+ END IF ';
+ END IF 'b
+ IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ NEXT
+ IF puformat$ = "" THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
+ IF i = n THEN Give_Error "Expected PRINT USING formatstring ; ...": EXIT SUB
+ 'create build string
+ PRINT #12, "tqbs=qbs_new(0,0);"
+ 'set format start/index variable
+ PRINT #12, "tmp_long=0;" 'scan format from beginning
-'create string to hold format in for multiple references
-puf$ = "print_using_format" + u$
-IF subfunc = "" THEN
-PRINT #13, "static qbs *" + puf$ + ";"
-ELSE
-PRINT #13, "qbs *" + puf$ + ";"
-END IF
-PRINT #12, puf$ + "=qbs_new(0,0); qbs_set(" + puf$ + "," + puformat$ + ");"
-PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
+ 'create string to hold format in for multiple references
+ puf$ = "print_using_format" + u$
+ IF subfunc = "" THEN
+ PRINT #13, "static qbs *" + puf$ + ";"
+ ELSE
+ PRINT #13, "qbs *" + puf$ + ";"
+ END IF
+ PRINT #12, puf$ + "=qbs_new(0,0); qbs_set(" + puf$ + "," + puformat$ + ");"
+ PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
-'print expressions
-b = 0
-e$ = ""
-last = 0
-FOR i = i + 1 TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = ";" OR a2$ = "," THEN
-printulast:
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-IF typ AND ISSTRING THEN
+ 'print expressions
+ b = 0
+ e$ = ""
+ last = 0
+ FOR i = i + 1 TO n
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = ";" OR a2$ = "," THEN
+ printulast:
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ IF typ AND ISSTRING THEN
-IF LEFT$(e$, 9) = "func_tab(" OR LEFT$(e$, 9) = "func_spc(" THEN
+ IF LEFT$(e$, 9) = "func_tab(" OR LEFT$(e$, 9) = "func_spc(" THEN
-'TAB/SPC exception
-'note: position in format-string must be maintained
-'-print any string up until now
-PRINT #12, "qbs_" + lp$ + "print(tqbs,0);"
-'-print e$
-PRINT #12, "qbs_set(tqbs," + e$ + ");"
-PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
-IF lp THEN PRINT #12, "lprint_makefit(tqbs);" ELSE PRINT #12, "makefit(tqbs);"
-PRINT #12, "qbs_" + lp$ + "print(tqbs,0);"
-'-set length of tqbs to 0
-PRINT #12, "tqbs->len=0;"
+ 'TAB/SPC exception
+ 'note: position in format-string must be maintained
+ '-print any string up until now
+ PRINT #12, "qbs_" + lp$ + "print(tqbs,0);"
+ '-print e$
+ PRINT #12, "qbs_set(tqbs," + e$ + ");"
+ PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
+ IF lp THEN PRINT #12, "lprint_makefit(tqbs);" ELSE PRINT #12, "makefit(tqbs);"
+ PRINT #12, "qbs_" + lp$ + "print(tqbs,0);"
+ '-set length of tqbs to 0
+ PRINT #12, "tqbs->len=0;"
-ELSE
+ ELSE
-'regular string
-PRINT #12, "tmp_long=print_using(" + puf$ + ",tmp_long,tqbs," + e$ + ");"
+ 'regular string
+ PRINT #12, "tmp_long=print_using(" + puf$ + ",tmp_long,tqbs," + e$ + ");"
-END IF
+ END IF
-ELSE 'not a string
-IF typ AND ISFLOAT THEN
-IF (typ AND 511) = 32 THEN PRINT #12, "tmp_long=print_using_single(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-IF (typ AND 511) = 64 THEN PRINT #12, "tmp_long=print_using_double(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-IF (typ AND 511) > 64 THEN PRINT #12, "tmp_long=print_using_float(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-ELSE
-IF ((typ AND 511) = 64) AND (typ AND ISUNSIGNED) <> 0 THEN
-PRINT #12, "tmp_long=print_using_uinteger64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-ELSE
-PRINT #12, "tmp_long=print_using_integer64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
-END IF
-END IF
-END IF 'string/not string
-PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
-e$ = ""
-IF last THEN EXIT FOR
-GOTO printunext
-END IF
-END IF
-IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-printunext:
-NEXT
-IF e$ <> "" THEN a2$ = "": last = 1: GOTO printulast
-PRINT #12, "skip_pu" + u$ + ":"
-'check for errors
-PRINT #12, "if (new_error){"
-PRINT #12, "g_tmp_long=new_error; new_error=0; qbs_" + lp$ + "print(tqbs,0); new_error=g_tmp_long;"
-PRINT #12, "}else{"
-IF a2$ = "," OR a2$ = ";" THEN nl = 0 ELSE nl = 1 'note: a2$ is set to the last element of a$
-PRINT #12, "qbs_" + lp$ + "print(tqbs," + str2$(nl) + ");"
-PRINT #12, "}"
-PRINT #12, "qbs_free(tqbs);"
-PRINT #12, "qbs_free(" + puf$ + ");"
-PRINT #12, "skip" + u$ + ":"
-PRINT #12, cleanupstringprocessingcall$ + "0);"
-IF lp THEN PRINT #12, "tab_LPRINT=0;"
-tlayout$ = l$
-EXIT SUB
-END IF
+ ELSE 'not a string
+ IF typ AND ISFLOAT THEN
+ IF (typ AND 511) = 32 THEN PRINT #12, "tmp_long=print_using_single(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ IF (typ AND 511) = 64 THEN PRINT #12, "tmp_long=print_using_double(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ IF (typ AND 511) > 64 THEN PRINT #12, "tmp_long=print_using_float(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ ELSE
+ IF ((typ AND 511) = 64) AND (typ AND ISUNSIGNED) <> 0 THEN
+ PRINT #12, "tmp_long=print_using_uinteger64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ ELSE
+ PRINT #12, "tmp_long=print_using_integer64(" + puf$ + "," + e$ + ",tmp_long,tqbs);"
+ END IF
+ END IF
+ END IF 'string/not string
+ PRINT #12, "if (new_error) goto skip_pu" + u$ + ";"
+ e$ = ""
+ IF last THEN EXIT FOR
+ GOTO printunext
+ END IF
+ END IF
+ IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ printunext:
+ NEXT
+ IF e$ <> "" THEN a2$ = "": last = 1: GOTO printulast
+ PRINT #12, "skip_pu" + u$ + ":"
+ 'check for errors
+ PRINT #12, "if (new_error){"
+ PRINT #12, "g_tmp_long=new_error; new_error=0; qbs_" + lp$ + "print(tqbs,0); new_error=g_tmp_long;"
+ PRINT #12, "}else{"
+ IF a2$ = "," OR a2$ = ";" THEN nl = 0 ELSE nl = 1 'note: a2$ is set to the last element of a$
+ PRINT #12, "qbs_" + lp$ + "print(tqbs," + str2$(nl) + ");"
+ PRINT #12, "}"
+ PRINT #12, "qbs_free(tqbs);"
+ PRINT #12, "qbs_free(" + puf$ + ");"
+ PRINT #12, "skip" + u$ + ":"
+ PRINT #12, cleanupstringprocessingcall$ + "0);"
+ IF lp THEN PRINT #12, "tab_LPRINT=0;"
+ tlayout$ = l$
+ EXIT SUB
+ END IF
END IF
'end of print using code
@@ -21299,64 +21506,64 @@ b = 0
e$ = ""
last = 0
FOR i = 2 TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = ";" OR a2$ = "," OR UCASE$(a2$) = "USING" THEN
-printlast:
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = ";" OR a2$ = "," OR UCASE$(a2$) = "USING" THEN
+ printlast:
-IF UCASE$(a2$) = "USING" THEN
-IF e$ <> "" THEN gotopu = 1 ELSE i = i + 1: GOTO pujump
-END IF
+ IF UCASE$(a2$) = "USING" THEN
+ IF e$ <> "" THEN gotopu = 1 ELSE i = i + 1: GOTO pujump
+ END IF
-IF LEN(e$) THEN
-ebak$ = e$
-pnrtnum = 0
-printnumber:
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-IF pnrtnum = 0 THEN
-IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
-END IF
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF (typ AND ISSTRING) = 0 THEN
-'not a string expresion!
-e$ = "STR$" + sp + "(" + sp + ebak$ + sp + ")" + sp + "+" + sp + CHR$(34) + " " + CHR$(34)
-pnrtnum = 1
-GOTO printnumber
-END IF
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-PRINT #12, "tqbs=qbs_new(0,0);"
-PRINT #12, "qbs_set(tqbs," + e$ + ");"
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-IF lp THEN PRINT #12, "lprint_makefit(tqbs);" ELSE PRINT #12, "makefit(tqbs);"
-PRINT #12, "qbs_" + lp$ + "print(tqbs,0);"
-PRINT #12, "qbs_free(tqbs);"
-ELSE
-IF a2$ = "," THEN l$ = l$ + sp + a2$
-IF a2$ = ";" THEN
-IF RIGHT$(l$, 1) <> ";" THEN l$ = l$ + sp + a2$ 'concat ;; to ;
-END IF
-END IF 'len(e$)
-IF a2$ = "," THEN PRINT #12, "tab();"
-e$ = ""
+ IF LEN(e$) THEN
+ ebak$ = e$
+ pnrtnum = 0
+ printnumber:
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ IF pnrtnum = 0 THEN
+ IF last THEN l$ = l$ + sp + tlayout$ ELSE l$ = l$ + sp + tlayout$ + sp2 + a2$
+ END IF
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF (typ AND ISSTRING) = 0 THEN
+ 'not a string expresion!
+ e$ = "STR$" + sp + "(" + sp + ebak$ + sp + ")" + sp + "+" + sp + CHR$(34) + " " + CHR$(34)
+ pnrtnum = 1
+ GOTO printnumber
+ END IF
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ PRINT #12, "tqbs=qbs_new(0,0);"
+ PRINT #12, "qbs_set(tqbs," + e$ + ");"
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ IF lp THEN PRINT #12, "lprint_makefit(tqbs);" ELSE PRINT #12, "makefit(tqbs);"
+ PRINT #12, "qbs_" + lp$ + "print(tqbs,0);"
+ PRINT #12, "qbs_free(tqbs);"
+ ELSE
+ IF a2$ = "," THEN l$ = l$ + sp + a2$
+ IF a2$ = ";" THEN
+ IF RIGHT$(l$, 1) <> ";" THEN l$ = l$ + sp + a2$ 'concat ;; to ;
+ END IF
+ END IF 'len(e$)
+ IF a2$ = "," THEN PRINT #12, "tab();"
+ e$ = ""
-IF gotopu THEN i = i + 1: GOTO pujump
+ IF gotopu THEN i = i + 1: GOTO pujump
-IF last THEN
-PRINT #12, "qbs_" + lp$ + "print(nothingstring,1);" 'go to new line
-EXIT FOR
-END IF
+ IF last THEN
+ PRINT #12, "qbs_" + lp$ + "print(nothingstring,1);" 'go to new line
+ EXIT FOR
+ END IF
-GOTO printnext
-END IF 'a2$
-END IF 'b=0
+ GOTO printnext
+ END IF 'a2$
+ END IF 'b=0
-IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-printnext:
+ IF LEN(e$) THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ printnext:
NEXT
IF LEN(e$) THEN a2$ = "": last = 1: GOTO printlast
IF n = 1 THEN PRINT #12, "qbs_" + lp$ + "print(nothingstring,1);"
@@ -21377,50 +21584,50 @@ IF i > n THEN Give_Error "Expected , ...": EXIT SUB
a3$ = ""
b = 0
FOR i = i TO n
-a2$ = getelement$(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF (a2$ = "," AND b = 0) OR i = n THEN
-IF i = n THEN
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
-END IF
-IF a3$ = "" THEN Give_Error "Expected , ...": EXIT SUB
-e$ = fixoperationorder$(a3$)
-IF Error_Happened THEN EXIT SUB
-l$ = l$ + sp + tlayout$: IF i <> n THEN l$ = l$ + sp2 + ","
-e$ = evaluate(e$, t)
-IF Error_Happened THEN EXIT SUB
-IF (t AND ISREFERENCE) = 0 THEN Give_Error "Expected variable": EXIT SUB
+ a2$ = getelement$(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF (a2$ = "," AND b = 0) OR i = n THEN
+ IF i = n THEN
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ END IF
+ IF a3$ = "" THEN Give_Error "Expected , ...": EXIT SUB
+ e$ = fixoperationorder$(a3$)
+ IF Error_Happened THEN EXIT SUB
+ l$ = l$ + sp + tlayout$: IF i <> n THEN l$ = l$ + sp2 + ","
+ e$ = evaluate(e$, t)
+ IF Error_Happened THEN EXIT SUB
+ IF (t AND ISREFERENCE) = 0 THEN Give_Error "Expected variable": EXIT SUB
-IF (t AND ISSTRING) THEN
-e$ = refer(e$, t, 0)
-IF Error_Happened THEN EXIT SUB
-PRINT #12, "sub_read_string(data,&data_offset,data_size," + e$ + ");"
-stringprocessinghappened = 1
-ELSE
-'numeric variable
-IF (t AND ISFLOAT) <> 0 OR (t AND 511) <> 64 THEN
-IF (t AND ISOFFSETINBITS) THEN
-setrefer e$, t, "((int64)func_read_float(data,&data_offset,data_size," + str2(t) + "))", 1
-IF Error_Happened THEN EXIT SUB
-ELSE
-setrefer e$, t, "func_read_float(data,&data_offset,data_size," + str2(t) + ")", 1
-IF Error_Happened THEN EXIT SUB
-END IF
-ELSE
-IF t AND ISUNSIGNED THEN
-setrefer e$, t, "func_read_uint64(data,&data_offset,data_size)", 1
-IF Error_Happened THEN EXIT SUB
-ELSE
-setrefer e$, t, "func_read_int64(data,&data_offset,data_size)", 1
-IF Error_Happened THEN EXIT SUB
-END IF
-END IF
-END IF 'string/numeric
-IF i = n THEN EXIT FOR
-a3$ = "": a2$ = ""
-END IF
-IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
+ IF (t AND ISSTRING) THEN
+ e$ = refer(e$, t, 0)
+ IF Error_Happened THEN EXIT SUB
+ PRINT #12, "sub_read_string(data,&data_offset,data_size," + e$ + ");"
+ stringprocessinghappened = 1
+ ELSE
+ 'numeric variable
+ IF (t AND ISFLOAT) <> 0 OR (t AND 511) <> 64 THEN
+ IF (t AND ISOFFSETINBITS) THEN
+ setrefer e$, t, "((int64)func_read_float(data,&data_offset,data_size," + str2(t) + "))", 1
+ IF Error_Happened THEN EXIT SUB
+ ELSE
+ setrefer e$, t, "func_read_float(data,&data_offset,data_size," + str2(t) + ")", 1
+ IF Error_Happened THEN EXIT SUB
+ END IF
+ ELSE
+ IF t AND ISUNSIGNED THEN
+ setrefer e$, t, "func_read_uint64(data,&data_offset,data_size)", 1
+ IF Error_Happened THEN EXIT SUB
+ ELSE
+ setrefer e$, t, "func_read_int64(data,&data_offset,data_size)", 1
+ IF Error_Happened THEN EXIT SUB
+ END IF
+ END IF
+ END IF 'string/numeric
+ IF i = n THEN EXIT FOR
+ a3$ = "": a2$ = ""
+ END IF
+ IF a3$ = "" THEN a3$ = a2$ ELSE a3$ = a3$ + sp + a2$
NEXT
IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);"
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
@@ -21430,56 +21637,56 @@ SUB xwrite (ca$, n)
l$ = "WRITE"
u$ = str2$(uniquenumber)
IF n = 1 THEN
-PRINT #12, "qbs_print(nothingstring,1);"
-GOTO writeblankline2
+ PRINT #12, "qbs_print(nothingstring,1);"
+ GOTO writeblankline2
END IF
b = 0
e$ = ""
last = 0
FOR i = 2 TO n
-a2$ = getelement(ca$, i)
-IF a2$ = "(" THEN b = b + 1
-IF a2$ = ")" THEN b = b - 1
-IF b = 0 THEN
-IF a2$ = "," THEN
-writelast:
-IF last = 1 THEN newline = 1 ELSE newline = 0
-ebak$ = e$
-reevaled = 0
-writechecked:
-e$ = fixoperationorder$(e$)
-IF Error_Happened THEN EXIT SUB
-IF reevaled = 0 THEN
-l$ = l$ + sp + tlayout$
-IF last = 0 THEN l$ = l$ + sp2 + ","
-END IF
-e$ = evaluate(e$, typ)
-IF Error_Happened THEN EXIT SUB
-IF reevaled = 0 THEN
-IF (typ AND ISSTRING) = 0 THEN
-e$ = "LTRIM$" + sp + "(" + sp + "STR$" + sp + "(" + sp + ebak$ + sp + ")" + sp + ")"
-IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
-reevaled = 1
-GOTO writechecked 'force re-evaluation
-ELSE
-e$ = CHR$(34) + "\042" + CHR$(34) + ",1" + sp + "+" + sp + ebak$ + sp + "+" + sp + CHR$(34) + "\042" + CHR$(34) + ",1"
-IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
-reevaled = 1
-GOTO writechecked 'force re-evaluation
-END IF
-END IF
-IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
-IF Error_Happened THEN EXIT SUB
-'format: string, (1/0) extraspace, (1/0) tab, (1/0)begin a new line
-PRINT #12, "qbs_print(" + e$ + ","; newline; ");"
-PRINT #12, "if (new_error) goto skip" + u$ + ";"
-e$ = ""
-IF last THEN EXIT FOR
-GOTO writenext
-END IF ',
-END IF 'b=0
-IF e$ <> "" THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
-writenext:
+ a2$ = getelement(ca$, i)
+ IF a2$ = "(" THEN b = b + 1
+ IF a2$ = ")" THEN b = b - 1
+ IF b = 0 THEN
+ IF a2$ = "," THEN
+ writelast:
+ IF last = 1 THEN newline = 1 ELSE newline = 0
+ ebak$ = e$
+ reevaled = 0
+ writechecked:
+ e$ = fixoperationorder$(e$)
+ IF Error_Happened THEN EXIT SUB
+ IF reevaled = 0 THEN
+ l$ = l$ + sp + tlayout$
+ IF last = 0 THEN l$ = l$ + sp2 + ","
+ END IF
+ e$ = evaluate(e$, typ)
+ IF Error_Happened THEN EXIT SUB
+ IF reevaled = 0 THEN
+ IF (typ AND ISSTRING) = 0 THEN
+ e$ = "LTRIM$" + sp + "(" + sp + "STR$" + sp + "(" + sp + ebak$ + sp + ")" + sp + ")"
+ IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
+ reevaled = 1
+ GOTO writechecked 'force re-evaluation
+ ELSE
+ e$ = CHR$(34) + "\042" + CHR$(34) + ",1" + sp + "+" + sp + ebak$ + sp + "+" + sp + CHR$(34) + "\042" + CHR$(34) + ",1"
+ IF last = 0 THEN e$ = e$ + sp + "+" + sp + CHR$(34) + "," + CHR$(34) + ",1"
+ reevaled = 1
+ GOTO writechecked 'force re-evaluation
+ END IF
+ END IF
+ IF (typ AND ISREFERENCE) THEN e$ = refer(e$, typ, 0)
+ IF Error_Happened THEN EXIT SUB
+ 'format: string, (1/0) extraspace, (1/0) tab, (1/0)begin a new line
+ PRINT #12, "qbs_print(" + e$ + ","; newline; ");"
+ PRINT #12, "if (new_error) goto skip" + u$ + ";"
+ e$ = ""
+ IF last THEN EXIT FOR
+ GOTO writenext
+ END IF ',
+ END IF 'b=0
+ IF e$ <> "" THEN e$ = e$ + sp + a2$ ELSE e$ = a2$
+ writenext:
NEXT
IF e$ <> "" THEN a2$ = ",": last = 1: GOTO writelast
writeblankline2:
@@ -21502,7 +21709,7 @@ DIM btype(1000) AS LONG 'for status=1 blocks
'put a$ into blocks
n = numelements(a$)
FOR i = 1 TO n
-block(i) = getelement$(a$, i)
+ block(i) = getelement$(a$, i)
NEXT
evalconstevalbrack:
@@ -21511,39 +21718,39 @@ evalconstevalbrack:
l = 0
b = 0
FOR i = 1 TO n
-IF block(i) = "(" THEN b = b + 1
-IF block(i) = ")" THEN b = b - 1
-IF b > l THEN l = b
+ IF block(i) = "(" THEN b = b + 1
+ IF block(i) = ")" THEN b = b - 1
+ IF b > l THEN l = b
NEXT
'if brackets exist, evaluate that item first
IF l THEN
-b = 0
-e$ = ""
-FOR i = 1 TO n
+ b = 0
+ e$ = ""
+ FOR i = 1 TO n
-IF block(i) = ")" THEN
-IF b = l THEN block(i) = "": EXIT FOR
-b = b - 1
-END IF
+ IF block(i) = ")" THEN
+ IF b = l THEN block(i) = "": EXIT FOR
+ b = b - 1
+ END IF
-IF b >= l THEN
-IF LEN(e$) = 0 THEN e$ = block(i) ELSE e$ = e$ + sp + block(i)
-block(i) = ""
-END IF
+ IF b >= l THEN
+ IF LEN(e$) = 0 THEN e$ = block(i) ELSE e$ = e$ + sp + block(i)
+ block(i) = ""
+ END IF
-IF block(i) = "(" THEN
-b = b + 1
-IF b = l THEN i2 = i: block(i) = ""
-END IF
+ IF block(i) = "(" THEN
+ b = b + 1
+ IF b = l THEN i2 = i: block(i) = ""
+ END IF
-NEXT i
+ NEXT i
-status(i) = 1
-block(i) = evaluateconst$(e$, btype(i))
-IF Error_Happened THEN EXIT FUNCTION
-GOTO evalconstevalbrack
+ status(i) = 1
+ block(i) = evaluateconst$(e$, btype(i))
+ IF Error_Happened THEN EXIT FUNCTION
+ GOTO evalconstevalbrack
END IF 'l
@@ -21557,103 +21764,103 @@ END IF 'l
'convert non-calc block numbers into binary form with QBASIC-like type
FOR i = 1 TO n
-IF status(i) = 0 THEN
-IF LEN(block(i)) THEN
+ IF status(i) = 0 THEN
+ IF LEN(block(i)) THEN
-a = ASC(block(i))
-IF (a = 45 AND LEN(block(i)) > 1) OR (a >= 48 AND a <= 57) THEN 'number?
+ a = ASC(block(i))
+ IF (a = 45 AND LEN(block(i)) > 1) OR (a >= 48 AND a <= 57) THEN 'number?
-'integers
-e$ = RIGHT$(block(i), 3)
-IF e$ = "~&&" THEN btype(i) = UINTEGER64TYPE - ISPOINTER: GOTO gotconstblkityp
-IF e$ = "~%%" THEN btype(i) = UBYTETYPE - ISPOINTER: GOTO gotconstblkityp
-e$ = RIGHT$(block(i), 2)
-IF e$ = "&&" THEN btype(i) = INTEGER64TYPE - ISPOINTER: GOTO gotconstblkityp
-IF e$ = "%%" THEN btype(i) = BYTETYPE - ISPOINTER: GOTO gotconstblkityp
-IF e$ = "~%" THEN btype(i) = UINTEGERTYPE - ISPOINTER: GOTO gotconstblkityp
-IF e$ = "~&" THEN btype(i) = ULONGTYPE - ISPOINTER: GOTO gotconstblkityp
-e$ = RIGHT$(block(i), 1)
-IF e$ = "%" THEN btype(i) = INTEGERTYPE - ISPOINTER: GOTO gotconstblkityp
-IF e$ = "&" THEN btype(i) = LONGTYPE - ISPOINTER: GOTO gotconstblkityp
+ 'integers
+ e$ = RIGHT$(block(i), 3)
+ IF e$ = "~&&" THEN btype(i) = UINTEGER64TYPE - ISPOINTER: GOTO gotconstblkityp
+ IF e$ = "~%%" THEN btype(i) = UBYTETYPE - ISPOINTER: GOTO gotconstblkityp
+ e$ = RIGHT$(block(i), 2)
+ IF e$ = "&&" THEN btype(i) = INTEGER64TYPE - ISPOINTER: GOTO gotconstblkityp
+ IF e$ = "%%" THEN btype(i) = BYTETYPE - ISPOINTER: GOTO gotconstblkityp
+ IF e$ = "~%" THEN btype(i) = UINTEGERTYPE - ISPOINTER: GOTO gotconstblkityp
+ IF e$ = "~&" THEN btype(i) = ULONGTYPE - ISPOINTER: GOTO gotconstblkityp
+ e$ = RIGHT$(block(i), 1)
+ IF e$ = "%" THEN btype(i) = INTEGERTYPE - ISPOINTER: GOTO gotconstblkityp
+ IF e$ = "&" THEN btype(i) = LONGTYPE - ISPOINTER: GOTO gotconstblkityp
-'ubit-type?
-IF INSTR(block(i), "~`") THEN
-x = INSTR(block(i), "~`")
-IF x = LEN(block(i)) - 1 THEN block(i) = block(i) + "1"
-btype(i) = UBITTYPE - ISPOINTER - 1 + VAL(RIGHT$(block(i), LEN(block(i)) - x - 1))
-block(i) = _MK$(_INTEGER64, VAL(LEFT$(block(i), x - 1)))
-status(i) = 1
-GOTO gotconstblktyp
-END IF
+ 'ubit-type?
+ IF INSTR(block(i), "~`") THEN
+ x = INSTR(block(i), "~`")
+ IF x = LEN(block(i)) - 1 THEN block(i) = block(i) + "1"
+ btype(i) = UBITTYPE - ISPOINTER - 1 + VAL(RIGHT$(block(i), LEN(block(i)) - x - 1))
+ block(i) = _MK$(_INTEGER64, VAL(LEFT$(block(i), x - 1)))
+ status(i) = 1
+ GOTO gotconstblktyp
+ END IF
-'bit-type?
-IF INSTR(block(i), "`") THEN
-x = INSTR(block(i), "`")
-IF x = LEN(block(i)) THEN block(i) = block(i) + "1"
-btype(i) = BITTYPE - ISPOINTER - 1 + VAL(RIGHT$(block(i), LEN(block(i)) - x))
-block(i) = _MK$(_INTEGER64, VAL(LEFT$(block(i), x - 1)))
-status(i) = 1
-GOTO gotconstblktyp
-END IF
+ 'bit-type?
+ IF INSTR(block(i), "`") THEN
+ x = INSTR(block(i), "`")
+ IF x = LEN(block(i)) THEN block(i) = block(i) + "1"
+ btype(i) = BITTYPE - ISPOINTER - 1 + VAL(RIGHT$(block(i), LEN(block(i)) - x))
+ block(i) = _MK$(_INTEGER64, VAL(LEFT$(block(i), x - 1)))
+ status(i) = 1
+ GOTO gotconstblktyp
+ END IF
-'floats
-IF INSTR(block(i), "E") THEN
-block(i) = _MK$(_FLOAT, VAL(block(i)))
-btype(i) = SINGLETYPE - ISPOINTER
-status(i) = 1
-GOTO gotconstblktyp
-END IF
-IF INSTR(block(i), "D") THEN
-block(i) = _MK$(_FLOAT, VAL(block(i)))
-btype(i) = DOUBLETYPE - ISPOINTER
-status(i) = 1
-GOTO gotconstblktyp
-END IF
-IF INSTR(block(i), "F") THEN
-block(i) = _MK$(_FLOAT, VAL(block(i)))
-btype(i) = FLOATTYPE - ISPOINTER
-status(i) = 1
-GOTO gotconstblktyp
-END IF
+ 'floats
+ IF INSTR(block(i), "E") THEN
+ block(i) = _MK$(_FLOAT, VAL(block(i)))
+ btype(i) = SINGLETYPE - ISPOINTER
+ status(i) = 1
+ GOTO gotconstblktyp
+ END IF
+ IF INSTR(block(i), "D") THEN
+ block(i) = _MK$(_FLOAT, VAL(block(i)))
+ btype(i) = DOUBLETYPE - ISPOINTER
+ status(i) = 1
+ GOTO gotconstblktyp
+ END IF
+ IF INSTR(block(i), "F") THEN
+ block(i) = _MK$(_FLOAT, VAL(block(i)))
+ btype(i) = FLOATTYPE - ISPOINTER
+ status(i) = 1
+ GOTO gotconstblktyp
+ END IF
-Give_Error "Invalid CONST expression.1": EXIT FUNCTION
+ Give_Error "Invalid CONST expression.1": EXIT FUNCTION
-gotconstblkityp:
-block(i) = LEFT$(block(i), LEN(block(i)) - LEN(e$))
-block(i) = _MK$(_INTEGER64, VAL(block(i)))
-status(i) = 1
-gotconstblktyp:
+ gotconstblkityp:
+ block(i) = LEFT$(block(i), LEN(block(i)) - LEN(e$))
+ block(i) = _MK$(_INTEGER64, VAL(block(i)))
+ status(i) = 1
+ gotconstblktyp:
-END IF 'a
+ END IF 'a
-IF a = 34 THEN 'string?
-'no changes need to be made to block(i) which is of format "CHARACTERS",size
-btype(i) = STRINGTYPE - ISPOINTER
-status(i) = 1
-END IF
+ IF a = 34 THEN 'string?
+ 'no changes need to be made to block(i) which is of format "CHARACTERS",size
+ btype(i) = STRINGTYPE - ISPOINTER
+ status(i) = 1
+ END IF
-END IF 'len<>0
-END IF 'status
+ END IF 'len<>0
+ END IF 'status
NEXT
'remove NULL blocks
n2 = 0
FOR i = 1 TO n
-IF block(i) <> "" THEN
-n2 = n2 + 1
-block(n2) = block(i)
-status(n2) = status(i)
-btype(n2) = btype(i)
-END IF
+ IF block(i) <> "" THEN
+ n2 = n2 + 1
+ block(n2) = block(i)
+ status(n2) = status(i)
+ btype(n2) = btype(i)
+ END IF
NEXT
n = n2
'only one block?
IF n = 1 THEN
-IF status(1) = 0 THEN Give_Error "Invalid CONST expression.2": EXIT FUNCTION
-t = btype(1)
-evaluateconst$ = block(1)
-EXIT FUNCTION
+ IF status(1) = 0 THEN Give_Error "Invalid CONST expression.2": EXIT FUNCTION
+ t = btype(1)
+ evaluateconst$ = block(1)
+ EXIT FUNCTION
END IF 'n=1
'evaluate equation (equation cannot contain any STRINGs)
@@ -21661,37 +21868,37 @@ END IF 'n=1
'[negation/not][variable]
e$ = block(1)
IF status(1) = 0 THEN
-IF n <> 2 THEN Give_Error "Invalid CONST expression.4": EXIT FUNCTION
-IF status(2) = 0 THEN Give_Error "Invalid CONST expression.5": EXIT FUNCTION
-IF btype(2) AND ISSTRING THEN Give_Error "Invalid CONST expression.6": EXIT FUNCTION
-o$ = block(1)
+ IF n <> 2 THEN Give_Error "Invalid CONST expression.4": EXIT FUNCTION
+ IF status(2) = 0 THEN Give_Error "Invalid CONST expression.5": EXIT FUNCTION
+ IF btype(2) AND ISSTRING THEN Give_Error "Invalid CONST expression.6": EXIT FUNCTION
+ o$ = block(1)
-IF o$ = "ñ" THEN
-IF btype(2) AND ISFLOAT THEN
-r## = -_CV(_FLOAT, block(2))
-evaluateconst$ = _MK$(_FLOAT, r##)
-ELSE
-r&& = -_CV(_INTEGER64, block(2))
-evaluateconst$ = _MK$(_INTEGER64, r&&)
-END IF
-t = btype(2)
-EXIT FUNCTION
-END IF
+ IF o$ = "ñ" THEN
+ IF btype(2) AND ISFLOAT THEN
+ r## = -_CV(_FLOAT, block(2))
+ evaluateconst$ = _MK$(_FLOAT, r##)
+ ELSE
+ r&& = -_CV(_INTEGER64, block(2))
+ evaluateconst$ = _MK$(_INTEGER64, r&&)
+ END IF
+ t = btype(2)
+ EXIT FUNCTION
+ END IF
-IF o$ = "NOT" THEN
-IF btype(2) AND ISFLOAT THEN
-r&& = _CV(_FLOAT, block(2))
-ELSE
-r&& = _CV(_INTEGER64, block(2))
-END IF
-r&& = NOT r&&
-t = btype(2)
-IF t AND ISFLOAT THEN t = LONGTYPE - ISPOINTER 'markdown to LONG
-evaluateconst$ = _MK$(_INTEGER64, r&&)
-EXIT FUNCTION
-END IF
+ IF o$ = "NOT" THEN
+ IF btype(2) AND ISFLOAT THEN
+ r&& = _CV(_FLOAT, block(2))
+ ELSE
+ r&& = _CV(_INTEGER64, block(2))
+ END IF
+ r&& = NOT r&&
+ t = btype(2)
+ IF t AND ISFLOAT THEN t = LONGTYPE - ISPOINTER 'markdown to LONG
+ evaluateconst$ = _MK$(_INTEGER64, r&&)
+ EXIT FUNCTION
+ END IF
-Give_Error "Invalid CONST expression.7": EXIT FUNCTION
+ Give_Error "Invalid CONST expression.7": EXIT FUNCTION
END IF
'[variable][bool-operator][variable]...
@@ -21715,57 +21922,57 @@ IF i > n THEN Give_Error "Invalid CONST expression.10": EXIT FUNCTION
IF (btype(i) AND ISSTRING) <> (et AND ISSTRING) THEN Give_Error "Invalid CONST expression.11": EXIT FUNCTION
IF et AND ISSTRING THEN
-IF o$ <> "+" THEN Give_Error "Invalid CONST expression.12": EXIT FUNCTION
-'concat strings
-s1$ = RIGHT$(ev$, LEN(ev$) - 1)
-s1$ = LEFT$(s1$, INSTR(s1$, CHR$(34)) - 1)
-s1size = VAL(RIGHT$(ev$, LEN(ev$) - LEN(s1$) - 3))
-s2$ = RIGHT$(block(i), LEN(block(i)) - 1)
-s2$ = LEFT$(s2$, INSTR(s2$, CHR$(34)) - 1)
-s2size = VAL(RIGHT$(block(i), LEN(block(i)) - LEN(s2$) - 3))
-ev$ = CHR$(34) + s1$ + s2$ + CHR$(34) + "," + str2$(s1size + s2size)
-GOTO econstmarkedup
+ IF o$ <> "+" THEN Give_Error "Invalid CONST expression.12": EXIT FUNCTION
+ 'concat strings
+ s1$ = RIGHT$(ev$, LEN(ev$) - 1)
+ s1$ = LEFT$(s1$, INSTR(s1$, CHR$(34)) - 1)
+ s1size = VAL(RIGHT$(ev$, LEN(ev$) - LEN(s1$) - 3))
+ s2$ = RIGHT$(block(i), LEN(block(i)) - 1)
+ s2$ = LEFT$(s2$, INSTR(s2$, CHR$(34)) - 1)
+ s2size = VAL(RIGHT$(block(i), LEN(block(i)) - LEN(s2$) - 3))
+ ev$ = CHR$(34) + s1$ + s2$ + CHR$(34) + "," + str2$(s1size + s2size)
+ GOTO econstmarkedup
END IF
'prepare left and right values
IF et AND ISFLOAT THEN
-linteger = 0
-l## = _CV(_FLOAT, ev$)
-l&& = l##
+ linteger = 0
+ l## = _CV(_FLOAT, ev$)
+ l&& = l##
ELSE
-linteger = 1
-l&& = _CV(_INTEGER64, ev$)
-l## = l&&
+ linteger = 1
+ l&& = _CV(_INTEGER64, ev$)
+ l## = l&&
END IF
IF btype(i) AND ISFLOAT THEN
-rinteger = 0
-r## = _CV(_FLOAT, block(i))
-r&& = r##
+ rinteger = 0
+ r## = _CV(_FLOAT, block(i))
+ r&& = r##
ELSE
-rinteger = 1
-r&& = _CV(_INTEGER64, block(i))
-r## = r&&
+ rinteger = 1
+ r&& = _CV(_INTEGER64, block(i))
+ r## = r&&
END IF
IF linteger = 1 AND rinteger = 1 THEN
-IF o$ = "+" THEN r&& = l&& + r&&: GOTO econstmarkupi
-IF o$ = "-" THEN r&& = l&& - r&&: GOTO econstmarkupi
-IF o$ = "*" THEN r&& = l&& * r&&: GOTO econstmarkupi
-IF o$ = "^" THEN r## = l&& ^ r&&: GOTO econstmarkupf
-IF o$ = "/" THEN r## = l&& / r&&: GOTO econstmarkupf
-IF o$ = "\" THEN r&& = l&& \ r&&: GOTO econstmarkupi
-IF o$ = "MOD" THEN r&& = l&& MOD r&&: GOTO econstmarkupi
-IF o$ = "=" THEN r&& = l&& = r&&: GOTO econstmarkupi16
-IF o$ = ">" THEN r&& = l&& > r&&: GOTO econstmarkupi16
-IF o$ = "<" THEN r&& = l&& < r&&: GOTO econstmarkupi16
-IF o$ = ">=" THEN r&& = l&& >= r&&: GOTO econstmarkupi16
-IF o$ = "<=" THEN r&& = l&& <= r&&: GOTO econstmarkupi16
-IF o$ = "<>" THEN r&& = l&& <> r&&: GOTO econstmarkupi16
-IF o$ = "IMP" THEN r&& = l&& IMP r&&: GOTO econstmarkupi
-IF o$ = "EQV" THEN r&& = l&& EQV r&&: GOTO econstmarkupi
-IF o$ = "XOR" THEN r&& = l&& XOR r&&: GOTO econstmarkupi
-IF o$ = "OR" THEN r&& = l&& OR r&&: GOTO econstmarkupi
-IF o$ = "AND" THEN r&& = l&& AND r&&: GOTO econstmarkupi
+ IF o$ = "+" THEN r&& = l&& + r&&: GOTO econstmarkupi
+ IF o$ = "-" THEN r&& = l&& - r&&: GOTO econstmarkupi
+ IF o$ = "*" THEN r&& = l&& * r&&: GOTO econstmarkupi
+ IF o$ = "^" THEN r## = l&& ^ r&&: GOTO econstmarkupf
+ IF o$ = "/" THEN r## = l&& / r&&: GOTO econstmarkupf
+ IF o$ = "\" THEN r&& = l&& \ r&&: GOTO econstmarkupi
+ IF o$ = "MOD" THEN r&& = l&& MOD r&&: GOTO econstmarkupi
+ IF o$ = "=" THEN r&& = l&& = r&&: GOTO econstmarkupi16
+ IF o$ = ">" THEN r&& = l&& > r&&: GOTO econstmarkupi16
+ IF o$ = "<" THEN r&& = l&& < r&&: GOTO econstmarkupi16
+ IF o$ = ">=" THEN r&& = l&& >= r&&: GOTO econstmarkupi16
+ IF o$ = "<=" THEN r&& = l&& <= r&&: GOTO econstmarkupi16
+ IF o$ = "<>" THEN r&& = l&& <> r&&: GOTO econstmarkupi16
+ IF o$ = "IMP" THEN r&& = l&& IMP r&&: GOTO econstmarkupi
+ IF o$ = "EQV" THEN r&& = l&& EQV r&&: GOTO econstmarkupi
+ IF o$ = "XOR" THEN r&& = l&& XOR r&&: GOTO econstmarkupi
+ IF o$ = "OR" THEN r&& = l&& OR r&&: GOTO econstmarkupi
+ IF o$ = "AND" THEN r&& = l&& AND r&&: GOTO econstmarkupi
END IF
IF o$ = "+" THEN r## = l## + r##: GOTO econstmarkupf
@@ -21801,25 +22008,25 @@ GOTO econstmarkedup
econstmarkupi:
IF et <> btype(i) THEN
-'keep unsigned?
-u = 0: IF (et AND ISUNSIGNED) <> 0 AND (btype(i) AND ISUNSIGNED) <> 0 THEN u = 1
-lb = et AND 511: rb = btype(i) AND 511
-ob = 0
-IF lb = rb THEN
-IF (et AND ISOFFSETINBITS) <> 0 AND (btype(i) AND ISOFFSETINBITS) <> 0 THEN ob = 1
-b = lb
-END IF
-IF lb > rb THEN
-IF (et AND ISOFFSETINBITS) <> 0 THEN ob = 1
-b = lb
-END IF
-IF lb < rb THEN
-IF (btype(i) AND ISOFFSETINBITS) <> 0 THEN ob = 1
-b = rb
-END IF
-et = b
-IF ob THEN et = et + ISOFFSETINBITS
-IF u THEN et = et + ISUNSIGNED
+ 'keep unsigned?
+ u = 0: IF (et AND ISUNSIGNED) <> 0 AND (btype(i) AND ISUNSIGNED) <> 0 THEN u = 1
+ lb = et AND 511: rb = btype(i) AND 511
+ ob = 0
+ IF lb = rb THEN
+ IF (et AND ISOFFSETINBITS) <> 0 AND (btype(i) AND ISOFFSETINBITS) <> 0 THEN ob = 1
+ b = lb
+ END IF
+ IF lb > rb THEN
+ IF (et AND ISOFFSETINBITS) <> 0 THEN ob = 1
+ b = lb
+ END IF
+ IF lb < rb THEN
+ IF (btype(i) AND ISOFFSETINBITS) <> 0 THEN ob = 1
+ b = rb
+ END IF
+ et = b
+ IF ob THEN et = et + ISOFFSETINBITS
+ IF u THEN et = et + ISUNSIGNED
END IF
ev$ = _MK$(_INTEGER64, r&&)
GOTO econstmarkedup
@@ -21851,9 +22058,9 @@ END FUNCTION
FUNCTION typevalue2symbol$ (t)
IF t AND ISSTRING THEN
-IF t AND ISFIXEDLENGTH THEN Give_Error "Cannot convert expression type to symbol": EXIT FUNCTION
-typevalue2symbol$ = "$"
-EXIT FUNCTION
+ IF t AND ISFIXEDLENGTH THEN Give_Error "Cannot convert expression type to symbol": EXIT FUNCTION
+ typevalue2symbol$ = "$"
+ EXIT FUNCTION
END IF
s$ = ""
@@ -21863,17 +22070,17 @@ IF t AND ISUNSIGNED THEN s$ = "~"
b = t AND 511
IF t AND ISOFFSETINBITS THEN
-IF b > 1 THEN s$ = s$ + "`" + str2$(b) ELSE s$ = s$ + "`"
-typevalue2symbol$ = s$
-EXIT FUNCTION
+ IF b > 1 THEN s$ = s$ + "`" + str2$(b) ELSE s$ = s$ + "`"
+ typevalue2symbol$ = s$
+ EXIT FUNCTION
END IF
IF t AND ISFLOAT THEN
-IF b = 32 THEN s$ = "!"
-IF b = 64 THEN s$ = "#"
-IF b = 256 THEN s$ = "##"
-typevalue2symbol$ = s$
-EXIT FUNCTION
+ IF b = 32 THEN s$ = "!"
+ IF b = 64 THEN s$ = "#"
+ IF b = 256 THEN s$ = "##"
+ typevalue2symbol$ = s$
+ EXIT FUNCTION
END IF
IF b = 8 THEN s$ = s$ + "%%"
@@ -21891,28 +22098,28 @@ IF t = 0 THEN t = id.arraytype
size = id.tsize
bits = t AND 511
IF t AND ISUDT THEN
-a$ = RTRIM$(udtxcname(t AND 511))
-id2fulltypename$ = a$: EXIT FUNCTION
+ a$ = RTRIM$(udtxcname(t AND 511))
+ id2fulltypename$ = a$: EXIT FUNCTION
END IF
IF t AND ISSTRING THEN
-IF t AND ISFIXEDLENGTH THEN a$ = "STRING * " + str2(size) ELSE a$ = "STRING"
-id2fulltypename$ = a$: EXIT FUNCTION
+ IF t AND ISFIXEDLENGTH THEN a$ = "STRING * " + str2(size) ELSE a$ = "STRING"
+ id2fulltypename$ = a$: EXIT FUNCTION
END IF
IF t AND ISOFFSETINBITS THEN
-IF bits > 1 THEN a$ = "_BIT * " + str2(bits) ELSE a$ = "_BIT"
-IF t AND ISUNSIGNED THEN a$ = "_UNSIGNED " + a$
-id2fulltypename$ = a$: EXIT FUNCTION
+ IF bits > 1 THEN a$ = "_BIT * " + str2(bits) ELSE a$ = "_BIT"
+ IF t AND ISUNSIGNED THEN a$ = "_UNSIGNED " + a$
+ id2fulltypename$ = a$: EXIT FUNCTION
END IF
IF t AND ISFLOAT THEN
-IF bits = 32 THEN a$ = "SINGLE"
-IF bits = 64 THEN a$ = "DOUBLE"
-IF bits = 256 THEN a$ = "_FLOAT"
+ IF bits = 32 THEN a$ = "SINGLE"
+ IF bits = 64 THEN a$ = "DOUBLE"
+ IF bits = 256 THEN a$ = "_FLOAT"
ELSE 'integer-based
-IF bits = 8 THEN a$ = "_BYTE"
-IF bits = 16 THEN a$ = "INTEGER"
-IF bits = 32 THEN a$ = "LONG"
-IF bits = 64 THEN a$ = "_INTEGER64"
-IF t AND ISUNSIGNED THEN a$ = "_UNSIGNED " + a$
+ IF bits = 8 THEN a$ = "_BYTE"
+ IF bits = 16 THEN a$ = "INTEGER"
+ IF bits = 32 THEN a$ = "LONG"
+ IF bits = 64 THEN a$ = "_INTEGER64"
+ IF t AND ISUNSIGNED THEN a$ = "_UNSIGNED " + a$
END IF
id2fulltypename$ = a$
END FUNCTION
@@ -21922,10 +22129,10 @@ FUNCTION symbol2fulltypename$ (s2$)
s$ = s2$
IF LEFT$(s$, 1) = "~" THEN
-u = 1
-IF LEN(typ$) = 1 THEN Give_Error "Expected ~...": EXIT FUNCTION
-s$ = RIGHT$(s$, LEN(s$) - 1)
-u$ = "_UNSIGNED "
+ u = 1
+ IF LEN(typ$) = 1 THEN Give_Error "Expected ~...": EXIT FUNCTION
+ s$ = RIGHT$(s$, LEN(s$) - 1)
+ u$ = "_UNSIGNED "
END IF
IF s$ = "%%" THEN t$ = u$ + "_BYTE": GOTO gotsym2typ
@@ -21935,14 +22142,14 @@ IF s$ = "&&" THEN t$ = u$ + "_INTEGER64": GOTO gotsym2typ
IF s$ = "%&" THEN t$ = u$ + "_OFFSET": GOTO gotsym2typ
IF LEFT$(s$, 1) = "`" THEN
-IF LEN(s$) = 1 THEN
-t$ = u$ + "_BIT * 1"
-GOTO gotsym2typ
-END IF
-n$ = RIGHT$(s$, LEN(s$) - 1)
-IF isuinteger(n$) = 0 THEN Give_Error "Expected number after symbol `": EXIT FUNCTION
-t$ = u$ + "_BIT * " + n$
-GOTO gotsym2typ
+ IF LEN(s$) = 1 THEN
+ t$ = u$ + "_BIT * 1"
+ GOTO gotsym2typ
+ END IF
+ n$ = RIGHT$(s$, LEN(s$) - 1)
+ IF isuinteger(n$) = 0 THEN Give_Error "Expected number after symbol `": EXIT FUNCTION
+ t$ = u$ + "_BIT * " + n$
+ GOTO gotsym2typ
END IF
IF u = 1 THEN Give_Error "Expected type symbol after ~": EXIT FUNCTION
@@ -21953,10 +22160,10 @@ IF s$ = "##" THEN t$ = "_FLOAT": GOTO gotsym2typ
IF s$ = "$" THEN t$ = "STRING": GOTO gotsym2typ
IF LEFT$(s$, 1) = "$" THEN
-n$ = RIGHT$(s$, LEN(s$) - 1)
-IF isuinteger(n$) = 0 THEN Give_Error "Expected number after symbol $": EXIT FUNCTION
-t$ = "STRING * " + n$
-GOTO gotsym2typ
+ n$ = RIGHT$(s$, LEN(s$) - 1)
+ IF isuinteger(n$) = 0 THEN Give_Error "Expected number after symbol $": EXIT FUNCTION
+ t$ = "STRING * " + n$
+ GOTO gotsym2typ
END IF
t$ = s$
@@ -21966,7 +22173,7 @@ gotsym2typ:
IF RIGHT$(" " + t$, 5) = " _BIT" THEN t$ = t$ + " * 1" 'clarify (_UNSIGNED) _BIT as (_UNSIGNED) _BIT * 1
FOR i = 1 TO LEN(t$)
-IF ASC(t$, i) = ASC(sp) THEN ASC(t$, i) = 32
+ IF ASC(t$, i) = ASC(sp) THEN ASC(t$, i) = 32
NEXT
symbol2fulltypename$ = t$
@@ -21990,36 +22197,36 @@ IF lineinput3index > l THEN lineinput3$ = CHR$(13): EXIT FUNCTION
c13 = INSTR(lineinput3index, lineinput3buffer$, CHR$(13))
c10 = INSTR(lineinput3index, lineinput3buffer$, CHR$(10))
IF c10 = 0 AND c13 = 0 THEN
-lineinput3$ = MID$(lineinput3buffer$, lineinput3index, l - lineinput3index + 1)
-lineinput3index = l + 1
-EXIT FUNCTION
+ lineinput3$ = MID$(lineinput3buffer$, lineinput3index, l - lineinput3index + 1)
+ lineinput3index = l + 1
+ EXIT FUNCTION
END IF
IF c10 = 0 THEN c10 = 2147483647
IF c13 = 0 THEN c13 = 2147483647
IF c10 < c13 THEN
-'10 before 13
-lineinput3$ = MID$(lineinput3buffer$, lineinput3index, c10 - lineinput3index)
-lineinput3index = c10 + 1
-IF lineinput3index <= l THEN
-IF ASC(MID$(lineinput3buffer$, lineinput3index, 1)) = 13 THEN lineinput3index = lineinput3index + 1
-END IF
+ '10 before 13
+ lineinput3$ = MID$(lineinput3buffer$, lineinput3index, c10 - lineinput3index)
+ lineinput3index = c10 + 1
+ IF lineinput3index <= l THEN
+ IF ASC(MID$(lineinput3buffer$, lineinput3index, 1)) = 13 THEN lineinput3index = lineinput3index + 1
+ END IF
ELSE
-'13 before 10
-lineinput3$ = MID$(lineinput3buffer$, lineinput3index, c13 - lineinput3index)
-lineinput3index = c13 + 1
-IF lineinput3index <= l THEN
-IF ASC(MID$(lineinput3buffer$, lineinput3index, 1)) = 10 THEN lineinput3index = lineinput3index + 1
-END IF
+ '13 before 10
+ lineinput3$ = MID$(lineinput3buffer$, lineinput3index, c13 - lineinput3index)
+ lineinput3index = c13 + 1
+ IF lineinput3index <= l THEN
+ IF ASC(MID$(lineinput3buffer$, lineinput3index, 1)) = 10 THEN lineinput3index = lineinput3index + 1
+ END IF
END IF
END FUNCTION
FUNCTION getfilepath$ (f$)
FOR i = LEN(f$) TO 1 STEP -1
-a$ = MID$(f$, i, 1)
-IF a$ = "/" OR a$ = "\" THEN
-getfilepath$ = LEFT$(f$, i)
-EXIT FUNCTION
-END IF
+ a$ = MID$(f$, i, 1)
+ IF a$ = "/" OR a$ = "\" THEN
+ getfilepath$ = LEFT$(f$, i)
+ EXIT FUNCTION
+ END IF
NEXT
getfilepath$ = ""
END FUNCTION
@@ -22030,22 +22237,22 @@ FUNCTION eleucase$ (a$)
IF LEN(a$) = 0 THEN EXIT FUNCTION
i = 1
IF ASC(a$) = 34 THEN
-i2 = INSTR(a$, sp)
-IF i2 = 0 THEN eleucase$ = a$: EXIT FUNCTION
-a2$ = LEFT$(a$, i2 - 1)
-i = i2
+ i2 = INSTR(a$, sp)
+ IF i2 = 0 THEN eleucase$ = a$: EXIT FUNCTION
+ a2$ = LEFT$(a$, i2 - 1)
+ i = i2
END IF
'check other elements
sp34$ = sp + CHR$(34)
IF i < LEN(a$) THEN
-DO WHILE INSTR(i, a$, sp34$)
-i2 = INSTR(i, a$, sp34$)
-a2$ = a2$ + UCASE$(MID$(a$, i, i2 - i + 1)) 'everything prior including spacer
-i3 = INSTR(i2 + 1, a$, sp): IF i3 = 0 THEN i3 = LEN(a$) ELSE i3 = i3 - 1
-a2$ = a2$ + MID$(a$, i2 + 1, i3 - (i2 + 1) + 1) 'everything from " to before next spacer or end
-i = i3 + 1
-IF i > LEN(a$) THEN EXIT DO
-LOOP
+ DO WHILE INSTR(i, a$, sp34$)
+ i2 = INSTR(i, a$, sp34$)
+ a2$ = a2$ + UCASE$(MID$(a$, i, i2 - i + 1)) 'everything prior including spacer
+ i3 = INSTR(i2 + 1, a$, sp): IF i3 = 0 THEN i3 = LEN(a$) ELSE i3 = i3 - 1
+ a2$ = a2$ + MID$(a$, i2 + 1, i3 - (i2 + 1) + 1) 'everything from " to before next spacer or end
+ i = i3 + 1
+ IF i > LEN(a$) THEN EXIT DO
+ LOOP
END IF
a2$ = a2$ + UCASE$(MID$(a$, i, LEN(a$) - i + 1))
eleucase$ = a2$
@@ -22054,7 +22261,7 @@ END FUNCTION
SUB SetDependency (requirement)
IF requirement THEN
-DEPENDENCY(requirement) = 1
+ DEPENDENCY(requirement) = 1
END IF
END SUB
@@ -22063,7 +22270,7 @@ SUB Build (path$)
'Count the separators in the path
depth = 1
FOR x = 1 TO LEN(path$)
-IF ASC(path$, x) = 92 OR ASC(path$, x) = 47 THEN depth = depth + 1
+ IF ASC(path$, x) = 92 OR ASC(path$, x) = 47 THEN depth = depth + 1
NEXT
CHDIR path$
@@ -22071,27 +22278,27 @@ bfh = FREEFILE
OPEN "build" + BATCHFILE_EXTENSION FOR BINARY AS #bfh
DO UNTIL EOF(bfh)
-LINE INPUT #bfh, c$
-use = 0
-IF LEN(c$) THEN use = 1
-IF c$ = "pause" THEN use = 0
-IF LEFT$(c$, 1) = "#" THEN use = 0 'eg. #!/bin/sh
-IF LEFT$(c$, 13) = "cd " + CHR$(34) + "$(dirname" THEN use = 0 'eg. cd "$(dirname "$0")"
-IF INSTR(LCASE$(c$), "press any key") THEN EXIT DO
-c$ = GDB_Fix$(c$)
-IF use THEN
-IF os$ = "WIN" THEN
-SHELL _HIDE "cmd /C " + c$
-ELSE
-SHELL _HIDE c$
-END IF
-END IF
+ LINE INPUT #bfh, c$
+ use = 0
+ IF LEN(c$) THEN use = 1
+ IF c$ = "pause" THEN use = 0
+ IF LEFT$(c$, 1) = "#" THEN use = 0 'eg. #!/bin/sh
+ IF LEFT$(c$, 13) = "cd " + CHR$(34) + "$(dirname" THEN use = 0 'eg. cd "$(dirname "$0")"
+ IF INSTR(LCASE$(c$), "press any key") THEN EXIT DO
+ c$ = GDB_Fix$(c$)
+ IF use THEN
+ IF os$ = "WIN" THEN
+ SHELL _HIDE "cmd /C " + c$
+ ELSE
+ SHELL _HIDE c$
+ END IF
+ END IF
LOOP
CLOSE #bfh
return_path$ = ".."
FOR x = 2 TO depth
-return_path$ = return_path$ + "\.."
+ return_path$ = return_path$ + "\.."
NEXT
CHDIR return_path$
@@ -22100,24 +22307,24 @@ END SUB
FUNCTION GDB_Fix$ (g_command$) 'edit a gcc/g++ command line to include debugging info
c$ = g_command$
IF Include_GDB_Debugging_Info THEN
-IF LEFT$(c$, 4) = "gcc " OR LEFT$(c$, 4) = "g++ " THEN
-c$ = LEFT$(c$, 4) + " -g " + RIGHT$(c$, LEN(c$) - 4)
-GOTO added_gdb_flag
-END IF
-FOR o = 1 TO 6
-IF o = 1 THEN o$ = "\g++ "
-IF o = 2 THEN o$ = "/g++ "
-IF o = 3 THEN o$ = "\gcc "
-IF o = 4 THEN o$ = "/gcc "
-IF o = 5 THEN o$ = " gcc "
-IF o = 6 THEN o$ = " g++ "
-x = INSTR(UCASE$(c$), UCASE$(o$))
-'note: -g adds debug symbols
-IF x THEN c$ = LEFT$(c$, x - 1) + o$ + " -g " + RIGHT$(c$, LEN(c$) - x - (LEN(o$) - 1)): EXIT FOR
-NEXT
-added_gdb_flag:
-'note: -s strips all debug symbols which is good for size but not for debugging
-x = INSTR(c$, " -s "): IF x THEN c$ = LEFT$(c$, x - 1) + " " + RIGHT$(c$, LEN(c$) - x - 3)
+ IF LEFT$(c$, 4) = "gcc " OR LEFT$(c$, 4) = "g++ " THEN
+ c$ = LEFT$(c$, 4) + " -g " + RIGHT$(c$, LEN(c$) - 4)
+ GOTO added_gdb_flag
+ END IF
+ FOR o = 1 TO 6
+ IF o = 1 THEN o$ = "\g++ "
+ IF o = 2 THEN o$ = "/g++ "
+ IF o = 3 THEN o$ = "\gcc "
+ IF o = 4 THEN o$ = "/gcc "
+ IF o = 5 THEN o$ = " gcc "
+ IF o = 6 THEN o$ = " g++ "
+ x = INSTR(UCASE$(c$), UCASE$(o$))
+ 'note: -g adds debug symbols
+ IF x THEN c$ = LEFT$(c$, x - 1) + o$ + " -g " + RIGHT$(c$, LEN(c$) - x - (LEN(o$) - 1)): EXIT FOR
+ NEXT
+ added_gdb_flag:
+ 'note: -s strips all debug symbols which is good for size but not for debugging
+ x = INSTR(c$, " -s "): IF x THEN c$ = LEFT$(c$, x - 1) + " " + RIGHT$(c$, LEN(c$) - x - 3)
END IF
GDB_Fix$ = c$
END FUNCTION
@@ -22125,13 +22332,13 @@ END FUNCTION
SUB PATH_SLASH_CORRECT (a$)
IF os$ = "WIN" THEN
-FOR x = 1 TO LEN(a$)
-IF ASC(a$, x) = 47 THEN ASC(a$, x) = 92
-NEXT
+ FOR x = 1 TO LEN(a$)
+ IF ASC(a$, x) = 47 THEN ASC(a$, x) = 92
+ NEXT
ELSE
-FOR x = 1 TO LEN(a$)
-IF ASC(a$, x) = 92 THEN ASC(a$, x) = 47
-NEXT
+ FOR x = 1 TO LEN(a$)
+ IF ASC(a$, x) = 92 THEN ASC(a$, x) = 47
+ NEXT
END IF
END SUB
@@ -22140,24 +22347,24 @@ SUB UseAndroid (Yes)
STATIC inline_DATA_backup
STATIC inline_DATA_backup_set
IF inline_DATA_backup_set = 0 THEN
-inline_DATA_backup_set = 1
-inline_DATA_backup = inline_DATA
+ inline_DATA_backup_set = 1
+ inline_DATA_backup = inline_DATA
END IF
IF Yes THEN
-IF MakeAndroid = 0 THEN
-MakeAndroid = 1
-inline_DATA = 1
-idechangemade = 1
-IDEBuildModeChanged = 1
-END IF
+ IF MakeAndroid = 0 THEN
+ MakeAndroid = 1
+ inline_DATA = 1
+ idechangemade = 1
+ IDEBuildModeChanged = 1
+ END IF
ELSE
-IF MakeAndroid THEN
-MakeAndroid = 0
-inline_DATA = inline_DATA_backup
-idechangemade = 1
-IDEBuildModeChanged = 1
-END IF
+ IF MakeAndroid THEN
+ MakeAndroid = 0
+ inline_DATA = inline_DATA_backup
+ idechangemade = 1
+ IDEBuildModeChanged = 1
+ END IF
END IF
END SUB
@@ -22180,35 +22387,35 @@ IF LEFT$(t$, 5) = "ERROR" THEN Evaluate_Expression$ = t$: EXIT FUNCTION
exp$ = "(" + t$ + ")" 'Starting and finishing brackets for our parse routine.
DO
-Eval_E = INSTR(exp$, ")")
-IF Eval_E > 0 THEN
-c = 0
-DO UNTIL Eval_E - c <= 0
-c = c + 1
-IF Eval_E THEN
-IF MID$(exp$, Eval_E - c, 1) = "(" THEN EXIT DO
-END IF
-LOOP
-s = Eval_E - c + 1
-IF s < 1 THEN PRINT "ERROR -- BAD () Count": END
-eval$ = " " + MID$(exp$, s, Eval_E - s) + " " 'pad with a space before and after so the parser can pick up the values properly.
-ParseExpression eval$
+ Eval_E = INSTR(exp$, ")")
+ IF Eval_E > 0 THEN
+ c = 0
+ DO UNTIL Eval_E - c <= 0
+ c = c + 1
+ IF Eval_E THEN
+ IF MID$(exp$, Eval_E - c, 1) = "(" THEN EXIT DO
+ END IF
+ LOOP
+ s = Eval_E - c + 1
+ IF s < 1 THEN PRINT "ERROR -- BAD () Count": END
+ eval$ = " " + MID$(exp$, s, Eval_E - s) + " " 'pad with a space before and after so the parser can pick up the values properly.
+ ParseExpression eval$
-eval$ = LTRIM$(RTRIM$(eval$))
-IF LEFT$(eval$, 5) = "ERROR" THEN Evaluate_Expression$ = eval$: EXIT SUB
-exp$ = DWD(LEFT$(exp$, s - 2) + eval$ + MID$(exp$, Eval_E + 1))
-IF MID$(exp$, 1, 1) = "N" THEN MID$(exp$, 1) = "-"
+ eval$ = LTRIM$(RTRIM$(eval$))
+ IF LEFT$(eval$, 5) = "ERROR" THEN Evaluate_Expression$ = eval$: EXIT SUB
+ exp$ = DWD(LEFT$(exp$, s - 2) + eval$ + MID$(exp$, Eval_E + 1))
+ IF MID$(exp$, 1, 1) = "N" THEN MID$(exp$, 1) = "-"
-temppp$ = DWD(LEFT$(exp$, s - 2) + " ## " + eval$ + " ## " + MID$(exp$, E + 1))
-END IF
+ temppp$ = DWD(LEFT$(exp$, s - 2) + " ## " + eval$ + " ## " + MID$(exp$, E + 1))
+ END IF
LOOP UNTIL Eval_E = 0
c = 0
DO
-c = c + 1
-SELECT CASE MID$(exp$, c, 1)
-CASE "0" TO "9", ".", "-" 'At this point, we should only have number values left.
-CASE ELSE: Evaluate_Expression$ = "ERROR - Unknown Diagnosis: (" + exp$ + ") ": EXIT SUB
-END SELECT
+ c = c + 1
+ SELECT CASE MID$(exp$, c, 1)
+ CASE "0" TO "9", ".", "-" 'At this point, we should only have number values left.
+ CASE ELSE: Evaluate_Expression$ = "ERROR - Unknown Diagnosis: (" + exp$ + ") ": EXIT SUB
+ END SELECT
LOOP UNTIL c >= LEN(exp$)
Evaluate_Expression$ = exp$
@@ -22221,81 +22428,81 @@ DIM num(10) AS STRING
'We should now have an expression with no () to deal with
IF MID$(exp$, 2, 1) = "-" THEN exp$ = "0+" + MID$(exp$, 2)
FOR J = 1 TO 250
-lowest = 0
-DO UNTIL lowest = LEN(exp$)
-lowest = LEN(exp$): OpOn = 0
-FOR P = 1 TO UBOUND(OName)
-'Look for first valid operator
-IF J = PL(P) THEN 'Priority levels match
-IF LEFT$(exp$, 1) = "-" THEN op = INSTR(2, exp$, OName(P)) ELSE op = INSTR(exp$, OName(P))
-IF op > 0 AND op < lowest THEN lowest = op: OpOn = P
-END IF
-NEXT
-IF OpOn = 0 THEN EXIT DO 'We haven't gotten to the proper PL for this OP to be processed yet.
-IF LEFT$(exp$, 1) = "-" THEN op = INSTR(2, exp$, OName(OpOn)) ELSE op = INSTR(exp$, OName(OpOn))
-numset = 0
+ lowest = 0
+ DO UNTIL lowest = LEN(exp$)
+ lowest = LEN(exp$): OpOn = 0
+ FOR P = 1 TO UBOUND(OName)
+ 'Look for first valid operator
+ IF J = PL(P) THEN 'Priority levels match
+ IF LEFT$(exp$, 1) = "-" THEN op = INSTR(2, exp$, OName(P)) ELSE op = INSTR(exp$, OName(P))
+ IF op > 0 AND op < lowest THEN lowest = op: OpOn = P
+ END IF
+ NEXT
+ IF OpOn = 0 THEN EXIT DO 'We haven't gotten to the proper PL for this OP to be processed yet.
+ IF LEFT$(exp$, 1) = "-" THEN op = INSTR(2, exp$, OName(OpOn)) ELSE op = INSTR(exp$, OName(OpOn))
+ numset = 0
-'*** SPECIAL OPERATION RULESETS
-IF OName(OpOn) = "-" THEN 'check for BOOLEAN operators before the -
-SELECT CASE MID$(exp$, op - 3, 3)
-CASE "NOT", "XOR", "AND", "EQV", "IMP"
-EXIT DO 'Not an operator, it's a negative
-END SELECT
-IF MID$(exp$, op - 3, 2) = "OR" THEN EXIT DO 'Not an operator, it's a negative
-END IF
+ '*** SPECIAL OPERATION RULESETS
+ IF OName(OpOn) = "-" THEN 'check for BOOLEAN operators before the -
+ SELECT CASE MID$(exp$, op - 3, 3)
+ CASE "NOT", "XOR", "AND", "EQV", "IMP"
+ EXIT DO 'Not an operator, it's a negative
+ END SELECT
+ IF MID$(exp$, op - 3, 2) = "OR" THEN EXIT DO 'Not an operator, it's a negative
+ END IF
-IF op THEN
-c = LEN(OName(OpOn)) - 1
-DO
-SELECT CASE MID$(exp$, op + c + 1, 1)
-CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "N": numset = -1 'Valid digit
-CASE "-" 'We need to check if it's a minus or a negative
-IF OName(OpOn) = "PI" OR numset THEN EXIT DO
-CASE ELSE 'Not a valid digit, we found our separator
-EXIT DO
-END SELECT
-c = c + 1
-LOOP UNTIL op + c >= LEN(exp$)
-E = op + c
+ IF op THEN
+ c = LEN(OName(OpOn)) - 1
+ DO
+ SELECT CASE MID$(exp$, op + c + 1, 1)
+ CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "N": numset = -1 'Valid digit
+ CASE "-" 'We need to check if it's a minus or a negative
+ IF OName(OpOn) = "PI" OR numset THEN EXIT DO
+ CASE ELSE 'Not a valid digit, we found our separator
+ EXIT DO
+ END SELECT
+ c = c + 1
+ LOOP UNTIL op + c >= LEN(exp$)
+ E = op + c
-c = 0
-DO
-c = c + 1
-SELECT CASE MID$(exp$, op - c, 1)
-CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "N" 'Valid digit
-CASE "-" 'We need to check if it's a minus or a negative
-c1 = c
-bad = 0
-DO
-c1 = c1 + 1
-SELECT CASE MID$(exp$, op - c1, 1)
-CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."
-bad = -1
-EXIT DO 'It's a minus sign
-CASE ELSE
-'It's a negative sign and needs to count as part of our numbers
-END SELECT
-LOOP UNTIL op - c1 <= 0
-IF bad THEN EXIT DO 'We found our seperator
-CASE ELSE 'Not a valid digit, we found our separator
-EXIT DO
-END SELECT
-LOOP UNTIL op - c <= 0
-s = op - c
-num(1) = MID$(exp$, s + 1, op - s - 1) 'Get our first number
-num(2) = MID$(exp$, op + LEN(OName(OpOn)), E - op - LEN(OName(OpOn)) + 1) 'Get our second number
-IF MID$(num(1), 1, 1) = "N" THEN MID$(num(1), 1) = "-"
-IF MID$(num(2), 1, 1) = "N" THEN MID$(num(2), 1) = "-"
-num(3) = EvaluateNumbers(OpOn, num())
-IF MID$(num(3), 1, 1) = "-" THEN MID$(num(3), 1) = "N"
-'PRINT "*************"
-'PRINT num(1), OName(OpOn), num(2), num(3), exp$
-IF LEFT$(num(3), 5) = "ERROR" THEN exp$ = num(3): EXIT SUB
-exp$ = LTRIM$(N2S(DWD(LEFT$(exp$, s) + RTRIM$(LTRIM$(num(3))) + MID$(exp$, E + 1))))
-'PRINT exp$
-END IF
-op = 0
-LOOP
+ c = 0
+ DO
+ c = c + 1
+ SELECT CASE MID$(exp$, op - c, 1)
+ CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "N" 'Valid digit
+ CASE "-" 'We need to check if it's a minus or a negative
+ c1 = c
+ bad = 0
+ DO
+ c1 = c1 + 1
+ SELECT CASE MID$(exp$, op - c1, 1)
+ CASE "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."
+ bad = -1
+ EXIT DO 'It's a minus sign
+ CASE ELSE
+ 'It's a negative sign and needs to count as part of our numbers
+ END SELECT
+ LOOP UNTIL op - c1 <= 0
+ IF bad THEN EXIT DO 'We found our seperator
+ CASE ELSE 'Not a valid digit, we found our separator
+ EXIT DO
+ END SELECT
+ LOOP UNTIL op - c <= 0
+ s = op - c
+ num(1) = MID$(exp$, s + 1, op - s - 1) 'Get our first number
+ num(2) = MID$(exp$, op + LEN(OName(OpOn)), E - op - LEN(OName(OpOn)) + 1) 'Get our second number
+ IF MID$(num(1), 1, 1) = "N" THEN MID$(num(1), 1) = "-"
+ IF MID$(num(2), 1, 1) = "N" THEN MID$(num(2), 1) = "-"
+ num(3) = EvaluateNumbers(OpOn, num())
+ IF MID$(num(3), 1, 1) = "-" THEN MID$(num(3), 1) = "N"
+ 'PRINT "*************"
+ 'PRINT num(1), OName(OpOn), num(2), num(3), exp$
+ IF LEFT$(num(3), 5) = "ERROR" THEN exp$ = num(3): EXIT SUB
+ exp$ = LTRIM$(N2S(DWD(LEFT$(exp$, s) + RTRIM$(LTRIM$(num(3))) + MID$(exp$, E + 1))))
+ 'PRINT exp$
+ END IF
+ op = 0
+ LOOP
NEXT
END SUB
@@ -22439,180 +22646,180 @@ END SUB
FUNCTION EvaluateNumbers$ (p, num() AS STRING)
DIM n1 AS _FLOAT, n2 AS _FLOAT, n3 AS _FLOAT
SELECT CASE OName(p) 'Depending on our operator..
-CASE "PI"
-n1 = 3.14159265358979323846264338327950288## 'Future compatable in case something ever stores extra digits for PI
-CASE "%" 'Note percent is a special case and works with the number BEFORE the % command and not after
-IF num(1) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get percent of NULL string": EXIT FUNCTION
-n1 = (VAL(num(1))) / 100
-CASE "ARCCOS"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOS of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOS from value >1, which is Invalid": EXIT FUNCTION
-IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOS from value <-1, which is Invalid": EXIT FUNCTION
-IF n1 = 1 THEN EvaluateNumbers$ = "0": EXIT FUNCTION
-n1 = (2 * ATN(1)) - ATN(n1 / SQR(1 - n1 * n1))
-CASE "ARCSIN"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSIN of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSIN from value >1, which is Invalid": EXIT FUNCTION
-IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSIN from value <-1, which is Invalid": EXIT FUNCTION
-n1 = ATN(n1 / SQR(1 - (n1 * n1)))
-CASE "ARCSEC"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSEC of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSEC from value > 1, which is Invalid": EXIT FUNCTION
-IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSEC from value < -1, which is Invalid": EXIT FUNCTION
-n1 = ATN(n1 / SQR(1 - n1 * n1)) + (SGN(n1) - 1) * (2 * ATN(1))
-CASE "ARCCSC"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCSC of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCSC from value >=1, which is Invalid": EXIT FUNCTION
-IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCSC from value <-1, which is Invalid": EXIT FUNCTION
-n1 = ATN(1 / SQR(1 - n1 * n1)) + (SGN(n1) - 1) * (2 * ATN(1))
-CASE "ARCCOT"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOT of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-n1 = (2 * ATN(1)) - ATN(n1)
-CASE "SECH"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SECH of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-IF n1 > 88.02969 OR (EXP(n1) + EXP(-n1)) = 0 THEN EvaluateNumbers$ = "ERROR - Bad SECH command": EXIT FUNCTION
-n1 = 2 / (EXP(n1) + EXP(-n1))
-CASE "CSCH"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get CSCH of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-IF n1 > 88.02969 OR (EXP(n1) - EXP(-n1)) = 0 THEN EvaluateNumbers$ = "ERROR - Bad CSCH command": EXIT FUNCTION
-n1 = 2 / (EXP(n1) - EXP(-n1))
-CASE "COTH"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get COTH of NULL string": EXIT FUNCTION
-n1 = VAL(num(2))
-IF 2 * n1 > 88.02969 OR EXP(2 * n1) - 1 = 0 THEN EvaluateNumbers$ = "ERROR - Bad COTH command": EXIT FUNCTION
-n1 = (EXP(2 * n1) + 1) / (EXP(2 * n1) - 1)
-CASE "COS"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get COS of NULL string": EXIT FUNCTION
-n1 = COS(VAL(num(2)))
-CASE "SIN"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SIN of NULL string": EXIT FUNCTION
-n1 = SIN(VAL(num(2)))
-CASE "TAN"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get TAN of NULL string": EXIT FUNCTION
-n1 = TAN(VAL(num(2)))
-CASE "LOG"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get LOG of NULL string": EXIT FUNCTION
-n1 = LOG(VAL(num(2)))
-CASE "EXP"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get EXP of NULL string": EXIT FUNCTION
-n1 = EXP(VAL(num(2)))
-CASE "ATN"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ATN of NULL string": EXIT FUNCTION
-n1 = ATN(VAL(num(2)))
-CASE "D2R"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Radian of NULL Degree value": EXIT FUNCTION
-n1 = 0.0174532925 * (VAL(num(2)))
-CASE "D2G"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Grad of NULL Degree string": EXIT FUNCTION
-n1 = 1.1111111111 * (VAL(num(2)))
-CASE "R2D"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Degree of NULL Radian string": EXIT FUNCTION
-n1 = 57.2957795 * (VAL(num(2)))
-CASE "R2G"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Grad of NULL Radian string": EXIT FUNCTION
-n1 = 0.015707963 * (VAL(num(2)))
-CASE "G2D"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Degree of NULL Gradian string": EXIT FUNCTION
-n1 = 0.9 * (VAL(num(2)))
-CASE "G2R"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Radian of NULL Grad string": EXIT FUNCTION
-n1 = 63.661977237 * (VAL(num(2)))
-CASE "ABS"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ABS of NULL string": EXIT FUNCTION
-n1 = ABS(VAL(num(2)))
-CASE "SGN"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SGN of NULL string": EXIT FUNCTION
-n1 = SGN(VAL(num(2)))
-CASE "INT"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get INT of NULL string": EXIT FUNCTION
-n1 = INT(VAL(num(2)))
-CASE "_ROUND"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to _ROUND a NULL string": EXIT FUNCTION
-n1 = _ROUND(VAL(num(2)))
-CASE "FIX"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to FIX a NULL string": EXIT FUNCTION
-n1 = FIX(VAL(num(2)))
-CASE "SEC"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SEC of NULL string": EXIT FUNCTION
-n1 = COS(VAL(num(2)))
-IF n1 = 0 THEN EvaluateNumbers$ = "ERROR - COS value is 0, thus SEC is 1/0 which is Invalid": EXIT FUNCTION
-n1 = 1 / n1
-CASE "CSC"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get CSC of NULL string": EXIT FUNCTION
-n1 = SIN(VAL(num(2)))
-IF n1 = 0 THEN EvaluateNumbers$ = "ERROR - SIN value is 0, thus CSC is 1/0 which is Invalid": EXIT FUNCTION
-n1 = 1 / n1
-CASE "COT"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get COT of NULL string": EXIT FUNCTION
-n1 = COS(VAL(num(2)))
-IF n1 = 0 THEN EvaluateNumbers$ = "ERROR - TAN value is 0, thus COT is 1/0 which is Invalid": EXIT FUNCTION
-n1 = 1 / n1
-CASE "BTA"
-IF num(2) = "" OR num(1) = "" THEN EvaluateNumbers$ = "ERROR - BTA": EXIT FUNCTION
-EvaluateNumbers$ = BTen$(num(1), "+", num(2)): EXIT FUNCTION
-CASE "BTS"
-IF num(2) = "" OR num(1) = "" THEN EvaluateNumbers$ = "ERROR - BTS": EXIT FUNCTION
-EvaluateNumbers$ = BTen$(num(1), "-", num(2)): EXIT FUNCTION
-CASE "BTM"
-IF num(2) = "" OR num(1) = "" THEN EvaluateNumbers$ = "ERROR - BTM": EXIT FUNCTION
-EvaluateNumbers$ = BTen$(num(1), "*", num(2)): EXIT FUNCTION
-CASE "^"
-IF num(1) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to raise NULL string to exponent": EXIT FUNCTION
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to raise number to NULL exponent": EXIT FUNCTION
-n1 = VAL(num(1)) ^ VAL(num(2))
-CASE "SQR"
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SQR of NULL string": EXIT FUNCTION
-IF VAL(num(2)) < 0 THEN EvaluateNumbers$ = "ERROR - Cannot take take SQR of numbers < 0. I'm a computer, I have a poor imagination.": EXIT FUNCTION
-n1 = SQR(VAL(num(2)))
-CASE "ROOT"
-IF num(1) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ROOT of a NULL string": EXIT FUNCTION
-IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get NULL ROOT of a string": EXIT FUNCTION
-n1 = VAL(num(1)): n2 = VAL(num(2))
-IF n2 = 1 THEN EvaluateNumbers$ = RTRIM$(LTRIM$(STR$(n1))): EXIT FUNCTION
-IF n2 = 0 THEN EvaluateNumbers$ = "ERROR - There is no such thing as a 0 ROOT of a number": EXIT FUNCTION
-IF n1 < 0 AND n2 MOD 2 = 0 AND n2 > 1 THEN EvaluateNumbers$ = "ERROR - Cannot take take an EVEN ROOT of numbers < 0. I'm a computer, I have a poor imagination.": EXIT FUNCTION
-IF n1 < 0 AND n2 >= 1 THEN sign = -1: n1 = -n1 ELSE sign = 1
-n3 = 1## / n2
-IF n3 <> INT(n3) AND n2 < 1 THEN sign = SGN(n1): n1 = ABS(n1)
-n1 = sign * (n1 ^ n3)
-CASE "*"
-IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to multiply NULL string ": EXIT FUNCTION
-n1 = VAL(num(1)) * VAL(num(2))
-CASE "/":
-IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to divide NULL string ": EXIT FUNCTION
-IF VAL(num(2)) = 0 THEN EvaluateNumbers$ = "ERROR - Division by 0": EXIT FUNCTION
-n1 = VAL(num(1)) / VAL(num(2))
-CASE "\"
-IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to divide NULL string ": EXIT FUNCTION
-IF VAL(num(2)) = 0 THEN EvaluateNumbers$ = "ERROR - Division by 0": EXIT FUNCTION
-n1 = VAL(num(1)) \ VAL(num(2))
-CASE "MOD"
-IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to MOD with NULL string ": EXIT FUNCTION
-IF VAL(num(2)) = 0 THEN EvaluateNumbers$ = "ERROR - Division by 0": EXIT FUNCTION
-n1 = VAL(num(1)) MOD VAL(num(2))
-CASE "+": n1 = VAL(num(1)) + VAL(num(2))
-CASE "-": n1 = VAL(num(1)) - VAL(num(2))
-CASE "=": n1 = VAL(num(1)) = VAL(num(2))
-CASE ">": n1 = VAL(num(1)) > VAL(num(2))
-CASE "<": n1 = VAL(num(1)) < VAL(num(2))
-CASE "<>", "><": n1 = VAL(num(1)) <> VAL(num(2))
-CASE "<=", "=<": n1 = VAL(num(1)) <= VAL(num(2))
-CASE ">=", "=>": n1 = VAL(num(1)) >= VAL(num(2))
-CASE "NOT": n1 = NOT VAL(num(2))
-CASE "AND": n1 = VAL(num(1)) AND VAL(num(2))
-CASE "OR": n1 = VAL(num(1)) OR VAL(num(2))
-CASE "XOR": n1 = VAL(num(1)) XOR VAL(num(2))
-CASE "EQV": n1 = VAL(num(1)) EQV VAL(num(2))
-CASE "IMP": n1 = VAL(num(1)) IMP VAL(num(2))
-CASE ELSE
-EvaluateNumbers$ = "ERROR - Bad operation (We shouldn't see this)" 'Let's say we're bad...
+ CASE "PI"
+ n1 = 3.14159265358979323846264338327950288## 'Future compatable in case something ever stores extra digits for PI
+ CASE "%" 'Note percent is a special case and works with the number BEFORE the % command and not after
+ IF num(1) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get percent of NULL string": EXIT FUNCTION
+ n1 = (VAL(num(1))) / 100
+ CASE "ARCCOS"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOS of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOS from value >1, which is Invalid": EXIT FUNCTION
+ IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOS from value <-1, which is Invalid": EXIT FUNCTION
+ IF n1 = 1 THEN EvaluateNumbers$ = "0": EXIT FUNCTION
+ n1 = (2 * ATN(1)) - ATN(n1 / SQR(1 - n1 * n1))
+ CASE "ARCSIN"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSIN of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSIN from value >1, which is Invalid": EXIT FUNCTION
+ IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSIN from value <-1, which is Invalid": EXIT FUNCTION
+ n1 = ATN(n1 / SQR(1 - (n1 * n1)))
+ CASE "ARCSEC"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSEC of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSEC from value > 1, which is Invalid": EXIT FUNCTION
+ IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCSEC from value < -1, which is Invalid": EXIT FUNCTION
+ n1 = ATN(n1 / SQR(1 - n1 * n1)) + (SGN(n1) - 1) * (2 * ATN(1))
+ CASE "ARCCSC"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCSC of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ IF n1 > 1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCSC from value >=1, which is Invalid": EXIT FUNCTION
+ IF n1 < -1 THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCSC from value <-1, which is Invalid": EXIT FUNCTION
+ n1 = ATN(1 / SQR(1 - n1 * n1)) + (SGN(n1) - 1) * (2 * ATN(1))
+ CASE "ARCCOT"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ARCCOT of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ n1 = (2 * ATN(1)) - ATN(n1)
+ CASE "SECH"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SECH of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ IF n1 > 88.02969 OR (EXP(n1) + EXP(-n1)) = 0 THEN EvaluateNumbers$ = "ERROR - Bad SECH command": EXIT FUNCTION
+ n1 = 2 / (EXP(n1) + EXP(-n1))
+ CASE "CSCH"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get CSCH of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ IF n1 > 88.02969 OR (EXP(n1) - EXP(-n1)) = 0 THEN EvaluateNumbers$ = "ERROR - Bad CSCH command": EXIT FUNCTION
+ n1 = 2 / (EXP(n1) - EXP(-n1))
+ CASE "COTH"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get COTH of NULL string": EXIT FUNCTION
+ n1 = VAL(num(2))
+ IF 2 * n1 > 88.02969 OR EXP(2 * n1) - 1 = 0 THEN EvaluateNumbers$ = "ERROR - Bad COTH command": EXIT FUNCTION
+ n1 = (EXP(2 * n1) + 1) / (EXP(2 * n1) - 1)
+ CASE "COS"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get COS of NULL string": EXIT FUNCTION
+ n1 = COS(VAL(num(2)))
+ CASE "SIN"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SIN of NULL string": EXIT FUNCTION
+ n1 = SIN(VAL(num(2)))
+ CASE "TAN"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get TAN of NULL string": EXIT FUNCTION
+ n1 = TAN(VAL(num(2)))
+ CASE "LOG"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get LOG of NULL string": EXIT FUNCTION
+ n1 = LOG(VAL(num(2)))
+ CASE "EXP"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get EXP of NULL string": EXIT FUNCTION
+ n1 = EXP(VAL(num(2)))
+ CASE "ATN"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ATN of NULL string": EXIT FUNCTION
+ n1 = ATN(VAL(num(2)))
+ CASE "D2R"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Radian of NULL Degree value": EXIT FUNCTION
+ n1 = 0.0174532925 * (VAL(num(2)))
+ CASE "D2G"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Grad of NULL Degree string": EXIT FUNCTION
+ n1 = 1.1111111111 * (VAL(num(2)))
+ CASE "R2D"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Degree of NULL Radian string": EXIT FUNCTION
+ n1 = 57.2957795 * (VAL(num(2)))
+ CASE "R2G"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Grad of NULL Radian string": EXIT FUNCTION
+ n1 = 0.015707963 * (VAL(num(2)))
+ CASE "G2D"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Degree of NULL Gradian string": EXIT FUNCTION
+ n1 = 0.9 * (VAL(num(2)))
+ CASE "G2R"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get Radian of NULL Grad string": EXIT FUNCTION
+ n1 = 63.661977237 * (VAL(num(2)))
+ CASE "ABS"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ABS of NULL string": EXIT FUNCTION
+ n1 = ABS(VAL(num(2)))
+ CASE "SGN"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SGN of NULL string": EXIT FUNCTION
+ n1 = SGN(VAL(num(2)))
+ CASE "INT"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get INT of NULL string": EXIT FUNCTION
+ n1 = INT(VAL(num(2)))
+ CASE "_ROUND"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to _ROUND a NULL string": EXIT FUNCTION
+ n1 = _ROUND(VAL(num(2)))
+ CASE "FIX"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to FIX a NULL string": EXIT FUNCTION
+ n1 = FIX(VAL(num(2)))
+ CASE "SEC"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SEC of NULL string": EXIT FUNCTION
+ n1 = COS(VAL(num(2)))
+ IF n1 = 0 THEN EvaluateNumbers$ = "ERROR - COS value is 0, thus SEC is 1/0 which is Invalid": EXIT FUNCTION
+ n1 = 1 / n1
+ CASE "CSC"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get CSC of NULL string": EXIT FUNCTION
+ n1 = SIN(VAL(num(2)))
+ IF n1 = 0 THEN EvaluateNumbers$ = "ERROR - SIN value is 0, thus CSC is 1/0 which is Invalid": EXIT FUNCTION
+ n1 = 1 / n1
+ CASE "COT"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get COT of NULL string": EXIT FUNCTION
+ n1 = COS(VAL(num(2)))
+ IF n1 = 0 THEN EvaluateNumbers$ = "ERROR - TAN value is 0, thus COT is 1/0 which is Invalid": EXIT FUNCTION
+ n1 = 1 / n1
+ CASE "BTA"
+ IF num(2) = "" OR num(1) = "" THEN EvaluateNumbers$ = "ERROR - BTA": EXIT FUNCTION
+ EvaluateNumbers$ = BTen$(num(1), "+", num(2)): EXIT FUNCTION
+ CASE "BTS"
+ IF num(2) = "" OR num(1) = "" THEN EvaluateNumbers$ = "ERROR - BTS": EXIT FUNCTION
+ EvaluateNumbers$ = BTen$(num(1), "-", num(2)): EXIT FUNCTION
+ CASE "BTM"
+ IF num(2) = "" OR num(1) = "" THEN EvaluateNumbers$ = "ERROR - BTM": EXIT FUNCTION
+ EvaluateNumbers$ = BTen$(num(1), "*", num(2)): EXIT FUNCTION
+ CASE "^"
+ IF num(1) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to raise NULL string to exponent": EXIT FUNCTION
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to raise number to NULL exponent": EXIT FUNCTION
+ n1 = VAL(num(1)) ^ VAL(num(2))
+ CASE "SQR"
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get SQR of NULL string": EXIT FUNCTION
+ IF VAL(num(2)) < 0 THEN EvaluateNumbers$ = "ERROR - Cannot take take SQR of numbers < 0. I'm a computer, I have a poor imagination.": EXIT FUNCTION
+ n1 = SQR(VAL(num(2)))
+ CASE "ROOT"
+ IF num(1) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get ROOT of a NULL string": EXIT FUNCTION
+ IF num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to get NULL ROOT of a string": EXIT FUNCTION
+ n1 = VAL(num(1)): n2 = VAL(num(2))
+ IF n2 = 1 THEN EvaluateNumbers$ = RTRIM$(LTRIM$(STR$(n1))): EXIT FUNCTION
+ IF n2 = 0 THEN EvaluateNumbers$ = "ERROR - There is no such thing as a 0 ROOT of a number": EXIT FUNCTION
+ IF n1 < 0 AND n2 MOD 2 = 0 AND n2 > 1 THEN EvaluateNumbers$ = "ERROR - Cannot take take an EVEN ROOT of numbers < 0. I'm a computer, I have a poor imagination.": EXIT FUNCTION
+ IF n1 < 0 AND n2 >= 1 THEN sign = -1: n1 = -n1 ELSE sign = 1
+ n3 = 1## / n2
+ IF n3 <> INT(n3) AND n2 < 1 THEN sign = SGN(n1): n1 = ABS(n1)
+ n1 = sign * (n1 ^ n3)
+ CASE "*"
+ IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to multiply NULL string ": EXIT FUNCTION
+ n1 = VAL(num(1)) * VAL(num(2))
+ CASE "/":
+ IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to divide NULL string ": EXIT FUNCTION
+ IF VAL(num(2)) = 0 THEN EvaluateNumbers$ = "ERROR - Division by 0": EXIT FUNCTION
+ n1 = VAL(num(1)) / VAL(num(2))
+ CASE "\"
+ IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to divide NULL string ": EXIT FUNCTION
+ IF VAL(num(2)) = 0 THEN EvaluateNumbers$ = "ERROR - Division by 0": EXIT FUNCTION
+ n1 = VAL(num(1)) \ VAL(num(2))
+ CASE "MOD"
+ IF num(1) = "" OR num(2) = "" THEN EvaluateNumbers$ = "ERROR - Attemping to MOD with NULL string ": EXIT FUNCTION
+ IF VAL(num(2)) = 0 THEN EvaluateNumbers$ = "ERROR - Division by 0": EXIT FUNCTION
+ n1 = VAL(num(1)) MOD VAL(num(2))
+ CASE "+": n1 = VAL(num(1)) + VAL(num(2))
+ CASE "-": n1 = VAL(num(1)) - VAL(num(2))
+ CASE "=": n1 = VAL(num(1)) = VAL(num(2))
+ CASE ">": n1 = VAL(num(1)) > VAL(num(2))
+ CASE "<": n1 = VAL(num(1)) < VAL(num(2))
+ CASE "<>", "><": n1 = VAL(num(1)) <> VAL(num(2))
+ CASE "<=", "=<": n1 = VAL(num(1)) <= VAL(num(2))
+ CASE ">=", "=>": n1 = VAL(num(1)) >= VAL(num(2))
+ CASE "NOT": n1 = NOT VAL(num(2))
+ CASE "AND": n1 = VAL(num(1)) AND VAL(num(2))
+ CASE "OR": n1 = VAL(num(1)) OR VAL(num(2))
+ CASE "XOR": n1 = VAL(num(1)) XOR VAL(num(2))
+ CASE "EQV": n1 = VAL(num(1)) EQV VAL(num(2))
+ CASE "IMP": n1 = VAL(num(1)) IMP VAL(num(2))
+ CASE ELSE
+ EvaluateNumbers$ = "ERROR - Bad operation (We shouldn't see this)" 'Let's say we're bad...
END SELECT
EvaluateNumbers$ = RTRIM$(LTRIM$(STR$(n1)))
END FUNCTION
@@ -22625,23 +22832,23 @@ FUNCTION DWD$ (exp$) 'Deal With Duplicates
'-+ becomes a -
t$ = exp$
DO
-bad = 0
-DO
-l = INSTR(t$, "++")
-IF l THEN t$ = LEFT$(t$, l - 1) + "+" + MID$(t$, l + 2): bad = -1
-LOOP UNTIL l = 0
-DO
-l = INSTR(t$, "+-")
-IF l THEN t$ = LEFT$(t$, l - 1) + "-" + MID$(t$, l + 2): bad = -1
-LOOP UNTIL l = 0
-DO
-l = INSTR(t$, "-+")
-IF l THEN t$ = LEFT$(t$, l - 1) + "-" + MID$(t$, l + 2): bad = -1
-LOOP UNTIL l = 0
-DO
-l = INSTR(t$, "--")
-IF l THEN t$ = LEFT$(t$, l - 1) + "+" + MID$(t$, l + 2): bad = -1
-LOOP UNTIL l = 0
+ bad = 0
+ DO
+ l = INSTR(t$, "++")
+ IF l THEN t$ = LEFT$(t$, l - 1) + "+" + MID$(t$, l + 2): bad = -1
+ LOOP UNTIL l = 0
+ DO
+ l = INSTR(t$, "+-")
+ IF l THEN t$ = LEFT$(t$, l - 1) + "-" + MID$(t$, l + 2): bad = -1
+ LOOP UNTIL l = 0
+ DO
+ l = INSTR(t$, "-+")
+ IF l THEN t$ = LEFT$(t$, l - 1) + "-" + MID$(t$, l + 2): bad = -1
+ LOOP UNTIL l = 0
+ DO
+ l = INSTR(t$, "--")
+ IF l THEN t$ = LEFT$(t$, l - 1) + "+" + MID$(t$, l + 2): bad = -1
+ LOOP UNTIL l = 0
LOOP UNTIL NOT bad
DWD$ = t$
VerifyString t$
@@ -22655,7 +22862,7 @@ t$ = e$
'First strip all spaces
t$ = ""
FOR i = 1 TO LEN(e$)
-IF MID$(e$, i, 1) <> " " THEN t$ = t$ + MID$(e$, i, 1)
+ IF MID$(e$, i, 1) <> " " THEN t$ = t$ + MID$(e$, i, 1)
NEXT
t$ = UCASE$(t$)
@@ -22664,115 +22871,115 @@ IF t$ = "" THEN e$ = "ERROR -- NULL string; nothing to evaluate": EXIT SUB
'ERROR CHECK by counting our brackets
l = 0
DO
-l = INSTR(l + 1, t$, "("): IF l THEN c = c + 1
+ l = INSTR(l + 1, t$, "("): IF l THEN c = c + 1
LOOP UNTIL l = 0
l = 0
DO
-l = INSTR(l + 1, t$, ")"): IF l THEN c1 = c1 + 1
+ l = INSTR(l + 1, t$, ")"): IF l THEN c1 = c1 + 1
LOOP UNTIL l = 0
IF c <> c1 THEN e$ = "ERROR -- Bad Parenthesis:" + STR$(c) + "( vs" + STR$(c1) + ")": EXIT SUB
'Modify so that NOT will process properly
l = 0
DO
-l = INSTR(l + 1, t$, "NOT")
-IF l THEN
-'We need to work magic on the statement so it looks pretty.
-' 1 + NOT 2 + 1 is actually processed as 1 + (NOT 2 + 1)
-'Look for something not proper
-l1 = INSTR(l + 1, t$, "AND")
-IF l1 = 0 OR (INSTR(l + 1, t$, "OR") > 0 AND INSTR(l + 1, t$, "OR") < l1) THEN l1 = INSTR(l + 1, t$, "OR")
-IF l1 = 0 OR (INSTR(l + 1, t$, "XOR") > 0 AND INSTR(l + 1, t$, "XOR") < l1) THEN l1 = INSTR(l + 1, t$, "XOR")
-IF l1 = 0 OR (INSTR(l + 1, t$, "EQV") > 0 AND INSTR(l + 1, t$, "EQV") < l1) THEN l1 = INSTR(l + 1, t$, "EQV")
-IF l1 = 0 OR (INSTR(l + 1, t$, "IMP") > 0 AND INSTR(l + 1, t$, "IMP") < l1) THEN l1 = INSTR(l + 1, t$, "IMP")
-IF l1 = 0 THEN l1 = LEN(t$) + 1
-t$ = LEFT$(t$, l - 1) + "(" + MID$(t$, l, l1 - l) + ")" + MID$(t$, l + l1 - l)
-l = l + 3
-'PRINT t$
-END IF
+ l = INSTR(l + 1, t$, "NOT")
+ IF l THEN
+ 'We need to work magic on the statement so it looks pretty.
+ ' 1 + NOT 2 + 1 is actually processed as 1 + (NOT 2 + 1)
+ 'Look for something not proper
+ l1 = INSTR(l + 1, t$, "AND")
+ IF l1 = 0 OR (INSTR(l + 1, t$, "OR") > 0 AND INSTR(l + 1, t$, "OR") < l1) THEN l1 = INSTR(l + 1, t$, "OR")
+ IF l1 = 0 OR (INSTR(l + 1, t$, "XOR") > 0 AND INSTR(l + 1, t$, "XOR") < l1) THEN l1 = INSTR(l + 1, t$, "XOR")
+ IF l1 = 0 OR (INSTR(l + 1, t$, "EQV") > 0 AND INSTR(l + 1, t$, "EQV") < l1) THEN l1 = INSTR(l + 1, t$, "EQV")
+ IF l1 = 0 OR (INSTR(l + 1, t$, "IMP") > 0 AND INSTR(l + 1, t$, "IMP") < l1) THEN l1 = INSTR(l + 1, t$, "IMP")
+ IF l1 = 0 THEN l1 = LEN(t$) + 1
+ t$ = LEFT$(t$, l - 1) + "(" + MID$(t$, l, l1 - l) + ")" + MID$(t$, l + l1 - l)
+ l = l + 3
+ 'PRINT t$
+ END IF
LOOP UNTIL l = 0
'Check for bad operators before a ( bracket
l = 0
DO
-l = INSTR(l + 1, t$, "(")
-IF l AND l > 2 THEN 'Don't check the starting bracket; there's nothing before it.
-good = 0
-FOR i = 1 TO UBOUND(OName)
-IF MID$(t$, l - LEN(OName(i)), LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
-NEXT
-IF NOT good THEN e$ = "ERROR - Improper operations before (.": EXIT SUB
-l = l + 1
-END IF
+ l = INSTR(l + 1, t$, "(")
+ IF l AND l > 2 THEN 'Don't check the starting bracket; there's nothing before it.
+ good = 0
+ FOR i = 1 TO UBOUND(OName)
+ IF MID$(t$, l - LEN(OName(i)), LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
+ NEXT
+ IF NOT good THEN e$ = "ERROR - Improper operations before (.": EXIT SUB
+ l = l + 1
+ END IF
LOOP UNTIL l = 0
'Check for bad operators after a ) bracket
l = 0
DO
-l = INSTR(l + 1, t$, ")")
-IF l AND l < LEN(t$) THEN
-good = 0
-FOR i = 1 TO UBOUND(OName)
-IF MID$(t$, l + 1, LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
-NEXT
-IF MID$(t$, l + 1, 1) = ")" THEN good = -1
-IF NOT good THEN e$ = "ERROR - Improper operations after ).": EXIT SUB
-l = l + 1
-END IF
+ l = INSTR(l + 1, t$, ")")
+ IF l AND l < LEN(t$) THEN
+ good = 0
+ FOR i = 1 TO UBOUND(OName)
+ IF MID$(t$, l + 1, LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
+ NEXT
+ IF MID$(t$, l + 1, 1) = ")" THEN good = -1
+ IF NOT good THEN e$ = "ERROR - Improper operations after ).": EXIT SUB
+ l = l + 1
+ END IF
LOOP UNTIL l = 0 OR l = LEN(t$) 'last symbol is a bracket
'Turn all &H (hex) numbers into decimal values for the program to process properly
l = 0
DO
-l = INSTR(t$, "&H")
-IF l THEN
-E = l + 1: finished = 0
-DO
-E = E + 1
-comp$ = MID$(t$, E, 1)
-SELECT CASE comp$
-CASE "0" TO "9", "A" TO "F" 'All is good, our next digit is a number, continue to add to the hex$
-CASE ELSE
-good = 0
-FOR i = 1 TO UBOUND(OName)
-IF MID$(t$, E, LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
-NEXT
-IF NOT good THEN e$ = "ERROR - Improper &H value. (" + comp$ + ")": EXIT SUB
-E = E - 1
-finished = -1
-END SELECT
-LOOP UNTIL finished OR E = LEN(t$)
-t$ = LEFT$(t$, l - 1) + LTRIM$(RTRIM$(STR$(VAL(MID$(t$, l, E - l + 1))))) + MID$(t$, E + 1)
-END IF
+ l = INSTR(t$, "&H")
+ IF l THEN
+ E = l + 1: finished = 0
+ DO
+ E = E + 1
+ comp$ = MID$(t$, E, 1)
+ SELECT CASE comp$
+ CASE "0" TO "9", "A" TO "F" 'All is good, our next digit is a number, continue to add to the hex$
+ CASE ELSE
+ good = 0
+ FOR i = 1 TO UBOUND(OName)
+ IF MID$(t$, E, LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
+ NEXT
+ IF NOT good THEN e$ = "ERROR - Improper &H value. (" + comp$ + ")": EXIT SUB
+ E = E - 1
+ finished = -1
+ END SELECT
+ LOOP UNTIL finished OR E = LEN(t$)
+ t$ = LEFT$(t$, l - 1) + LTRIM$(RTRIM$(STR$(VAL(MID$(t$, l, E - l + 1))))) + MID$(t$, E + 1)
+ END IF
LOOP UNTIL l = 0
'Turn all &B (binary) numbers into decimal values for the program to process properly
l = 0
DO
-l = INSTR(t$, "&B")
-IF l THEN
-E = l + 1: finished = 0
-DO
-E = E + 1
-comp$ = MID$(t$, E, 1)
-SELECT CASE comp$
-CASE "0", "1" 'All is good, our next digit is a number, continue to add to the hex$
-CASE ELSE
-good = 0
-FOR i = 1 TO UBOUND(OName)
-IF MID$(t$, E, LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
-NEXT
-IF NOT good THEN e$ = "ERROR - Improper &B value. (" + comp$ + ")": EXIT SUB
-E = E - 1
-finished = -1
-END SELECT
-LOOP UNTIL finished OR E = LEN(t$)
-bin$ = MID$(t$, l + 2, E - l - 1)
-FOR i = 1 TO LEN(bin$)
-IF MID$(bin$, i, 1) = "1" THEN f = f + 2 ^ (LEN(bin$) - i)
-NEXT
-t$ = LEFT$(t$, l - 1) + LTRIM$(RTRIM$(STR$(f))) + MID$(t$, E + 1)
-END IF
+ l = INSTR(t$, "&B")
+ IF l THEN
+ E = l + 1: finished = 0
+ DO
+ E = E + 1
+ comp$ = MID$(t$, E, 1)
+ SELECT CASE comp$
+ CASE "0", "1" 'All is good, our next digit is a number, continue to add to the hex$
+ CASE ELSE
+ good = 0
+ FOR i = 1 TO UBOUND(OName)
+ IF MID$(t$, E, LEN(OName(i))) = OName(i) AND PL(i) > 1 AND PL(i) <= 250 THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
+ NEXT
+ IF NOT good THEN e$ = "ERROR - Improper &B value. (" + comp$ + ")": EXIT SUB
+ E = E - 1
+ finished = -1
+ END SELECT
+ LOOP UNTIL finished OR E = LEN(t$)
+ bin$ = MID$(t$, l + 2, E - l - 1)
+ FOR i = 1 TO LEN(bin$)
+ IF MID$(bin$, i, 1) = "1" THEN f = f + 2 ^ (LEN(bin$) - i)
+ NEXT
+ t$ = LEFT$(t$, l - 1) + LTRIM$(RTRIM$(STR$(f))) + MID$(t$, E + 1)
+ END IF
LOOP UNTIL l = 0
t$ = N2S(t$)
@@ -22787,17 +22994,17 @@ SUB VerifyString (t$)
'ERROR CHECK for unrecognized operations
j = 1
DO
-comp$ = MID$(t$, j, 1)
-SELECT CASE comp$
-CASE "0" TO "9", ".", "(", ")": j = j + 1
-CASE ELSE
-good = 0
-FOR i = 1 TO UBOUND(OName)
-IF MID$(t$, j, LEN(OName(i))) = OName(i) THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
-NEXT
-IF NOT good THEN t$ = "ERROR - Bad Operational value. (" + comp$ + ")": EXIT SUB
-j = j + LEN(OName(i))
-END SELECT
+ comp$ = MID$(t$, j, 1)
+ SELECT CASE comp$
+ CASE "0" TO "9", ".", "(", ")": j = j + 1
+ CASE ELSE
+ good = 0
+ FOR i = 1 TO UBOUND(OName)
+ IF MID$(t$, j, LEN(OName(i))) = OName(i) THEN good = -1: EXIT FOR 'We found an operator after our ), and it's not a CONST (like PI)
+ NEXT
+ IF NOT good THEN t$ = "ERROR - Bad Operational value. (" + comp$ + ")": EXIT SUB
+ j = j + LEN(OName(i))
+ END SELECT
LOOP UNTIL j > LEN(t$)
END SUB
@@ -22821,8 +23028,8 @@ l = INSTR(InBot, ".")
IF l = 0 THEN InBot = InBot + "."
IF Op$ = "-" THEN
-Op$ = "+"
-IF MID$(InBot, 1, 1) = "-" THEN MID$(InBot, 1, 1) = "+" ELSE MID$(InBot, 1, 1) = "-"
+ Op$ = "+"
+ IF MID$(InBot, 1, 1) = "-" THEN MID$(InBot, 1, 1) = "+" ELSE MID$(InBot, 1, 1) = "-"
END IF
@@ -22837,31 +23044,31 @@ BSign% = Check&(11, InBot$)
' Calculate Array Size
IF Op$ = CHR$(43) OR Op$ = CHR$(45) THEN
-' "+" (Add) OR "-" (Subtract)
-Temp& = 9
+ ' "+" (Add) OR "-" (Subtract)
+ Temp& = 9
ELSEIF Op$ = CHR$(42) OR Op$ = CHR$(50) THEN
-' "*" (Multiply) OR "2" (SQRT Multiply)
-Temp& = 7
+ ' "*" (Multiply) OR "2" (SQRT Multiply)
+ Temp& = 7
ELSE
-EXIT FUNCTION
+ EXIT FUNCTION
END IF
' LSA (Left Side of Array)
LSA& = TDP& - 2
TLS& = LSA& \ Temp&
IF LSA& MOD Temp& > 0 THEN
-TLS& = TLS& + 1
-DO WHILE (TLPad& + LSA&) MOD Temp& > 0
-TLPad& = TLPad& + 1
-LOOP
+ TLS& = TLS& + 1
+ DO WHILE (TLPad& + LSA&) MOD Temp& > 0
+ TLPad& = TLPad& + 1
+ LOOP
END IF
LSA& = BDP& - 2
BLS& = LSA& \ Temp&
IF LSA& MOD Temp& > 0 THEN
-BLS& = BLS& + 1
-DO WHILE (BLPad& + LSA&) MOD Temp& > 0
-BLPad& = BLPad& + 1
-LOOP
+ BLS& = BLS& + 1
+ DO WHILE (BLPad& + LSA&) MOD Temp& > 0
+ BLPad& = BLPad& + 1
+ LOOP
END IF
IF TLS& >= BLS& THEN LSA& = TLS& ELSE LSA& = BLS&
@@ -22869,404 +23076,404 @@ IF TLS& >= BLS& THEN LSA& = TLS& ELSE LSA& = BLS&
RSA& = LEN(InTop$) - TDP&
TRS& = RSA& \ Temp&
IF RSA& MOD Temp& > 0 THEN
-TRS& = TRS& + 1
-DO WHILE (TRPad& + RSA&) MOD Temp& > 0
-TRPad& = TRPad& + 1
-LOOP
+ TRS& = TRS& + 1
+ DO WHILE (TRPad& + RSA&) MOD Temp& > 0
+ TRPad& = TRPad& + 1
+ LOOP
END IF
RSA& = LEN(InBot$) - BDP&
BRS& = RSA& \ Temp&
IF RSA& MOD Temp& > 0 THEN
-BRS& = BRS& + 1
-DO WHILE (BRPad& + RSA&) MOD Temp& > 0
-BRPad& = BRPad& + 1
-LOOP
+ BRS& = BRS& + 1
+ DO WHILE (BRPad& + RSA&) MOD Temp& > 0
+ BRPad& = BRPad& + 1
+ LOOP
END IF
IF TRS& >= BRS& THEN RSA& = TRS& ELSE RSA& = BRS&
IF Op$ = CHR$(43) OR Op$ = CHR$(45) THEN
-' "+" (Add) OR "-" (Subtract)
+ ' "+" (Add) OR "-" (Subtract)
-DIM Result(1 TO (LSA& + RSA&)) AS LONG
+ DIM Result(1 TO (LSA& + RSA&)) AS LONG
-IF (Op$ = CHR$(43) AND TSign% = BSign%) OR (Op$ = CHR$(45) AND TSign% <> BSign%) THEN
-' Add Absolute Values and Return Top Sign
+ IF (Op$ = CHR$(43) AND TSign% = BSign%) OR (Op$ = CHR$(45) AND TSign% <> BSign%) THEN
+ ' Add Absolute Values and Return Top Sign
-' Left Side
-FOR I& = 1 TO LSA&
-' Top
-IF I& <= (LSA& - TLS&) THEN
-''' Result(I&) = Result(I&) + 0
-ELSEIF I& = (1 + LSA& - TLS&) THEN
-Result(I&) = VAL(MID$(InTop$, 2, (9 - TLPad&)))
-TDP& = 11 - TLPad&
-ELSE
-Result(I&) = VAL(MID$(InTop$, TDP&, 9))
-TDP& = TDP& + 9
-END IF
-' Bottom
-IF I& <= (LSA& - BLS&) THEN
-''' Result(I&) = Result(I&) + 0
-ELSEIF I& = (1 + LSA& - BLS&) THEN
-Result(I&) = Result(I&) + VAL(MID$(InBot$, 2, (9 - BLPad&)))
-BDP& = 11 - BLPad&
-ELSE
-Result(I&) = Result(I&) + VAL(MID$(InBot$, BDP&, 9))
-BDP& = BDP& + 9
-END IF
-NEXT I&
+ ' Left Side
+ FOR I& = 1 TO LSA&
+ ' Top
+ IF I& <= (LSA& - TLS&) THEN
+ ''' Result(I&) = Result(I&) + 0
+ ELSEIF I& = (1 + LSA& - TLS&) THEN
+ Result(I&) = VAL(MID$(InTop$, 2, (9 - TLPad&)))
+ TDP& = 11 - TLPad&
+ ELSE
+ Result(I&) = VAL(MID$(InTop$, TDP&, 9))
+ TDP& = TDP& + 9
+ END IF
+ ' Bottom
+ IF I& <= (LSA& - BLS&) THEN
+ ''' Result(I&) = Result(I&) + 0
+ ELSEIF I& = (1 + LSA& - BLS&) THEN
+ Result(I&) = Result(I&) + VAL(MID$(InBot$, 2, (9 - BLPad&)))
+ BDP& = 11 - BLPad&
+ ELSE
+ Result(I&) = Result(I&) + VAL(MID$(InBot$, BDP&, 9))
+ BDP& = BDP& + 9
+ END IF
+ NEXT I&
-' Right Side
-TDP& = TDP& + 1: BDP& = BDP& + 1
-FOR I& = (LSA& + 1) TO (LSA& + RSA&)
-' Top
-IF I& > (LSA& + TRS&) THEN
-''' Result(I&) = Result(I&) + 0
-ELSEIF I& = (LSA& + TRS&) THEN
-Result(I&) = (10 ^ TRPad&) * VAL(RIGHT$(InTop$, (9 - TRPad&)))
-ELSE
-Result(I&) = VAL(MID$(InTop$, TDP&, 9))
-TDP& = TDP& + 9
-END IF
-' Bottom
-IF I& > (LSA& + BRS&) THEN
-''' Result(I&) = Result(I&) + 0
-ELSEIF I& = (LSA& + BRS&) THEN
-Result(I&) = Result(I&) + (10 ^ BRPad&) * VAL(RIGHT$(InBot$, (9 - BRPad&)))
-ELSE
-Result(I&) = Result(I&) + VAL(MID$(InBot$, BDP&, 9))
-BDP& = BDP& + 9
-END IF
-NEXT I&
+ ' Right Side
+ TDP& = TDP& + 1: BDP& = BDP& + 1
+ FOR I& = (LSA& + 1) TO (LSA& + RSA&)
+ ' Top
+ IF I& > (LSA& + TRS&) THEN
+ ''' Result(I&) = Result(I&) + 0
+ ELSEIF I& = (LSA& + TRS&) THEN
+ Result(I&) = (10 ^ TRPad&) * VAL(RIGHT$(InTop$, (9 - TRPad&)))
+ ELSE
+ Result(I&) = VAL(MID$(InTop$, TDP&, 9))
+ TDP& = TDP& + 9
+ END IF
+ ' Bottom
+ IF I& > (LSA& + BRS&) THEN
+ ''' Result(I&) = Result(I&) + 0
+ ELSEIF I& = (LSA& + BRS&) THEN
+ Result(I&) = Result(I&) + (10 ^ BRPad&) * VAL(RIGHT$(InBot$, (9 - BRPad&)))
+ ELSE
+ Result(I&) = Result(I&) + VAL(MID$(InBot$, BDP&, 9))
+ BDP& = BDP& + 9
+ END IF
+ NEXT I&
-' Carry
-FOR I& = (LSA& + RSA&) TO 2 STEP -1
-IF Result(I&) >= 1000000000 THEN
-Result(I& - 1) = Result(I& - 1) + 1
-Result(I&) = Result(I&) - 1000000000
-END IF
-NEXT I&
+ ' Carry
+ FOR I& = (LSA& + RSA&) TO 2 STEP -1
+ IF Result(I&) >= 1000000000 THEN
+ Result(I& - 1) = Result(I& - 1) + 1
+ Result(I&) = Result(I&) - 1000000000
+ END IF
+ NEXT I&
-' Return Sign
-IF TSign% = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
+ ' Return Sign
+ IF TSign% = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
-ELSE
-' Compare Absolute Values
+ ELSE
+ ' Compare Absolute Values
-IF TDP& > BDP& THEN
-Compare& = 1
-ELSEIF TDP& < BDP& THEN
-Compare& = -1
-ELSE
-IF LEN(InTop$) > LEN(InBot$) THEN Compare& = LEN(InBot$) ELSE Compare& = LEN(InTop$)
-FOR I& = 2 TO Compare&
-IF VAL(MID$(InTop$, I&, 1)) > VAL(MID$(InBot$, I&, 1)) THEN
-Compare& = 1
-EXIT FOR
-ELSEIF VAL(MID$(InTop$, I&, 1)) < VAL(MID$(InBot$, I&, 1)) THEN
-Compare& = -1
-EXIT FOR
-END IF
-NEXT I&
-IF Compare& > 1 THEN
-IF LEN(InTop$) > LEN(InBot$) THEN
-Compare& = 1
-ELSEIF LEN(InTop$) < LEN(InBot$) THEN
-Compare& = -1
-ELSE
-Compare& = 0
-END IF
-END IF
-END IF
+ IF TDP& > BDP& THEN
+ Compare& = 1
+ ELSEIF TDP& < BDP& THEN
+ Compare& = -1
+ ELSE
+ IF LEN(InTop$) > LEN(InBot$) THEN Compare& = LEN(InBot$) ELSE Compare& = LEN(InTop$)
+ FOR I& = 2 TO Compare&
+ IF VAL(MID$(InTop$, I&, 1)) > VAL(MID$(InBot$, I&, 1)) THEN
+ Compare& = 1
+ EXIT FOR
+ ELSEIF VAL(MID$(InTop$, I&, 1)) < VAL(MID$(InBot$, I&, 1)) THEN
+ Compare& = -1
+ EXIT FOR
+ END IF
+ NEXT I&
+ IF Compare& > 1 THEN
+ IF LEN(InTop$) > LEN(InBot$) THEN
+ Compare& = 1
+ ELSEIF LEN(InTop$) < LEN(InBot$) THEN
+ Compare& = -1
+ ELSE
+ Compare& = 0
+ END IF
+ END IF
+ END IF
-' Conditional Subtraction
+ ' Conditional Subtraction
-IF Compare& = 1 THEN
-' Subtract Bottom from Top and Return Top Sign
+ IF Compare& = 1 THEN
+ ' Subtract Bottom from Top and Return Top Sign
-' Top
-Result(1) = VAL(MID$(InTop$, 2, (9 - TLPad&)))
-TDP& = 11 - TLPad&
-FOR I& = 2 TO LSA&
-Result(I&) = VAL(MID$(InTop$, TDP&, 9))
-TDP& = TDP& + 9
-NEXT I&
-TDP& = TDP& + 1
-FOR I& = (LSA& + 1) TO (LSA& + TRS& - 1)
-Result(I&) = VAL(MID$(InTop$, TDP&, 9))
-TDP& = TDP& + 9
-NEXT I&
-Result(LSA& + TRS&) = 10& ^ TRPad& * VAL(RIGHT$(InTop$, (9 - TRPad&)))
+ ' Top
+ Result(1) = VAL(MID$(InTop$, 2, (9 - TLPad&)))
+ TDP& = 11 - TLPad&
+ FOR I& = 2 TO LSA&
+ Result(I&) = VAL(MID$(InTop$, TDP&, 9))
+ TDP& = TDP& + 9
+ NEXT I&
+ TDP& = TDP& + 1
+ FOR I& = (LSA& + 1) TO (LSA& + TRS& - 1)
+ Result(I&) = VAL(MID$(InTop$, TDP&, 9))
+ TDP& = TDP& + 9
+ NEXT I&
+ Result(LSA& + TRS&) = 10& ^ TRPad& * VAL(RIGHT$(InTop$, (9 - TRPad&)))
-' Bottom
-BDP& = (LEN(InBot$) - 17) + BRPad&
-FOR I& = (LSA& + BRS&) TO (1 + LSA& - BLS&) STEP -1
-IF I& = LSA& THEN BDP& = BDP& - 1
-IF I& = (LSA& + BRS&) THEN
-Temp& = (10& ^ BRPad&) * VAL(RIGHT$(InBot$, (9 - BRPad&)))
-ELSEIF I& = (1 + LSA& - BLS&) THEN
-Temp& = VAL(MID$(InBot$, 2, (9 - BLPad&)))
-ELSE
-Temp& = VAL(MID$(InBot$, BDP&, 9))
-BDP& = BDP& - 9
-END IF
-IF Result(I&) < Temp& THEN
-' Borrow
-FOR J& = (I& - 1) TO 1 STEP -1
-IF Result(J&) = 0 THEN
-Result(J&) = 999999999
-ELSE
-Result(J&) = Result(J&) - 1
-EXIT FOR
-END IF
-NEXT J&
-Result(I&) = Result(I&) + 1000000000
-END IF
-Result(I&) = Result(I&) - Temp&
-NEXT I&
+ ' Bottom
+ BDP& = (LEN(InBot$) - 17) + BRPad&
+ FOR I& = (LSA& + BRS&) TO (1 + LSA& - BLS&) STEP -1
+ IF I& = LSA& THEN BDP& = BDP& - 1
+ IF I& = (LSA& + BRS&) THEN
+ Temp& = (10& ^ BRPad&) * VAL(RIGHT$(InBot$, (9 - BRPad&)))
+ ELSEIF I& = (1 + LSA& - BLS&) THEN
+ Temp& = VAL(MID$(InBot$, 2, (9 - BLPad&)))
+ ELSE
+ Temp& = VAL(MID$(InBot$, BDP&, 9))
+ BDP& = BDP& - 9
+ END IF
+ IF Result(I&) < Temp& THEN
+ ' Borrow
+ FOR J& = (I& - 1) TO 1 STEP -1
+ IF Result(J&) = 0 THEN
+ Result(J&) = 999999999
+ ELSE
+ Result(J&) = Result(J&) - 1
+ EXIT FOR
+ END IF
+ NEXT J&
+ Result(I&) = Result(I&) + 1000000000
+ END IF
+ Result(I&) = Result(I&) - Temp&
+ NEXT I&
-' Return Sign
-IF TSign% = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
+ ' Return Sign
+ IF TSign% = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
-ELSEIF Compare& = -1 THEN
-' Subtract Top from Bottom and Return Bottom Sign
+ ELSEIF Compare& = -1 THEN
+ ' Subtract Top from Bottom and Return Bottom Sign
-' Bottom
-Result(1) = VAL(MID$(InBot$, 2, (9 - BLPad&)))
-BDP& = 11 - BLPad&
-FOR I& = 2 TO LSA&
-Result(I&) = VAL(MID$(InBot$, BDP&, 9))
-BDP& = BDP& + 9
-NEXT I&
-BDP& = BDP& + 1
-FOR I& = (LSA& + 1) TO (LSA& + BRS& - 1)
-Result(I&) = VAL(MID$(InBot$, BDP&, 9))
-BDP& = BDP& + 9
-NEXT I&
-Result(LSA& + BRS&) = 10& ^ BRPad& * VAL(RIGHT$(InBot$, (9 - BRPad&)))
+ ' Bottom
+ Result(1) = VAL(MID$(InBot$, 2, (9 - BLPad&)))
+ BDP& = 11 - BLPad&
+ FOR I& = 2 TO LSA&
+ Result(I&) = VAL(MID$(InBot$, BDP&, 9))
+ BDP& = BDP& + 9
+ NEXT I&
+ BDP& = BDP& + 1
+ FOR I& = (LSA& + 1) TO (LSA& + BRS& - 1)
+ Result(I&) = VAL(MID$(InBot$, BDP&, 9))
+ BDP& = BDP& + 9
+ NEXT I&
+ Result(LSA& + BRS&) = 10& ^ BRPad& * VAL(RIGHT$(InBot$, (9 - BRPad&)))
-' Top
-TDP& = (LEN(InTop$) - 17) + TRPad&
-FOR I& = (LSA& + TRS&) TO (1 + LSA& - TLS&) STEP -1
-IF I& = LSA& THEN TDP& = TDP& - 1
-IF I& = (LSA& + TRS&) THEN
-Temp& = (10& ^ TRPad&) * VAL(RIGHT$(InTop$, (9 - TRPad&)))
-ELSEIF I& = (1 + LSA& - TLS&) THEN
-Temp& = VAL(MID$(InTop$, 2, (9 - TLPad&)))
-ELSE
-Temp& = VAL(MID$(InTop$, TDP&, 9))
-TDP& = TDP& - 9
-END IF
-IF Result(I&) < Temp& THEN
-' Borrow
-FOR J& = (I& - 1) TO 1 STEP -1
-IF Result(J&) = 0 THEN
-Result(J&) = 999999999
-ELSE
-Result(J&) = Result(J&) - 1
-EXIT FOR
-END IF
-NEXT J&
-Result(I&) = Result(I&) + 1000000000
-END IF
-Result(I&) = Result(I&) - Temp&
-NEXT I&
+ ' Top
+ TDP& = (LEN(InTop$) - 17) + TRPad&
+ FOR I& = (LSA& + TRS&) TO (1 + LSA& - TLS&) STEP -1
+ IF I& = LSA& THEN TDP& = TDP& - 1
+ IF I& = (LSA& + TRS&) THEN
+ Temp& = (10& ^ TRPad&) * VAL(RIGHT$(InTop$, (9 - TRPad&)))
+ ELSEIF I& = (1 + LSA& - TLS&) THEN
+ Temp& = VAL(MID$(InTop$, 2, (9 - TLPad&)))
+ ELSE
+ Temp& = VAL(MID$(InTop$, TDP&, 9))
+ TDP& = TDP& - 9
+ END IF
+ IF Result(I&) < Temp& THEN
+ ' Borrow
+ FOR J& = (I& - 1) TO 1 STEP -1
+ IF Result(J&) = 0 THEN
+ Result(J&) = 999999999
+ ELSE
+ Result(J&) = Result(J&) - 1
+ EXIT FOR
+ END IF
+ NEXT J&
+ Result(I&) = Result(I&) + 1000000000
+ END IF
+ Result(I&) = Result(I&) - Temp&
+ NEXT I&
-' Build Return Sign
-IF BSign% = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
+ ' Build Return Sign
+ IF BSign% = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
-ELSE
-' Result will always be 0
+ ELSE
+ ' Result will always be 0
-LSA& = 1: RSA& = 1
-RetStr$ = CHR$(43)
+ LSA& = 1: RSA& = 1
+ RetStr$ = CHR$(43)
-END IF
-END IF
+ END IF
+ END IF
-' Generate Return String
-RetStr$ = RetStr$ + LTRIM$(STR$(Result(1)))
-FOR I& = 2 TO LSA&
-RetStr$ = RetStr$ + RIGHT$(STRING$(8, 48) + LTRIM$(STR$(Result(I&))), 9)
-NEXT I&
-RetStr$ = RetStr$ + CHR$(46)
-FOR I& = (LSA& + 1) TO (LSA& + RSA&)
-RetStr$ = RetStr$ + RIGHT$(STRING$(8, 48) + LTRIM$(STR$(Result(I&))), 9)
-NEXT I&
+ ' Generate Return String
+ RetStr$ = RetStr$ + LTRIM$(STR$(Result(1)))
+ FOR I& = 2 TO LSA&
+ RetStr$ = RetStr$ + RIGHT$(STRING$(8, 48) + LTRIM$(STR$(Result(I&))), 9)
+ NEXT I&
+ RetStr$ = RetStr$ + CHR$(46)
+ FOR I& = (LSA& + 1) TO (LSA& + RSA&)
+ RetStr$ = RetStr$ + RIGHT$(STRING$(8, 48) + LTRIM$(STR$(Result(I&))), 9)
+ NEXT I&
-ERASE Result
+ ERASE Result
ELSEIF Op$ = CHR$(42) THEN
-' * (Multiply)
+ ' * (Multiply)
-DIM TArray(1 TO (LSA& + RSA&)) AS LONG
-DIM BArray(1 TO (LSA& + RSA&)) AS LONG
-DIM ResDBL(0 TO (LSA& + RSA&)) AS DOUBLE
+ DIM TArray(1 TO (LSA& + RSA&)) AS LONG
+ DIM BArray(1 TO (LSA& + RSA&)) AS LONG
+ DIM ResDBL(0 TO (LSA& + RSA&)) AS DOUBLE
-' Push String Data Into Array
-FOR I& = 1 TO LSA&
-IF I& <= (LSA& - TLS&) THEN
-''' TArray(I&) = TArray(I&) + 0
-ELSEIF I& = (1 + LSA& - TLS&) THEN
-TArray(I&) = VAL(MID$(InTop$, 2, (7 - TLPad&)))
-TDP& = 9 - TLPad&
-ELSE
-TArray(I&) = VAL(MID$(InTop$, TDP&, 7))
-TDP& = TDP& + 7
-END IF
-IF I& <= (LSA& - BLS&) THEN
-''' BArray(I&) = BArray(I&) + 0
-ELSEIF I& = (1 + LSA& - BLS&) THEN
-BArray(I&) = VAL(MID$(InBot$, 2, (7 - BLPad&)))
-BDP& = 9 - BLPad&
-ELSE
-BArray(I&) = VAL(MID$(InBot$, BDP&, 7))
-BDP& = BDP& + 7
-END IF
-NEXT I&
-TDP& = TDP& + 1: BDP& = BDP& + 1
-FOR I& = (LSA& + 1) TO (LSA& + RSA&)
-IF I& > (LSA& + TRS&) THEN
-''' TArray(I&) = TArray(I&) + 0
-ELSEIF I& = (LSA& + TRS&) THEN
-TArray(I&) = 10 ^ TRPad& * VAL(RIGHT$(InTop$, (7 - TRPad&)))
-ELSE
-TArray(I&) = VAL(MID$(InTop$, TDP&, 7))
-TDP& = TDP& + 7
-END IF
-IF I& > (LSA& + BRS&) THEN
-''' BArray(I&) = BArray(I&) + 0
-ELSEIF I& = (LSA& + BRS&) THEN
-BArray(I&) = 10 ^ BRPad& * VAL(RIGHT$(InBot$, (7 - BRPad&)))
-ELSE
-BArray(I&) = VAL(MID$(InBot$, BDP&, 7))
-BDP& = BDP& + 7
-END IF
-NEXT I&
+ ' Push String Data Into Array
+ FOR I& = 1 TO LSA&
+ IF I& <= (LSA& - TLS&) THEN
+ ''' TArray(I&) = TArray(I&) + 0
+ ELSEIF I& = (1 + LSA& - TLS&) THEN
+ TArray(I&) = VAL(MID$(InTop$, 2, (7 - TLPad&)))
+ TDP& = 9 - TLPad&
+ ELSE
+ TArray(I&) = VAL(MID$(InTop$, TDP&, 7))
+ TDP& = TDP& + 7
+ END IF
+ IF I& <= (LSA& - BLS&) THEN
+ ''' BArray(I&) = BArray(I&) + 0
+ ELSEIF I& = (1 + LSA& - BLS&) THEN
+ BArray(I&) = VAL(MID$(InBot$, 2, (7 - BLPad&)))
+ BDP& = 9 - BLPad&
+ ELSE
+ BArray(I&) = VAL(MID$(InBot$, BDP&, 7))
+ BDP& = BDP& + 7
+ END IF
+ NEXT I&
+ TDP& = TDP& + 1: BDP& = BDP& + 1
+ FOR I& = (LSA& + 1) TO (LSA& + RSA&)
+ IF I& > (LSA& + TRS&) THEN
+ ''' TArray(I&) = TArray(I&) + 0
+ ELSEIF I& = (LSA& + TRS&) THEN
+ TArray(I&) = 10 ^ TRPad& * VAL(RIGHT$(InTop$, (7 - TRPad&)))
+ ELSE
+ TArray(I&) = VAL(MID$(InTop$, TDP&, 7))
+ TDP& = TDP& + 7
+ END IF
+ IF I& > (LSA& + BRS&) THEN
+ ''' BArray(I&) = BArray(I&) + 0
+ ELSEIF I& = (LSA& + BRS&) THEN
+ BArray(I&) = 10 ^ BRPad& * VAL(RIGHT$(InBot$, (7 - BRPad&)))
+ ELSE
+ BArray(I&) = VAL(MID$(InBot$, BDP&, 7))
+ BDP& = BDP& + 7
+ END IF
+ NEXT I&
-' Multiply from Arrays to Array
-FOR I& = (LSA& + TRS&) TO (1 + LSA& - TLS&) STEP -1
-FOR J& = (LSA& + BRS&) TO (1 + LSA& - BLS&) STEP -1
-Temp# = 1# * TArray(I&) * BArray(J&)
-IF (I& + J&) MOD 2 = 0 THEN
-TL& = INT(Temp# / 10000000)
-TR& = Temp# - 10000000# * TL&
-ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
-ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + 10000000# * TR&
-ELSE
-ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + Temp#
-END IF
-IF ResDBL((I& + J&) \ 2) >= 100000000000000# THEN
-Temp# = ResDBL((I& + J&) \ 2)
-TL& = INT(Temp# / 100000000000000#)
-ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
-ResDBL((I& + J&) \ 2) = Temp# - 100000000000000# * TL&
-END IF
-NEXT J&
-NEXT I&
+ ' Multiply from Arrays to Array
+ FOR I& = (LSA& + TRS&) TO (1 + LSA& - TLS&) STEP -1
+ FOR J& = (LSA& + BRS&) TO (1 + LSA& - BLS&) STEP -1
+ Temp# = 1# * TArray(I&) * BArray(J&)
+ IF (I& + J&) MOD 2 = 0 THEN
+ TL& = INT(Temp# / 10000000)
+ TR& = Temp# - 10000000# * TL&
+ ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
+ ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + 10000000# * TR&
+ ELSE
+ ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + Temp#
+ END IF
+ IF ResDBL((I& + J&) \ 2) >= 100000000000000# THEN
+ Temp# = ResDBL((I& + J&) \ 2)
+ TL& = INT(Temp# / 100000000000000#)
+ ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
+ ResDBL((I& + J&) \ 2) = Temp# - 100000000000000# * TL&
+ END IF
+ NEXT J&
+ NEXT I&
-ERASE TArray, BArray
+ ERASE TArray, BArray
-' Generate Return String
-IF (TSign% * BSign%) = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
-RetStr$ = RetStr$ + LTRIM$(STR$(ResDBL(0)))
-FOR I& = 1 TO (LSA&)
-RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
-NEXT I&
-RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 7) + CHR$(46) + RIGHT$(RetStr$, 7)
-FOR I& = (LSA& + 1) TO (LSA& + RSA&)
-RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
-NEXT I&
+ ' Generate Return String
+ IF (TSign% * BSign%) = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
+ RetStr$ = RetStr$ + LTRIM$(STR$(ResDBL(0)))
+ FOR I& = 1 TO (LSA&)
+ RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
+ NEXT I&
+ RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 7) + CHR$(46) + RIGHT$(RetStr$, 7)
+ FOR I& = (LSA& + 1) TO (LSA& + RSA&)
+ RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
+ NEXT I&
-ERASE ResDBL
+ ERASE ResDBL
ELSEIF Op$ = CHR$(50) THEN
-' 2 (SQRT Multiply)
+ ' 2 (SQRT Multiply)
-DIM IArray(1 TO (LSA& + RSA&)) AS LONG
-DIM ResDBL(0 TO (LSA& + RSA&)) AS DOUBLE
+ DIM IArray(1 TO (LSA& + RSA&)) AS LONG
+ DIM ResDBL(0 TO (LSA& + RSA&)) AS DOUBLE
-' Push String Data Into Array
-FOR I& = 1 TO LSA&
-IF I& <= (LSA& - TLS&) THEN
-''' IArray(I&) = IArray(I&) + 0
-ELSEIF I& = (1 + LSA& - TLS&) THEN
-IArray(I&) = VAL(MID$(InTop$, 2, (7 - TLPad&)))
-TDP& = 9 - TLPad&
-ELSE
-IArray(I&) = VAL(MID$(InTop$, TDP&, 7))
-TDP& = TDP& + 7
-END IF
-NEXT I&
-TDP& = TDP& + 1
-FOR I& = (LSA& + 1) TO (LSA& + RSA&)
-IF I& > (LSA& + TRS&) THEN
-''' IArray(I&) = IArray(I&) + 0
-ELSEIF I& = (LSA& + TRS&) THEN
-IArray(I&) = 10 ^ TRPad& * VAL(RIGHT$(InTop$, (7 - TRPad&)))
-ELSE
-IArray(I&) = VAL(MID$(InTop$, TDP&, 7))
-TDP& = TDP& + 7
-END IF
-NEXT I&
+ ' Push String Data Into Array
+ FOR I& = 1 TO LSA&
+ IF I& <= (LSA& - TLS&) THEN
+ ''' IArray(I&) = IArray(I&) + 0
+ ELSEIF I& = (1 + LSA& - TLS&) THEN
+ IArray(I&) = VAL(MID$(InTop$, 2, (7 - TLPad&)))
+ TDP& = 9 - TLPad&
+ ELSE
+ IArray(I&) = VAL(MID$(InTop$, TDP&, 7))
+ TDP& = TDP& + 7
+ END IF
+ NEXT I&
+ TDP& = TDP& + 1
+ FOR I& = (LSA& + 1) TO (LSA& + RSA&)
+ IF I& > (LSA& + TRS&) THEN
+ ''' IArray(I&) = IArray(I&) + 0
+ ELSEIF I& = (LSA& + TRS&) THEN
+ IArray(I&) = 10 ^ TRPad& * VAL(RIGHT$(InTop$, (7 - TRPad&)))
+ ELSE
+ IArray(I&) = VAL(MID$(InTop$, TDP&, 7))
+ TDP& = TDP& + 7
+ END IF
+ NEXT I&
-' SQRT Multiply from Array to Array
-FOR I& = (LSA& + TRS&) TO 1 STEP -1
-FOR J& = I& TO 1 STEP -1
-Temp# = 1# * IArray(I&) * IArray(J&)
-IF I& <> J& THEN Temp# = Temp# * 2
-IF (I& + J&) MOD 2 = 0 THEN
-TL& = INT(Temp# / 10000000)
-TR& = Temp# - 10000000# * TL&
-ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
-ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + 10000000# * TR&
-ELSE
-ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + Temp#
-END IF
-IF ResDBL((I& + J&) \ 2) >= 100000000000000# THEN
-Temp# = ResDBL((I& + J&) \ 2)
-TL& = INT(Temp# / 100000000000000#)
-ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
-ResDBL((I& + J&) \ 2) = Temp# - 100000000000000# * TL&
-END IF
-NEXT J&
-NEXT I&
+ ' SQRT Multiply from Array to Array
+ FOR I& = (LSA& + TRS&) TO 1 STEP -1
+ FOR J& = I& TO 1 STEP -1
+ Temp# = 1# * IArray(I&) * IArray(J&)
+ IF I& <> J& THEN Temp# = Temp# * 2
+ IF (I& + J&) MOD 2 = 0 THEN
+ TL& = INT(Temp# / 10000000)
+ TR& = Temp# - 10000000# * TL&
+ ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
+ ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + 10000000# * TR&
+ ELSE
+ ResDBL((I& + J&) \ 2) = ResDBL((I& + J&) \ 2) + Temp#
+ END IF
+ IF ResDBL((I& + J&) \ 2) >= 100000000000000# THEN
+ Temp# = ResDBL((I& + J&) \ 2)
+ TL& = INT(Temp# / 100000000000000#)
+ ResDBL(((I& + J&) \ 2) - 1) = ResDBL(((I& + J&) \ 2) - 1) + TL&
+ ResDBL((I& + J&) \ 2) = Temp# - 100000000000000# * TL&
+ END IF
+ NEXT J&
+ NEXT I&
-ERASE IArray
+ ERASE IArray
-' Generate Return String
-IF (TSign% * BSign%) = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
-RetStr$ = RetStr$ + LTRIM$(STR$(ResDBL(0)))
-FOR I& = 1 TO (LSA&)
-RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
-NEXT I&
-RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 7) + CHR$(46) + RIGHT$(RetStr$, 7)
-' Don't usually want the full right side for this, just enough to check the
-' actual result against the expected result, which is probably an integer.
-' Uncomment the three lines below when trying to find an oddball square root.
-'FOR I& = (LSA& + 1) TO (LSA& + RSA&)
-' RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
-'NEXT I&
+ ' Generate Return String
+ IF (TSign% * BSign%) = 1 THEN RetStr$ = CHR$(43) ELSE RetStr$ = CHR$(45)
+ RetStr$ = RetStr$ + LTRIM$(STR$(ResDBL(0)))
+ FOR I& = 1 TO (LSA&)
+ RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
+ NEXT I&
+ RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 7) + CHR$(46) + RIGHT$(RetStr$, 7)
+ ' Don't usually want the full right side for this, just enough to check the
+ ' actual result against the expected result, which is probably an integer.
+ ' Uncomment the three lines below when trying to find an oddball square root.
+ 'FOR I& = (LSA& + 1) TO (LSA& + RSA&)
+ ' RetStr$ = RetStr$ + RIGHT$(STRING$(13, 48) + LTRIM$(STR$(ResDBL(I&))), 14)
+ 'NEXT I&
-ERASE ResDBL
+ ERASE ResDBL
END IF
' Trim Leading and Trailing Zeroes
DO WHILE MID$(RetStr$, 2, 1) = CHR$(48) AND MID$(RetStr$, 3, 1) <> CHR$(46)
-RetStr$ = LEFT$(RetStr$, 1) + RIGHT$(RetStr$, LEN(RetStr$) - 2)
+ RetStr$ = LEFT$(RetStr$, 1) + RIGHT$(RetStr$, LEN(RetStr$) - 2)
LOOP
DO WHILE RIGHT$(RetStr$, 1) = CHR$(48) AND RIGHT$(RetStr$, 2) <> CHR$(46) + CHR$(48)
-RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 1)
+ RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 1)
LOOP
IF MID$(RetStr$, 1, 1) = "+" THEN MID$(RetStr$, 1, 1) = " "
DO
-r$ = RIGHT$(RetStr$, 1)
-IF r$ = "0" THEN RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 1)
+ r$ = RIGHT$(RetStr$, 1)
+ IF r$ = "0" THEN RetStr$ = LEFT$(RetStr$, LEN(RetStr$) - 1)
LOOP UNTIL r$ <> "0"
r$ = RIGHT$(RetStr$, 1)
@@ -23298,87 +23505,87 @@ RetVal& = LEN(InString$)
SELECT CASE Op&
-CASE 10
-' {00A} Test String for Base-10-Format ( *!* ALTERS InString$ *!* )
-' Returns:
-' {& > 0} = DP offset; {& < 0} = FAILED at negative offset
-'
-' After testing passes, the string is trimmed
-' of nonessential leading and trailing zeroes.
+ CASE 10
+ ' {00A} Test String for Base-10-Format ( *!* ALTERS InString$ *!* )
+ ' Returns:
+ ' {& > 0} = DP offset; {& < 0} = FAILED at negative offset
+ '
+ ' After testing passes, the string is trimmed
+ ' of nonessential leading and trailing zeroes.
-IF RetVal& = 0 THEN
-RetVal& = -1
-ELSE
-SELECT CASE ASC(LEFT$(InString$, 1))
-CASE 43, 45 ' "+", "-"
-FOR I& = 2 TO RetVal&
-SELECT CASE ASC(MID$(InString$, I&, 1))
-CASE 46 ' "."
-IF DPC% > 0 THEN
-RetVal& = 0 - I&
-EXIT FOR
-ELSE
-DPC% = DPC% + 1
-RetVal& = I&
-END IF
-CASE 48 TO 57
-' keep going
-CASE ELSE
-RetVal& = 0 - I&
-EXIT FOR
-END SELECT
-NEXT I&
-CASE ELSE
-RetVal& = -1
-END SELECT
-IF DPC% = 0 AND RetVal& > 0 THEN
-RetVal& = 0 - RetVal&
-ELSEIF RetVal& = 2 THEN
-InString$ = LEFT$(InString$, 1) + CHR$(48) + RIGHT$(InString$, LEN(InString$) - 1)
-RetVal& = RetVal& + 1
-END IF
-IF RetVal& = LEN(InString$) THEN InString$ = InString$ + CHR$(48)
-DO WHILE ASC(RIGHT$(InString$, 1)) = 48 AND RetVal& < (LEN(InString$) - 1)
-InString$ = LEFT$(InString$, LEN(InString$) - 1)
-LOOP
-DO WHILE ASC(MID$(InString$, 2, 1)) = 48 AND RetVal& > 3
-InString$ = LEFT$(InString$, 1) + RIGHT$(InString$, LEN(InString$) - 2)
-RetVal& = RetVal& - 1
-LOOP
-END IF
+ IF RetVal& = 0 THEN
+ RetVal& = -1
+ ELSE
+ SELECT CASE ASC(LEFT$(InString$, 1))
+ CASE 43, 45 ' "+", "-"
+ FOR I& = 2 TO RetVal&
+ SELECT CASE ASC(MID$(InString$, I&, 1))
+ CASE 46 ' "."
+ IF DPC% > 0 THEN
+ RetVal& = 0 - I&
+ EXIT FOR
+ ELSE
+ DPC% = DPC% + 1
+ RetVal& = I&
+ END IF
+ CASE 48 TO 57
+ ' keep going
+ CASE ELSE
+ RetVal& = 0 - I&
+ EXIT FOR
+ END SELECT
+ NEXT I&
+ CASE ELSE
+ RetVal& = -1
+ END SELECT
+ IF DPC% = 0 AND RetVal& > 0 THEN
+ RetVal& = 0 - RetVal&
+ ELSEIF RetVal& = 2 THEN
+ InString$ = LEFT$(InString$, 1) + CHR$(48) + RIGHT$(InString$, LEN(InString$) - 1)
+ RetVal& = RetVal& + 1
+ END IF
+ IF RetVal& = LEN(InString$) THEN InString$ = InString$ + CHR$(48)
+ DO WHILE ASC(RIGHT$(InString$, 1)) = 48 AND RetVal& < (LEN(InString$) - 1)
+ InString$ = LEFT$(InString$, LEN(InString$) - 1)
+ LOOP
+ DO WHILE ASC(MID$(InString$, 2, 1)) = 48 AND RetVal& > 3
+ InString$ = LEFT$(InString$, 1) + RIGHT$(InString$, LEN(InString$) - 2)
+ RetVal& = RetVal& - 1
+ LOOP
+ END IF
-CASE 11
-' {00B} Read Sign ("+", "-", or "ñ")
-' Returns:
-' Explicit: +1 = Positive; -1 = Negative; 0 = Unsigned;
-' Implied: +64 = Positive; -64 = NULL String
+ CASE 11
+ ' {00B} Read Sign ("+", "-", or "ñ")
+ ' Returns:
+ ' Explicit: +1 = Positive; -1 = Negative; 0 = Unsigned;
+ ' Implied: +64 = Positive; -64 = NULL String
-IF RetVal& = 0 THEN RetVal& = -64
-FOR I& = 1 TO RetVal&
-SELECT CASE ASC(MID$(InString$, I&, 1))
-CASE 32
-RetVal& = 64
-' keep going
-CASE 43
-RetVal& = 1
-EXIT FOR
-CASE 45
-RetVal& = -1
-EXIT FOR
-CASE 241
-RetVal& = 0
-EXIT FOR
-CASE ELSE
-RetVal& = 64
-EXIT FOR
-END SELECT
-NEXT I&
+ IF RetVal& = 0 THEN RetVal& = -64
+ FOR I& = 1 TO RetVal&
+ SELECT CASE ASC(MID$(InString$, I&, 1))
+ CASE 32
+ RetVal& = 64
+ ' keep going
+ CASE 43
+ RetVal& = 1
+ EXIT FOR
+ CASE 45
+ RetVal& = -1
+ EXIT FOR
+ CASE 241
+ RetVal& = 0
+ EXIT FOR
+ CASE ELSE
+ RetVal& = 64
+ EXIT FOR
+ END SELECT
+ NEXT I&
-CASE ELSE
+ CASE ELSE
-RetVal& = 0 - Op&
+ RetVal& = 0 - Op&
END SELECT
@@ -23395,10 +23602,10 @@ check1 = SGN(dp) + SGN(dm) + SGN(ep) + SGN(em)
IF check1 < 1 OR check1 > 1 THEN N2S = exp$: EXIT SUB 'If no scientic notation is found, or if we find more than 1 type, it's not SN!
SELECT CASE l 'l now tells us where the SN starts at.
-CASE IS < dp: l = dp
-CASE IS < dm: l = dm
-CASE IS < ep: l = ep
-CASE IS < em: l = em
+ CASE IS < dp: l = dp
+ CASE IS < dm: l = dm
+ CASE IS < ep: l = ep
+ CASE IS < em: l = em
END SELECT
l$ = LEFT$(t$, l - 1) 'The left of the SN
@@ -23406,26 +23613,26 @@ r$ = MID$(t$, l + 1): r&& = VAL(r$) 'The right of the SN, turned into a workable
IF INSTR(l$, ".") THEN 'Location of the decimal, if any
-IF r&& > 0 THEN
-r&& = r&& - LEN(l$) + 2
-ELSE
-r&& = r&& + 1
-END IF
-l$ = LEFT$(l$, 1) + MID$(l$, 3)
+ IF r&& > 0 THEN
+ r&& = r&& - LEN(l$) + 2
+ ELSE
+ r&& = r&& + 1
+ END IF
+ l$ = LEFT$(l$, 1) + MID$(l$, 3)
END IF
SELECT CASE r&&
-CASE 0 'what the heck? We solved it already?
-'l$ = l$
-CASE IS < 0
-FOR i = 1 TO -r&&
-l$ = "0" + l$
-NEXT
-l$ = "0." + l$
-CASE ELSE
-FOR i = 1 TO r&&
-l$ = l$ + "0"
-NEXT
+ CASE 0 'what the heck? We solved it already?
+ 'l$ = l$
+ CASE IS < 0
+ FOR i = 1 TO -r&&
+ l$ = "0" + l$
+ NEXT
+ l$ = "0." + l$
+ CASE ELSE
+ FOR i = 1 TO r&&
+ l$ = l$ + "0"
+ NEXT
END SELECT
N2S$ = sign$ + l$
@@ -23435,13 +23642,13 @@ END SUB
FUNCTION QuotedFilename$ (f$)
IF os$ = "WIN" THEN
-QuotedFilename$ = CHR$(34) + f$ + CHR$(34)
-EXIT FUNCTION
+ QuotedFilename$ = CHR$(34) + f$ + CHR$(34)
+ EXIT FUNCTION
END IF
IF os$ = "LNX" THEN
-QuotedFilename$ = "'" + f$ + "'"
-EXIT FUNCTION
+ QuotedFilename$ = "'" + f$ + "'"
+ EXIT FUNCTION
END IF
END FUNCTION
@@ -23453,37 +23660,37 @@ l = LEN(a$)
IF l = 0 THEN EXIT FUNCTION 'an (invalid) NULL string equates to 0
a = ASC(a$)
IF a <> 95 THEN 'does not begin with underscore
-SELECT CASE l
-CASE 1
-HashValue& = hash1char(a) + 1048576
-EXIT FUNCTION
-CASE 2
-HashValue& = hash2char(CVI(a$)) + 2097152
-EXIT FUNCTION
-CASE 3
-HashValue& = hash2char(CVI(a$)) + hash1char(ASC(a$, 3)) * 1024 + 3145728
-EXIT FUNCTION
-CASE ELSE
-HashValue& = hash2char(CVI(a$)) + hash2char(ASC(a$, l) + ASC(a$, l - 1) * 256) * 1024 + (l AND 7) * 1048576
-EXIT FUNCTION
-END SELECT
+ SELECT CASE l
+ CASE 1
+ HashValue& = hash1char(a) + 1048576
+ EXIT FUNCTION
+ CASE 2
+ HashValue& = hash2char(CVI(a$)) + 2097152
+ EXIT FUNCTION
+ CASE 3
+ HashValue& = hash2char(CVI(a$)) + hash1char(ASC(a$, 3)) * 1024 + 3145728
+ EXIT FUNCTION
+ CASE ELSE
+ HashValue& = hash2char(CVI(a$)) + hash2char(ASC(a$, l) + ASC(a$, l - 1) * 256) * 1024 + (l AND 7) * 1048576
+ EXIT FUNCTION
+ END SELECT
ELSE 'does begin with underscore
-SELECT CASE l
-CASE 1
-HashValue& = (1048576 + 8388608): EXIT FUNCTION 'note: underscore only is illegal in QB64 but supported by hash
-CASE 2
-HashValue& = hash1char(ASC(a$, 2)) + (2097152 + 8388608)
-EXIT FUNCTION
-CASE 3
-HashValue& = hash2char(ASC(a$, 2) + ASC(a$, 3) * 256) + (3145728 + 8388608)
-EXIT FUNCTION
-CASE 4
-HashValue& = hash2char((CVL(a$) AND &HFFFF00) \ 256) + hash1char(ASC(a$, 4)) * 1024 + (4194304 + 8388608)
-EXIT FUNCTION
-CASE ELSE
-HashValue& = hash2char((CVL(a$) AND &HFFFF00) \ 256) + hash2char(ASC(a$, l) + ASC(a$, l - 1) * 256) * 1024 + (l AND 7) * 1048576 + 8388608
-EXIT FUNCTION
-END SELECT
+ SELECT CASE l
+ CASE 1
+ HashValue& = (1048576 + 8388608): EXIT FUNCTION 'note: underscore only is illegal in QB64 but supported by hash
+ CASE 2
+ HashValue& = hash1char(ASC(a$, 2)) + (2097152 + 8388608)
+ EXIT FUNCTION
+ CASE 3
+ HashValue& = hash2char(ASC(a$, 2) + ASC(a$, 3) * 256) + (3145728 + 8388608)
+ EXIT FUNCTION
+ CASE 4
+ HashValue& = hash2char((CVL(a$) AND &HFFFF00) \ 256) + hash1char(ASC(a$, 4)) * 1024 + (4194304 + 8388608)
+ EXIT FUNCTION
+ CASE ELSE
+ HashValue& = hash2char((CVL(a$) AND &HFFFF00) \ 256) + hash2char(ASC(a$, l) + ASC(a$, l - 1) * 256) * 1024 + (l AND 7) * 1048576 + 8388608
+ EXIT FUNCTION
+ END SELECT
END IF
END FUNCTION
@@ -23491,32 +23698,32 @@ SUB HashAdd (a$, flags, reference)
'find the index to use
IF HashListFreeLast > 0 THEN
-'take from free list
-i = HashListFree(HashListFreeLast)
-HashListFreeLast = HashListFreeLast - 1
+ 'take from free list
+ i = HashListFree(HashListFreeLast)
+ HashListFreeLast = HashListFreeLast - 1
ELSE
-IF HashListNext > HashListSize THEN
-'double hash list size
-HashListSize = HashListSize * 2
-REDIM _PRESERVE HashList(1 TO HashListSize) AS HashListItem
-REDIM _PRESERVE HashListName(1 TO HashListSize) AS STRING * 256
-END IF
-i = HashListNext
-HashListNext = HashListNext + 1
+ IF HashListNext > HashListSize THEN
+ 'double hash list size
+ HashListSize = HashListSize * 2
+ REDIM _PRESERVE HashList(1 TO HashListSize) AS HashListItem
+ REDIM _PRESERVE HashListName(1 TO HashListSize) AS STRING * 256
+ END IF
+ i = HashListNext
+ HashListNext = HashListNext + 1
END IF
'setup links to index
x = HashValue(a$)
i2 = HashTable(x)
IF i2 THEN
-i3 = HashList(i2).LastItem
-HashList(i2).LastItem = i
-HashList(i3).NextItem = i
-HashList(i).PrevItem = i3
+ i3 = HashList(i2).LastItem
+ HashList(i2).LastItem = i
+ HashList(i3).NextItem = i
+ HashList(i).PrevItem = i3
ELSE
-HashTable(x) = i
-HashList(i).PrevItem = 0
-HashList(i).LastItem = i
+ HashTable(x) = i
+ HashList(i).PrevItem = 0
+ HashList(i).LastItem = i
END IF
HashList(i).NextItem = 0
@@ -23534,31 +23741,31 @@ FUNCTION HashFind (a$, searchflags, resultflags, resultreference)
'2=found, more items still to scan
i = HashTable(HashValue(a$))
IF i THEN
-ua$ = UCASE$(a$) + SPACE$(256 - LEN(a$))
-hashfind_next:
-f = HashList(i).Flags
-IF searchflags AND f THEN 'flags in common
-IF HashListName(i) = ua$ THEN
-resultflags = f
-resultreference = HashList(i).Reference
-i2 = HashList(i).NextItem
-IF i2 THEN
-HashFind = 2
-HashFind_NextListItem = i2
-HashFind_Reverse = 0
-HashFind_SearchFlags = searchflags
-HashFind_Name = ua$
-HashRemove_LastFound = i
-EXIT FUNCTION
-ELSE
-HashFind = 1
-HashRemove_LastFound = i
-EXIT FUNCTION
-END IF
-END IF
-END IF
-i = HashList(i).NextItem
-IF i THEN GOTO hashfind_next
+ ua$ = UCASE$(a$) + SPACE$(256 - LEN(a$))
+ hashfind_next:
+ f = HashList(i).Flags
+ IF searchflags AND f THEN 'flags in common
+ IF HashListName(i) = ua$ THEN
+ resultflags = f
+ resultreference = HashList(i).Reference
+ i2 = HashList(i).NextItem
+ IF i2 THEN
+ HashFind = 2
+ HashFind_NextListItem = i2
+ HashFind_Reverse = 0
+ HashFind_SearchFlags = searchflags
+ HashFind_Name = ua$
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ ELSE
+ HashFind = 1
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ END IF
+ END IF
+ END IF
+ i = HashList(i).NextItem
+ IF i THEN GOTO hashfind_next
END IF
END FUNCTION
@@ -23569,32 +23776,32 @@ FUNCTION HashFindRev (a$, searchflags, resultflags, resultreference)
'2=found, more items still to scan
i = HashTable(HashValue(a$))
IF i THEN
-i = HashList(i).LastItem
-ua$ = UCASE$(a$) + SPACE$(256 - LEN(a$))
-hashfindrev_next:
-f = HashList(i).Flags
-IF searchflags AND f THEN 'flags in common
-IF HashListName(i) = ua$ THEN
-resultflags = f
-resultreference = HashList(i).Reference
-i2 = HashList(i).PrevItem
-IF i2 THEN
-HashFindRev = 2
-HashFind_NextListItem = i2
-HashFind_Reverse = 1
-HashFind_SearchFlags = searchflags
-HashFind_Name = ua$
-HashRemove_LastFound = i
-EXIT FUNCTION
-ELSE
-HashFindRev = 1
-HashRemove_LastFound = i
-EXIT FUNCTION
-END IF
-END IF
-END IF
-i = HashList(i).PrevItem
-IF i THEN GOTO hashfindrev_next
+ i = HashList(i).LastItem
+ ua$ = UCASE$(a$) + SPACE$(256 - LEN(a$))
+ hashfindrev_next:
+ f = HashList(i).Flags
+ IF searchflags AND f THEN 'flags in common
+ IF HashListName(i) = ua$ THEN
+ resultflags = f
+ resultreference = HashList(i).Reference
+ i2 = HashList(i).PrevItem
+ IF i2 THEN
+ HashFindRev = 2
+ HashFind_NextListItem = i2
+ HashFind_Reverse = 1
+ HashFind_SearchFlags = searchflags
+ HashFind_Name = ua$
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ ELSE
+ HashFindRev = 1
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ END IF
+ END IF
+ END IF
+ i = HashList(i).PrevItem
+ IF i THEN GOTO hashfindrev_next
END IF
END FUNCTION
@@ -23605,55 +23812,55 @@ FUNCTION HashFindCont (resultflags, resultreference)
'2=found, more items still to scan
IF HashFind_Reverse THEN
-i = HashFind_NextListItem
-hashfindrevc_next:
-f = HashList(i).Flags
-IF HashFind_SearchFlags AND f THEN 'flags in common
-IF HashListName(i) = HashFind_Name THEN
-resultflags = f
-resultreference = HashList(i).Reference
-i2 = HashList(i).PrevItem
-IF i2 THEN
-HashFindCont = 2
-HashFind_NextListItem = i2
-HashRemove_LastFound = i
-EXIT FUNCTION
-ELSE
-HashFindCont = 1
-HashRemove_LastFound = i
-EXIT FUNCTION
-END IF
-END IF
-END IF
-i = HashList(i).PrevItem
-IF i THEN GOTO hashfindrevc_next
-EXIT FUNCTION
+ i = HashFind_NextListItem
+ hashfindrevc_next:
+ f = HashList(i).Flags
+ IF HashFind_SearchFlags AND f THEN 'flags in common
+ IF HashListName(i) = HashFind_Name THEN
+ resultflags = f
+ resultreference = HashList(i).Reference
+ i2 = HashList(i).PrevItem
+ IF i2 THEN
+ HashFindCont = 2
+ HashFind_NextListItem = i2
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ ELSE
+ HashFindCont = 1
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ END IF
+ END IF
+ END IF
+ i = HashList(i).PrevItem
+ IF i THEN GOTO hashfindrevc_next
+ EXIT FUNCTION
ELSE
-i = HashFind_NextListItem
-hashfindc_next:
-f = HashList(i).Flags
-IF HashFind_SearchFlags AND f THEN 'flags in common
-IF HashListName(i) = HashFind_Name THEN
-resultflags = f
-resultreference = HashList(i).Reference
-i2 = HashList(i).NextItem
-IF i2 THEN
-HashFindCont = 2
-HashFind_NextListItem = i2
-HashRemove_LastFound = i
-EXIT FUNCTION
-ELSE
-HashFindCont = 1
-HashRemove_LastFound = i
-EXIT FUNCTION
-END IF
-END IF
-END IF
-i = HashList(i).NextItem
-IF i THEN GOTO hashfindc_next
-EXIT FUNCTION
+ i = HashFind_NextListItem
+ hashfindc_next:
+ f = HashList(i).Flags
+ IF HashFind_SearchFlags AND f THEN 'flags in common
+ IF HashListName(i) = HashFind_Name THEN
+ resultflags = f
+ resultreference = HashList(i).Reference
+ i2 = HashList(i).NextItem
+ IF i2 THEN
+ HashFindCont = 2
+ HashFind_NextListItem = i2
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ ELSE
+ HashFindCont = 1
+ HashRemove_LastFound = i
+ EXIT FUNCTION
+ END IF
+ END IF
+ END IF
+ i = HashList(i).NextItem
+ IF i THEN GOTO hashfindc_next
+ EXIT FUNCTION
END IF
END FUNCTION
@@ -23665,39 +23872,39 @@ i = HashRemove_LastFound
'add to free list
HashListFreeLast = HashListFreeLast + 1
IF HashListFreeLast > HashListFreeSize THEN
-HashListFreeSize = HashListFreeSize * 2
-REDIM _PRESERVE HashListFree(1 TO HashListFreeSize) AS LONG
+ HashListFreeSize = HashListFreeSize * 2
+ REDIM _PRESERVE HashListFree(1 TO HashListFreeSize) AS LONG
END IF
HashListFree(HashListFreeLast) = i
'unlink
i1 = HashList(i).PrevItem
IF i1 THEN
-'not first item in list
-i2 = HashList(i).NextItem
-IF i2 THEN
-'(not first and) not last item
-HashList(i1).NextItem = i2
-HashList(i2).LastItem = i1
+ 'not first item in list
+ i2 = HashList(i).NextItem
+ IF i2 THEN
+ '(not first and) not last item
+ HashList(i1).NextItem = i2
+ HashList(i2).LastItem = i1
+ ELSE
+ 'last item
+ x = HashTable(HashValue(HashListName$(i)))
+ HashList(x).LastItem = i1
+ HashList(i1).NextItem = 0
+ END IF
ELSE
-'last item
-x = HashTable(HashValue(HashListName$(i)))
-HashList(x).LastItem = i1
-HashList(i1).NextItem = 0
-END IF
-ELSE
-'first item in list
-x = HashTable(HashValue(HashListName$(i)))
-i2 = HashList(i).NextItem
-IF i2 THEN
-'(first item but) not last item
-HashTable(x) = i2
-HashList(i2).PrevItem = 0
-HashList(i2).LastItem = HashList(i).LastItem
-ELSE
-'(first and) last item
-HashTable(x) = 0
-END IF
+ 'first item in list
+ x = HashTable(HashValue(HashListName$(i)))
+ i2 = HashList(i).NextItem
+ IF i2 THEN
+ '(first item but) not last item
+ HashTable(x) = i2
+ HashList(i2).PrevItem = 0
+ HashList(i2).LastItem = HashList(i).LastItem
+ ELSE
+ '(first and) last item
+ HashTable(x) = 0
+ END IF
END IF
END SUB
@@ -23707,49 +23914,49 @@ fh = FREEFILE
OPEN "hashdump.txt" FOR OUTPUT AS #fh
b$ = "12345678901234567890123456789012}"
FOR x = 0 TO 16777215
-IF HashTable(x) THEN
+ IF HashTable(x) THEN
-PRINT #fh, "START HashTable("; x; "):"
-i = HashTable(x)
+ PRINT #fh, "START HashTable("; x; "):"
+ i = HashTable(x)
-'validate
-lasti = HashList(i).LastItem
-IF HashList(i).LastItem = 0 OR HashList(i).PrevItem <> 0 OR HashValue(HashListName(i)) <> x THEN GOTO corrupt
+ 'validate
+ lasti = HashList(i).LastItem
+ IF HashList(i).LastItem = 0 OR HashList(i).PrevItem <> 0 OR HashValue(HashListName(i)) <> x THEN GOTO corrupt
-PRINT #fh, " HashList("; i; ").LastItem="; HashList(i).LastItem
-hashdumpnextitem:
-x$ = " [" + STR$(i) + "]" + HashListName(i)
+ PRINT #fh, " HashList("; i; ").LastItem="; HashList(i).LastItem
+ hashdumpnextitem:
+ x$ = " [" + STR$(i) + "]" + HashListName(i)
-f = HashList(i).Flags
-x$ = x$ + ",.Flags=" + STR$(f) + "{"
-FOR z = 1 TO 32
-ASC(b$, z) = (f AND 1) + 48
-f = f \ 2
-NEXT
-x$ = x$ + b$
+ f = HashList(i).Flags
+ x$ = x$ + ",.Flags=" + STR$(f) + "{"
+ FOR z = 1 TO 32
+ ASC(b$, z) = (f AND 1) + 48
+ f = f \ 2
+ NEXT
+ x$ = x$ + b$
-x$ = x$ + ",.Reference=" + STR$(HashList(i).Reference)
+ x$ = x$ + ",.Reference=" + STR$(HashList(i).Reference)
-PRINT #fh, x$
+ PRINT #fh, x$
-'validate
-i1 = HashList(i).PrevItem
-i2 = HashList(i).NextItem
-IF i1 THEN
-IF HashList(i1).NextItem <> i THEN GOTO corrupt
-END IF
-IF i2 THEN
-IF HashList(i2).PrevItem <> i THEN GOTO corrupt
-END IF
-IF i2 = 0 THEN
-IF lasti <> i THEN GOTO corrupt
-END IF
+ 'validate
+ i1 = HashList(i).PrevItem
+ i2 = HashList(i).NextItem
+ IF i1 THEN
+ IF HashList(i1).NextItem <> i THEN GOTO corrupt
+ END IF
+ IF i2 THEN
+ IF HashList(i2).PrevItem <> i THEN GOTO corrupt
+ END IF
+ IF i2 = 0 THEN
+ IF lasti <> i THEN GOTO corrupt
+ END IF
-i = HashList(i).NextItem
-IF i THEN GOTO hashdumpnextitem
+ i = HashList(i).NextItem
+ IF i THEN GOTO hashdumpnextitem
-PRINT #fh, "END HashTable("; x; ")"
-END IF
+ PRINT #fh, "END HashTable("; x; ")"
+ END IF
NEXT
CLOSE #fh
@@ -23782,7 +23989,7 @@ END SUB
FUNCTION removecast$ (a$)
removecast$ = a$
IF INSTR(a$, " )") THEN
-removecast$ = RIGHT$(a$, LEN(a$) - INSTR(a$, " )") - 2)
+ removecast$ = RIGHT$(a$, LEN(a$) - INSTR(a$, " )") - 2)
END IF
END FUNCTION
@@ -23790,8 +23997,8 @@ FUNCTION converttabs$ (a2$)
IF ideautoindent THEN s = ideautoindentsize ELSE s = 4
a$ = a2$
DO WHILE INSTR(a$, CHR_TAB)
-x = INSTR(a$, CHR_TAB)
-a$ = LEFT$(a$, x - 1) + SPACE$(s - ((x - 1) MOD s)) + RIGHT$(a$, LEN(a$) - x)
+ x = INSTR(a$, CHR_TAB)
+ a$ = LEFT$(a$, x - 1) + SPACE$(s - ((x - 1) MOD s)) + RIGHT$(a$, LEN(a$) - x)
LOOP
converttabs$ = a$
END FUNCTION
@@ -23801,12 +24008,12 @@ FUNCTION NewByteElement$
a$ = "byte_element_" + str2$(uniquenumber)
NewByteElement$ = a$
IF use_global_byte_elements THEN
-PRINT #18, "byte_element_struct *" + a$ + "=(byte_element_struct*)malloc(12);"
+ PRINT #18, "byte_element_struct *" + a$ + "=(byte_element_struct*)malloc(12);"
ELSE
-PRINT #13, "byte_element_struct *" + a$ + "=NULL;"
-PRINT #13, "if (!" + a$ + "){"
-PRINT #13, "if ((mem_static_pointer+=12) 40 THEN
-IF l = 0 THEN EXIT FUNCTION
-'Note: variable names with periods need to be obfuscated, and this affects their length
-i = INSTR(a$, fix046$)
-DO WHILE i
-l = l - LEN(fix046$) + 1
-i = INSTR(i + 1, a$, fix046$)
-LOOP
-IF l > 40 THEN EXIT FUNCTION
-l = LEN(a$)
+ IF l = 0 THEN EXIT FUNCTION
+ 'Note: variable names with periods need to be obfuscated, and this affects their length
+ i = INSTR(a$, fix046$)
+ DO WHILE i
+ l = l - LEN(fix046$) + 1
+ i = INSTR(i + 1, a$, fix046$)
+ LOOP
+ IF l > 40 THEN EXIT FUNCTION
+ l = LEN(a$)
END IF
'check for single, leading underscore
IF l >= 2 THEN
-IF ASC(a$, 1) = 95 AND ASC(a$, 2) <> 95 THEN EXIT FUNCTION
+ IF ASC(a$, 1) = 95 AND ASC(a$, 2) <> 95 THEN EXIT FUNCTION
END IF
FOR i = 1 TO l
-a = ASC(a$, i)
-IF alphanumeric(a) = 0 THEN EXIT FUNCTION
-IF isnumeric(a) THEN
-trailingunderscore = 0
-IF alphabetletter = 0 THEN EXIT FUNCTION
-ELSE
-IF a = 95 THEN
-trailingunderscore = 1
-ELSE
-alphabetletter = 1
-trailingunderscore = 0
-END IF
-END IF
+ a = ASC(a$, i)
+ IF alphanumeric(a) = 0 THEN EXIT FUNCTION
+ IF isnumeric(a) THEN
+ trailingunderscore = 0
+ IF alphabetletter = 0 THEN EXIT FUNCTION
+ ELSE
+ IF a = 95 THEN
+ trailingunderscore = 1
+ ELSE
+ alphabetletter = 1
+ trailingunderscore = 0
+ END IF
+ END IF
NEXT
IF trailingunderscore THEN EXIT FUNCTION
validname = 1
@@ -23871,8 +24078,8 @@ a$ = myString$
b$ = LCASE$(whatToRemove$)
i = INSTR(LCASE$(a$), b$)
DO WHILE i
-a$ = LEFT$(a$, i - 1) + RIGHT$(a$, LEN(a$) - i - LEN(b$) + 1)
-i = INSTR(LCASE$(a$), b$)
+ a$ = LEFT$(a$, i - 1) + RIGHT$(a$, LEN(a$) - i - LEN(b$) + 1)
+ i = INSTR(LCASE$(a$), b$)
LOOP
StrRemove$ = a$
END FUNCTION
@@ -23884,9 +24091,9 @@ b$ = LCASE$(find$)
basei = 1
i = INSTR(basei, LCASE$(a$), b$)
DO WHILE i
-a$ = LEFT$(a$, i - 1) + replaceWith$ + RIGHT$(a$, LEN(a$) - i - LEN(b$) + 1)
-basei = i + LEN(replaceWith$)
-i = INSTR(basei, LCASE$(a$), b$)
+ a$ = LEFT$(a$, i - 1) + replaceWith$ + RIGHT$(a$, LEN(a$) - i - LEN(b$) + 1)
+ basei = i + LEN(replaceWith$)
+ i = INSTR(basei, LCASE$(a$), b$)
LOOP
StrReplace$ = a$
END FUNCTION
@@ -23900,53 +24107,53 @@ placed = 0
'check for quotes where needed for strings
IF RIGHT$(RTRIM$(item$), 1) = "$" THEN
-IF LEFT$(value$, 1) <> CHR$(34) THEN value$ = CHR$(34) + value$
-IF RIGHT$(value$, 1) <> CHR$(34) THEN value$ = value$ + CHR$(34)
+ IF LEFT$(value$, 1) <> CHR$(34) THEN value$ = CHR$(34) + value$
+ IF RIGHT$(value$, 1) <> CHR$(34) THEN value$ = value$ + CHR$(34)
END IF
IF LOF(InFile) THEN
-DO UNTIL EOF(InFile)
-LINE INPUT #InFile, junk$
-'we really don't care about heading$ here; it's only used to make things easier for the user to locate in the config file
-junk$ = LTRIM$(RTRIM$(junk$))
-l = INSTR(junk$, "=") 'compare the values to the left of the equal sign
-compare$ = RTRIM$(LEFT$(junk$, l - 1))
+ DO UNTIL EOF(InFile)
+ LINE INPUT #InFile, junk$
+ 'we really don't care about heading$ here; it's only used to make things easier for the user to locate in the config file
+ junk$ = LTRIM$(RTRIM$(junk$))
+ l = INSTR(junk$, "=") 'compare the values to the left of the equal sign
+ compare$ = RTRIM$(LEFT$(junk$, l - 1))
-IF UCASE$(compare$) = UCASE$(item$) THEN 'if it's a match, replace it
-PRINT #OutFile, item$; " = "; value$
-placed = -1
-ELSE
-PRINT #OutFile, junk$ 'otherwise put that line back and check the next one
-END IF
-LOOP
+ IF UCASE$(compare$) = UCASE$(item$) THEN 'if it's a match, replace it
+ PRINT #OutFile, item$; " = "; value$
+ placed = -1
+ ELSE
+ PRINT #OutFile, junk$ 'otherwise put that line back and check the next one
+ END IF
+ LOOP
END IF
CLOSE #InFile, #OutFile
KILL ConfigFile$
IF NOT placed THEN 'we didn't find the proper setting already in the file somewhere.
-'Either the file was corrupted, or the user deleted this particulat setting sometime in the past.
-'Now we look to see if the heading exists in the file or not.
-'If it does, then we place the new setting under that heading.
-'If not then we write that heading to the end of the file to make it easier for the user to locate in the future
-'and then we write it below there.
-OPEN ConfigBak$ FOR BINARY AS #InFile
-OPEN "internal/config.tmp" FOR OUTPUT AS #OutFile
-out$ = item$ + " = " + value$
-DO UNTIL EOF(InFile) OR LOF(InFile) = 0
-LINE INPUT #InFile, temp$
-PRINT #OutFile, temp$
-IF INSTR(temp$, heading$) THEN PRINT #OutFile, out$: placed = -1 'If we have the heading, we want to print the item after it
-LOOP
-IF NOT placed THEN 'If the heading doesn't exist already then we'll make the heading and the item
-PRINT #OutFile, ""
-PRINT #OutFile, heading$
-PRINT #OutFile, out$
-END IF
-CLOSE #InFile, #OutFile
-KILL ConfigBak$
-NAME "internal/config.tmp" AS ConfigFile$
+ 'Either the file was corrupted, or the user deleted this particulat setting sometime in the past.
+ 'Now we look to see if the heading exists in the file or not.
+ 'If it does, then we place the new setting under that heading.
+ 'If not then we write that heading to the end of the file to make it easier for the user to locate in the future
+ 'and then we write it below there.
+ OPEN ConfigBak$ FOR BINARY AS #InFile
+ OPEN "internal/config.tmp" FOR OUTPUT AS #OutFile
+ out$ = item$ + " = " + value$
+ DO UNTIL EOF(InFile) OR LOF(InFile) = 0
+ LINE INPUT #InFile, temp$
+ PRINT #OutFile, temp$
+ IF INSTR(temp$, heading$) THEN PRINT #OutFile, out$: placed = -1 'If we have the heading, we want to print the item after it
+ LOOP
+ IF NOT placed THEN 'If the heading doesn't exist already then we'll make the heading and the item
+ PRINT #OutFile, ""
+ PRINT #OutFile, heading$
+ PRINT #OutFile, out$
+ END IF
+ CLOSE #InFile, #OutFile
+ KILL ConfigBak$
+ NAME "internal/config.tmp" AS ConfigFile$
ELSE
-NAME ConfigBak$ AS ConfigFile$
+ NAME ConfigBak$ AS ConfigFile$
END IF
END SUB
@@ -23956,33 +24163,33 @@ value$ = "" 'We start by blanking the value$ as a default return state
InFile = FREEFILE: OPEN ConfigFile$ FOR BINARY AS #InFile
IF LOF(InFile) THEN
-found = 0
-DO UNTIL EOF(InFile)
-LINE INPUT #InFile, temp$
-temp$ = LTRIM$(RTRIM$(temp$))
-l = INSTR(temp$, "=")
-compare$ = LTRIM$(RTRIM$(LEFT$(temp$, l - 1)))
-IF UCASE$(compare$) = UCASE$(item$) THEN found = -1: EXIT DO
-LOOP
-CLOSE #InFile
-IF found THEN 'we found what we're looking for
-IF l THEN
-value$ = MID$(temp$, l + 1)
-l = INSTR(value$, CHR$(13)) 'we only want what's before a CR
-IF l THEN value$ = LEFT$(value$, l)
-l = INSTR(value$, CHR$(10)) 'or a LineFeed
-'These are basic text files; they shouldn't have stray CHR$(10) or CHR$(13) characters in them!
-IF l THEN value$ = LEFT$(value$, l)
-value$ = LTRIM$(RTRIM$(value$))
-'check for quotes where needed for strings and remove them so our return value doesn't contain them
-IF RIGHT$(RTRIM$(item$), 1) = "$" THEN
-IF LEFT$(value$, 1) = CHR$(34) THEN value$ = MID$(value$, 2)
-IF RIGHT$(value$, 1) = CHR$(34) THEN value$ = LEFT$(value$, LEN(value$) - 1)
-END IF
-ReadConfigSetting = -1
-EXIT FUNCTION
-END IF
-END IF
+ found = 0
+ DO UNTIL EOF(InFile)
+ LINE INPUT #InFile, temp$
+ temp$ = LTRIM$(RTRIM$(temp$))
+ l = INSTR(temp$, "=")
+ compare$ = LTRIM$(RTRIM$(LEFT$(temp$, l - 1)))
+ IF UCASE$(compare$) = UCASE$(item$) THEN found = -1: EXIT DO
+ LOOP
+ CLOSE #InFile
+ IF found THEN 'we found what we're looking for
+ IF l THEN
+ value$ = MID$(temp$, l + 1)
+ l = INSTR(value$, CHR$(13)) 'we only want what's before a CR
+ IF l THEN value$ = LEFT$(value$, l)
+ l = INSTR(value$, CHR$(10)) 'or a LineFeed
+ 'These are basic text files; they shouldn't have stray CHR$(10) or CHR$(13) characters in them!
+ IF l THEN value$ = LEFT$(value$, l)
+ value$ = LTRIM$(RTRIM$(value$))
+ 'check for quotes where needed for strings and remove them so our return value doesn't contain them
+ IF RIGHT$(RTRIM$(item$), 1) = "$" THEN
+ IF LEFT$(value$, 1) = CHR$(34) THEN value$ = MID$(value$, 2)
+ IF RIGHT$(value$, 1) = CHR$(34) THEN value$ = LEFT$(value$, LEN(value$) - 1)
+ END IF
+ ReadConfigSetting = -1
+ EXIT FUNCTION
+ END IF
+ END IF
END IF
CLOSE #InFile
ReadConfigSetting = 0 'failed to find the setting
@@ -23996,18 +24203,192 @@ FUNCTION VRGBS (text$, DefaultColor AS _UNSIGNED LONG)
VRGBS = DefaultColor 'A return the default value if we can't parse the string properly
IF UCASE$(LEFT$(text$, 4)) = "_RGB" THEN
-rpos = INSTR(text$, "(")
-gpos = INSTR(rpos, text$, ",")
-bpos = INSTR(gpos + 1, text$, ",")
-IF rpos <> 0 AND bpos <> 0 AND gpos <> 0 THEN
-red = VAL(MID$(text$, rpos + 1))
-green = VAL(MID$(text$, gpos + 1))
-blue = VAL(MID$(text$, bpos + 1))
-VRGBS = _RGB32(red, green, blue)
-END IF
+ rpos = INSTR(text$, "(")
+ gpos = INSTR(rpos, text$, ",")
+ bpos = INSTR(gpos + 1, text$, ",")
+ IF rpos <> 0 AND bpos <> 0 AND gpos <> 0 THEN
+ red = VAL(MID$(text$, rpos + 1))
+ green = VAL(MID$(text$, gpos + 1))
+ blue = VAL(MID$(text$, bpos + 1))
+ VRGBS = _RGB32(red, green, blue)
+ END IF
END IF
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'