272 lines
8.4 KiB
Plaintext
272 lines
8.4 KiB
Plaintext
compile subroutine debugger_Dump( void )
|
|
/*
|
|
Author : Meester C
|
|
Date : 21 October 2008
|
|
Purpose : Simple function to grab all the variable contents in a broken
|
|
proc and write them out to a "DEBUGGER_DUMP" record in SYSLISTS
|
|
|
|
Comments
|
|
========
|
|
|
|
This is a very basic procedure. It would really be a good idea to monitor
|
|
the size of the dump output and break it up into sections and write it out
|
|
as an OS file for example. The output has the potential to be extremely
|
|
large due to the possibility of large variable contents and iterating
|
|
through dimensioned arrays with large values.
|
|
|
|
... but that is another story ...
|
|
|
|
|
|
Amended Version Date Reason
|
|
======= ======= ==== ======
|
|
|
|
*/
|
|
declare function debugger_Fetch
|
|
$insert debugger_Fetch_Equates
|
|
$insert logical
|
|
|
|
equ VERSION$ to "1.0.0"
|
|
equ LOCAL_DUMP_ID$ to "oe_local_dmp.txt"
|
|
equ LCOMM_DUMP_ID$ to "oe_lcomm_dmp.txt"
|
|
equ CRLF$ to \0D0A\
|
|
equ CR$ to \0D\
|
|
equ LF$ to \0A\
|
|
equ TAB$ to \09\
|
|
|
|
goSub dumpLocalVars
|
|
goSub dumpLabelledCommonVars
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
dumpLocalVars:
|
|
|
|
localList = debugger_Fetch( "LISTLOCAL" )
|
|
localVars = ""
|
|
|
|
xCount = count( localList, @fm ) + ( localList # "" )
|
|
for x = 1 to xCount
|
|
var = localList<x>
|
|
varName = var[1,@vm]
|
|
varType = var[col2()+1,@vm]
|
|
varDim = var[col2()+1,@vm]
|
|
|
|
begin case
|
|
case ( varType = VAR_TYPE_DESC_UNASSIGNED$ )
|
|
localVars := varName : @vm : varType : @vm : "" : @fm
|
|
|
|
case ( varType = VAR_TYPE_DESC_IDISPATCH$ )
|
|
localVars := varName : @vm : varType : @vm : "" : @fm
|
|
|
|
case ( varType = VAR_TYPE_DESC_DIM_ARRAY$ )
|
|
localVars := varName : @vm : varType : @vm : "" : @fm
|
|
|
|
* // We need to iterate across the matrix ...
|
|
dim1 = varDim[1,@svm]
|
|
dim2 = varDim[col2()+1,@svm]
|
|
|
|
d1 = 0
|
|
d2 = 0
|
|
if len( dim2 ) then
|
|
dVar = debugger_Fetch( "GETLOCALDIMTYPE", varName, d1, d2 )
|
|
goSub processLocalDimVar
|
|
end else
|
|
dVar = debugger_Fetch( "GETLOCALDIMTYPE", varName, d1 )
|
|
goSub processLocalDimVar
|
|
end
|
|
|
|
for d1 = 1 to dim1
|
|
if len( dim2 ) then
|
|
for d2 = 1 to dim2
|
|
dVar = debugger_Fetch( "GETLOCALDIMTYPE", varName, d1, d2 )
|
|
goSub processLocalDimVar
|
|
next
|
|
end else
|
|
dVar = debugger_Fetch( "GETLOCALDIMTYPE", varName, d1 )
|
|
goSub processLocalDimVar
|
|
end
|
|
next
|
|
|
|
case OTHERWISE$
|
|
varData = debugger_Fetch( "GETLOCAL", varName )
|
|
goSub escapeVarData
|
|
|
|
localVars := varName : @vm : varType : @vm : varData : @fm
|
|
|
|
end case
|
|
|
|
next
|
|
|
|
localVars[-1,1] = ""
|
|
|
|
swap @fm with CRLF$ in localVars
|
|
convert @vm to "|" in localVars
|
|
|
|
osWrite localVars to LOCAL_DUMP_ID$
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
dumpLabelledCommonVars:
|
|
|
|
lCommList = debugger_Fetch( "LISTLABELLED" )
|
|
lCommVars = ""
|
|
|
|
xCount = count( lCommList, @fm ) + ( lCommList # "" )
|
|
for x = 1 to xCount
|
|
|
|
var = lCommList<x>
|
|
|
|
commName = var[1,@vm]
|
|
varName = var[col2()+1,@vm]
|
|
varType = var[col2()+1,@vm]
|
|
varDim = var[col2()+1,@vm]
|
|
|
|
begin case
|
|
case ( varType = VAR_TYPE_DESC_UNASSIGNED$ )
|
|
lCommVars := commName : @vm : varName : @vm : varType : @vm : "" : @fm
|
|
|
|
case ( varType = VAR_TYPE_DESC_IDISPATCH$ )
|
|
lCommVars := commName : @vm : varName : @vm : varType : @vm : "" : @fm
|
|
|
|
case ( varType = VAR_TYPE_DESC_DIM_ARRAY$ )
|
|
lCommVars := commName : @vm : varName : @vm : varType : @vm : "" : @fm
|
|
|
|
* // We need to iterate across the matrix ...
|
|
dim1 = varDim[1,@svm]
|
|
dim2 = varDim[col2()+1,@svm]
|
|
|
|
d1 = 0
|
|
d2 = 0
|
|
if len( dim2 ) then
|
|
dVar = debugger_Fetch( "GETLABELLEDDIMTYPE", commName, varName, d1, d2 )
|
|
goSub processLabelledCommonDimVar
|
|
end else
|
|
dVar = debugger_Fetch( "GETLABELLEDDIMTYPE", commName, varName, d1 )
|
|
goSub processLabelledCommonDimVar
|
|
end
|
|
|
|
for d1 = 1 to dim1
|
|
if len( dim2 ) then
|
|
for d2 = 1 to dim2
|
|
dVar = debugger_Fetch( "GETLABELLEDDIMTYPE", commName, varName, d1, d2 )
|
|
goSub processLabelledCommonDimVar
|
|
next
|
|
end else
|
|
dVar = debugger_Fetch( "GETLABELLEDDIMTYPE", commName, varName, d1 )
|
|
goSub processLabelledCommonDimVar
|
|
end
|
|
next
|
|
|
|
case OTHERWISE$
|
|
varData = debugger_Fetch( "GETLABELLED", commName, varName )
|
|
goSub escapeVarData
|
|
|
|
lCommVars := commName : @vm : varName : @vm : varType : @vm : varData : @fm
|
|
|
|
end case
|
|
|
|
next
|
|
|
|
lCommVars[-1,1] = ""
|
|
|
|
swap @fm with CRLF$ in lCommVars
|
|
convert @vm to "|" in lCommVars
|
|
|
|
osWrite lCommVars to LCOMM_DUMP_ID$
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
processLocalDimVar:
|
|
|
|
dVarType = dVar<1>
|
|
varData = ""
|
|
|
|
begin case
|
|
case ( dVarType = VAR_TYPE_DESC_UNASSIGNED$ )
|
|
null
|
|
|
|
case ( dVarType = VAR_TYPE_DESC_IDISPATCH$ )
|
|
null
|
|
|
|
case ( dVarType = VAR_TYPE_DESC_DIM_ARRAY$ )
|
|
* // This HAS to be an error!
|
|
null
|
|
|
|
case OTHERWISE$
|
|
varData = debugger_Fetch( "GETLOCAL", varName, d1, d2 )
|
|
goSub escapeVarData
|
|
|
|
end case
|
|
|
|
dVarName = varName : "(" : d1
|
|
if len( dim2 ) then
|
|
dVarName := "," : d2
|
|
end
|
|
dVarName := ")"
|
|
|
|
localVars : = " " : dVarName : @vm : dVarType : @vm : varData : @fm
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
processLabelledCommonDimVar:
|
|
|
|
dVarType = dVar<1>
|
|
varData = ""
|
|
|
|
begin case
|
|
case ( dVarType = VAR_TYPE_DESC_UNASSIGNED$ )
|
|
null
|
|
|
|
case ( dVarType = VAR_TYPE_DESC_IDISPATCH$ )
|
|
null
|
|
|
|
case ( dVarType = VAR_TYPE_DESC_DIM_ARRAY$ )
|
|
* // This HAS to be an error!
|
|
null
|
|
|
|
case OTHERWISE$
|
|
varData = debugger_Fetch( "GETLABELLED", commName, varName, d1, d2 )
|
|
goSub escapeVarData
|
|
|
|
end case
|
|
|
|
dVarName = varName : "(" : d1
|
|
if len( dim2 ) then
|
|
dVarName := "," : d2
|
|
end
|
|
dVarName := ")"
|
|
|
|
lCommVars := " " : commName : @vm : dVarName : @vm : dVarType : @vm : varData : @fm
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
escapeVarData:
|
|
swap "\" with "\\" in varData
|
|
swap @rm with "\xFF" in varData
|
|
swap @fm with "\xFE" in varData
|
|
swap @vm with "\xFD" in varData
|
|
swap @svm with "\xFC" in varData
|
|
swap @tm with "\xFB" in varData
|
|
swap \09\ with "\t" in varData
|
|
swap \0A\ with "\n" in varData
|
|
swap \0D\ with "\r" in varData
|
|
swap \00\ with "\0" in varData
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|