1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-04 23:30:24 +00:00

Merge branch 'var-export' into development

This commit is contained in:
Fellippe Heitor 2021-07-29 18:47:35 -03:00
commit f5d70bf105
6 changed files with 434 additions and 249 deletions

View file

@ -1,14 +1,14 @@
$CHECKING:OFF
SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
STATIC AS LONG ideHost, breakpointCount, skipCount, timeout, startLevel, lastLine
STATIC AS LONG callStackLength, runToLine
STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine
STATIC buffer$, endc$
DIM AS LONG i, tempIndex, localIndex, varSize, sequence
DIM AS _OFFSET address
DIM AS _MEM m, m2
DIM start!, temp$, cmd$, value$, k&, buf$, scope$
STATIC AS LONG vw_ideHost, vw_breakpointCount, vw_skipCount, vw_timeout, vw_startLevel, vw_lastLine
STATIC AS LONG vw_runToLine
STATIC AS _BYTE vw_pauseMode, vw_stepOver, vw_bypass, vw_setNextLine
STATIC vw_buffer$, vw_endc$
DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_sequence
DIM AS _OFFSET vw_address
DIM AS _MEM vw_m, vw_m2
DIM vw_start!, vw_temp$, vw_cmd$, vw_value$, vw_k&, vw_buf$, vw_scope$
DECLARE LIBRARY
SUB vwatch_stoptimers ALIAS stop_timers
@ -16,67 +16,67 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
SUB unlockvWatchHandle
END DECLARE
IF bypass THEN EXIT SUB
IF vw_bypass THEN EXIT SUB
vwatch_goto = 0
IF ideHost = 0 THEN
timeout = 10
endc$ = "<END>"
IF vw_ideHost = 0 THEN
vw_timeout = 10
vw_endc$ = "<END>"
'initial setup
GOSUB Connect
'send this binary's path/exe name
cmd$ = "me:" + COMMAND$(0)
vw_cmd$ = "me:" + COMMAND$(0)
GOSUB SendCommand
DO
GOSUB GetCommand
SELECT CASE cmd$
SELECT CASE vw_cmd$
CASE "vwatch"
IF value$ <> "ok" THEN
unlockvWatchHandle: CLOSE #ideHost
bypass = -1
IF vw_value$ <> "ok" THEN
unlockvWatchHandle: CLOSE #vw_ideHost
vw_bypass = -1
EXIT SUB
END IF
CASE "line count"
REDIM vwatch_breakpoints(CVL(value$)) AS _BYTE
REDIM vwatch_skiplines(CVL(value$)) AS _BYTE
REDIM vwatch_breakpoints(CVL(vw_value$)) AS _BYTE
REDIM vwatch_skiplines(CVL(vw_value$)) AS _BYTE
CASE "breakpoint count"
breakpointCount = CVL(value$)
vw_breakpointCount = CVL(vw_value$)
CASE "breakpoint list"
IF LEN(value$) \ 4 <> breakpointCount THEN
cmd$ = "quit:Communication error."
IF LEN(vw_value$) \ 4 <> vw_breakpointCount THEN
vw_cmd$ = "quit:Communication error."
GOSUB SendCommand
unlockvWatchHandle: CLOSE #ideHost
bypass = -1
unlockvWatchHandle: CLOSE #vw_ideHost
vw_bypass = -1
EXIT SUB
END IF
FOR i = 1 TO breakpointCount
temp$ = MID$(value$, i * 4 - 3, 4)
vwatch_breakpoints(CVL(temp$)) = -1
FOR vw_i = 1 TO vw_breakpointCount
vw_temp$ = MID$(vw_value$, vw_i * 4 - 3, 4)
vwatch_breakpoints(CVL(vw_temp$)) = -1
NEXT
CASE "skip count"
skipCount = CVL(value$)
vw_skipCount = CVL(vw_value$)
CASE "skip list"
IF LEN(value$) \ 4 <> skipCount THEN
cmd$ = "quit:Communication error."
IF LEN(vw_value$) \ 4 <> vw_skipCount THEN
vw_cmd$ = "quit:Communication error."
GOSUB SendCommand
unlockvWatchHandle: CLOSE #ideHost
bypass = -1
unlockvWatchHandle: CLOSE #vw_ideHost
vw_bypass = -1
EXIT SUB
END IF
FOR i = 1 TO skipCount
temp$ = MID$(value$, i * 4 - 3, 4)
vwatch_skiplines(CVL(temp$)) = -1
FOR vw_i = 1 TO vw_skipCount
vw_temp$ = MID$(vw_value$, vw_i * 4 - 3, 4)
vwatch_skiplines(CVL(vw_temp$)) = -1
NEXT
CASE "run"
IF vwatch_breakpoints(vwatch_linenumber) THEN EXIT DO
pauseMode = 0
vw_pauseMode = 0
EXIT SUB
CASE "break"
pauseMode = -1
vw_pauseMode = -1
EXIT DO
END SELECT
LOOP
@ -84,60 +84,53 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
IF vwatch_linenumber = 0 THEN
GOSUB SendCallStack
cmd$ = "quit:Program ended."
vw_cmd$ = "quit:Program ended."
GOSUB SendCommand
unlockvWatchHandle: CLOSE #ideHost
bypass = -1
ideHost = 0
unlockvWatchHandle: CLOSE #vw_ideHost
vw_bypass = -1
vw_ideHost = 0
EXIT SUB
ELSEIF vwatch_linenumber = -1 THEN
'report an error in the most recent line
GOSUB SendCallStack
cmd$ = "error:" + MKL$(lastLine)
vw_cmd$ = "error:" + MKL$(vw_lastLine)
GOSUB SendCommand
EXIT SUB
ELSEIF vwatch_linenumber = -2 THEN
'report a new sub/function has been "entered"
IF LEN(vwatch_callstack) > 100000 THEN
vwatch_callstack = ""
callStackLength = 0
END IF
callStackLength = callStackLength + 1
IF LEN(vwatch_callstack) THEN vwatch_callstack = vwatch_callstack + CHR$(0)
vwatch_callstack = vwatch_callstack + vwatch_subname$ + ", line" + STR$(lastLine)
IF vwatch_sublevel > UBOUND(vwatch_stack) THEN
REDIM _PRESERVE vwatch_stack(UBOUND(vwatch_stack) + 1000) AS STRING
END IF
vwatch_stack(vwatch_sublevel) = vwatch_internalsubname$
vwatch_stack(vwatch_sublevel) = vwatch_internalsubname$ + "," + vwatch_subname$ + ", line" + STR$(vw_lastLine)
EXIT SUB
ELSEIF vwatch_linenumber = -3 THEN
'handle STOP - instead of quitting, pause execution
pauseMode = -1
stepOver = 0
vw_pauseMode = -1
vw_stepOver = 0
EXIT SUB
END IF
IF vwatch_linenumber = lastLine AND setNextLine = 0 THEN EXIT SUB
setNextLine = 0
lastLine = vwatch_linenumber
IF vwatch_linenumber = vw_lastLine AND vw_setNextLine = 0 THEN EXIT SUB
vw_setNextLine = 0
vw_lastLine = vwatch_linenumber
GOSUB GetCommand
SELECT CASE cmd$
SELECT CASE vw_cmd$
CASE "break"
pauseMode = -1
stepOver = 0
runToLine = 0
cmd$ = ""
vw_pauseMode = -1
vw_stepOver = 0
vw_runToLine = 0
vw_cmd$ = ""
CASE "set breakpoint"
vwatch_breakpoints(CVL(value$)) = -1
vwatch_skiplines(CVL(value$)) = 0
vwatch_breakpoints(CVL(vw_value$)) = -1
vwatch_skiplines(CVL(vw_value$)) = 0
CASE "clear breakpoint"
vwatch_breakpoints(CVL(value$)) = 0
vwatch_breakpoints(CVL(vw_value$)) = 0
CASE "set skip line"
vwatch_skiplines(CVL(value$)) = -1
vwatch_breakpoints(CVL(value$)) = 0
vwatch_skiplines(CVL(vw_value$)) = -1
vwatch_breakpoints(CVL(vw_value$)) = 0
CASE "clear skip line"
vwatch_skiplines(CVL(value$)) = 0
vwatch_skiplines(CVL(vw_value$)) = 0
CASE "clear all breakpoints"
REDIM vwatch_breakpoints(UBOUND(vwatch_breakpoints)) AS _BYTE
CASE "clear all skips"
@ -146,72 +139,72 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
IF vwatch_skiplines(vwatch_linenumber) THEN vwatch_goto = -vwatch_linenumber: EXIT SUB
IF stepOver = -1 AND vwatch_sublevel > startLevel AND vwatch_breakpoints(vwatch_linenumber) = 0 THEN
IF vw_stepOver = -1 AND vwatch_sublevel > vw_startLevel AND vwatch_breakpoints(vwatch_linenumber) = 0 THEN
EXIT SUB
ELSEIF stepOver = -1 AND vwatch_sublevel = startLevel THEN
stepOver = 0
pauseMode = -1
ELSEIF vw_stepOver = -1 AND vwatch_sublevel = vw_startLevel THEN
vw_stepOver = 0
vw_pauseMode = -1
END IF
IF runToLine > 0 AND runToLine <> vwatch_linenumber THEN
IF vw_runToLine > 0 AND vw_runToLine <> vwatch_linenumber THEN
EXIT SUB
ELSEIF runToLine > 0 AND runToLine = vwatch_linenumber THEN
pauseMode = -1
runToLine = 0
ELSEIF vw_runToLine > 0 AND vw_runToLine = vwatch_linenumber THEN
vw_pauseMode = -1
vw_runToLine = 0
END IF
IF vwatch_breakpoints(vwatch_linenumber) = 0 AND pauseMode = 0 THEN
IF vwatch_breakpoints(vwatch_linenumber) = 0 AND vw_pauseMode = 0 THEN
EXIT SUB
END IF
vwatch_stoptimers
cmd$ = "line number:"
IF vwatch_breakpoints(vwatch_linenumber) THEN cmd$ = "breakpoint:"
cmd$ = cmd$ + MKL$(vwatch_linenumber)
vw_cmd$ = "line number:"
IF vwatch_breakpoints(vwatch_linenumber) THEN vw_cmd$ = "breakpoint:"
vw_cmd$ = vw_cmd$ + MKL$(vwatch_linenumber)
GOSUB SendCommand
cmd$ = "current sub:" + vwatch_stack(vwatch_sublevel)
vw_cmd$ = "current sub:" + LEFT$(vwatch_stack(vwatch_sublevel), INSTR(vwatch_stack(vwatch_sublevel), ",") - 1)
GOSUB SendCommand
DO 'main loop
SELECT CASE cmd$
SELECT CASE vw_cmd$
CASE "run"
pauseMode = 0
stepOver = 0
vw_pauseMode = 0
vw_stepOver = 0
vwatch_starttimers
EXIT SUB
CASE "run to line"
pauseMode = 0
stepOver = 0
runToLine = CVL(value$)
vw_pauseMode = 0
vw_stepOver = 0
vw_runToLine = CVL(vw_value$)
vwatch_starttimers
EXIT SUB
CASE "step"
pauseMode = -1
stepOver = 0
vw_pauseMode = -1
vw_stepOver = 0
EXIT SUB
CASE "step over"
pauseMode = -1
stepOver = -1
startLevel = vwatch_sublevel
vw_pauseMode = -1
vw_stepOver = -1
vw_startLevel = vwatch_sublevel
vwatch_starttimers
EXIT SUB
CASE "step out"
pauseMode = -1
stepOver = -1
startLevel = vwatch_sublevel - 1
vw_pauseMode = -1
vw_stepOver = -1
vw_startLevel = vwatch_sublevel - 1
vwatch_starttimers
EXIT SUB
CASE "free"
unlockvWatchHandle: CLOSE #ideHost
ideHost = 0
bypass = -1
unlockvWatchHandle: CLOSE #vw_ideHost
vw_ideHost = 0
vw_bypass = -1
vwatch_starttimers
EXIT SUB
CASE "set breakpoint"
vwatch_breakpoints(CVL(value$)) = -1
vwatch_skiplines(CVL(value$)) = 0
vwatch_breakpoints(CVL(vw_value$)) = -1
vwatch_skiplines(CVL(vw_value$)) = 0
CASE "clear breakpoint"
vwatch_breakpoints(CVL(value$)) = 0
vwatch_breakpoints(CVL(vw_value$)) = 0
CASE "clear all breakpoints"
REDIM vwatch_breakpoints(UBOUND(vwatch_breakpoints)) AS _BYTE
CASE "clear all skips"
@ -220,49 +213,49 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
'send call stack history
GOSUB SendCallStack
CASE "global var"
tempIndex = CVL(LEFT$(value$, 4))
localIndex = CVL(MID$(value$, 5, 4))
address = _OFFSET(globalVariables) + LEN(address) * localIndex
address = _MEMGET(m, address, _OFFSET) 'first resolve pass
address = _MEMGET(m, address, _OFFSET) 'second resolve pass
cmd$ = "global var:" + MKL$(tempIndex) + STR$(address)
vw_tempIndex = CVL(LEFT$(vw_value$, 4))
vw_localIndex = CVL(MID$(vw_value$, 5, 4))
vw_address = _OFFSET(globalVariables) + LEN(vw_address) * vw_localIndex
vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'first resolve pass
vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'second resolve pass
vw_cmd$ = "global var:" + MKL$(vw_tempIndex) + STR$(vw_address)
GOSUB SendCommand
CASE "local var"
tempIndex = CVL(LEFT$(value$, 4))
localIndex = CVL(MID$(value$, 5, 4))
scope$ = MID$(value$, 9)
IF scope$ = vwatch_stack(vwatch_sublevel) THEN
address = _OFFSET(localVariables) + LEN(address) * localIndex
address = _MEMGET(m, address, _OFFSET) 'first resolve pass
address = _MEMGET(m, address, _OFFSET) 'second resolve pass
cmd$ = "local var:" + MKL$(tempIndex) + STR$(address)
vw_tempIndex = CVL(LEFT$(vw_value$, 4))
vw_localIndex = CVL(MID$(vw_value$, 5, 4))
vw_scope$ = MID$(vw_value$, 9)
IF vw_scope$ = LEFT$(vwatch_stack(vwatch_sublevel), INSTR(vwatch_stack(vwatch_sublevel), ",") - 1) THEN
vw_address = _OFFSET(localVariables) + LEN(vw_address) * vw_localIndex
vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'first resolve pass
vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'second resolve pass
vw_cmd$ = "local var:" + MKL$(vw_tempIndex) + STR$(vw_address)
GOSUB SendCommand
END IF
CASE "get address"
tempIndex = CVL(LEFT$(value$, 4))
sequence = CVI(MID$(value$, 5, 2))
varSize = CVL(MID$(value$, 7, 4))
address = VAL(MID$(value$, 11))
buf$ = SPACE$(varSize)
m = _MEM(address, varSize)
m2 = _MEM(_OFFSET(buf$), varSize)
_MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET
cmd$ = "address read:" + MKL$(tempIndex) + MKI$(sequence) + buf$
vw_tempIndex = CVL(LEFT$(vw_value$, 4))
vw_sequence = CVI(MID$(vw_value$, 5, 2))
vw_varSize = CVL(MID$(vw_value$, 7, 4))
vw_address = VAL(MID$(vw_value$, 11))
vw_buf$ = SPACE$(vw_varSize)
vw_m = _MEM(vw_address, vw_varSize)
vw_m2 = _MEM(_OFFSET(vw_buf$), vw_varSize)
_MEMCOPY vw_m, vw_m.OFFSET, vw_m.SIZE TO vw_m2, vw_m2.OFFSET
vw_cmd$ = "address read:" + MKL$(vw_tempIndex) + MKI$(vw_sequence) + vw_buf$
GOSUB SendCommand
CASE "current sub"
cmd$ = "current sub:" + vwatch_stack(vwatch_sublevel)
vw_cmd$ = "current sub:" + LEFT$(vwatch_stack(vwatch_sublevel), INSTR(vwatch_stack(vwatch_sublevel), ",") - 1)
GOSUB SendCommand
CASE "set next line"
pauseMode = -1
stepOver = 0
setNextLine = -1
vwatch_goto = CVL(value$)
vw_pauseMode = -1
vw_stepOver = 0
vw_setNextLine = -1
vwatch_goto = CVL(vw_value$)
EXIT SUB
CASE "set skip line"
vwatch_skiplines(CVL(value$)) = -1
vwatch_breakpoints(CVL(value$)) = 0
vwatch_skiplines(CVL(vw_value$)) = -1
vwatch_breakpoints(CVL(vw_value$)) = 0
CASE "clear skip line"
vwatch_skiplines(CVL(value$)) = 0
vwatch_skiplines(CVL(vw_value$)) = 0
END SELECT
GOSUB GetCommand
@ -273,49 +266,57 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
EXIT SUB
Connect:
DIM ideport$
ideport$ = ENVIRON$("QB64DEBUGPORT")
IF ideport$ = "" THEN bypass = -1: EXIT SUB
DIM vw_ideport$
vw_ideport$ = ENVIRON$("QB64DEBUGPORT")
IF vw_ideport$ = "" THEN vw_bypass = -1: EXIT SUB
start! = TIMER
vw_start! = TIMER
DO
k& = _KEYHIT
ideHost = _OPENCLIENT("QB64IDE:" + ideport$ + ":localhost")
vw_k& = _KEYHIT
vw_ideHost = _OPENCLIENT("QB64IDE:" + vw_ideport$ + ":localhost")
_LIMIT 30
LOOP UNTIL k& = 27 OR ideHost <> 0 OR TIMER - start! > timeout
IF ideHost = 0 THEN bypass = -1: EXIT SUB
LOOP UNTIL vw_k& = 27 OR vw_ideHost <> 0 OR TIMER - vw_start! > vw_timeout
IF vw_ideHost = 0 THEN vw_bypass = -1: EXIT SUB
RETURN
GetCommand:
GET #ideHost, , temp$
buffer$ = buffer$ + temp$
GET #vw_ideHost, , vw_temp$
vw_buffer$ = vw_buffer$ + vw_temp$
IF INSTR(buffer$, endc$) THEN
cmd$ = LEFT$(buffer$, INSTR(buffer$, endc$) - 1)
buffer$ = MID$(buffer$, INSTR(buffer$, endc$) + LEN(endc$))
IF INSTR(vw_buffer$, vw_endc$) THEN
vw_cmd$ = LEFT$(vw_buffer$, INSTR(vw_buffer$, vw_endc$) - 1)
vw_buffer$ = MID$(vw_buffer$, INSTR(vw_buffer$, vw_endc$) + LEN(vw_endc$))
IF INSTR(cmd$, ":") THEN
value$ = MID$(cmd$, INSTR(cmd$, ":") + 1)
cmd$ = LEFT$(cmd$, INSTR(cmd$, ":") - 1)
IF INSTR(vw_cmd$, ":") THEN
vw_value$ = MID$(vw_cmd$, INSTR(vw_cmd$, ":") + 1)
vw_cmd$ = LEFT$(vw_cmd$, INSTR(vw_cmd$, ":") - 1)
ELSE
value$ = ""
vw_value$ = ""
END IF
ELSE
cmd$ = "": value$ = ""
vw_cmd$ = "": vw_value$ = ""
END IF
RETURN
SendCallStack:
cmd$ = "call stack size:" + MKL$(callStackLength)
IF vwatch_sublevel - 1 > 0 THEN
vwatch_callstack = MID$(vwatch_stack(2), INSTR(vwatch_stack(2), ",") + 1)
FOR vw_i = 3 TO vwatch_sublevel
vwatch_callstack = vwatch_callstack + CHR$(0) + MID$(vwatch_stack(vw_i), INSTR(vwatch_stack(vw_i), ",") + 1)
NEXT
ELSE
vwatch_callstack = ""
END IF
vw_cmd$ = "call stack size:" + MKL$(vwatch_sublevel - 1)
GOSUB SendCommand
cmd$ = "call stack:" + vwatch_callstack
vw_cmd$ = "call stack:" + vwatch_callstack
GOSUB SendCommand
RETURN
SendCommand:
cmd$ = cmd$ + endc$
PUT #ideHost, , cmd$
cmd$ = ""
vw_cmd$ = vw_cmd$ + vw_endc$
PUT #vw_ideHost, , vw_cmd$
vw_cmd$ = ""
RETURN
END SUB

