TMGTPSTP.m: Difference between revisions
From VistApedia
Jump to navigationJump to search
No edit summary |
Added a glossary link to Action~ |
||
| (3 intermediate revisions by one other user not shown) | |||
| Line 7: | Line 7: | ||
;" 4-13-2005 | ;" 4-13-2005 | ||
;" License: GPL Applies | ;" License: GPL Applies | ||
;" | ;" | ||
;" This code module will allow tracing through code. | ;" This code module will allow tracing through code. | ||
;" It is used as follows: | ;" It is used as follows: | ||
| Line 23: | Line 23: | ||
;" | ;" | ||
;"Notes: | ;"Notes: | ||
;" This function will be called inbetween lines of the main | ;" This function will be called inbetween lines of the main | ||
;" program that is being traced. Thus is function can't do | ;" program that is being traced. Thus is function can't do | ||
;" anything that might change the environment of the main | ;" anything that might change the environment of the main | ||
;" program | ;" program. | ||
;"------------------------------------------------------------ | ;"------------------------------------------------------------ | ||
;"------------------------------------------------------------ | ;"------------------------------------------------------------ | ||
STEPTRAP(idePos,Msg) | STEPTRAP(idePos,Msg) | ||
;"Purpose: This is the line that is called by GT.M for each zstep event. | |||
;" It will be used to display the current code execution point, and | |||
;" query user as to plans for future execution: run/step/ etc. | |||
;"Input: idePos -- a text line containing position, as returned bye $ZPOS | |||
;" Msg -- OPTIONAL -- can be used by programs to pass in info. | |||
;" If Msg=1, then this function was called without the | |||
;" $ZSTEP value set, so this function should set it. | |||
new NakedRef set NakedRef=$$LGR^%ZOSV ;"save naked reference | |||
new tpBlankLine | new tpBlankLine | ||
new | new tp[[Action~|Action]] | ||
new tpKeyIn | new tpKeyIn | ||
new tpRunMode,tpStepMode | new tpRunMode,tpStepMode | ||
| Line 47: | Line 48: | ||
new tpDone | new tpDone | ||
new result set result=1 ;1=step into, 2=step over | new result set result=1 ;1=step into, 2=step over | ||
new ViewOffset set ViewOffset=0 | |||
;"Run modes: 0=running mode | |||
;" 1=stepping mode | ;"Run modes: 0=running mode | ||
;" 2=Don't show code | ;" 1=stepping mode | ||
;" | ;" 2=Don't show code | ||
;" 3=running SLOW mode | |||
;" -1=quit | ;" -1=quit | ||
set tpRunMode=$get(TMGRunMode,1) | set tpRunMode=$get(TMGRunMode,1) | ||
set tpStepMode=$get(TMGStepMode,"into") | set tpStepMode=$get(TMGStepMode,"into") | ||
new ScrHeight,ScrWidth | new ScrHeight,ScrWidth | ||
set ScrHeight=$get(TMGScrHeight,10) | set ScrHeight=$get(TMGScrHeight,10) | ||
set ScrWidth=$get(TMGScrWidth,80) | set ScrWidth=$get(TMGScrWidth,80) | ||
set tpBlankLine=" " | set tpBlankLine=" " | ||
for tpI=1:1:ScrWidth-1 set tpBlankLine=tpBlankLine_" " | for tpI=1:1:ScrWidth-1 set tpBlankLine=tpBlankLine_" " | ||
new ArrayName set ArrayName="^TMP(""TMGIDE"",$J,""MODULES"")" | |||
set idePos=$$ConvertPos(idePos,ArrayName) | |||
do VCUSAV2^TMGTERM | do VCUSAV2^TMGTERM | ||
if tpRunMode'=2 do | if tpRunMode'=2 do | ||
| Line 80: | Line 85: | ||
. if (tpKeyIn>0) set tpRunMode=1 | . if (tpKeyIn>0) set tpRunMode=1 | ||
. else if tpRunMode=3 hang 1 | . else if tpRunMode=3 hang 1 | ||
if tpRunMode=2 goto SPDone ;"Don't showmode --> goto SPDone | if tpRunMode=2 goto SPDone ;"Don't showmode --> goto SPDone | ||
set tpDone=0 | set tpDone=0 | ||
if tpRunMode=1 for do quit:tpDone=1 | if tpRunMode=1 for do quit:tpDone=1 | ||
. new | . new Def[[Action~|Action]] set Def[[Action~|Action]]="O" | ||
. do ShowCodePos(idePos,ScrWidth,ScrHeight) | . do ShowCodePos(idePos,ScrWidth,ScrHeight,,ViewOffset) | ||
. do CUP^TMGTERM(1,ScrHeight+4) ;"Cursor to line (x,y) | . do CUP^TMGTERM(1,ScrHeight+4) ;"Cursor to line (x,y) | ||
. write tpBlankLine,! | |||
. do CUU^TMGTERM(2) | |||
. if tpWatchLine'="" do | |||
. . new $etrap set $etrap="write ""(Invalid M Code!. Error Trapped.)"" set $etrap="""",$ecode=""""" | |||
. . xecute tpWatchLine | |||
. . write ! | |||
. write tpBlankLine,! | . write tpBlankLine,! | ||
. do CUU^TMGTERM( | . do VTATRIB^TMGTERM(7) ;"reverse text | ||
. write "Action (? for help): " | . for i=1:1:ScrWidth write "~" | ||
. if tpStepMode="into" write "step INTO// " set | . do VTATRIB^TMGTERM(0) ;"reset text | ||
. else write "step OVER// " set | . write ! | ||
. read | . do CUU^TMGTERM(2) | ||
. if | . write "[[Action~|Action]] (? for help): " | ||
. if tpStepMode="into" write "step INTO// " set Def[[Action~|Action]]="I" | |||
. else write "step OVER// " set Def[[Action~|Action]]="O" | |||
. new loop | |||
. for loop=1:1:20 write " " | |||
. for loop=1:1:20 write $char(8) ;"backspace | |||
. set tp[[Action~|Action]]=$$READ^XGF(1) write ! | |||
. ;"read tp[[Action~|Action]],! | |||
. if tp[[Actio~|Action]]n="" set tpAction=DefAction | |||
. if "rR"[tpAction do quit | . if "rR"[tpAction do quit | ||
. . set tpRunMode=0 | . . set tpRunMode=0 | ||
. . set tpDone=1 | . . set tpDone=1 | ||
. if "lL"[ | . if "lL"[tp[[Action~|Action]] do quit | ||
. . set tpRunMode=3 | . . set tpRunMode=3 | ||
. . set tpDone=1 | . . set tpDone=1 | ||
. if "mM"[ | . if "mM"[tp[[Action~|Action]] do quit | ||
. . new temp | |||
. . do CUU^TMGTERM(1) | |||
. . do CHA^TMGTERM(1) ;"move to x=1 on this line | |||
. . write tpBlankLine,! | . . write tpBlankLine,! | ||
. . do CUU^TMGTERM(1) | . . do CUU^TMGTERM(1) | ||
. . | . . read " enter M code (^ to cancel): ",tpLine,! | ||
. . | . . if (tpLine'="^") do | ||
. . xecute tpLine | . . . new $etrap set $etrap="write ""(Invalid M Code!. Error Trapped.)"",! set $etrap="""",$ecode=""""" | ||
. if "iI"[ | . . . write ! ;"get below bottom line for output. | ||
. . . xecute tpLine | |||
. if "iI"[tp[[Action~|Action]] do quit | |||
. . set tpStepMode="into" | . . set tpStepMode="into" | ||
. . ;"set $ZSTEP="do STEPTRAP^TMGTPSTP($ZPOS) zstep into zcontinue" | . . ;"set $ZSTEP="do STEPTRAP^TMGTPSTP($ZPOS) zstep into zcontinue" | ||
. . set tpDone=1 | . . set tpDone=1 | ||
. if "Oo"[ | . if "Oo"[tp[[Action~|Action]] do quit | ||
. . set tpStepMode="over" | . . set tpStepMode="over" | ||
. . ;"set $ZSTEP="do STEPTRAP^TMGTPSTP($ZPOS) zstep over zcontinue" | . . ;"set $ZSTEP="do STEPTRAP^TMGTPSTP($ZPOS) zstep over zcontinue" | ||
. . set tpDone=1 | . . set tpDone=1 | ||
. if "Bb"[ | . if "Bb"[tp[[Action~|Action]] do quit | ||
. . new idePos | . . new idePos | ||
. . read "Enter breakpoint (e.g. Label+8^MyFunct): ",idePos,! | . . read "Enter breakpoint (e.g. Label+8^MyFunct): ",idePos,! | ||
. . set idePos=Pos_":""n tmg s tmg=$$STEPTRAP^TMGTPSTP($ZPOS,1)""" | . . set idePos=Pos_":""n tmg s tmg=$$STEPTRAP^TMGTPSTP($ZPOS,1)""" | ||
. . ZBREAK @idePos | . . ZBREAK @idePos | ||
. if "Hh"[ | . if "Hh"[tp[[Action~|Action]] do quit | ||
. . set tpRunMode=2 | . . set tpRunMode=2 | ||
. . set tpDone=1 | . . set tpDone=1 | ||
. if "Ww"[tp[[Action~|Action]] do quit | |||
. . new temp | |||
. . do CUU^TMGTERM(1) | |||
. . do CHA^TMGTERM(1) ;"move to x=1 on this line | |||
. . write tpBlankLine,! | |||
. . do CUU^TMGTERM(1) | |||
. . read "Enter M code (^ to cancel): ",temp,! | |||
. . if temp'="^" set tpWatchLine=temp | |||
. if "Aa"[tp[[Action~|Action]] do quit | |||
. . set ViewOffset=ViewOffset-1 | |||
. if "Zz"[tp[[Action~|Action]] do quit | |||
. . set ViewOffset=ViewOffset+1 | |||
. else do quit | . else do quit | ||
. . write ! | |||
. . new tpNLines | . . new tpNLines | ||
. . for tpNLines=1:1:5 write tpBlankLine,! | . . for tpNLines=1:1:5 write tpBlankLine,! | ||
. . do CUU^TMGTERM(5) | . . do CUU^TMGTERM(5) | ||
. . write " L -- run in sLow mode | . . write " L -- run in sLow mode M -- enter any line of M code",! | ||
. . write " O -- step OVER line | . . write " O -- step OVER line I -- step INTO line",! | ||
. . write " R -- run | . . write " R -- run H -- Hide debug code",! | ||
. . write " B -- set Breakpoint",! | . . write " B -- set Breakpoint W - enter variable watch code ",! | ||
. . write " A -- scroll upward Z -- scroll downward",! | |||
SPDone | SPDone | ||
do VCULOAD2^TMGTERM | do VCULOAD2^TMGTERM | ||
| Line 138: | Line 176: | ||
else set result=2 | else set result=2 | ||
set TMGStepMode=tpStepMode | set TMGStepMode=tpStepMode | ||
if $get(Msg)=1 do | if $get(Msg)=1 do | ||
. set $ZSTEP="N TMGTrap S TMGTrap=$$STEPTRAP^TMGTPSTP($ZPOS) zstep:(TMGTrap=1) into zstep:(TMGTrap=2) over zcontinue" | . set $ZSTEP="N TMGTrap S TMGTrap=$$STEPTRAP^TMGTPSTP($ZPOS) zstep:(TMGTrap=1) into zstep:(TMGTrap=2) over zcontinue" | ||
. zstep:(result=1) into zstep:(result=2) over | . zstep:(result=1) into zstep:(result=2) over | ||
new discard set discard=$get(@NakedRef) ;"reset naked reference. | |||
quit result | quit result | ||
BlankLine | |||
write tpBlankLine | |||
do CHA^TMGTERM(1) ;"move to x=1 on this line | |||
quit | |||
ErrTrap(idePos) | ErrTrap(idePos) | ||
;"Purpose: This is the line that is called by GT.M for each ztrap event. | |||
;" It will be used to display the current code execution point | |||
new ScrHeight,ScrWidth | new ScrHeight,ScrWidth | ||
set ScrHeight=$get(TMGScrHeight,10) | set ScrHeight=$get(TMGScrHeight,10) | ||
set ScrWidth=$get(TMGScrWidth,70) | set ScrWidth=$get(TMGScrWidth,70) | ||
do VCUSAV2^TMGTERM | do VCUSAV2^TMGTERM | ||
do ShowCodePos(idePos,ScrWidth,ScrHeight) | do ShowCodePos(idePos,ScrWidth,ScrHeight) | ||
ETDone | ETDone | ||
do VCULOAD2^TMGTERM | do VCULOAD2^TMGTERM | ||
quit | quit | ||
ShowCode(idePos,ScrWidth,ScrHeight,Wipe) | |||
ShowCode(idePos,ScrWidth,ScrHeight,Wipe,ViewOffset) | |||
;"Purpose: This will display code at the top of the screen | ;"Purpose: This will display code at the top of the screen | ||
;"Input: idePos -- string like this: X+2^ROUTINE[$DMOD] | ;"Input: idePos -- string like this: X+2^ROUTINE[$DMOD] | ||
;" ScrWidth -- width of code display (Num of columns) | ;" ScrWidth -- width of code display (Num of columns) | ||
; | ;" ScrHeight -- height of code display (number of rows) | ||
;" Wipe -- OPTIONAL. if 1, then code area is wiped blank | ;" Wipe -- OPTIONAL. if 1, then code area is wiped blank | ||
;" ViewOffset -- OPTIONAL. If a value is supplied, then | |||
;" the display will be shifted up or down (i.e. to view | |||
;" code other than at the point of execution) | |||
;" Positive numbers will scroll page downward. | |||
new i | new i | ||
| Line 172: | Line 224: | ||
new LastRou,LastLabel,LastOffset | new LastRou,LastLabel,LastOffset | ||
new dbFGColor,bBGColor,nlFGColor,nlBGColor | new dbFGColor,bBGColor,nlFGColor,nlBGColor | ||
new BlankLine | new BlankLine | ||
new StartOffset | new StartOffset | ||
set ScrWidth=$get(ScrWidth,80) | set ScrWidth=$get(ScrWidth,80) | ||
set ScrHeight=$get(ScrHeight,10) | set ScrHeight=$get(ScrHeight,10) | ||
set BlankLine=" " | set BlankLine=" " | ||
for i=1:1:ScrWidth-1 set BlankLine=BlankLine_" " | for i=1:1:ScrWidth-1 set BlankLine=BlankLine_" " | ||
do VTATRIB^TMGTERM(7) ;"reverse text | |||
do CUP^TMGTERM(1,1) ;"Cursor to line (1,1) | do CUP^TMGTERM(1,1) ;"Cursor to line (1,1) | ||
write BlankLine,! ;"This is needed for some reason... | write BlankLine,! ;"This is needed for some reason... | ||
do CUU^TMGTERM(2) | do CUU^TMGTERM(2) | ||
if $get(Wipe)=1 do goto SCDone | if $get(Wipe)=1 do goto SCDone | ||
. do VTATRIB^TMGTERM(0) ;"reset colors | |||
. for i=0:1:ScrHeight+1 write BlankLine | . for i=0:1:ScrHeight+1 write BlankLine | ||
set s=$piece(idePos,"$",1) ;"e.g. X+2^ROUTINE$DMOD-->X+2^ROUTINE | set s=$piece(idePos,"$",1) ;"e.g. X+2^ROUTINE$DMOD-->X+2^ROUTINE | ||
set Routine=$piece(s,"^",2) | set Routine=$piece(s,"^",2) | ||
| Line 201: | Line 248: | ||
set Offset=+$piece(Label,"+",2) | set Offset=+$piece(Label,"+",2) | ||
set Label=$piece(Label,"+",1) | set Label=$piece(Label,"+",1) | ||
set s="=== Routine: ^"_Routine_" " write s | set s="=== Routine: ^"_Routine_" " write s | ||
for i=1:1:ScrWidth-$length(s) write "=" | for i=1:1:ScrWidth-$length(s) write "=" | ||
write ! | write ! | ||
if Offset>(ScrHeight) do | if Offset>(ScrHeight) do | ||
set StartOffset=(Offset-ScrHeight) | set StartOffset=(Offset-ScrHeight)+2 | ||
else set StartOffset=0 | else set StartOffset=0 | ||
set StartOffset=StartOffset+$get(ViewOffset) | |||
for i=StartOffset:1:(ScrHeight+StartOffset) do | for i=StartOffset:1:(ScrHeight+StartOffset) do | ||
. new line,Bl,ref,LoopOffset | . new line,Bl,ref,LoopOffset | ||
. set ref=Label_"+"_i_"^"_Routine | . set ref=Label_"+"_i_"^"_Routine | ||
. set line=$text(@ref) | . set line=$text(@ref) | ||
. if (i=Offset) do | . set line=$$Substitute^TMGSTUTL(line,$Char(9)," ") | ||
. . do | . if (i=Offset) do | ||
. . do VTATRIB^TMGTERM(0) ;"reset colors | |||
. . write ">" | . . write ">" | ||
. else write " " | . else write " " | ||
| Line 223: | Line 272: | ||
. . write $extract(line,1,ScrWidth-1) | . . write $extract(line,1,ScrWidth-1) | ||
. . write $extract(BlankLine,1,ScrWidth-$length(line)-1),! | . . write $extract(BlankLine,1,ScrWidth-$length(line)-1),! | ||
. if (i=Offset) do | . if (i=Offset) do VTATRIB^TMGTERM(7) ;"reverse colors | ||
for i=1:1:ScrWidth write "~" | for i=1:1:ScrWidth write "~" | ||
write ! | write ! | ||
SCDone | |||
do VTATRIB^TMGTERM(0) ;"reset colors | |||
quit | |||
;" | ScanMod(Module,pArray) | ||
;"Purpose: To scan a module and find all the labels/entry points/Entry points | |||
;"Input: Module -- The name of the module, like "XGF" (not "XGF.m" or "^XGF") | |||
;" pArray -- pointer to (name of) array Will be filled like this | |||
;" pArray(1,"TAG")="Label1" | |||
;" pArray(1,"OFFSET")=1 | |||
;" pArray(2,"TAG")="Label2" | |||
;" pArray(2,"OFFSET")=9 | |||
;" pArray(3,"TAG")="Label3" etc. | |||
;" pArray(3,"OFFSET")=15 | |||
;" pArray("Label1")=1 | |||
;" pArray("Label2")=2 | |||
;" pArray("Label3")=3 | |||
;"Output: Results are put into array | |||
;"Result: none | |||
new i set i=1 | |||
new LabelNum set LabelNum=0 | |||
new line set line="" | |||
if $get(Module)="" goto SMDone | |||
for do quit:(line="") | |||
. new ch | |||
. set line=$text(+i^@Module) | |||
. if line="" quit | |||
. set line=$$Substitute^TMGSTUTL(line,$Char(9)," ") ;"replace tabs for spaces | |||
. set ch=$extract(line,1) | |||
. if (ch'=" ")&(ch'=";") do | |||
. . new label | |||
. . set label=$piece(line," ",1) | |||
. . set LabelNum=LabelNum+1 | |||
. . set @pArray@(LabelNum,"TAG")=label | |||
. . set @pArray@(LabelNum,"OFFSET")=i | |||
. . set @pArray@(label)=LabelNum | |||
. set i=i+1 | |||
SMDone | |||
quit | |||
ConvertPos(Pos,pArray) | |||
;"Purpose: to convert a text positioning line from one that is relative to the last tag/label, into | |||
;" one that is relative to the start of the file | |||
;" e.g. START+8^MYFUNCT --> +32^MYFUNCT | |||
;"Input: Pos -- a position, as returned from $ZPOS | |||
;" pArray -- pointer to (name of). Array holding holding tag offsets | |||
;" pArray will be in this format: | |||
;" pArray("ModuleA",1,"TAG")="ALabel1" | |||
;" pArray("ModuleA",1,"OFFSET")=1 | |||
;" pArray("ModuleA",2,"TAG")="ALabel2" | |||
;" pArray("ModuleA",2,"OFFSET")=9 | |||
;" pArray("ModuleA","Label1")=1 | |||
;" pArray("ModuleA","Label2")=2 | |||
;" pArray("ModuleA","Label3")=3 | |||
;" pArray("ModuleB",1,"TAG")="BLabel1" | |||
;" pArray("ModuleB",1,"OFFSET")=4 | |||
;" pArray("ModuleB",2,"TAG")="BLabel2" | |||
;" pArray("ModuleB",2,"OFFSET")=23 | |||
;" pArray("ModuleB","Label1")=1 | |||
;" pArray("ModuleB","Label2")=2 | |||
;" pArray("ModuleB","Label3")=3 | |||
;" NOTE: -- if array passed is empty, then this function will call ScanModule to fill it | |||
;"Result: returns the new position line, relative to the start of the file/module | |||
;" | |||
quit | new s | ||
new result set result="" | |||
new Routine,Label,Offset | |||
set s=$piece(Pos,"$",1) ;"e.g. X+2^ROUTINE$DMOD-->X+2^ROUTINE | |||
if s="" goto CPDone | |||
set Routine=$piece(s,"^",2) | |||
if Routine="" goto CPDone | |||
set s=$piece(s,"^",1) | |||
set Offset=$piece(s,"+",2) | |||
if Offset="" set Offset=1 | |||
else set Offset=+Offset | |||
set Label=$piece(s,"+",1) | |||
if $data(@pArray@(Routine))=0 do | |||
. new p2Array set p2Array=$name(@pArray@(Routine)) | |||
. do ScanMod(Routine,p2Array) | |||
new i set i=+$get(@pArray@(Routine,Label)) | |||
if i=0 goto CPDone | |||
new GOffset set GOffset=@pArray@(Routine,i,"OFFSET") | |||
set result="+"_+(GOffset+Offset)_"^"_Routine | |||
CPDone | |||
quit result | |||
Latest revision as of 08:56, 10 July 2012
;"------------------------------------------------------------
;"------------------------------------------------------------
;"
;" GT.M STEP TRAP
;"
;" K. Toppenberg
;" 4-13-2005
;" License: GPL Applies
;"
;" This code module will allow tracing through code.
;" It is used as follows:
;"
;" set $ZSTEP="do STEPTRAP^TMGTRSTP($ZPOS) zstep into zcontinue"
;" zstep into
;" do ^MyFunction ;"<--- put the function you want to trace here
;"
;" set $ZSTEP="" ;"<---turn off step capture
;" quit
;"
;"
;" Dependencies:
;" Uses TMGTERM
;"
;"Notes:
;" This function will be called inbetween lines of the main
;" program that is being traced. Thus is function can't do
;" anything that might change the environment of the main
;" program.
;"------------------------------------------------------------
;"------------------------------------------------------------
STEPTRAP(idePos,Msg)
;"Purpose: This is the line that is called by GT.M for each zstep event.
;" It will be used to display the current code execution point, and
;" query user as to plans for future execution: run/step/ etc.
;"Input: idePos -- a text line containing position, as returned bye $ZPOS
;" Msg -- OPTIONAL -- can be used by programs to pass in info.
;" If Msg=1, then this function was called without the
;" $ZSTEP value set, so this function should set it.
new NakedRef set NakedRef=$$LGR^%ZOSV ;"save naked reference
new tpBlankLine
new tpAction
new tpKeyIn
new tpRunMode,tpStepMode
new tpI
new tpDone
new result set result=1 ;1=step into, 2=step over
new ViewOffset set ViewOffset=0
;"Run modes: 0=running mode
;" 1=stepping mode
;" 2=Don't show code
;" 3=running SLOW mode
;" -1=quit
set tpRunMode=$get(TMGRunMode,1)
set tpStepMode=$get(TMGStepMode,"into")
new ScrHeight,ScrWidth
set ScrHeight=$get(TMGScrHeight,10)
set ScrWidth=$get(TMGScrWidth,80)
set tpBlankLine=" "
for tpI=1:1:ScrWidth-1 set tpBlankLine=tpBlankLine_" "
new ArrayName set ArrayName="^TMP(""TMGIDE"",$J,""MODULES"")"
set idePos=$$ConvertPos(idePos,ArrayName)
do VCUSAV2^TMGTERM
if tpRunMode'=2 do
. do ShowCodePos(idePos,ScrWidth,ScrHeight)
else do
. do CUP^TMGTERM(1,2)
write tpBlankLine,!
write tpBlankLine,!
do CUU^TMGTERM(2)
if (tpRunMode=0)!(tpRunMode=3)!(tpRunMode=2) do
. write tpBlankLine,!
. do CUU^TMGTERM(1)
. write "(Press any key to pause)",!
. read *tpKeyIn:0
. if (tpKeyIn>0) set tpRunMode=1
. else if tpRunMode=3 hang 1
if tpRunMode=2 goto SPDone ;"Don't showmode --> goto SPDone
set tpDone=0
if tpRunMode=1 for do quit:tpDone=1
. new DefAction set DefAction="O"
. do ShowCodePos(idePos,ScrWidth,ScrHeight,,ViewOffset)
. do CUP^TMGTERM(1,ScrHeight+4) ;"Cursor to line (x,y)
. write tpBlankLine,!
. do CUU^TMGTERM(2)
. if tpWatchLine'="" do
. . new $etrap set $etrap="write ""(Invalid M Code!. Error Trapped.)"" set $etrap="""",$ecode="""""
. . xecute tpWatchLine
. . write !
. write tpBlankLine,!
. do VTATRIB^TMGTERM(7) ;"reverse text
. for i=1:1:ScrWidth write "~"
. do VTATRIB^TMGTERM(0) ;"reset text
. write !
. do CUU^TMGTERM(2)
. write "Action (? for help): "
. if tpStepMode="into" write "step INTO// " set DefAction="I"
. else write "step OVER// " set DefAction="O"
. new loop
. for loop=1:1:20 write " "
. for loop=1:1:20 write $char(8) ;"backspace
. set tpAction=$$READ^XGF(1) write !
. ;"read tpAction,!
. if tpActionn="" set tpAction=DefAction
. if "rR"[tpAction do quit
. . set tpRunMode=0
. . set tpDone=1
. if "lL"[tpAction do quit
. . set tpRunMode=3
. . set tpDone=1
. if "mM"[tpAction do quit
. . new temp
. . do CUU^TMGTERM(1)
. . do CHA^TMGTERM(1) ;"move to x=1 on this line
. . write tpBlankLine,!
. . do CUU^TMGTERM(1)
. . read " enter M code (^ to cancel): ",tpLine,!
. . if (tpLine'="^") do
. . . new $etrap set $etrap="write ""(Invalid M Code!. Error Trapped.)"",! set $etrap="""",$ecode="""""
. . . write ! ;"get below bottom line for output.
. . . xecute tpLine
. if "iI"[tpAction do quit
. . set tpStepMode="into"
. . ;"set $ZSTEP="do STEPTRAP^TMGTPSTP($ZPOS) zstep into zcontinue"
. . set tpDone=1
. if "Oo"[tpAction do quit
. . set tpStepMode="over"
. . ;"set $ZSTEP="do STEPTRAP^TMGTPSTP($ZPOS) zstep over zcontinue"
. . set tpDone=1
. if "Bb"[tpAction do quit
. . new idePos
. . read "Enter breakpoint (e.g. Label+8^MyFunct): ",idePos,!
. . set idePos=Pos_":""n tmg s tmg=$$STEPTRAP^TMGTPSTP($ZPOS,1)"""
. . ZBREAK @idePos
. if "Hh"[tpAction do quit
. . set tpRunMode=2
. . set tpDone=1
. if "Ww"[tpAction do quit
. . new temp
. . do CUU^TMGTERM(1)
. . do CHA^TMGTERM(1) ;"move to x=1 on this line
. . write tpBlankLine,!
. . do CUU^TMGTERM(1)
. . read "Enter M code (^ to cancel): ",temp,!
. . if temp'="^" set tpWatchLine=temp
. if "Aa"[tpAction do quit
. . set ViewOffset=ViewOffset-1
. if "Zz"[tpAction do quit
. . set ViewOffset=ViewOffset+1
. else do quit
. . write !
. . new tpNLines
. . for tpNLines=1:1:5 write tpBlankLine,!
. . do CUU^TMGTERM(5)
. . write " L -- run in sLow mode M -- enter any line of M code",!
. . write " O -- step OVER line I -- step INTO line",!
. . write " R -- run H -- Hide debug code",!
. . write " B -- set Breakpoint W - enter variable watch code ",!
. . write " A -- scroll upward Z -- scroll downward",!
SPDone
do VCULOAD2^TMGTERM
set TMGRunMode=tpRunMode
if tpStepMode="into" set result=1
else set result=2
set TMGStepMode=tpStepMode
if $get(Msg)=1 do
. set $ZSTEP="N TMGTrap S TMGTrap=$$STEPTRAP^TMGTPSTP($ZPOS) zstep:(TMGTrap=1) into zstep:(TMGTrap=2) over zcontinue"
. zstep:(result=1) into zstep:(result=2) over
new discard set discard=$get(@NakedRef) ;"reset naked reference.
quit result
BlankLine
write tpBlankLine
do CHA^TMGTERM(1) ;"move to x=1 on this line
quit
ErrTrap(idePos)
;"Purpose: This is the line that is called by GT.M for each ztrap event.
;" It will be used to display the current code execution point
new ScrHeight,ScrWidth
set ScrHeight=$get(TMGScrHeight,10)
set ScrWidth=$get(TMGScrWidth,70)
do VCUSAV2^TMGTERM
do ShowCodePos(idePos,ScrWidth,ScrHeight)
ETDone
do VCULOAD2^TMGTERM
quit
ShowCode(idePos,ScrWidth,ScrHeight,Wipe,ViewOffset)
;"Purpose: This will display code at the top of the screen
;"Input: idePos -- string like this: X+2^ROUTINE[$DMOD]
;" ScrWidth -- width of code display (Num of columns)
;" ScrHeight -- height of code display (number of rows)
;" Wipe -- OPTIONAL. if 1, then code area is wiped blank
;" ViewOffset -- OPTIONAL. If a value is supplied, then
;" the display will be shifted up or down (i.e. to view
;" code other than at the point of execution)
;" Positive numbers will scroll page downward.
new i
new Routine,Label,Offest,s
new LastRou,LastLabel,LastOffset
new dbFGColor,bBGColor,nlFGColor,nlBGColor
new BlankLine
new StartOffset
set ScrWidth=$get(ScrWidth,80)
set ScrHeight=$get(ScrHeight,10)
set BlankLine=" "
for i=1:1:ScrWidth-1 set BlankLine=BlankLine_" "
do VTATRIB^TMGTERM(7) ;"reverse text
do CUP^TMGTERM(1,1) ;"Cursor to line (1,1)
write BlankLine,! ;"This is needed for some reason...
do CUU^TMGTERM(2)
if $get(Wipe)=1 do goto SCDone
. do VTATRIB^TMGTERM(0) ;"reset colors
. for i=0:1:ScrHeight+1 write BlankLine
set s=$piece(idePos,"$",1) ;"e.g. X+2^ROUTINE$DMOD-->X+2^ROUTINE
set Routine=$piece(s,"^",2)
set Label=$piece(s,"^",1)
set Offset=+$piece(Label,"+",2)
set Label=$piece(Label,"+",1)
set s="=== Routine: ^"_Routine_" " write s
for i=1:1:ScrWidth-$length(s) write "="
write !
if Offset>(ScrHeight) do
set StartOffset=(Offset-ScrHeight)+2
else set StartOffset=0
set StartOffset=StartOffset+$get(ViewOffset)
for i=StartOffset:1:(ScrHeight+StartOffset) do
. new line,Bl,ref,LoopOffset
. set ref=Label_"+"_i_"^"_Routine
. set line=$text(@ref)
. set line=$$Substitute^TMGSTUTL(line,$Char(9)," ")
. if (i=Offset) do
. . do VTATRIB^TMGTERM(0) ;"reset colors
. . write ">"
. else write " "
. if $length(line)>(ScrWidth-1) do
. . write $extract(line,1,ScrWidth-4),"...",!
. else do
. . write $extract(line,1,ScrWidth-1)
. . write $extract(BlankLine,1,ScrWidth-$length(line)-1),!
. if (i=Offset) do VTATRIB^TMGTERM(7) ;"reverse colors
for i=1:1:ScrWidth write "~"
write !
SCDone
do VTATRIB^TMGTERM(0) ;"reset colors
quit
ScanMod(Module,pArray)
;"Purpose: To scan a module and find all the labels/entry points/Entry points
;"Input: Module -- The name of the module, like "XGF" (not "XGF.m" or "^XGF")
;" pArray -- pointer to (name of) array Will be filled like this
;" pArray(1,"TAG")="Label1"
;" pArray(1,"OFFSET")=1
;" pArray(2,"TAG")="Label2"
;" pArray(2,"OFFSET")=9
;" pArray(3,"TAG")="Label3" etc.
;" pArray(3,"OFFSET")=15
;" pArray("Label1")=1
;" pArray("Label2")=2
;" pArray("Label3")=3
;"Output: Results are put into array
;"Result: none
new i set i=1
new LabelNum set LabelNum=0
new line set line=""
if $get(Module)="" goto SMDone
for do quit:(line="")
. new ch
. set line=$text(+i^@Module)
. if line="" quit
. set line=$$Substitute^TMGSTUTL(line,$Char(9)," ") ;"replace tabs for spaces
. set ch=$extract(line,1)
. if (ch'=" ")&(ch'=";") do
. . new label
. . set label=$piece(line," ",1)
. . set LabelNum=LabelNum+1
. . set @pArray@(LabelNum,"TAG")=label
. . set @pArray@(LabelNum,"OFFSET")=i
. . set @pArray@(label)=LabelNum
. set i=i+1
SMDone
quit
ConvertPos(Pos,pArray)
;"Purpose: to convert a text positioning line from one that is relative to the last tag/label, into
;" one that is relative to the start of the file
;" e.g. START+8^MYFUNCT --> +32^MYFUNCT
;"Input: Pos -- a position, as returned from $ZPOS
;" pArray -- pointer to (name of). Array holding holding tag offsets
;" pArray will be in this format:
;" pArray("ModuleA",1,"TAG")="ALabel1"
;" pArray("ModuleA",1,"OFFSET")=1
;" pArray("ModuleA",2,"TAG")="ALabel2"
;" pArray("ModuleA",2,"OFFSET")=9
;" pArray("ModuleA","Label1")=1
;" pArray("ModuleA","Label2")=2
;" pArray("ModuleA","Label3")=3
;" pArray("ModuleB",1,"TAG")="BLabel1"
;" pArray("ModuleB",1,"OFFSET")=4
;" pArray("ModuleB",2,"TAG")="BLabel2"
;" pArray("ModuleB",2,"OFFSET")=23
;" pArray("ModuleB","Label1")=1
;" pArray("ModuleB","Label2")=2
;" pArray("ModuleB","Label3")=3
;" NOTE: -- if array passed is empty, then this function will call ScanModule to fill it
;"Result: returns the new position line, relative to the start of the file/module
;"
new s
new result set result=""
new Routine,Label,Offset
set s=$piece(Pos,"$",1) ;"e.g. X+2^ROUTINE$DMOD-->X+2^ROUTINE
if s="" goto CPDone
set Routine=$piece(s,"^",2)
if Routine="" goto CPDone
set s=$piece(s,"^",1)
set Offset=$piece(s,"+",2)
if Offset="" set Offset=1
else set Offset=+Offset
set Label=$piece(s,"+",1)
if $data(@pArray@(Routine))=0 do
. new p2Array set p2Array=$name(@pArray@(Routine))
. do ScanMod(Routine,p2Array)
new i set i=+$get(@pArray@(Routine,Label))
if i=0 goto CPDone
new GOffset set GOffset=@pArray@(Routine,i,"OFFSET")
set result="+"_+(GOffset+Offset)_"^"_Routine
CPDone
quit result