1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-02 22:21:21 +00:00

Merge pull request #188 from QB64Team/watch-arrays

Watch arrays
This commit is contained in:
Fellippe Heitor 2021-09-10 01:24:23 -03:00 committed by GitHub
commit ca32adf247
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 323 additions and 143 deletions

View file

@ -941,12 +941,12 @@ inline int16 func_abs(int16 d){return abs(d);}
inline int32 func_abs(int32 d){return abs(d);}
inline int64 func_abs(int64 d){return llabs(d);}
ptrszint check_lbound(ptrszint *array) {
return func_lbound((ptrszint*)(*array),1,1);
ptrszint check_lbound(ptrszint *array,int32 index, int32 num_indexes) {
return func_lbound((ptrszint*)(*array),index,num_indexes);
}
ptrszint check_ubound(ptrszint *array) {
return func_ubound((ptrszint*)(*array),1,1);
ptrszint check_ubound(ptrszint *array,int32 index, int32 num_indexes) {
return func_ubound((ptrszint*)(*array),index,num_indexes);
}
inline ptrszint array_check(uptrszint index,uptrszint limit){

View file

@ -2,17 +2,19 @@ $CHECKING:OFF
SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
STATIC AS LONG vw_ideHost, vw_breakpointCount, vw_skipCount, vw_timeout, vw_startLevel, vw_lastLine
STATIC AS LONG vw_runToLine, vw_arrayIndex, vw_originalVarLineNumber
STATIC AS _BYTE vw_pauseMode, vw_stepOver, vw_bypass, vw_setNextLine, vw_hwndsent
STATIC AS _OFFSET vw_idehwnd
STATIC AS LONG vw_runToLine, vw_originalVarLineNumber
STATIC AS _BYTE vw_pauseMode, vw_stepOver, vw_bypass, vw_setNextLine, vw_hwndSent
STATIC AS _OFFSET vw_ideHwnd
STATIC vw_buffer$
DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_cmdsize
DIM AS LONG vw_arrayelementsize, vw_element, vw_elementoffset, vw_storage
DIM AS _OFFSET vw_address, vw_lbound, vw_ubound
DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_cmdSize
DIM AS LONG vw_arrayElementSize, vw_element, vw_elementOffset, vw_storage, vw_blockSize
DIM AS LONG vw_arrayDimension, vw_arrayTotalDimensions, vw_arrayIndex, vw_realArrayIndex
DIM AS _OFFSET vw_address, vw_lBound, vw_uBound
DIM AS _MEM vw_m, vw_m2
DIM AS _BYTE vw_isarray, vw_isUDT
DIM AS _BYTE vw_isArray, vw_isUDT
DIM vw_start!, vw_temp$, vw_cmd$, vw_value$, vw_k&, vw_buf$, vw_scope$, vw_varType$
DIM vw_dummy%&
DIM vw_prevValue$, vw_getBytes&, vw_getBytesPosition&, vw_valueBytes$, vw_dummy%&
DIM vw_arrayIndexes$
DECLARE LIBRARY
SUB vwatch_stoptimers ALIAS stop_timers
@ -20,8 +22,8 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
SUB unlockvWatchHandle
SUB set_qbs_size (target AS _OFFSET, BYVAL length&)
FUNCTION stop_program_state&
FUNCTION check_lbound%& (array AS _OFFSET)
FUNCTION check_ubound%& (array AS _OFFSET)
FUNCTION check_lbound%& (array AS _OFFSET, BYVAL index AS LONG, BYVAL num_indexes AS LONG)
FUNCTION check_ubound%& (array AS _OFFSET, BYVAL index AS LONG, BYVAL num_indexes AS LONG)
END DECLARE
$IF WIN THEN
@ -44,7 +46,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vw_cmd$ = "me:" + COMMAND$(0)
GOSUB SendCommand
IF _WINDOWHANDLE THEN
vw_hwndsent = -1
vw_hwndSent = -1
vw_cmd$ = "hwnd:" + _MK$(_OFFSET, _WINDOWHANDLE)
GOSUB SendCommand
END IF
@ -76,7 +78,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vwatch_breakpoints(CVL(vw_temp$)) = -1
NEXT
CASE "hwnd"
vw_idehwnd = _CV(_OFFSET, vw_value$)
vw_ideHwnd = _CV(_OFFSET, vw_value$)
CASE "skip count"
vw_skipCount = CVL(vw_value$)
CASE "skip list"
@ -102,9 +104,9 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
LOOP
END IF
IF vw_hwndsent = 0 THEN
IF vw_hwndSent = 0 THEN
IF _WINDOWHANDLE > 0 THEN
vw_hwndsent = -1
vw_hwndSent = -1
vw_cmd$ = "hwnd:" + _MK$(_OFFSET, _WINDOWHANDLE)
GOSUB SendCommand
END IF
@ -204,7 +206,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
GOSUB SendCommand
$IF WIN THEN
vw_i = SetForegroundWindow&(vw_idehwnd)
vw_i = SetForegroundWindow&(vw_ideHwnd)
$END IF
DO 'main loop
@ -213,13 +215,13 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
CASE "run"
vw_pauseMode = 0
vw_stepOver = 0
vwatch_starttimers
_KEYCLEAR: vwatch_starttimers
EXIT SUB
CASE "run to line"
vw_pauseMode = 0
vw_stepOver = 0
vw_runToLine = CVL(vw_value$)
vwatch_starttimers
_KEYCLEAR: vwatch_starttimers
EXIT SUB
CASE "step"
vw_pauseMode = -1
@ -229,19 +231,19 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vw_pauseMode = -1
vw_stepOver = -1
vw_startLevel = vwatch_sublevel
vwatch_starttimers
_KEYCLEAR: vwatch_starttimers
EXIT SUB
CASE "step out"
vw_pauseMode = -1
vw_stepOver = -1
vw_startLevel = vwatch_sublevel - 1
vwatch_starttimers
_KEYCLEAR: vwatch_starttimers
EXIT SUB
CASE "free"
unlockvWatchHandle: CLOSE #vw_ideHost
vw_ideHost = 0
vw_bypass = -1
vwatch_starttimers
_KEYCLEAR: vwatch_starttimers
EXIT SUB
CASE "set breakpoint"
vwatch_breakpoints(CVL(vw_value$)) = -1
@ -256,23 +258,25 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
'send call stack history
GOSUB SendCallStack
CASE "get global var", "get local var"
vw_tempIndex = CVL(LEFT$(vw_value$, 4))
vw_isarray = _CV(_BYTE, MID$(vw_value$, 5, 1))
vw_originalVarLineNumber = CVL(MID$(vw_value$, 6, 4))
vw_localIndex = CVL(MID$(vw_value$, 10, 4))
vw_arrayIndex = CVL(MID$(vw_value$, 14, 4))
vw_arrayelementsize = CVL(MID$(vw_value$, 18, 4))
vw_element = CVL(MID$(vw_value$, 22, 4))
vw_elementoffset = CVL(MID$(vw_value$, 26, 4))
vw_varSize = CVL(MID$(vw_value$, 30, 4))
vw_getBytes& = 4: GOSUB GetBytes: vw_tempIndex = CVL(vw_valueBytes$)
vw_getBytes& = 1: GOSUB GetBytes: vw_isArray = _CV(_BYTE, vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_originalVarLineNumber = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_localIndex = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_arrayTotalDimensions = CVL(vw_valueBytes$)
vw_getBytes& = vw_arrayTotalDimensions: GOSUB GetBytes: vw_arrayIndexes$ = vw_valueBytes$
vw_arrayTotalDimensions = vw_arrayTotalDimensions \ 4
vw_getBytes& = 4: GOSUB GetBytes: vw_arrayElementSize = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_element = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_elementOffset = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_varSize = CVL(vw_valueBytes$)
IF vw_varSize = 0 THEN GOTO cmdProcessingDone
vw_storage = CVL(MID$(vw_value$, 34, 4))
vw_i = CVI(MID$(vw_value$, 38, 2))
vw_getBytes& = 4: GOSUB GetBytes: vw_storage = CVL(vw_valueBytes$)
vw_getBytes& = 2: GOSUB GetBytes: vw_i = CVI(vw_valueBytes$)
IF vw_i THEN
vw_scope$ = MID$(vw_value$, 40, vw_i)
vw_getBytes& = vw_i: GOSUB GetBytes: vw_scope$ = vw_valueBytes$
END IF
vw_i = CVI(MID$(vw_value$, 40 + vw_i, 2))
vw_varType$ = RIGHT$(vw_value$, vw_i)
vw_getBytes& = 2: GOSUB GetBytes: vw_i = CVI(vw_valueBytes$)
vw_getBytes& = vw_i: GOSUB GetBytes: vw_varType$ = vw_valueBytes$
IF vw_cmd$ = "get global var" THEN
vw_address = _OFFSET(globalVariables) + LEN(vw_address) * vw_localIndex
@ -287,17 +291,27 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'first resolve pass
vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'second resolve pass
IF vw_isarray THEN
IF vw_isArray THEN
IF vw_originalVarLineNumber > 0 THEN
'prevent fetching array data before DIM line
IF vwatch_linenumber <= vw_originalVarLineNumber THEN GOTO cmdProcessingDone
END IF
vw_lbound = check_lbound%&(vw_address)
vw_ubound = check_ubound%&(vw_address)
IF vw_arrayIndex < vw_lbound OR vw_arrayIndex > vw_ubound THEN
GOTO cmdProcessingDone
END IF
vw_realArrayIndex = 0
vw_blockSize = 1
FOR vw_arrayDimension = 1 TO vw_arrayTotalDimensions
vw_lBound = check_lbound%&(vw_address, vw_arrayDimension, vw_arrayTotalDimensions)
vw_uBound = check_ubound%&(vw_address, vw_arrayDimension, vw_arrayTotalDimensions)
vw_arrayIndex = CVL(MID$(vw_arrayIndexes$, vw_arrayDimension * 4 - 3, 4))
IF vw_arrayIndex < vw_lBound OR vw_arrayIndex > vw_uBound THEN
GOTO cmdProcessingDone
END IF
vw_arrayIndex = (vw_arrayIndex - VAL(STR$(vw_lBound))) * vw_blockSize
vw_realArrayIndex = vw_realArrayIndex + vw_arrayIndex
vw_blockSize = vw_blockSize * VAL(STR$(vw_uBound - vw_lBound + 1))
NEXT
'get the address of where this array's data is stored
vw_buf$ = SPACE$(LEN(vw_dummy%&))
@ -319,24 +333,24 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vw_varSize = LEN(vw_dummy%&)
END IF
'this is where we calculate the actual array index position in memory
IF vw_arrayelementsize = 0 THEN
vw_address = vw_address + ((vw_arrayIndex - vw_lbound) * vw_varSize)
IF vw_arrayElementSize = 0 THEN
vw_address = vw_address + (vw_realArrayIndex * vw_varSize)
ELSE
vw_address = vw_address + ((vw_arrayIndex - vw_lbound) * vw_arrayelementsize)
vw_address = vw_address + (vw_realArrayIndex * vw_arrayElementSize)
END IF
END IF
'vw_address now points to the actual data
vw_address = vw_address + vw_elementoffset
vw_address = vw_address + vw_elementOffset
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
IF INSTR(vw_varType$, "STRING *") > 0 AND (vw_isarray <> 0 OR vw_element > 0) THEN
IF INSTR(vw_varType$, "STRING *") > 0 AND (vw_isArray <> 0 OR vw_element > 0) THEN
'actual data already fetched; nothing else to do
ELSEIF INSTR(vw_varType$, "STRING") > 0 THEN
IF vw_isarray <> 0 OR vw_element > 0 THEN
IF vw_isArray <> 0 OR vw_element > 0 THEN
'First pass
vw_varSize = LEN(vw_dummy%&)
vw_buf$ = SPACE$(vw_varSize)
@ -376,17 +390,19 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vw_cmd$ = "address read:" + MKL$(vw_tempIndex) + MKL$(vw_arrayIndex) + MKL$(vw_element) + MKL$(vw_storage) + vw_buf$
GOSUB SendCommand
CASE "set global address", "set local address"
vw_localIndex = CVL(LEFT$(vw_value$, 4))
vw_isarray = (CVL(MID$(vw_value$, 5, 4)) <> 0)
vw_arrayIndex = CVL(MID$(vw_value$, 9, 4))
vw_isUDT = (CVL(MID$(vw_value$, 13, 4)) <> 0)
vw_elementoffset = CVL(MID$(vw_value$, 17, 4))
vw_arrayelementsize = CVL(MID$(vw_value$, 21, 4))
vw_varSize = CVL(MID$(vw_value$, 25, 4))
vw_i = CVI(MID$(vw_value$, 29, 2))
vw_varType$ = MID$(vw_value$, 31, vw_i)
vw_i = CVI(MID$(vw_value$, 31 + vw_i, 2))
vw_value$ = RIGHT$(vw_value$, vw_i)
vw_getBytes& = 4: GOSUB GetBytes: vw_localIndex = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_isArray = (CVL(vw_valueBytes$) <> 0)
vw_getBytes& = 4: GOSUB GetBytes: vw_arrayTotalDimensions = CVL(vw_valueBytes$)
vw_getBytes& = vw_arrayTotalDimensions: GOSUB GetBytes: vw_arrayIndexes$ = vw_valueBytes$
vw_arrayTotalDimensions = vw_arrayTotalDimensions \ 4
vw_getBytes& = 4: GOSUB GetBytes: vw_isUDT = (CVL(vw_valueBytes$) <> 0)
vw_getBytes& = 4: GOSUB GetBytes: vw_elementOffset = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_arrayElementSize = CVL(vw_valueBytes$)
vw_getBytes& = 4: GOSUB GetBytes: vw_varSize = CVL(vw_valueBytes$)
vw_getBytes& = 2: GOSUB GetBytes: vw_i = CVI(vw_valueBytes$)
vw_getBytes& = vw_i: GOSUB GetBytes: vw_varType$ = vw_valueBytes$
vw_getBytes& = 2: GOSUB GetBytes: vw_i = CVI(vw_valueBytes$)
vw_getBytes& = vw_i: GOSUB GetBytes: vw_value$ = vw_valueBytes$
IF vw_cmd$ = "set global address" THEN
vw_address = _OFFSET(globalVariables) + LEN(vw_address) * vw_localIndex
@ -397,13 +413,25 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vw_address = _MEMGET(vw_m, vw_address, _OFFSET) 'second resolve pass
'--------
IF vw_isarray THEN
vw_lbound = check_lbound%&(vw_address)
vw_ubound = check_ubound%&(vw_address)
IF vw_isArray THEN
IF vw_arrayIndex < vw_lbound OR vw_arrayIndex > vw_ubound THEN
GOTO cmdProcessingDone
END IF
vw_realArrayIndex = 0
vw_blockSize = 1
FOR vw_arrayDimension = 1 TO vw_arrayTotalDimensions
vw_lBound = check_lbound%&(vw_address, vw_arrayDimension, vw_arrayTotalDimensions)
vw_uBound = check_ubound%&(vw_address, vw_arrayDimension, vw_arrayTotalDimensions)
vw_arrayIndex = CVL(MID$(vw_arrayIndexes$, vw_arrayDimension * 4 - 3, 4))
IF vw_arrayIndex < vw_lBound OR vw_arrayIndex > vw_uBound THEN
GOTO cmdProcessingDone
END IF
vw_arrayIndex = (vw_arrayIndex - VAL(STR$(vw_lBound))) * vw_blockSize
vw_realArrayIndex = vw_realArrayIndex + vw_arrayIndex
vw_blockSize = vw_blockSize * VAL(STR$(vw_uBound - vw_lBound + 1))
NEXT
'get the address of where this array's data is stored
vw_buf$ = SPACE$(LEN(vw_dummy%&))
@ -426,10 +454,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
END IF
'this is where we calculate the actual array index position in memory
IF vw_arrayelementsize = 0 THEN
vw_address = vw_address + ((vw_arrayIndex - vw_lbound) * vw_varSize)
IF vw_arrayElementSize = 0 THEN
vw_address = vw_address + (vw_realArrayIndex * vw_varSize)
ELSE
vw_address = vw_address + ((vw_arrayIndex - vw_lbound) * vw_arrayelementsize)
vw_address = vw_address + (vw_realArrayIndex * vw_arrayElementSize)
END IF
ELSE
IF vw_isUDT = 0 THEN
@ -458,12 +486,12 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
END IF
'if it's a UDT, move the pointer to this element's offset
vw_address = vw_address + vw_elementoffset
vw_address = vw_address + vw_elementOffset
IF INSTR(vw_varType$, "STRING *") > 0 AND (vw_isarray <> 0 OR vw_isUDT <> 0) THEN
IF INSTR(vw_varType$, "STRING *") > 0 AND (vw_isArray <> 0 OR vw_isUDT <> 0) THEN
vw_value$ = LEFT$(vw_value$ + SPACE$(vw_varSize), vw_varSize)
ELSEIF INSTR(vw_varType$, "STRING") > 0 THEN
IF vw_isarray <> 0 OR vw_isUDT <> 0 THEN
IF vw_isArray <> 0 OR vw_isUDT <> 0 THEN
'First pass
vw_varSize = LEN(vw_dummy%&)
vw_buf$ = SPACE$(vw_varSize)
@ -502,6 +530,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
_LIMIT 100
LOOP
_KEYCLEAR
vwatch_starttimers
EXIT SUB
@ -523,10 +552,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
GET #vw_ideHost, , vw_temp$
vw_buffer$ = vw_buffer$ + vw_temp$
IF LEN(vw_buffer$) >= 4 THEN vw_cmdsize = CVL(LEFT$(vw_buffer$, 4)) ELSE vw_cmdsize = 0
IF vw_cmdsize > 0 AND LEN(vw_buffer$) >= vw_cmdsize THEN
vw_cmd$ = MID$(vw_buffer$, 5, vw_cmdsize)
vw_buffer$ = MID$(vw_buffer$, 5 + vw_cmdsize)
IF LEN(vw_buffer$) >= 4 THEN vw_cmdSize = CVL(LEFT$(vw_buffer$, 4)) ELSE vw_cmdSize = 0
IF vw_cmdSize > 0 AND LEN(vw_buffer$) >= vw_cmdSize THEN
vw_cmd$ = MID$(vw_buffer$, 5, vw_cmdSize)
vw_buffer$ = MID$(vw_buffer$, 5 + vw_cmdSize)
IF INSTR(vw_cmd$, ":") THEN
vw_value$ = MID$(vw_cmd$, INSTR(vw_cmd$, ":") + 1)
@ -537,6 +566,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
ELSE
vw_cmd$ = "": vw_value$ = ""
END IF
vw_getBytesPosition& = 1
RETURN
SendCallStack:
@ -559,4 +589,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
PUT #vw_ideHost, , vw_cmd$
vw_cmd$ = ""
RETURN
GetBytes:
IF vw_getBytes& = 0 THEN vw_valueBytes$ = "": RETURN
vw_valueBytes$ = MID$(vw_value$, vw_getBytesPosition&, vw_getBytes&)
vw_getBytesPosition& = vw_getBytesPosition& + vw_getBytes&
RETURN
END SUB

View file

@ -6407,7 +6407,7 @@ SUB DebugMode
debugClient& = 0
debuggeepid = 0
showvWatchPanel vWatchPanel, "", 0, 1
showvWatchPanel vWatchPanel, "", 1
IF LEN(variableWatchList$) = 0 THEN
totalVisibleVariables = 0
vWatchPanel.h = 5
@ -7063,24 +7063,28 @@ SUB DebugMode
estabilishingScope = -1
ELSE
requestVariableWatch:
hidePanel = -1
GOSUB UpdateDisplay
selectVar = 1
filter$ = ""
DO
result$ = idevariablewatchbox$(currentSub$, filter$, selectVar, returnAction)
IF returnAction = 1 THEN
temp$ = GetBytes$("", 0) 'reset buffer
'set address
tempIndex& = CVL(LEFT$(result$, 4))
result$ = MID$(result$, 5)
tempHeader$ = LEFT$(result$, 24)
tempIsArray& = CVL(MID$(result$, 5, 4))
tempArrayIndex& = CVL(MID$(result$, 9, 4))
tempIsUDT& = CVL(MID$(result$, 13, 4))
tempElementOffset& = CVL(MID$(result$, 17, 4))
tempStorage& = CVL(MID$(result$, 25, 4))
i = CVI(MID$(result$, 29, 2))
varType$ = MID$(result$, 31, i)
i = CVI(MID$(result$, 31 + i, 2))
value$ = RIGHT$(result$, i)
tempIndex& = CVL(GetBytes$(result$, 4))
tempLocalIndex& = CVL(GetBytes$(result$, 4))
tempIsArray& = CVL(GetBytes$(result$, 4))
tempArrayIndex& = CVL(GetBytes$(result$, 4))
tempArrayIndexes$ = MKL$(tempArrayIndex&) + GetBytes$(result$, tempArrayIndex&)
tempIsUDT& = CVL(GetBytes$(result$, 4))
tempElementOffset& = CVL(GetBytes$(result$, 4))
tempArrayElementSize& = CVL(GetBytes$(result$, 4))
tempStorage& = CVL(GetBytes$(result$, 4))
i = CVI(GetBytes$(result$, 2))
varType$ = GetBytes$(result$, i)
i = CVI(GetBytes$(result$, 2))
value$ = GetBytes$(result$, i)
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
cmd$ = "set global address:"
@ -7160,7 +7164,12 @@ SUB DebugMode
END IF
END SELECT
cmd$ = cmd$ + tempHeader$
cmd$ = cmd$ + MKL$(tempLocalIndex&)
cmd$ = cmd$ + MKL$(tempIsArray&)
cmd$ = cmd$ + tempArrayIndexes$
cmd$ = cmd$ + MKL$(tempIsUDT&)
cmd$ = cmd$ + MKL$(tempElementOffset&)
cmd$ = cmd$ + MKL$(tempArrayElementSize&)
cmd$ = cmd$ + MKL$(varSize&)
cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$
cmd$ = cmd$ + MKI$(LEN(value$)) + value$
@ -7172,10 +7181,12 @@ SUB DebugMode
PCOPY 3, 0: SCREEN , , 3, 0
WHILE _MOUSEINPUT: WEND
hidePanel = -1
GOSUB UpdateDisplay
ELSEIF returnAction = 2 THEN
PCOPY 3, 0: SCREEN , , 3, 0
WHILE _MOUSEINPUT: WEND
hidePanel = -1
GOSUB UpdateDisplay
_CONTINUE
ELSE
@ -7399,14 +7410,20 @@ SUB DebugMode
'request variables addresses
IF LEN(variableWatchList$) THEN
requestVariableValues:
temp$ = MID$(variableWatchList$, 9)
DO WHILE LEN(temp$)
tempIndex& = CVL(LEFT$(temp$, 4))
tempArrayIndex& = CVL(MID$(temp$, 5, 4))
tempElement& = CVL(MID$(temp$, 9, 4))
tempElementOffset& = CVL(MID$(temp$, 13, 4))
tempStorage& = CVL(MID$(temp$, 17, 4))
temp$ = MID$(temp$, 25)
temp$ = GetBytes$("", 0) 'reset buffer
temp$ = MID$(variableWatchList$, 9) 'skip longest var name and total visible vars
DO
temp2$ = GetBytes$(temp$, 4)
IF temp2$ <> MKL$(-1) THEN EXIT DO 'no more variables in list
tempIndex& = CVL(GetBytes$(temp$, 4))
tempArrayIndexes$ = GetBytes$(temp$, 4)
i = CVL(tempArrayIndexes$)
IF i > 0 THEN
tempArrayIndexes$ = tempArrayIndexes$ + GetBytes$(temp$, i)
END IF
tempElement& = CVL(GetBytes$(temp$, 4))
tempElementOffset& = CVL(GetBytes$(temp$, 4))
tempStorage& = CVL(GetBytes$(temp$, 4))
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
cmd$ = "get global var:"
ELSE
@ -7418,7 +7435,7 @@ SUB DebugMode
cmd$ = cmd$ + _MK$(_BYTE, usedVariableList(tempIndex&).isarray)
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).linenumber)
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex)
cmd$ = cmd$ + MKL$(tempArrayIndex&)
cmd$ = cmd$ + tempArrayIndexes$
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).arrayElementSize)
cmd$ = cmd$ + MKL$(tempElement&)
IF tempElement& THEN
@ -7592,7 +7609,9 @@ SUB DebugMode
IF PauseMode <> 0 AND LEN(variableWatchList$) > 0 THEN
IF WatchListToConsole THEN _CONSOLE ON
showvWatchPanel vWatchPanel, currentSub$, totalVisibleVariables, 0
totalVisibleVariables = CVL(MID$(variableWatchList$, 5, 4))
IF hidePanel = 0 THEN showvWatchPanel vWatchPanel, currentSub$, 0
hidePanel = 0
END IF
PCOPY 3, 0
@ -7652,9 +7671,9 @@ Function map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)
map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!
End Function
SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariables, action as _BYTE)
SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, action as _BYTE)
STATIC previousVariableWatchList$
STATIC longestVarName
STATIC longestVarName, totalVisibleVariables
IF action = 1 THEN previousVariableWatchList$ = "": EXIT SUB 'reset
@ -7662,7 +7681,7 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl
'new setup
previousVariableWatchList$ = variableWatchList$
longestVarName = CVL(LEFT$(variableWatchList$, 4))
totalVisibleVariables = (LEN(variableWatchList$) - 4) \ 20
totalVisibleVariables = CVL(MID$(variableWatchList$, 5, 4))
this.h = totalVisibleVariables + 2
IF this.h > idewy - 10 THEN this.h = idewy - 10
IF this.h < 5 THEN this.h = 5
@ -7697,14 +7716,19 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl
i = 0
this.contentWidth = 0
IF this.hPos = 0 THEN this.hPos = 1
temp$ = GetBytes$("", 0) 'reset buffer
temp$ = MID$(variableWatchList$, 9)
DO WHILE LEN(temp$)
tempIndex& = CVL(LEFT$(temp$, 4))
tempArrayIndex& = CVL(MID$(temp$, 5, 4))
tempElement& = CVL(MID$(temp$, 9, 4))
tempElementOffset& = CVL(MID$(temp$, 13, 4))
tempStorage& = CVL(MID$(temp$, 17, 4))
temp$ = MID$(temp$, 25)
actualLongestVarName = 0
DO
temp2$ = GetBytes$(temp$, 4)
IF temp2$ <> MKL$(-1) THEN EXIT DO 'no more variables in list
tempIndex& = CVL(GetBytes$(temp$, 4))
tempTotalArrayIndexes& = CVL(GetBytes$(temp$, 4))
tempArrayIndexes$ = GetBytes$(temp$, tempTotalArrayIndexes&)
tempElement& = CVL(GetBytes$(temp$, 4))
tempElementOffset& = CVL(GetBytes$(temp$, 4))
tempStorage& = CVL(GetBytes$(temp$, 4))
i = i + 1
IF this.firstVisible > i AND WatchListToConsole = 0 THEN _CONTINUE
y = y + 1
@ -7712,13 +7736,19 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl
thisName$ = usedVariableList(tempIndex&).name
IF usedVariableList(tempIndex&).isarray THEN
thisName$ = LEFT$(thisName$, LEN(thisName$) - 1) + _
LTRIM$(STR$(tempArrayIndex&)) + ")"
thisName$ = LEFT$(thisName$, LEN(thisName$) - 1)
tempTotalArrayIndexes& = tempTotalArrayIndexes& \ 4
FOR j = 1 TO tempTotalArrayIndexes&
thisName$ = thisName$ + LTRIM$(STR$(CVL(MID$(tempArrayIndexes$, j * 4 - 3, 4))))
IF j < tempTotalArrayIndexes& THEN thisName$ = thisName$ + ", "
NEXT
thisName$ = thisName$ + ")"
END IF
IF tempElement& THEN
tempElementList$ = MID$(usedVariableList(tempIndex&).elements, 5)
thisName$ = thisName$ + getelement$(tempElementList$, tempElement&)
END IF
IF LEN(thisName$) > actualLongestVarName THEN actualLongestVarName = LEN(thisName$)
item$ = thisName$ + SPACE$(longestVarName - LEN(thisName$)) + " = "
IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN
IF tempElement& THEN
@ -7745,6 +7775,7 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl
_ECHO item$
END IF
LOOP
longestVarName = actualLongestVarName 'if these are different, next time it'll be fixed
IF WatchListToConsole = 0 THEN
IF totalVisibleVariables > this.h - 2 THEN
@ -8011,14 +8042,35 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN
'scope is valid
tempArrayIndex& = 0
tempArrayIndexes$ = MKL$(0)
tempStorage& = 0
tempIsUDT& = 0
tempElementOffset$ = MKL$(0)
IF usedVariableList(tempIndex&).isarray THEN
v$ = ideinputbox$("Change Value", "#Index to change", temp$, "01234567890", 45, 0, ok)
setArrayRange3:
v$ = ideinputbox$("Change Value", "#Index to change", temp$, "01234567890,", 45, 0, ok)
IF ok THEN
IF LEN(v$) > 0 THEN
tempArrayIndex& = VAL(v$)
WHILE RIGHT$(v$, 1) = ",": v$ = LEFT$(v$, LEN(v$) - 1): WEND
temp$ = lineformat$(v$)
i = countelements(temp$)
IF i <> ABS(ids(usedVariableList(tempIndex&).id).arrayelements) THEN
result = idemessagebox("Error", "Array has" + STR$(ABS(ids(usedVariableList(tempIndex&).id).arrayelements)) + " dimension(s).", "#OK")
temp$ = _TRIM$(v$)
GOTO setArrayRange3
END IF
tempArrayIndexes$ = MKL$(i * 4)
WHILE i
foundComma = INSTR(v$, ",")
IF foundComma THEN
temp$ = LEFT$(v$, foundComma - 1)
v$ = MID$(v$, foundComma + 1)
ELSE
temp$ = v$
END IF
tempArrayIndexes$ = tempArrayIndexes$ + MKL$(VAL(temp$))
i = i - 1
WEND
ELSE
_CONTINUE
END IF
@ -8143,14 +8195,14 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
storageSlot& = 0
IF LEN(usedVariableList(tempIndex&).storage) = 4 THEN
storageSlot& = CVL(usedVariableList(tempIndex&).storage)
ELSE
i = 5
ELSEIF LEN(usedVariableList(tempIndex&).storage) > 4 THEN
i = 4
DO
i = INSTR(i + 1, variableWatchList$, MKL$(-1) + MKL$(tempIndex&) + MKL$(tempArrayIndex&))
i = INSTR(i + 1, variableWatchList$, MKL$(-1) + MKL$(tempIndex&) + tempArrayIndexes$)
IF i = 0 THEN EXIT DO
IF MID$(variableWatchList$, i + 16, 4) = tempElementOffset$ THEN
IF MID$(variableWatchList$, i + 8 + LEN(tempArrayIndexes$), 4) = tempElementOffset$ THEN
'we found where this element's value is being stored
storageSlot& = CVL(MID$(variableWatchList$, i + 20, 4))
storageSlot& = CVL(MID$(variableWatchList$, i + 16 + LEN(tempArrayIndexes$), 4))
EXIT DO
END IF
LOOP
@ -8170,7 +8222,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
temp$ = temp$ + MKL$(tempIndex&)
temp$ = temp$ + MKL$(usedVariableList(tempIndex&).localindex)
temp$ = temp$ + MKL$(usedVariableList(tempIndex&).isarray <> 0)
temp$ = temp$ + MKL$(tempArrayIndex&)
temp$ = temp$ + tempArrayIndexes$
temp$ = temp$ + MKL$(tempIsUDT&)
temp$ = temp$ + tempElementOffset$
temp$ = temp$ + MKL$(usedVariableList(tempIndex&).arrayElementSize)
@ -8199,12 +8251,13 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
variableWatchList$ = ""
longestVarName = 0
nextvWatchDataSlot = 0
totalVisibleVariables = 0
FOR y = 1 TO totalVariablesCreated
IF usedVariableList(y).includedLine THEN _CONTINUE 'don't deal with variables in $INCLUDEs
IF usedVariableList(y).watch THEN
thisLen = LEN(usedVariableList(y).name)
IF usedVariableList(y).isarray THEN
thisLen = thisLen + LEN(STR$(CVL(RIGHT$(usedVariableList(y).indexes, 4)))) - 1
thisLen = thisLen + LEN(usedVariableList(y).watchRange)
END IF
IF LEN(usedVariableList(y).elements) THEN
@ -8213,28 +8266,39 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF thisLen > longestVarName THEN
longestVarName = thisLen
IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4)
IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(8)
MID$(variableWatchList$, 1, 4) = MKL$(longestVarName)
END IF
IF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) = 0 THEN
'array of native data type
temp$ = usedVariableList(y).indexes
DO WHILE LEN(temp$)
temp$ = GetBytes$("", 0) 'reset buffer
temp$ = expandArray$(usedVariableList(y).indexes, "")
DO
temp2$ = GetBytes$(temp$, 4)
IF LEN(temp2$) <> 4 THEN EXIT DO 'no more items
length = CVL(temp2$)
temp2$ = MKL$(length) + GetBytes$(temp$, length)
nextvWatchDataSlot = nextvWatchDataSlot + 1
WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$)
REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999)
WEND
variableWatchList$ = variableWatchList$ + MKL$(-1) + MKL$(y) + LEFT$(temp$, 4) + MKL$(0) + MKL$(0) + MKL$(nextvWatchDataSlot)
variableWatchList$ = variableWatchList$ + MKL$(-1) + MKL$(y) + temp2$ + MKL$(0) + MKL$(0) + MKL$(nextvWatchDataSlot)
totalVisibleVariables = totalVisibleVariables + 1
usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
vWatchReceivedData$(nextvWatchDataSlot) = ""
temp$ = MID$(temp$, 5)
LOOP
ELSEIF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) > 0 THEN
'array of UDT
temp$ = usedVariableList(y).indexes
DO WHILE LEN(temp$)
thisTempElement$ = MKL$(-1) + MKL$(y) + LEFT$(temp$, 4)
temp$ = GetBytes$("", 0)
temp$ = expandArray$(usedVariableList(y).indexes, "")
DO
temp2$ = GetBytes$(temp$, 4)
IF LEN(temp2$) <> 4 THEN EXIT DO 'no more items
length = CVL(temp2$)
temp2$ = MKL$(length) + GetBytes$(temp$, length)
thisTempElement$ = MKL$(-1) + MKL$(y) + temp2$
thisElementList$ = MID$(usedVariableList(y).elements, 5)
i = 0
DO
@ -8248,10 +8312,10 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
WEND
tempElementOffset& = CVL(MID$(usedVariableList(y).elementOffset, i * 4 - 3, 4))
variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(tempElementOffset&) + MKL$(nextvWatchDataSlot)
totalVisibleVariables = totalVisibleVariables + 1
usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
vWatchReceivedData$(nextvWatchDataSlot) = ""
LOOP
temp$ = MID$(temp$, 5)
LOOP
ELSEIF usedVariableList(y).isarray = 0 AND LEN(usedVariableList(y).elements) > 0 THEN
'single variable of UDT
@ -8269,6 +8333,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
WEND
tempElementOffset& = CVL(MID$(usedVariableList(y).elementOffset, i * 4 - 3, 4))
variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(tempElementOffset&) + MKL$(nextvWatchDataSlot)
totalVisibleVariables = totalVisibleVariables + 1
usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
vWatchReceivedData$(nextvWatchDataSlot) = ""
LOOP
@ -8279,10 +8344,12 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999)
WEND
variableWatchList$ = variableWatchList$ + MKL$(-1) + MKL$(y) + MKL$(0) + MKL$(0) + MKL$(0) + MKL$(nextvWatchDataSlot)
totalVisibleVariables = totalVisibleVariables + 1
usedVariableList(y).storage = MKL$(nextvWatchDataSlot)
END IF
END IF
NEXT
IF LEN(variableWatchList$) THEN MID$(variableWatchList$, 5, 4) = MKL$(totalVisibleVariables)
IF mousedown THEN
DO
GetInput
@ -8322,17 +8389,38 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF LEN(usedVariableList(varDlgList(y).index).indexes) THEN
temp$ = usedVariableList(varDlgList(y).index).watchRange
END IF
v$ = ideinputbox$("Watch Array", "#Indexes to watch", temp$, "01234567890,-", 45, 0, ok)
setArrayRange2:
v$ = ideinputbox$("Watch Array", "#Indexes" + tempPrompt$, temp$, "01234567890,-; TOto", 45, 0, ok)
IF ok THEN
IF LEN(v$) > 0 THEN
temp$ = parseRange$(v$)
usedVariableList(varDlgList(y).index).indexes = temp$
temp$ = formatRange$(temp$)
usedVariableList(varDlgList(y).index).watchRange = temp$
ELSE
v$ = UCASE$(v$)
v$ = StrReplace$(v$, " TO ", "-")
WHILE RIGHT$(v$, 1) = ",": v$ = LEFT$(v$, LEN(v$) - 1): WEND
temp$ = lineformat$(v$)
i = countelements(temp$)
IF i <> ABS(ids(usedVariableList(varDlgList(y).index).id).arrayelements) THEN
result = idemessagebox("Error", "Array has" + STR$(ABS(ids(usedVariableList(varDlgList(y).index).id).arrayelements)) + " dimension(s).", "#OK")
temp$ = _TRIM$(v$)
GOTO setArrayRange2
END IF
usedVariableList(varDlgList(y).index).indexes = ""
usedVariableList(varDlgList(y).index).watchRange = ""
WHILE i
foundComma = INSTR(v$, ",")
IF foundComma THEN
temp$ = LEFT$(v$, foundComma - 1)
v$ = MID$(v$, foundComma + 1)
ELSE
temp$ = v$
END IF
temp$ = parseRange$(temp$)
usedVariableList(varDlgList(y).index).indexes = usedVariableList(varDlgList(y).index).indexes + MKL$(LEN(temp$)) + temp$
temp$ = formatRange$(temp$)
usedVariableList(varDlgList(y).index).watchRange = usedVariableList(varDlgList(y).index).watchRange + temp$
i = i - 1
IF i THEN usedVariableList(varDlgList(y).index).watchRange = usedVariableList(varDlgList(y).index).watchRange + ","
WEND
ELSE
usedVariableList(varDlgList(y).index).watch = 0
GOSUB buildList
idetxt(o(varListBox).txt) = l$
@ -8344,6 +8432,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
usedVariableList(varDlgList(y).index).watch = 0
GOTO unWatch
END IF
END IF
varType$ = usedVariableList(varDlgList(y).index).varType
@ -8593,7 +8682,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$
IF IdeDebugMode > 0 AND usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 AND LEN(usedVariableList(x).storage) = 4 THEN
'single var
item$ = item$ + vWatchReceivedData$(CVL(usedVariableList(x).storage))
item$ = item$ + StrReplace$(vWatchReceivedData$(CVL(usedVariableList(x).storage)), CHR$(0), " ")
END IF
IF multiSearch(item$, searchTerm$) = 0 THEN
_CONTINUE 'skip variable if no field matches the search
@ -8666,6 +8755,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
LOOP
IF LEN(usedVariableList(x).storage) THEN l$ = l$ + "}"
ELSEIF usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 THEN
'simple variable
IF LEN(usedVariableList(x).storage) = 4 THEN
storageSlot& = CVL(usedVariableList(x).storage)
l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor)
@ -8673,6 +8763,9 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
l$ = l$ + StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
IF thisIsAString THEN l$ = l$ + CHR$(34)
END IF
ELSE
l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor)
l$ = l$ + "<multiple values>"
END IF
END IF
ELSE
@ -9064,10 +9157,10 @@ FUNCTION formatRange$(__text$)
v2 = v
ELSE
IF v2 = -1 THEN
a2$ = a2$ + LTRIM$(STR$(v1)) + ","
a2$ = a2$ + LTRIM$(STR$(v1)) + ";"
v1 = v
ELSE
a2$ = a2$ + LTRIM$(STR$(v1)) + "-" + LTRIM$(STR$(v2)) + ","
a2$ = a2$ + LTRIM$(STR$(v1)) + "-" + LTRIM$(STR$(v2)) + ";"
v1 = v
v2 = -1
END IF
@ -9079,6 +9172,37 @@ FUNCTION formatRange$(__text$)
formatRange$ = a2$
END FUNCTION
FUNCTION expandArray$ (__indexes$, __path$)
STATIC thisLevel AS LONG, returnValue$
IF thisLevel = 0 THEN
returnValue$ = ""
END IF
thisLevel = thisLevel + 1
totalIndexes = CVL(LEFT$(__indexes$, 4))
indexes$ = MID$(__indexes$, 5, totalIndexes)
remainingIndexes$ = MID$(__indexes$, 5 + totalIndexes)
totalIndexes = totalIndexes \ 4
FOR i = 1 TO totalIndexes
temp$ = __path$ + MID$(indexes$, i * 4 - 3, 4)
IF LEN(remainingIndexes$) THEN
temp$ = expandArray$(remainingIndexes$, temp$)
END IF
IF LEN(temp$) THEN
returnValue$ = returnValue$ + MKL$(LEN(temp$)) + temp$
END IF
NEXT
thisLevel = thisLevel - 1
IF thisLevel = 0 THEN
expandArray$ = returnValue$
END IF
END FUNCTION
FUNCTION parseRange$(__text$)
'__text$ must contain a valid numeric string (####),
'a valid interval (####-####) or comma-separated values.
@ -9090,7 +9214,7 @@ FUNCTION parseRange$(__text$)
DIM zeroIncluded AS _BYTE
Filter$ = _TRIM$(__text$)
j = INSTR(Filter$, "-") + INSTR(Filter$, ",")
j = INSTR(Filter$, "-") + INSTR(Filter$, ";")
temp$ = SPACE$(1000)
IF j = 0 THEN 'Single number passed
@ -9102,7 +9226,7 @@ FUNCTION parseRange$(__text$)
FOR j = 1 TO LEN(Filter$)
v = ASC(Filter$, j)
SELECT CASE v
CASE 44 'comma
CASE 59 ';
Reading = 1
GOSUB parseIt
CASE 45 'hyphen
@ -18658,3 +18782,17 @@ SUB printWrapStatus (x AS INTEGER, y AS INTEGER, initialX AS INTEGER, __text$)
RETURN
END SUB
FUNCTION GetBytes$(__value$, numberOfBytes&)
STATIC prevValue$, getBytesPosition&
value$ = __value$
IF value$ <> prevValue$ THEN
prevValue$ = value$
getBytesPosition& = 1
END IF
IF numberOfBytes& = 0 THEN EXIT FUNCTION
GetBytes$ = MID$(value$, getBytesPosition&, numberOfBytes&)
getBytesPosition& = getBytesPosition& + numberOfBytes&
END FUNCTION

View file

@ -25997,6 +25997,12 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE)
usedVariableList(i).varType = id2fulltypename$
usedVariableList(i).cname = cname$
usedVariableList(i).localIndex = localIndex
'remove eventual instances of fix046$ in name$
DO WHILE INSTR(name$, fix046$)
x = INSTR(name$, fix046$): name$ = LEFT$(name$, x - 1) + "." + RIGHT$(name$, LEN(name$) - x + 1 - LEN(fix046$))
LOOP
IF LEN(RTRIM$(id.musthave)) > 0 THEN
usedVariableList(i).name = name$ + RTRIM$(id.musthave)
ELSE