View file

@ -217,8 +217,9 @@ DIM SHARED OptionsMenuShowErrorsImmediately AS INTEGER, OptionsMenuIgnoreWarning
DIM SHARED OptionsMenuDisableSyntax AS INTEGER ', OptionsMenuAutoComplete
DIM SHARED ViewMenuID AS INTEGER, ViewMenuShowLineNumbersSubMenuID AS INTEGER
DIM SHARED ViewMenuShowSeparatorID AS INTEGER, ViewMenuShowBGID AS INTEGER
DIM SHARED ViewMenuCompilerWarnings AS INTEGER, ViewMenuCallStack AS INTEGER
DIM SHARED ViewMenuCompilerWarnings AS INTEGER
DIM SHARED RunMenuID AS INTEGER, RunMenuSaveExeWithSource AS INTEGER, brackethighlight AS INTEGER
DIM SHARED DebugMenuID AS INTEGER, DebugMenuCallStack AS INTEGER
DIM SHARED multihighlight AS INTEGER, keywordHighlight AS INTEGER
DIM SHARED PresetColorSchemes AS INTEGER, TotalColorSchemes AS INTEGER, ColorSchemes$(0)
DIM SHARED LastValidColorScheme AS INTEGER

View file

@ -274,10 +274,6 @@ FUNCTION ide2 (ignore)
ViewMenuCompilerWarnings = i
menu$(ViewMenuID, ViewMenuCompilerWarnings) = "Compiler #Warnings... Ctrl+W": i = i + 1
menuDesc$(m, i - 1) = "Displays a list of recent code warnings"
ViewMenuCallStack = i
menu$(ViewMenuID, ViewMenuCallStack) = "Call #Stack... F12": i = i + 1
menuDesc$(m, i - 1) = "Displays the call stack of the current program's last execution"
menusize(m) = i - 1
m = m + 1: i = 0: SearchMenuID = m
@ -336,7 +332,7 @@ FUNCTION ide2 (ignore)
menuDesc$(m, i - 1) = "Compiles current program without running it"
menusize(m) = i - 1
m = m + 1: i = 0
m = m + 1: i = 0: DebugMenuID = m
menu$(m, i) = "Debug": i = i + 1
menu$(m, i) = "Start #Paused F8": i = i + 1
menuDesc$(m, i - 1) = "Compiles current program and starts it in pause mode"
@ -350,8 +346,18 @@ FUNCTION ide2 (ignore)
menu$(m, i) = "#Unskip All Lines Ctrl+F10": i = i + 1
menuDesc$(m, i - 1) = "Removes all line skip flags"
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "#Watch List... F4": i = i + 1
menuDesc$(m, i - 1) = "Adds variables to watch list"
DebugMenuCallStack = i
menu$(DebugMenuID, DebugMenuCallStack) = "Call #Stack... F12": i = i + 1
menuDesc$(m, i - 1) = "Displays the call stack of the current program's last execution"
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "Set Base #TCP/IP Port Number...": i = i + 1
menuDesc$(m, i - 1) = "Sets the initial port number for TCP/IP communication with the debuggee"
menu$(m, i) = "#Advanced (C++)...": i = i + 1
menuDesc$(m, i - 1) = "Enables embedding C++ debug information into compiled program"
menu$(m, i) = "Purge C++ #Libraries": i = i + 1
menuDesc$(m, i - 1) = "Purges all pre-compiled content"
menusize(m) = i - 1
m = m + 1: i = 0: OptionsMenuID = m
@ -367,8 +373,6 @@ FUNCTION ide2 (ignore)
menuDesc$(m, i - 1) = "Changes code page to use with TTF fonts"
menu$(m, i) = "#Backup/Undo...": i = i + 1
menuDesc$(m, i - 1) = "Sets size of backup/undo buffer"
menu$(m, i) = "#Advanced...": i = i + 1
menuDesc$(m, i - 1) = "Enables embedding C++ debug information into compiled program"
menu$(m, i) = "-": i = i + 1
OptionsMenuDisableSyntax = i
@ -725,6 +729,23 @@ FUNCTION ide2 (ignore)
'$DEBUG mode on
IdeDebugMode = 1
FOR x = 1 TO totalVariablesCreated
usedVariableList(x).mostRecentValue = ""
NEXT
variableWatchList$ = ""
longestVarName = 0
FOR y = 1 TO totalVariablesCreated
IF usedVariableList(y).watch THEN
IF LEN(usedVariableList(y).name) > longestVarName THEN
longestVarName = LEN(usedVariableList(y).name)
IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4)
MID$(variableWatchList$, 1, 4) = MKL$(longestVarName)
END IF
variableWatchList$ = variableWatchList$ + MKL$(y)
END IF
NEXT
EnterDebugMode:
IF idehelp THEN
idewy = idewy + idesubwindow
@ -1627,9 +1648,26 @@ FUNCTION ide2 (ignore)
END IF
IF KB = KEY_F4 THEN 'variable watch
result = idevariablewatchbox("")
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
IF vWatchOn = 0 THEN
result = idemessagebox("Watch List", "Insert $DEBUG metacommand?", "#Yes;#No")
IF result = 1 THEN
ideselect = 0
ideinsline 1, SCase$("$Debug")
idecy = idecy + 1
idechangemade = 1
GOTO ideloop
ELSE
GOTO ideloop
END IF
ELSE
IF idecompiling = 1 THEN
result = idemessagebox("Watch List", "Variable List not yet available.\nWait for the 'OK' message in the status area.", "")
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
ELSE
GOTO showWatchList
END IF
END IF
END IF
IF KB = KEY_F5 THEN 'Note: F5 or SHIFT+F5 accepted
@ -4367,9 +4405,9 @@ FUNCTION ide2 (ignore)
END IF
IF callStackLength = 0 THEN
menu$(ViewMenuID, ViewMenuCallStack) = "~Call #Stack... F12"
menu$(DebugMenuID, DebugMenuCallStack) = "~Call #Stack... F12"
ELSE
menu$(ViewMenuID, ViewMenuCallStack) = "Call #Stack... F12"
menu$(DebugMenuID, DebugMenuCallStack) = "Call #Stack... F12"
END IF
oldmy = mY: oldmx = mX
@ -4876,7 +4914,7 @@ FUNCTION ide2 (ignore)
GOTO ideloop
END IF
IF menu$(m, s) = "#Advanced..." THEN
IF menu$(m, s) = "#Advanced (C++)..." THEN
PCOPY 2, 0
retval = ideadvancedbox
'retval is ignored
@ -4884,6 +4922,13 @@ FUNCTION ide2 (ignore)
GOTO ideloop
END IF
IF menu$(m, s) = "Purge C++ #Libraries" THEN
PCOPY 2, 0
purgeprecompiledcontent
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
END IF
IF RIGHT$(menu$(m, s), 19) = "#Swap Mouse Buttons" THEN
PCOPY 2, 0
@ -5719,6 +5764,14 @@ FUNCTION ide2 (ignore)
END IF
END IF
IF menu$(m, s) = "#Watch List... F4" THEN
PCOPY 2, 0
showWatchList:
result = idevariablewatchbox("")
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
END IF
IF menu$(m, s) = "Call #Stack... F12" OR menu$(m, s) = "Call Stack... F12" THEN
IF IdeDebugMode = 2 THEN
IdeDebugMode = 3
@ -6321,6 +6374,11 @@ SUB DebugMode
END TYPE
STATIC vWatchPanel AS vWatchPanelType
TYPE ui
AS INTEGER x, y, w, h
AS STRING caption
END TYPE
SELECT EVERYCASE IdeDebugMode
CASE 1
PauseMode = 0
@ -6343,6 +6401,32 @@ SUB DebugMode
vWatchPanel.x = idewx - vWatchPanel.w - 6
vWatchPanel.y = 4
vWatchPanel.firstVisible = 1
STATIC Button(1 TO 8) AS ui
i = 0
i = i + 1: Button(i).Caption = "<F4 = Add Watch>"
i = i + 1: Button(i).Caption = "<F5 = Run>"
i = i + 1: Button(i).Caption = "<F6 = Step Out>"
i = i + 1: Button(i).Caption = "<F7 = Step Over>"
i = i + 1: Button(i).Caption = "<F8 = Step Into>"
i = i + 1: Button(i).Caption = "<F9 = Toggle Breakpoint>"
i = i + 1: Button(i).Caption = "<F10 = Clear all breakpoints>"
i = i + 1: Button(i).Caption = "<F12 = Call Stack>"
y = (idewy - 4) + 2
x = 2
FOR i = 1 TO UBOUND(Button)
Button(i).x = x
Button(i).y = y
Button(i).w = LEN(Button(i).Caption)
IF i < UBOUND(Button) THEN
x = x + Button(i).w + 1
IF x + LEN(Button(i + 1).Caption) > idewx - 1 THEN
y = y + 1
x = 2
END IF
END IF
NEXT
CASE IS > 1
noFocusMessage = NOT noFocusMessage
GOSUB UpdateStatusArea
@ -6646,6 +6730,15 @@ SUB DebugMode
ELSE
draggingHThumb = 0
END IF
mouseDownOnButton = 0
FOR i = 1 TO UBOUND(Button)
IF mY = Button(i).y AND mX >= Button(i).x AND mX <= Button(i).x + Button(i).w AND _
vWatchPanel.draggingPanel = 0 AND vWatchPanel.resizingPanel = 0 THEN
mouseDownOnButton = i
EXIT FOR
END IF
NEXT
ELSE
'drag
IF draggingVThumb = -1 THEN
@ -6736,7 +6829,7 @@ SUB DebugMode
GOSUB UpdateDisplay
END IF
END IF
ELSE
ELSE 'mouse button released
IF vWatchPanel.draggingPanel THEN vWatchPanel.draggingPanel = 0: mouseDown = 0
IF vWatchPanel.resizingPanel THEN vWatchPanel.resizingPanel = 0: mouseDown = 0
IF vWatchPanel.closingPanel AND (mX = mouseDownOnX AND mY = mouseDownOnY) THEN
@ -6780,6 +6873,20 @@ SUB DebugMode
mouseDown = 0
draggingVThumb = 0
draggingHThumb = 0
IF mouseDownOnButton > 0 AND mX = mouseDownOnX AND mY = mouseDownOnY THEN
SELECT CASE mouseDownOnButton
CASE 1: mouseDownOnButton = 0: mouseDown = 0: GOTO F4
CASE 2: mouseDownOnButton = 0: mouseDown = 0: GOTO F5
CASE 3: mouseDownOnButton = 0: mouseDown = 0: GOTO F6
CASE 4: mouseDownOnButton = 0: mouseDown = 0: GOTO F7
CASE 5: mouseDownOnButton = 0: mouseDown = 0: GOTO F8
CASE 6: mouseDownOnButton = 0: mouseDown = 0: GOTO F9
CASE 7: mouseDownOnButton = 0: mouseDown = 0: GOTO F10
CASE 8: mouseDownOnButton = 0: mouseDown = 0: GOTO F12
END SELECT
END IF
IF (mX > 1 AND mX <= 1 + maxLineNumberLength AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers) OR _
(mX = 1 AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers = 0) THEN
'Inside the editor/line numbers
@ -6856,11 +6963,8 @@ SUB DebugMode
UpdateStatusArea:
IF _WINDOWHASFOCUS THEN
IF noFocusMessage THEN
clearStatusWindow 2
clearStatusWindow 3
setStatusMessage 2, "<F4 = Add Watch> <F5 = Run> <F6 = Step Out> <F7 = Step Over> <F8 = Step Into>", 15
setStatusMessage 3, "<F9 = Toggle Breakpoint> <F10 = Clear all breakpoints> <F12 = Call Stack>", 15
UpdateMenuHelpLine "Right-click the code for more options; hit ESC to abort."
GOSUB UpdateButtons
noFocusMessage = 0
END IF
ELSE
@ -6963,6 +7067,7 @@ SUB DebugMode
END IF
GOSUB UpdateDisplay
CASE 15872 'F4
F4:
IF PauseMode = 0 THEN
cmd$ = "break"
PauseMode = -1
@ -6976,12 +7081,14 @@ SUB DebugMode
vWatchPanel.h = totalVisibleVariables + 2
IF vWatchPanel.h > idewy - 10 THEN vWatchPanel.h = idewy - 10
IF vWatchPanel.h < 5 THEN vWatchPanel.h = 5
GOTO requestVariableValues
END IF
PCOPY 3, 0: SCREEN , , 3, 0
WHILE _MOUSEINPUT: WEND
GOSUB UpdateDisplay
END IF
CASE 16128 'F5
F5:
requestContinue:
PauseMode = 0
debugnextline = 0
@ -6992,6 +7099,7 @@ SUB DebugMode
GOSUB UpdateDisplay
dummy = DarkenFGBG(1)
CASE 16384 'F6
F6:
requestStepOut:
IF PauseMode THEN
PauseMode = 0
@ -7002,6 +7110,7 @@ SUB DebugMode
dummy = DarkenFGBG(1)
END IF
CASE 16640 'F7
F7:
requestStepOver:
IF PauseMode THEN
cmd$ = "step over"
@ -7012,6 +7121,7 @@ SUB DebugMode
dummy = DarkenFGBG(1)
END IF
CASE 16896 'F8
F8:
IF PauseMode = 0 THEN
requestPause:
cmd$ = "break"
@ -7026,6 +7136,7 @@ SUB DebugMode
setStatusMessage 1, "Paused.", 2
IF IdeDebugMode = 2 THEN RETURN
CASE 17152 'F9
F9:
requestToggleBreakpoint:
IF PauseMode THEN
IdeBreakpoints(idecy) = NOT IdeBreakpoints(idecy)
@ -7040,6 +7151,7 @@ SUB DebugMode
GOSUB UpdateDisplay
END IF
CASE 17408 'F10
F10:
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN
requestUnskipAllLines:
REDIM IdeSkipLines(iden) AS _BYTE
@ -7053,6 +7165,7 @@ SUB DebugMode
END IF
GOSUB UpdateDisplay
CASE 34304 'F12
F12:
IF PauseMode THEN
requestCallStack:
cmd$ = "call stack"
@ -7087,10 +7200,10 @@ SUB DebugMode
IF callStackLength = -1 THEN
callStackLength = 0
clearStatusWindow 0
setStatusMessage 1, "Error retrieving call stack.", 2
setStatusMessage 1, "Error retrieving call stack.", 4
ELSEIF callStackLength = 0 THEN
clearStatusWindow 0
setStatusMessage 1, "No call stack log available.", 2
setStatusMessage 1, "No call stack log available.", 4
END IF
END IF
noFocusMessage = NOT noFocusMessage
@ -7162,6 +7275,7 @@ SUB DebugMode
'request variables
IF LEN(variableWatchList$) THEN
requestVariableValues:
temp$ = MID$(variableWatchList$, 5)
DO WHILE LEN(temp$)
tempIndex& = CVL(LEFT$(temp$, 4))
@ -7216,8 +7330,8 @@ SUB DebugMode
CASE "SINGLE": recvData$ = STR$(_CV(SINGLE, recvData$))
CASE "DOUBLE": recvData$ = STR$(_CV(DOUBLE, recvData$))
CASE "_FLOAT": recvData$ = STR$(_CV(_FLOAT, recvData$))
CASE "_OFFSET": 'TODO
CASE "_UNSIGNED _OFFSET": 'TODO
CASE "_OFFSET": recvData$ = STR$(_CV(_OFFSET, recvData$))
CASE "_UNSIGNED _OFFSET": recvData$ = STR$(_CV(_UNSIGNED _OFFSET, recvData$))
CASE "STRING"
IF sequence% = 1 THEN
IF LEN(dummy%&) = 8 THEN
@ -7262,7 +7376,7 @@ SUB DebugMode
GOSUB UpdateDisplay
clearStatusWindow 1
COLOR , 4
setStatusMessage 1, "Error occurred on line" + STR$(l), 13
setStatusMessage 1, "Error occurred on line" + STR$(l), 15
BypassRequestCallStack = -1
PauseMode = -1
CASE "call stack size"
@ -7286,6 +7400,7 @@ SUB DebugMode
END IF
END SELECT
IF _WINDOWHASFOCUS THEN GOSUB UpdateButtons
_LIMIT 100
LOOP
@ -7326,6 +7441,22 @@ SUB DebugMode
PCOPY 3, 0
RETURN
UpdateButtons:
FOR i = 1 TO UBOUND(Button)
IF mY = Button(i).y AND mX >= Button(i).x AND mX <= Button(i).x + Button(i).w AND _
vWatchPanel.draggingPanel = 0 AND vWatchPanel.resizingPanel = 0 THEN
COLOR 0, 7
temp$ = ""
ELSE
COLOR 13, 1
temp$ = " "
END IF
_PRINTSTRING (Button(i).x, Button(i).y), Button(i).Caption + temp$
NEXT
PCOPY 3, 0
RETURN
END SUB
Function map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)
@ -7451,8 +7582,7 @@ FUNCTION idevariablewatchbox(currentScope$)
l$ = l$ + CHR$(16) + " "
END IF
text$ = usedVariableList(x).name + CHR$(16) + CHR$(2)
IF usedVariableList(x).used = 0 THEN someUnusedVars = -1: text$ = text$ + "*" ELSE text$ = text$ + " "
text$ = usedVariableList(x).name + CHR$(16) + CHR$(2) + " "
text$ = text$ + SPACE$(maxVarLen - LEN(usedVariableList(x).name))
text$ = text$ + " " + usedVariableList(x).varType + SPACE$(maxTypeLen - LEN(usedVariableList(x).varType))
@ -7481,20 +7611,24 @@ FUNCTION idevariablewatchbox(currentScope$)
IF dialogHeight > idewy + idesubwindow - 6 THEN
dialogHeight = idewy + idesubwindow - 6
END IF
IF dialogHeight < 6 THEN dialogHeight = 6
idepar p, idewx - 8, dialogHeight, "Watch List"
dialogWidth = 6 + maxModuleNameLen + maxVarLen + maxTypeLen + 20
IF dialogWidth < 60 THEN dialogWidth = 60
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
idepar p, dialogWidth, dialogHeight, "Watch List"
i = i + 1: varListBox = i
o(varListBox).typ = 2
o(varListBox).y = 2
o(varListBox).w = idewx - 12: o(i).h = dialogHeight - 4
o(varListBox).w = dialogWidth - 4: o(i).h = dialogHeight - 4
o(varListBox).txt = idenewtxt(l$)
o(varListBox).sel = 1
o(varListBox).nam = idenewtxt("Variable List (" + LTRIM$(STR$(totalVisibleVariables)) + ")")
i = i + 1: buttonSet = i
o(buttonSet).typ = 3
o(i).x = p.x + p.w - 45
o(buttonSet).y = dialogHeight
o(buttonSet).txt = idenewtxt("#Add All" + sep + "#Remove All" + sep + "#Close")
@ -7526,10 +7660,6 @@ FUNCTION idevariablewatchbox(currentScope$)
'-------- custom display changes --------
COLOR 0, 7: _PRINTSTRING (p.x + 2, p.y + 1), "Double-click on a variable to add it to the watch list"
IF someUnusedVars THEN
COLOR 2
_PRINTSTRING (p.x + 2, p.y + p.h), "* unused"
END IF
'-------- end of custom display changes --------
@ -7656,19 +7786,34 @@ FUNCTION idecallstackbox
'-------- init --------
i = 0
dialogHeight = callStackLength + 4
IF dialogHeight > idewy + idesubwindow - 6 THEN
dialogHeight = idewy + idesubwindow - 6
END IF
idepar p, idewx - 8, dialogHeight, "$DEBUG MODE"
dialogWidth = 52
temp$ = callstacklist$
DO
i = INSTR(temp$, sep)
IF i THEN
temp2$ = LEFT$(temp$, i - 1)
temp$ = MID$(temp$, i + 1)
IF LEN(temp2$) + 6 > dialogWidth THEN dialogWidth = LEN(temp2$) + 6
ELSE
IF LEN(temp$) + 6 > dialogWidth THEN dialogWidth = LEN(temp$) + 6
EXIT DO
END IF
LOOP
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
idepar p, dialogWidth, dialogHeight, "$DEBUG MODE"
i = 0
i = i + 1
o(i).typ = 2
o(i).y = 2
o(i).w = idewx - 12: o(i).h = dialogHeight - 4
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 4
o(i).txt = idenewtxt(callstacklist$)
o(i).sel = callStackLength
o(i).nam = idenewtxt("Call Stack")
@ -7704,7 +7849,7 @@ FUNCTION idecallstackbox
'-------- end of generic display dialog box & objects --------
'-------- custom display changes --------
COLOR 0, 7: _PRINTSTRING (p.x + 2, p.y + 1), "These are the most recent sub/function calls in your program:"
COLOR 0, 7: _PRINTSTRING (p.x + 2, p.y + 1), "Most recent sub/function calls in your program:"
'-------- end of custom display changes --------
@ -9035,7 +9180,7 @@ END SUB
SUB idegotoline (i)
IF idel = i THEN EXIT SUB
IF i < 1 THEN ERROR 5
IF i < 1 THEN i = 1
'scan backwards
IF i < idel THEN
DO
@ -10619,7 +10764,6 @@ FUNCTION idesubs$
SortedSubsFlag = idesortsubs
SubClosed = 0
FOR y = 1 TO iden
a$ = idegetline(y)
IF SubClosed = 0 THEN ModuleSize = ModuleSize + 1
@ -10770,6 +10914,8 @@ FUNCTION idesubs$
END IF
'build lists
dialogWidth = 50
argsLength = 2
FOR x = 1 TO TotalSUBs
n$ = SubNames(x)
IF LEN(n$) > maxModuleNameLen THEN
@ -10779,6 +10925,7 @@ FUNCTION idesubs$
END IF
args$ = Args(x)
IF LEN(args$) > argsLength THEN argsLength = LEN(args$)
IF LEN(args$) <= (idewx - 41) THEN
args$ = args$ + SPACE$((idewx - 41) - LEN(args$))
ELSE
@ -10843,13 +10990,17 @@ FUNCTION idesubs$
IF dialogHeight > idewy + idesubwindow - 6 THEN
dialogHeight = idewy + idesubwindow - 6
END IF
idepar p, idewx - 8, dialogHeight, "SUBs"
IF argsLength + maxModuleNameLen + maxLineCountSpace + 20 > dialogWidth THEN dialogWidth = argsLength + maxModuleNameLen + maxLineCountSpace + 20
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
idepar p, dialogWidth, dialogHeight, "SUBs"
i = i + 1
o(i).typ = 2
o(i).y = 1
'68
o(i).w = idewx - 12: o(i).h = dialogHeight - 3
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 3
IF SortedSubsFlag = 0 THEN
IF IDESubsLength THEN
o(i).txt = idenewtxt(lSized$)
@ -10903,8 +11054,8 @@ FUNCTION idesubs$
i = i + 1
o(i).typ = 3
o(i).x = p.x + p.w - 26
o(i).w = 26
o(i).x = dialogWidth - 22
o(i).y = dialogHeight
IF IdeDebugMode = 0 THEN
o(i).txt = idenewtxt("#Edit" + sep + "#Cancel")
@ -11125,8 +11276,10 @@ FUNCTION idelanguagebox
'generate list of available code pages
l$ = idecpname(1)
dialogWidth = LEN(l$)
FOR x = 2 TO idecpnum
l$ = l$ + sep + idecpname(x)
IF LEN(idecpname(x)) > dialogWidth THEN dialogWidth = LEN(idecpname(x))
NEXT
l$ = UCASE$(l$)
@ -11135,12 +11288,15 @@ FUNCTION idelanguagebox
IF dialogHeight > idewy + idesubwindow - 6 THEN
dialogHeight = idewy + idesubwindow - 6
END IF
idepar p, idewx - 8, dialogHeight, "Language"
IF dialogWidth < 60 THEN dialogWidth = 60
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
idepar p, dialogWidth, dialogHeight, "Language"
i = i + 1
o(i).typ = 2
o(i).y = 2
o(i).w = idewx - 12: o(i).h = dialogheight - 4
o(i).w = dialogWidth - 4: o(i).h = dialogheight - 4
o(i).txt = idenewtxt(l$)
o(i).sel = 1: IF idecpindex THEN o(i).sel = idecpindex
o(i).nam = idenewtxt("Code Pages")
@ -11290,6 +11446,7 @@ FUNCTION idewarningbox
NEXT
'build list
dialogWidth = 60
FOR x = 1 TO warningListItems
IF warningLines(x) = 0 THEN
l$ = l$ + warning$(x)
@ -11307,6 +11464,7 @@ FUNCTION idewarningbox
END IF
treeConnection = LEN(l$) + 1
text$ = warning$(x)
IF LEN(text$) + 10 > dialogWidth THEN dialogWidth = LEN(text$) + 10
IF LEN(text$) THEN
l$ = l$ + CHR$(195) + CHR$(196) + l3$ + ": " + text$
ELSE
@ -11326,12 +11484,14 @@ FUNCTION idewarningbox
dialogHeight = idewy + idesubwindow - 6
END IF
idepar p, idewx - 8, dialogHeight, "Compilation status"
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
idepar p, dialogWidth, dialogHeight, "Compilation status"
i = i + 1
o(i).typ = 2
o(i).y = 2
o(i).w = idewx - 12: o(i).h = dialogHeight - 4
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 4
o(i).txt = idenewtxt(l$)
o(i).sel = 1
o(i).nam = idenewtxt("Warnings (" + LTRIM$(STR$(totalWarnings)) + ")")
@ -12628,7 +12788,8 @@ FUNCTION ideadvancedbox
o(i).y = y
o(i).nam = idenewtxt("Embed C++ debug information into executable")
o(i).sel = idedebuginfo
y = y + 1: Direct_Text$(y) = " " + CHR$(254) + " Investigate crashes/freezes at C++ (not QB64) code level"
y = y + 1: Direct_Text$(y) = " " + CHR$(254) + " This setting is not required for $DEBUG mode"
y = y + 1: Direct_Text$(y) = " " + CHR$(254) + " Use it to investigate crashes/freezes at C++ (not QB64) code level"
y = y + 1: Direct_Text$(y) = " " + CHR$(254) + " Use internal/temp/debug batch file to debug your executable"
y = y + 1: Direct_Text$(y) = " " + CHR$(254) + " Increases executable size"
y = y + 1: Direct_Text$(y) = " " + CHR$(254) + " Makes public the names of variables in your program's code"
@ -12737,42 +12898,12 @@ FUNCTION ideadvancedbox
WriteConfigSetting generalSettingsSection$, "DebugInfo", "False" + DebugInfoIniWarning$
END IF
Include_GDB_Debugging_Info = idedebuginfo
IF os$ = "WIN" THEN
CHDIR "internal\c"
SHELL _HIDE "cmd /c purge_all_precompiled_content_win.bat"
CHDIR "..\.."
END IF
IF os$ = "LNX" THEN
CHDIR "./internal/c"
IF INSTR(_OS$, "[MACOSX]") THEN
SHELL _HIDE "./purge_all_precompiled_content_osx.command"
ELSE
SHELL _HIDE "./purge_all_precompiled_content_lnx.sh"
END IF
CHDIR "../.."
END IF
idechangemade = 1 'force recompilation
purgeprecompiledcontent
END IF
'...
EXIT FUNCTION
END IF
'end of custom controls
mousedown = 0
@ -15023,13 +15154,22 @@ FUNCTION iderecentbox$
l$ = ""
dialogWidth = 72
totalRecent = 0
fh = FREEFILE
OPEN ".\internal\temp\recent.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$
a$ = RIGHT$(a$, LEN(a$) - 2)
REDIM tempList$(100)
DO WHILE LEN(a$)
ai = INSTR(a$, CRLF)
IF ai THEN
f$ = LEFT$(a$, ai - 1): IF ai = LEN(a$) - 1 THEN a$ = "" ELSE a$ = RIGHT$(a$, LEN(a$) - ai - 3)
IF LEN(f$) + 6 > dialogWidth THEN dialogWidth = LEN(f$) + 6
totalRecent = totalRecent + 1
IF totalRecent > UBOUND(tempList$) THEN
REDIM _PRESERVE tempList$(UBOUND(tempList$) + 100)
END IF
tempList$(totalRecent) = f$
IF LEN(l$) THEN l$ = l$ + sep + f$ ELSE l$ = f$
END IF
LOOP
@ -15037,21 +15177,27 @@ FUNCTION iderecentbox$
'72,19
i = 0
idepar p, idewx - 8, idewy + idesubwindow - 6, "Open"
dialogHeight = (totalRecent) + 3
IF dialogHeight > idewy + idesubwindow - 6 THEN
dialogHeight = idewy + idesubwindow - 6
END IF
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
idepar p, dialogWidth, dialogHeight, "Open"
i = i + 1
o(i).typ = 2
o(i).y = 1
'68
o(i).w = idewx - 12: o(i).h = idewy + idesubwindow - 9
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 3
o(i).txt = idenewtxt(l$)
o(i).sel = 1
o(i).nam = idenewtxt("Recent Programs")
i = i + 1
o(i).typ = 3
o(i).y = idewy + idesubwindow - 6
o(i).txt = idenewtxt("#OK" + sep + "#Cancel" + sep + "Clear #list" + sep + "#Remove broken links")
o(i).y = dialogHeight
o(i).txt = idenewtxt("#Open" + sep + "#Cancel" + sep + "Clear #list" + sep + "#Remove broken links")
o(i).dft = 1
'-------- end of init --------
@ -15133,7 +15279,7 @@ FUNCTION iderecentbox$
END IF
IF (K$ = CHR$(13) AND focus = 1) OR (focus = 2 AND info <> 0) OR (info = 1 AND focus = 1) THEN
f$ = idetxt(o(1).stx)
f$ = tempList$(ABS(o(1).sel))
iderecentbox$ = f$
EXIT FUNCTION
END IF
@ -15246,6 +15392,8 @@ SUB IdeMakeContextualMenu
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "SUBs... F2": i = i + 1
menuDesc$(m, i - 1) = "Displays a list of SUB/FUNCTION procedures"
menu$(m, i) = "#Watch List... F4": i = i + 1
menuDesc$(m, i - 1) = "Adds variables to watch list"
menu$(m, i) = "Call Stack... F12": i = i + 1
menuDesc$(m, i - 1) = "Displays the call stack of the current program's execution"
menu$(m, i) = "-": i = i + 1
@ -16950,3 +17098,22 @@ FUNCTION isnumber (__a$)
END FUNCTION
'$INCLUDE:'wiki\wiki_methods.bas'
SUB purgeprecompiledcontent
IF os$ = "WIN" THEN
CHDIR "internal\c"
SHELL _HIDE "cmd /c purge_all_precompiled_content_win.bat"
CHDIR "..\.."
END IF
IF os$ = "LNX" THEN
CHDIR "./internal/c"
IF INSTR(_OS$, "[MACOSX]") THEN
SHELL _HIDE "./purge_all_precompiled_content_osx.command"
ELSE
SHELL _HIDE "./purge_all_precompiled_content_lnx.sh"
END IF
CHDIR "../.."
END IF
idechangemade = 1 'force recompilation
END SUB

View file

@ -348,6 +348,19 @@ SUB WikiParse (a$)
GOTO Special
END IF
s$ = "&lt;nowiki>"
IF c$(LEN(s$)) = s$ THEN
i = i + LEN(s$) - 1
GOTO Special
END IF
s$ = "&lt;/nowiki>"
IF c$(LEN(s$)) = s$ THEN
i = i + LEN(s$) - 1
GOTO Special
END IF
s$ = "&lt;p style="
IF c$(LEN(s$)) = s$ THEN
i = i + LEN(s$) - 1

View file

@ -3440,7 +3440,7 @@ DO
inclinenump$ = inclinenump$ + "," + CHR$(34) + thisincname$ + CHR$(34)
END IF
IF NoChecks = 0 THEN
IF vWatchOn THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
IF vWatchOn AND inclinenumber(inclevel) = 0 THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
PRINT #12, "if(qbevent){" + temp$ + "evnt(" + str2$(linenumber) + inclinenump$ + ");r=0;}"
END IF
IF n = 1 THEN GOTO finishednonexec
@ -3501,7 +3501,7 @@ DO
inclinenump$ = inclinenump$ + "," + CHR$(34) + thisincname$ + CHR$(34)
END IF
IF NoChecks = 0 THEN
IF vWatchOn THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
IF vWatchOn AND inclinenumber(inclevel) = 0 THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
PRINT #12, "if(qbevent){" + temp$ + "evnt(" + str2$(linenumber) + inclinenump$ + ");r=0;}"
END IF
entireline$ = RIGHT$(entireline$, LEN(entireline$) - x3): u$ = UCASE$(entireline$)
@ -8879,7 +8879,7 @@ DO
thisincname$ = MID$(incname$(inclevel), LEN(thisincname$) + 1)
inclinenump$ = inclinenump$ + "," + CHR$(34) + thisincname$ + CHR$(34)
END IF
IF vWatchOn THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
IF vWatchOn AND inclinenumber(inclevel) = 0 THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
PRINT #12, "if(qbevent){" + temp$ + "evnt(" + str2$(linenumber) + inclinenump$ + ");}" 'non-resumable error check (cannot exit without handling errors)
PRINT #12, "exit_code=" + e$ + ";"
l$ = l$ + sp + l2$
@ -8903,7 +8903,7 @@ DO
thisincname$ = MID$(incname$(inclevel), LEN(thisincname$) + 1)
inclinenump$ = inclinenump$ + "," + CHR$(34) + thisincname$ + CHR$(34)
END IF
IF vWatchOn = 1 AND NoChecks = 0 THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
IF vWatchOn = 1 AND NoChecks = 0 AND inclinenumber(inclevel) = 0 THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
PRINT #12, "if(qbevent){" + temp$ + "evnt(" + str2$(linenumber) + inclinenump$ + ");}" 'non-resumable error check (cannot exit without handling errors)
PRINT #12, "exit_code=" + e$ + ";"
l$ = l$ + sp + l2$
@ -8911,8 +8911,10 @@ DO
IF vWatchOn = 1 THEN
vWatchAddLabel linenumber, 0
PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars); if (*__LONG_VWATCH_GOTO>0) goto VWATCH_SETNEXTLINE; if (*__LONG_VWATCH_GOTO<0) goto VWATCH_SKIPLINE;"
IF inclinenumber(inclevel) = 0 THEN
vWatchAddLabel linenumber, 0
END IF
PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars);"
END IF
PRINT #12, "if (sub_gl_called) error(271);"
PRINT #12, "close_program=1;"
@ -11191,7 +11193,7 @@ DO
inclinenump$ = inclinenump$ + "," + CHR$(34) + thisincname$ + CHR$(34)
END IF
IF NoChecks = 0 THEN
IF vWatchOn THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
IF vWatchOn AND inclinenumber(inclevel) = 0 THEN temp$ = vWatchErrorCall$ ELSE temp$ = ""
IF dynscope THEN
dynscope = 0
PRINT #12, "if(qbevent){" + temp$ + "evnt(" + str2$(linenumber) + inclinenump$ + ");if(r)goto S_" + str2$(statementn) + ";}"
@ -22803,6 +22805,7 @@ END FUNCTION
SUB xend
IF vWatchOn = 1 THEN
'check if closedmain = 0 in case a main module ends in an include.
IF (inclinenumber(inclevel) = 0 OR closedmain = 0) THEN vWatchAddLabel 0, -1
PRINT #12, "*__LONG_VWATCH_LINENUMBER= 0; SUB_VWATCH((ptrszint*)vwatch_global_vars,(ptrszint*)vwatch_local_vars);"
END IF

View file

@ -404,7 +404,7 @@ id.args = 1
id.arg = MKL$(LONGTYPE - ISPOINTER)
id.ret = STRINGTYPE - ISPOINTER
id.specialformat = "[?]"
id.hr_syntax = "_DEVICE$(device_number)
id.hr_syntax = "_DEVICE$(device_number)"
regid
clearid
@ -415,7 +415,7 @@ id.args = 1
id.arg = MKL$(LONGTYPE - ISPOINTER)
id.ret = LONGTYPE - ISPOINTER
id.specialformat = "[?]"
id.hr_syntax = "_DEVICEINPUT or _DEVICEINPUT(device_number%)
id.hr_syntax = "_DEVICEINPUT or _DEVICEINPUT(device_number%)"
regid
clearid
@ -664,7 +664,7 @@ id.args = 4
id.arg = MKL$(LONGTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER)
id.specialformat = "[?,?,?,?]"
id.ret = LONGTYPE - ISPOINTER
id.hr_syntax = "_SCREENIMAGE(column1, row1, column2, row2)
id.hr_syntax = "_SCREENIMAGE(column1, row1, column2, row2)"
regid
@ -1084,7 +1084,7 @@ id.args = 2
id.arg = MKL$(LONGTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER)
id.specialformat = "?[,?]"
id.ret = LONGTYPE - ISPOINTER
id.hr_syntax = "_COPYIMAGE[(imageHandle&[, mode])]
id.hr_syntax = "_COPYIMAGE[(imageHandle&[, mode])]"
regid
'IMAGE SELECTION
@ -2410,7 +2410,7 @@ id.args = 7
id.arg = MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(ULONGTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER)
id.specialformat = "[{Step}](?,?),?[,[?][,[?][,[?][,?]]]]"
'CIRCLE [STEP] (x!,y!),radius![,[color&] [,[start!] [,[end!] [,aspect!]]]]
id.hr_syntax = "CIRCLE [STEP] (x!, y!), radius![, [color&] [, [start!] [, [end!] [, aspect!]]]]
id.hr_syntax = "CIRCLE [STEP] (x!, y!), radius![, [color&] [, [start!] [, [end!] [, aspect!]]]]"
regid
clearid