[796] | 1 | TMGIDE6 ;TMG/kst/GT/M debugger Code Coloration ;4/4/09
|
---|
| 2 | ;;1.0;TMG-LIB;**1**;4/4/09
|
---|
| 3 | ;
|
---|
| 4 | ;" TMG IDE Code Coloration
|
---|
| 5 | ;"
|
---|
| 6 | ;" K. Toppenberg
|
---|
| 7 | ;" 4/4/09
|
---|
| 8 | ;" License: GPL Applies
|
---|
| 9 | ;"
|
---|
| 10 | ;"------------------------------------------------------------
|
---|
| 11 | ;"PUBLIC API
|
---|
| 12 | ;"------------------------------------------------------------
|
---|
| 13 | ;"ShowLine(line,Options,BkColor) -- Encode and write out a line of code with colors
|
---|
| 14 | ;"WriteMLine(line,BkColor) -- write out markup line, converting tags into colors
|
---|
| 15 | ;"MarkupLine(line,Options) -- add markup tags that will allow coloration.
|
---|
| 16 |
|
---|
| 17 | ;"------------------------------------------------------------
|
---|
| 18 | ;"PRIVATE API
|
---|
| 19 | ;"------------------------------------------------------------
|
---|
| 20 |
|
---|
| 21 | ;"------------------------------------------------------------
|
---|
| 22 | ;"------------------------------------------------------------
|
---|
| 23 |
|
---|
| 24 | temp
|
---|
| 25 | new tempPos,pos,offset
|
---|
| 26 | set pos="^PSOORFIN"
|
---|
| 27 | new Options
|
---|
| 28 | set Options("XCMD")=1
|
---|
| 29 | set Options("LCASE")=1
|
---|
| 30 | for offset=50:1:58 do
|
---|
| 31 | . set tempPos="+"_offset_pos
|
---|
| 32 | . new line set line=$text(@tempPos)
|
---|
| 33 | . write offset,": " if $$ShowLine(line,.Options,40) write !
|
---|
| 34 | do VTATRIB^TMGTERM(0) ;"Reset colors
|
---|
| 35 | quit
|
---|
| 36 |
|
---|
| 37 |
|
---|
| 38 | ShowPos(Pos)
|
---|
| 39 | ;"A temp function to show out code at a given position.
|
---|
| 40 | new line set line=$text(@Pos)
|
---|
| 41 | write Pos,": " if $$ShowLine(line) write !
|
---|
| 42 | quit
|
---|
| 43 |
|
---|
| 44 |
|
---|
| 45 | ShowLine(line,Options,MaxChar)
|
---|
| 46 | ;"Purpose: to encode and write out a line of code with colors
|
---|
| 47 | ;"Input: line -- the code line to show
|
---|
| 48 | ;" Options -- See MarkupLine for format
|
---|
| 49 | ;" MaxChar -- OPTIONAL. Max count of characters to be allowed written.
|
---|
| 50 | ;"Results: returns the actual number of chars written to screen.
|
---|
| 51 | new temp set temp=$$MarkupLine(line,.Options)
|
---|
| 52 | ;"write "{",$get(MaxChar),"}"
|
---|
| 53 | new result set result=$$WriteMLine(temp,.MaxChar)
|
---|
| 54 | quit result
|
---|
| 55 |
|
---|
| 56 | WriteMLine(line,MaxChar)
|
---|
| 57 | ;"Purpose: to write out markup line, converting tags into colors)
|
---|
| 58 | ;"Input: line -- the text to show, created by MarkupLine. DON'T pass by reference
|
---|
| 59 | ;" MaxChar -- OPTIONAL. Max count of characters to be allowed written.
|
---|
| 60 | ;"result: number of actual characters written to screen (removing tags)
|
---|
| 61 | new result set result=0
|
---|
| 62 | set MaxChar=$get(MaxChar,9999)
|
---|
| 63 | for quit:($length(line)'>0)!(result>MaxChar) do
|
---|
| 64 | . new p set p=$find(line,"{C")
|
---|
| 65 | . if p>0 do ;"start color found
|
---|
| 66 | . . new partS set partS=$extract(line,1,p-3)
|
---|
| 67 | . . do SetColors^TMGIDE2("NORM")
|
---|
| 68 | . . do DoWrite(partS,.result,MaxChar)
|
---|
| 69 | . . ;"write partS set result=result+$length(partS)
|
---|
| 70 | . . set line=$extract(line,p-2,999)
|
---|
| 71 | . . new code set code=$$GetWord^TMGSTUTL(line,1,"{","}")
|
---|
| 72 | . . set line=$extract(line,$length(code)+3,999) ;"shorten to after color tag onward
|
---|
| 73 | . . new mode set mode=$piece(code,":",2)
|
---|
| 74 | . . do SetColors^TMGIDE2(mode)
|
---|
| 75 | . . set p=$find(line,"{C/}") ;"look for close color directive
|
---|
| 76 | . . if p>0 do
|
---|
| 77 | . . . set partS=$extract(line,1,p-5) ;"get text up to closing color
|
---|
| 78 | . . . do DoWrite(partS,.result,MaxChar)
|
---|
| 79 | . . . ;"write partS set result=result+$length(partS)
|
---|
| 80 | . . . do SetColors^TMGIDE2("NORM")
|
---|
| 81 | . . . set line=$extract(line,p,999) ;"shorten to next segment after closing color onward
|
---|
| 82 | . . else do
|
---|
| 83 | . . . do DoWrite(line,.result,MaxChar)
|
---|
| 84 | . . . ;"write line set result=result+$length(line)
|
---|
| 85 | . . . set line=""
|
---|
| 86 | . else do
|
---|
| 87 | . . do DoWrite(line,.result,MaxChar)
|
---|
| 88 | . . ;"write line set result=result+$length(line)
|
---|
| 89 | . . set line=""
|
---|
| 90 | quit result
|
---|
| 91 |
|
---|
| 92 | DoWrite(s,CurLen,MaxLen)
|
---|
| 93 | ;"Purpose: To do a controlled write to the screen.
|
---|
| 94 | ;"Input: s -- the text to write
|
---|
| 95 | ;" CurLen -- PASS BY REFERENCE. Current Num chars that have been written
|
---|
| 96 | ;" MaxLen -- the limit to chars that can be written to screen.
|
---|
| 97 | new len set len=$length(s)
|
---|
| 98 | if CurLen+len>MaxLen do
|
---|
| 99 | . set s=$extract(s,1,(MaxLen-CurLen))
|
---|
| 100 | . set len=$length(s)
|
---|
| 101 | write s
|
---|
| 102 | set CurLen=CurLen+len
|
---|
| 103 | quit
|
---|
| 104 |
|
---|
| 105 | MarkupLine(line,Options)
|
---|
| 106 | ;"Purpose: To take an arbitrary line of code and add markup tags
|
---|
| 107 | ;" that will allow coloration.
|
---|
| 108 | ;"Input : line -- the line of code to consider. DON'T pass by reference.
|
---|
| 109 | ;" Options -- PASS BY REFERENCE. OPTIONAL. Format
|
---|
| 110 | ;" Options('XCMD')=1 --> turn I --> IF etc. (expand commands)
|
---|
| 111 | ;" Options('UCASE')=1 --> turn commands into UPPER CASE
|
---|
| 112 | ;" Options('LCASE')=1 --> turn commands into LOWER CASE
|
---|
| 113 | ;" Options('Tab')=8 --> e.g. turn $char(9) into 8 spaces (Default is 5)
|
---|
| 114 | ;"Results : returns line with markup added. Format:
|
---|
| 115 | ;" {C:Name}...{C/}aaaa bbb ccc{C:Name2}ddddd{C/}
|
---|
| 116 | ;" 'Name' will be one of the following:
|
---|
| 117 | ;" LABEL -- for a code label
|
---|
| 118 | ;" CMD -- for a command, e.g. IF F GOTO ELSE etc.
|
---|
| 119 | ;" FN -- anything starting with $$
|
---|
| 120 | ;" MOD -- e.g. ^MYMODULE
|
---|
| 121 | ;" IFN -- intrinsic function, i.e. starting with $
|
---|
| 122 | ;" STR -- a string
|
---|
| 123 | ;" PC -- a post-conditional
|
---|
| 124 | ;" # -- a comment
|
---|
| 125 | new result set result=""
|
---|
| 126 | new token,cmd,arg,tabStr,p,ch
|
---|
| 127 | new tabLen set tabLen=$get(Options("Tab"),5)
|
---|
| 128 | set $piece(tabStr," ",tabLen)=""
|
---|
| 129 | set line=$get(line)
|
---|
| 130 | set line=$translate(line,$char(9),tabStr) ;"turn tabs into spaces
|
---|
| 131 | if $extract(line,1)'=" " do
|
---|
| 132 | . set token=$piece(line," ",1)
|
---|
| 133 | . set line=$piece(line," ",2,999)
|
---|
| 134 | . set result="{C:LABEL}"_token_"{C/} "
|
---|
| 135 | for p=1:1 quit:(p>$length(line))!($extract(line,p)'=" ")
|
---|
| 136 | set result=result_$extract(line,1,p-1) ;"get leading space
|
---|
| 137 | set line=$extract(line,p,999)
|
---|
| 138 | new comment set comment=""
|
---|
| 139 | ;"Extract comments first...
|
---|
| 140 | set p=1 for set p=$find(line,";",p) quit:(p'>0) do
|
---|
| 141 | . if $$InQt^TMGSTUTL(line,p-1) quit
|
---|
| 142 | . set comment=$extract(line,p-1,999)
|
---|
| 143 | . set comment="{C:#}"_comment_"{C/}"
|
---|
| 144 | . set line=$extract(line,1,p-2)
|
---|
| 145 | ;"====== Loop to get COMMAND ARG pairs ===="
|
---|
| 146 | for quit:($length(line)'>0) do
|
---|
| 147 | . for set ch=$extract(line,1) quit:(" ."'[ch)!(ch="") do
|
---|
| 148 | . . set result=result_ch,line=$extract(line,2,999)
|
---|
| 149 | . quit:(line="")
|
---|
| 150 | . set token=$$NextBlock(.line)
|
---|
| 151 | . if token[":" do
|
---|
| 152 | . . set cmd=$$NextBlock(.token,":")
|
---|
| 153 | . . set result=result_$$HndlCmd(cmd,.Options)_"{C:PC}:{C/}"
|
---|
| 154 | . . set result=result_$$HndlArgs(token)_" "
|
---|
| 155 | . else do
|
---|
| 156 | . . set result=result_$$HndlCmd(token,.Options)_" "
|
---|
| 157 | . set arg=$$NextBlock(.line)
|
---|
| 158 | . set arg=$$HndlArgs(arg)
|
---|
| 159 | . set result=result_arg_" "
|
---|
| 160 | ;
|
---|
| 161 | set result=result_comment ;"add back comment (if any)
|
---|
| 162 | quit result
|
---|
| 163 | ;
|
---|
| 164 | HndlArgs(Args)
|
---|
| 165 | ;"Purpose: to return a formatted arguments text
|
---|
| 166 | ;"Input: Args -- the text that supplies arguments to a command, OR
|
---|
| 167 | ;" the text that is post-conditional code
|
---|
| 168 | ;"results: returns the Args with markup code.
|
---|
| 169 | new p set p=1
|
---|
| 170 | for set p=$find(Args,"$$",p) quit:(p'>0) do quit:(p'>0) ;"Handle functions
|
---|
| 171 | . if $$InQt^TMGSTUTL(Args,p-1) set p=$find(Args,"""",p) quit
|
---|
| 172 | . new fnName set fnName="$$"_$$GetWord^TMGSTUTL(Args,p,"$","():^= ")
|
---|
| 173 | . new partA,partB
|
---|
| 174 | . set partA=$extract(Args,1,p-3)
|
---|
| 175 | . set partB=$extract(Args,p-2+$length(fnName),999)
|
---|
| 176 | . set Args=partA_"{C:FN}"_fnName_"{C/}"_partB
|
---|
| 177 | . set p=p+6+$length(fnName) ;"6=length of {C:FN}
|
---|
| 178 | set p=1
|
---|
| 179 | for set p=$find(Args,"$",p) quit:(p'>0) do quit:(p'>0) ;"Handle intrinsic functions
|
---|
| 180 | . if $$InQt^TMGSTUTL(Args,p-1) set p=$find(Args,"""",p) quit
|
---|
| 181 | . if $extract(Args,p)="$" set p=p+1 quit ;"avoid $$ matches
|
---|
| 182 | . new fnName set fnName="$"_$$GetWord^TMGSTUTL(Args,p,"$","():,= ")
|
---|
| 183 | . new partA,partB
|
---|
| 184 | . set partA=$extract(Args,1,p-2)
|
---|
| 185 | . set partB=$extract(Args,p-1+$length(fnName),999)
|
---|
| 186 | . set Args=partA_"{C:IFN}"_fnName_"{C/}"_partB
|
---|
| 187 | . set p=p+7+$length(fnName) ;"7=length of {C:IFN}
|
---|
| 188 | set p=1
|
---|
| 189 | for set p=$find(Args,"^",p) quit:(p'>0) do quit:(p'>0);"Handle Modules
|
---|
| 190 | . if $$InQt^TMGSTUTL(Args,p-1) set p=$find(Args,"""",p) quit
|
---|
| 191 | . new modName set modName="^"_$$GetWord^TMGSTUTL(Args,p,"^","():,= ")
|
---|
| 192 | . new partA,partB
|
---|
| 193 | . set partA=$extract(Args,1,p-2)
|
---|
| 194 | . set partB=$extract(Args,p-1+$length(modName),999)
|
---|
| 195 | . set Args=partA_"{C:MOD}"_modName_"{C/}"_partB
|
---|
| 196 | . set p=p+7+$length(modName) ;"7=length of {C:MOD}
|
---|
| 197 | set p=1
|
---|
| 198 | for set p=$find(Args,"""",p) quit:(p'>0) do ;"Handle Strings
|
---|
| 199 | . new p2
|
---|
| 200 | . if $extract(Args,p)="""" set p2=p
|
---|
| 201 | . else set p2=$$StrBounds^TMGSTUTL(Args,p)
|
---|
| 202 | . if p2=0 set p=999 quit
|
---|
| 203 | . new partA,partB,partC
|
---|
| 204 | . set partA=$extract(Args,1,p-2)
|
---|
| 205 | . set partB=$extract(Args,p-1,p2)
|
---|
| 206 | . set partC=$extract(Args,p2+1,999)
|
---|
| 207 | . set Args=partA_"{C:STR}"_partB_"{C/}"_partC
|
---|
| 208 | . set p=p+7+$length(partB) ;"7=length of {C:STR}
|
---|
| 209 | quit Args
|
---|
| 210 |
|
---|
| 211 |
|
---|
| 212 | HndlCmd(Cmd,Options)
|
---|
| 213 | ;"Purpose: Return formatted command
|
---|
| 214 | ;"Input: Cmd -- the mumps command
|
---|
| 215 | ;" Options -- OPTIONAL. Format:
|
---|
| 216 | ;" Options('XCMD')=1 --> turn I --> IF etc. (expand commands)
|
---|
| 217 | ;" Options('SCMD')=1 --> turn IF --> I etc. (shrink commands)
|
---|
| 218 | ;" Options('UCASE')=1 --> turn commands into UPPER CASE
|
---|
| 219 | ;" Options('LCASE')=1 --> turn commands into LOWER CASE
|
---|
| 220 | ;"Results: returns the command with markup code
|
---|
| 221 | new result set result=""
|
---|
| 222 | set Cmd=$get(Cmd)
|
---|
| 223 | new tempCmd set tempCmd=$$UP^XLFSTR(Cmd)
|
---|
| 224 | if $get(Options("XCMD")) do
|
---|
| 225 | . if tempCmd="AB" set Cmd="ABLOCK" quit
|
---|
| 226 | . if tempCmd="A" set Cmd="ASSIGN" quit
|
---|
| 227 | . if tempCmd="ASTA" set Cmd="ASTART" quit
|
---|
| 228 | . if tempCmd="ASTO" set Cmd="ASTOP" quit
|
---|
| 229 | . if tempCmd="AUNB" set Cmd="AUNBLOCK" quit
|
---|
| 230 | . if tempCmd="B" set Cmd="BREAK" quit
|
---|
| 231 | . if tempCmd="C" set Cmd="CLOSE" quit
|
---|
| 232 | . if tempCmd="D" set Cmd="DO" quit
|
---|
| 233 | . if tempCmd="E" set Cmd="ELSE" quit
|
---|
| 234 | . if tempCmd="ESTA" set Cmd="ESTART" quit
|
---|
| 235 | . if tempCmd="ESTO" set Cmd="ESTOP" quit
|
---|
| 236 | . if tempCmd="ETR" set Cmd="ETRIGGER" quit
|
---|
| 237 | . if tempCmd="F" set Cmd="FOR" quit
|
---|
| 238 | . if tempCmd="G" set Cmd="GOTO" quit
|
---|
| 239 | . ;"if tempCmd="H" set Cmd="HALT" quit
|
---|
| 240 | . ;"if tempCmd="H" set Cmd="HANG" quit
|
---|
| 241 | . if tempCmd="I" set Cmd="IF" quit
|
---|
| 242 | . if tempCmd="J" set Cmd="JOB" quit
|
---|
| 243 | . if tempCmd="K" set Cmd="KILL" quit
|
---|
| 244 | . if tempCmd="KS" set Cmd="KSUBSCRIPTS" quit
|
---|
| 245 | . if tempCmd="KV" set Cmd="KVALUE" quit
|
---|
| 246 | . if tempCmd="L" set Cmd="LOCK" quit
|
---|
| 247 | . if tempCmd="M" set Cmd="MERGE" quit
|
---|
| 248 | . if tempCmd="N" set Cmd="NEW" quit
|
---|
| 249 | . if tempCmd="O" set Cmd="OPEN" quit
|
---|
| 250 | . if tempCmd="Q" set Cmd="QUIT" quit
|
---|
| 251 | . if tempCmd="R" set Cmd="READ" quit
|
---|
| 252 | . if tempCmd="RL" set Cmd="RLOAD" quit
|
---|
| 253 | . if tempCmd="RS" set Cmd="RSAVE" quit
|
---|
| 254 | . if tempCmd="S" set Cmd="SET" quit
|
---|
| 255 | . if tempCmd="TC" set Cmd="TCOMMIT" quit
|
---|
| 256 | . if tempCmd="TH" set Cmd="THEN" quit
|
---|
| 257 | . if tempCmd="TRE" set Cmd="TRESTART" quit
|
---|
| 258 | . if tempCmd="TRO" set Cmd="TROLLBACK" quit
|
---|
| 259 | . if tempCmd="TS" set Cmd="TSTART" quit
|
---|
| 260 | . if tempCmd="U" set Cmd="USE" quit
|
---|
| 261 | . if tempCmd="V" set Cmd="VIEW" quit
|
---|
| 262 | . if tempCmd="W" set Cmd="WRITE" quit
|
---|
| 263 | . if tempCmd="X" set Cmd="XECUTE" quit
|
---|
| 264 | . if tempCmd="ZWR" set Cmd="ZWRITE" quit
|
---|
| 265 | if $get(Options("SCMD")) do
|
---|
| 266 | . if tempCmd="ABLOCK" set Cmd="AB" quit
|
---|
| 267 | . if tempCmd="ASSIGN" set Cmd="A" quit
|
---|
| 268 | . if tempCmd="ASTART" set Cmd="ASTA" quit
|
---|
| 269 | . if tempCmd="ASTOP" set Cmd="ASTO" quit
|
---|
| 270 | . if tempCmd="AUNBLOCK" set Cmd="AUNB" quit
|
---|
| 271 | . if tempCmd="BREAK" set Cmd="B" quit
|
---|
| 272 | . if tempCmd="CLOSE" set Cmd="C" quit
|
---|
| 273 | . if tempCmd="DO" set Cmd="D" quit
|
---|
| 274 | . if tempCmd="ELSE" set Cmd="E" quit
|
---|
| 275 | . if tempCmd="ESTART" set Cmd="ESTA" quit
|
---|
| 276 | . if tempCmd="ESTOP" set Cmd="ESTO" quit
|
---|
| 277 | . if tempCmd="ETRIGGER" set Cmd="ETR" quit
|
---|
| 278 | . if tempCmd="FOR" set Cmd="F" quit
|
---|
| 279 | . if tempCmd="GOTO" set Cmd="G" quit
|
---|
| 280 | . if tempCmd="HALT" set Cmd="H" quit
|
---|
| 281 | . if tempCmd="HANG" set Cmd="H" quit
|
---|
| 282 | . if tempCmd="IF" set Cmd="I" quit
|
---|
| 283 | . if tempCmd="JOB" set Cmd="J" quit
|
---|
| 284 | . if tempCmd="KILL" set Cmd="K" quit
|
---|
| 285 | . if tempCmd="KSUBSCRIPTS" set Cmd="KS" quit
|
---|
| 286 | . if tempCmd="KVALUE" set Cmd="KV" quit
|
---|
| 287 | . if tempCmd="LOCK" set Cmd="L" quit
|
---|
| 288 | . if tempCmd="MERGE" set Cmd="M" quit
|
---|
| 289 | . if tempCmd="NEW" set Cmd="N" quit
|
---|
| 290 | . if tempCmd="OPEN" set Cmd="O" quit
|
---|
| 291 | . if tempCmd="QUIT" set Cmd="Q" quit
|
---|
| 292 | . if tempCmd="READ" set Cmd="R" quit
|
---|
| 293 | . if tempCmd="RLOAD" set Cmd="RL" quit
|
---|
| 294 | . if tempCmd="RSAVE" set Cmd="RS" quit
|
---|
| 295 | . if tempCmd="SET" set Cmd="S" quit
|
---|
| 296 | . if tempCmd="TCOMMIT" set Cmd="TC" quit
|
---|
| 297 | . if tempCmd="THEN" set Cmd="TH" quit
|
---|
| 298 | . if tempCmd="TRESTART" set Cmd="TRE" quit
|
---|
| 299 | . if tempCmd="TROLLBACK" set Cmd="TRO" quit
|
---|
| 300 | . if tempCmd="TSTART" set Cmd="TS" quit
|
---|
| 301 | . if tempCmd="USE" set Cmd="U" quit
|
---|
| 302 | . if tempCmd="VIEW" set Cmd="V" quit
|
---|
| 303 | . if tempCmd="WRITE" set Cmd="W" quit
|
---|
| 304 | . if tempCmd="XECUTE" set Cmd="X" quit
|
---|
| 305 | . if tempCmd="ZWRITE" set Cmd="ZWR" quit
|
---|
| 306 | if $get(Options("UCASE")) set Cmd=$$UP^XLFSTR(Cmd)
|
---|
| 307 | if $get(Options("LCASE")) set Cmd=$$LOW^XLFSTR(Cmd)
|
---|
| 308 | set result="{C:CMD}"_Cmd_"{C/}"
|
---|
| 309 | quit result
|
---|
| 310 |
|
---|
| 311 | NextBlock(line,Div)
|
---|
| 312 | ;"Purpose: to return from the begining to the next space. Space is
|
---|
| 313 | ;" discarded.
|
---|
| 314 | ;" e.g. line='This is a test', then function will return 'This'
|
---|
| 315 | ;" and line will be changed to be 'is a test'
|
---|
| 316 | ;" e.g. line='quit:(test) do' will return 'quit:(test)'
|
---|
| 317 | ;" and line will be changed to ' do' (with 1 space)
|
---|
| 318 | ;" e.g. line=' do' will return ''
|
---|
| 319 | ;" and line will be changed to 'do'
|
---|
| 320 | ;" e.g. line='test' will return 'test'
|
---|
| 321 | ;" and line will be changed to ''
|
---|
| 322 | ;" NO e.g. line='..test' will return '...'
|
---|
| 323 | ;" NO and line will be changed to 'test'
|
---|
| 324 | ;"Input: line -- PASS BY REFERENCE
|
---|
| 325 | ;" Div -- the divider of blocks. OPTIONAL. Default=" "
|
---|
| 326 | ;"Result: the first block, see above.
|
---|
| 327 | new result set result=""
|
---|
| 328 | set Div=$get(Div," ")
|
---|
| 329 | new done set done=0
|
---|
| 330 | new p set p=1
|
---|
| 331 | for do quit:(done)
|
---|
| 332 | . set p=$find(line,Div,p)
|
---|
| 333 | . if p'>0 set result=line,line="",done=1 quit
|
---|
| 334 | . if $$InQt^TMGSTUTL(line,p-1) quit
|
---|
| 335 | . set result=$extract(line,1,p-2)
|
---|
| 336 | . set line=$extract(line,p,999)
|
---|
| 337 | . set done=1
|
---|
| 338 | quit result
|
---|
| 339 | ;
|
---|
| 340 | InitColors
|
---|
| 341 | ;"Purpose: to establish tmgDbgOptions globally-scoped var for colors,
|
---|
| 342 | new ref set ref=$name(^TMG("TMGIDE",$J,"COLORS"))
|
---|
| 343 | new refMaster set refMaster=$name(^TMG("TMGIDE","COLORS"))
|
---|
| 344 | if ($data(@ref)=0)&($data(@refMaster)'=0) do
|
---|
| 345 | . merge @ref=^TMG("TMGIDE","COLORS") ;"copy master into job's
|
---|
| 346 | else do
|
---|
| 347 | . if $data(TMGcBlack)=0 do SetGlobals^TMGTERM
|
---|
| 348 | . set @ref@("BACKGROUND")=TMGcBlue
|
---|
| 349 | . set @ref@("HighExecPos")=TMGcGrey
|
---|
| 350 | . set @ref@("HighBkPos")=TMGcBRed
|
---|
| 351 | . set @ref@("BkPos")=TMGcRed
|
---|
| 352 | . set @ref@("Highlight")=TMGcFGBWhite
|
---|
| 353 | . ;"-----------------------------------
|
---|
| 354 | . set @ref@("LABEL","fg")=TMGcBYellow
|
---|
| 355 | . set @ref@("LABEL","bg")=TMGcRed
|
---|
| 356 | . set @ref@("SPECIAL","fg")=TMGcBYellow
|
---|
| 357 | . set @ref@("SPECIAL","bg")=TMGcRed
|
---|
| 358 | . ;"-----------------------------------
|
---|
| 359 | . set @ref@("NORM","fg")=TMGcFGBWhite
|
---|
| 360 | . set @ref@("NORM","bg")="@" ;"signal to use current background color
|
---|
| 361 | . set @ref@("CMD","fg")=TMGcBRed
|
---|
| 362 | . set @ref@("CMD","bg")="@"
|
---|
| 363 | . set @ref@("FN","fg")=TMGcBCyan
|
---|
| 364 | . set @ref@("FN","bg")="@"
|
---|
| 365 | . set @ref@("MOD","fg")=TMGcBBlue
|
---|
| 366 | . set @ref@("MOD","bg")="@"
|
---|
| 367 | . set @ref@("IFN","fg")=TMGcRed
|
---|
| 368 | . set @ref@("IFN","bg")="@"
|
---|
| 369 | . set @ref@("STR","fg")=TMGcBMagenta
|
---|
| 370 | . set @ref@("STR","bg")="@"
|
---|
| 371 | . set @ref@("PC","fg")=TMGcBRed
|
---|
| 372 | . set @ref@("PC","bg")="@"
|
---|
| 373 | . set @ref@("#","fg")=TMGcBYellow
|
---|
| 374 | . set @ref@("#","bg")="@"
|
---|
| 375 | . merge @refMaster=@ref
|
---|
| 376 | quit
|
---|
| 377 | ;
|
---|
| 378 | EditColors
|
---|
| 379 | ;"Purpose: Enable Edit Colors
|
---|
| 380 | write #
|
---|
| 381 | new ref set ref=$name(^TMG("TMGIDE",$J,"COLORS"))
|
---|
| 382 | new Menu,Menu2,UsrSlct,UsrSlct2,UsrRaw,fg,bg,ct
|
---|
| 383 | set ct=1
|
---|
| 384 | set Menu(0)="Pick Color to Edit"
|
---|
| 385 | set Menu(ct)="Window Background color"_$char(9)_"BACKGROUND",ct=ct+1
|
---|
| 386 | set Menu(ct)="Current Execution Position Background Color"_$char(9)_"HighExecPos",ct=ct+1
|
---|
| 387 | set Menu(ct)="Highlighted Breakpoint Background Color"_$char(9)_"HighBkPos",ct=ct+1
|
---|
| 388 | set Menu(ct)="Breakpoint Background Color"_$char(9)_"BkPos",ct=ct+1
|
---|
| 389 | set Menu(ct)="Highlight Background Color"_$char(9)_"Highlight",ct=ct+1
|
---|
| 390 |
|
---|
| 391 | set Menu(ct)="Label Foreground & Background Color"_$char(9)_"LABEL",ct=ct+1
|
---|
| 392 | set Menu(ct)="'Special' Foreground & Background Color"_$char(9)_"SPECIAL",ct=ct+1
|
---|
| 393 |
|
---|
| 394 | set Menu(ct)="Normal Text Foreground Color"_$char(9)_"NORM",ct=ct+1
|
---|
| 395 | set Menu(ct)="Command Foreground Color"_$char(9)_"CMD",ct=ct+1
|
---|
| 396 | set Menu(ct)="Functions Foreground Color"_$char(9)_"FN",ct=ct+1
|
---|
| 397 | set Menu(ct)="Module/Global reference Foreground Color"_$char(9)_"MOD",ct=ct+1
|
---|
| 398 | set Menu(ct)="Mumps intrinsic functions Foreground Color"_$char(9)_"IFN",ct=ct+1
|
---|
| 399 | set Menu(ct)="String Foreground Color"_$char(9)_"STR",ct=ct+1
|
---|
| 400 | set Menu(ct)="Post-conditional Foreground Color"_$char(9)_"PC",ct=ct+1
|
---|
| 401 | set Menu(ct)="Comments Foreground Color"_$char(9)_"#",ct=ct+1
|
---|
| 402 | new i
|
---|
| 403 | M1 set i=0
|
---|
| 404 | for set i=$order(Menu(i)) quit:(i="") do
|
---|
| 405 | . new bg,fg
|
---|
| 406 | . new mode set mode=$piece(Menu(i),$char(9),2)
|
---|
| 407 | . if "BACKGROUND,Highlight,HighBkPos,HighExecPos,BkPos"[mode do
|
---|
| 408 | . . set bg=$get(@ref@(mode))
|
---|
| 409 | . . set fg=$select(bg=0:7,1:10)
|
---|
| 410 | . else do
|
---|
| 411 | . . set fg=$get(@ref@(mode,"fg"))
|
---|
| 412 | . . set bg=$get(@ref@(mode,"bg"))
|
---|
| 413 | . . if bg="@" set bg=$get(@ref@("BACKGROUND"),0)
|
---|
| 414 | . set Menu(i,"COLOR","fg")=fg
|
---|
| 415 | . set Menu(i,"COLOR","bg")=bg
|
---|
| 416 | ;
|
---|
| 417 | set UsrSlct=$$Menu^TMGUSRIF(.Menu,"^",.UsrRaw)
|
---|
| 418 | if UsrSlct="^" goto ECDn
|
---|
| 419 | if "BACKGROUND,Highlight,HighBkPos,HighExecPos,BkPos"[UsrSlct do goto M1
|
---|
| 420 | . set @ref@(UsrSlct)=$$PickBGColor^TMGTERM()
|
---|
| 421 | if UsrSlct=0 set UsrSlct="" goto M1
|
---|
| 422 | if "SPECIAL,LABEL"'[UsrSlct do goto M1
|
---|
| 423 | . new bg set bg=$get(@ref@("BACKGROUND"),0)
|
---|
| 424 | . write "Setting bg=",bg,!
|
---|
| 425 | . set @ref@(UsrSlct,"fg")=$$PickFGColor^TMGTERM(@ref@(UsrSlct,"fg"),bg)
|
---|
| 426 |
|
---|
| 427 | new Label set Label=$get(Menu(UsrRaw))
|
---|
| 428 | kill Menu2
|
---|
| 429 | set Menu2(0)="For "_$piece(Label,$char(9),1)_"..."
|
---|
| 430 | set Menu2(1)="Edit Foreground color"_$char(9)_"fg"
|
---|
| 431 | set Menu2(2)="Edit Background color"_$char(9)_"bg"
|
---|
| 432 | set Menu2(3)="Edit BOTH colors"_$char(9)_"fg&bg"
|
---|
| 433 | write !
|
---|
| 434 | M2 set fg=+$get(@ref@(UsrSlct,"fg"),1)
|
---|
| 435 | set bg=+$get(@ref@(UsrSlct,"bg"),0)
|
---|
| 436 | do VCOLORS^TMGTERM(fg,bg)
|
---|
| 437 | write "Here are the current colors..."
|
---|
| 438 | do VTATRIB^TMGTERM(0) ;"Reset colors
|
---|
| 439 | write !
|
---|
| 440 | set UsrSlct2=$$Menu^TMGUSRIF(.Menu2,"^",.UsrRaw)
|
---|
| 441 | if UsrSlct2="^" goto M1
|
---|
| 442 |
|
---|
| 443 | M3 if UsrSlct2="fg" do goto M2
|
---|
| 444 | . set @ref@(UsrSlct,"fg")=$$PickFGColor^TMGTERM(@ref@(UsrSlct,"fg"),@ref@(UsrSlct,"bg"))
|
---|
| 445 | if UsrSlct2="bg" do goto M2
|
---|
| 446 | . set @ref@(UsrSlct,"bg")=$$PickBGColor^TMGTERM(@ref@(UsrSlct,"bg"))
|
---|
| 447 | if UsrSlct2="fg&bg" do goto M2
|
---|
| 448 | . do PickColors^TMGTERM(.fg,.bg)
|
---|
| 449 | . set @ref@(UsrSlct,"fg")=fg
|
---|
| 450 | . set @ref@(UsrSlct,"bg")=bg
|
---|
| 451 | goto M2
|
---|
| 452 |
|
---|
| 453 | ECDn
|
---|
| 454 | new % set %=2
|
---|
| 455 | write "Set current colors as default"
|
---|
| 456 | do YN^DICN
|
---|
| 457 | if %=1 do
|
---|
| 458 | . kill ^TMG("TMGIDE","COLORS")
|
---|
| 459 | . merge ^TMG("TMGIDE","COLORS")=^TMG("TMGIDE",$J,"COLORS")
|
---|
| 460 | quit
|
---|
| 461 | ;
|
---|
| 462 | ;
|
---|
| 463 | TestColors
|
---|
| 464 | do InitColors
|
---|
| 465 | new mode
|
---|
| 466 | for mode="Highlight","HighExecPos","BkPos","HighBkPos","SPECIAL","NORM","LABEL","CMD","FN","MOD","IFN","STR","PC","#" do
|
---|
| 467 | . do SetColors^TMGIDE2(mode)
|
---|
| 468 | . write "Here is text for ",mode,"...."
|
---|
| 469 | . do SetColors^TMGIDE2("Reset")
|
---|
| 470 | . write !
|
---|
| 471 | quit
|
---|
| 472 |
|
---|
| 473 |
|
---|
| 474 | ;"============== Code for TRACE functionality =================
|
---|
| 475 |
|
---|
| 476 | ShowTrace
|
---|
| 477 | ;"Purpose: to show current trace record of execution.
|
---|
| 478 | ;"if $get(tmgDbgOptions("TRACE"))=1 quit
|
---|
| 479 | new ref set ref=$name(^TMG("TMGIDE",$J,"TRACE"))
|
---|
| 480 | if $data(@ref) do
|
---|
| 481 | . write "SHOW TRACE RECORDS:",!
|
---|
| 482 | . new NumRecs set NumRecs=$order(@ref@(""),-1)
|
---|
| 483 | . write NumRecs," trace lines to display",!
|
---|
| 484 | . new count set count=1
|
---|
| 485 | . new % set %=1
|
---|
| 486 | . write "Also display code for each line" do YN^DICN write !
|
---|
| 487 | . if %=-1 quit
|
---|
| 488 | . new showCode set showCode=(%=1)
|
---|
| 489 | . new Colorize set Colorize=0
|
---|
| 490 | . if %=1 do quit:(%=-1)
|
---|
| 491 | . . set %=1 write "Colorize code" do YN^DICN write !
|
---|
| 492 | . . set Colorize=(%=1)
|
---|
| 493 | . new %ZIS
|
---|
| 494 | . set %ZIS("A")="Enter Output Device: "
|
---|
| 495 | . set %ZIS("B")="HOME"
|
---|
| 496 | . do ^%ZIS ;"standard device call
|
---|
| 497 | . if POP do quit
|
---|
| 498 | . . do ShowError^TMGDEBUG(.PriorErrorFound,"Error opening output. Aborting.")
|
---|
| 499 | . use IO
|
---|
| 500 | . new i set i=""
|
---|
| 501 | . for set i=$order(@ref@(i)) quit:(i="")!($get(TMGPTCABORT)=1) do
|
---|
| 502 | . . new s set s=$get(@ref@(i))
|
---|
| 503 | . . write s
|
---|
| 504 | . . if showCode do
|
---|
| 505 | . . . new pos set pos=$piece(s,".",$length(s,"."))
|
---|
| 506 | . . . if pos="" write " ??",! quit
|
---|
| 507 | . . . ;"write "pos=",pos,!
|
---|
| 508 | . . . new code
|
---|
| 509 | . . . do
|
---|
| 510 | . . . . new $etrap set $etrap="set code=""Error -- ""_pos,$etrap="""",$ecode="""""
|
---|
| 511 | . . . . set code=$text(@pos)
|
---|
| 512 | . . . write ?25,":"
|
---|
| 513 | . . . new x for x=1:1:$length(s,".")-1 write " "
|
---|
| 514 | . . . if Colorize do
|
---|
| 515 | . . . . if $$ShowLine(code,.tmgDbgOptions)
|
---|
| 516 | . . . . do SetColors^TMGIDE2("Reset")
|
---|
| 517 | . . . else write code
|
---|
| 518 | . . . write !
|
---|
| 519 | . . else write " ",!
|
---|
| 520 | . . ;"set count=count+1
|
---|
| 521 | . . if count>20 do
|
---|
| 522 | . . . do PressToCont^TMGUSRIF ;" will set TMGPTCABORT=1 if user entered ^
|
---|
| 523 | . . . do CUU^TMGTERM(1)
|
---|
| 524 | . . . write " ",!
|
---|
| 525 | . . . do CUU^TMGTERM(1)
|
---|
| 526 | . . . set count=1
|
---|
| 527 | else do
|
---|
| 528 | . write "(No Trace record found)",!
|
---|
| 529 | do ^%ZISC ;" Close the output device
|
---|
| 530 | do PressToCont^TMGUSRIF
|
---|
| 531 | quit
|
---|
| 532 |
|
---|
| 533 | RecordTrace(ExecPos)
|
---|
| 534 | ;"Purpose: To keep trace record of execution as program runs.
|
---|
| 535 | ;"Input:ExecPos -- Current execution position
|
---|
| 536 | new ref set ref=$name(^TMG("TMGIDE",$J,"TRACE"))
|
---|
| 537 | new Stack do GetStackInfo^TMGIDE2(.Stack,ExecPos)
|
---|
| 538 | new str set str=$$StackStr(.Stack)
|
---|
| 539 | new i set i=+$get(@ref)+1
|
---|
| 540 | set @ref@(i)=str
|
---|
| 541 | set @ref=i
|
---|
| 542 | quit
|
---|
| 543 |
|
---|
| 544 | StackStr(Stack)
|
---|
| 545 | ;"Purpose: Turn stack array into a single string
|
---|
| 546 | ;"Input: Stack -- PASS BY REFERENCE, Numbered array, as created by GetStackInfo^TMGIDE2
|
---|
| 547 | ;"Result: returns string with latest position, with
|
---|
| 548 | ;" a "." leading for each level of indenction.
|
---|
| 549 | ;"
|
---|
| 550 | new result set result=""
|
---|
| 551 | new count set count=+$order(Stack(""),-1)
|
---|
| 552 | if count>0 do
|
---|
| 553 | . new x for x=1:1:(count-1) set result=result_"."
|
---|
| 554 | . new s set s=$get(Stack(count))
|
---|
| 555 | . if s[" <--" set s=$piece(s," <--",1)
|
---|
| 556 | . if s[" " set s=$piece(s," ",2)
|
---|
| 557 | . set result=result_s
|
---|
| 558 | quit result
|
---|
| 559 |
|
---|
| 560 | ;"============== Code for VAR TRACING functionality =================
|
---|
| 561 |
|
---|
| 562 | ShowVTrace
|
---|
| 563 | ;"Purpose: Output changes from last step
|
---|
| 564 | new tmgRefNum set tmgRefNum=+$order(^TMG("TMGIDE",$J,"VARTRACE","DELTA",""),-1)
|
---|
| 565 | new tmgRefDelta set tmgRefDelta=$name(^TMG("TMGIDE",$J,"VARTRACE","DELTA",tmgRefNum))
|
---|
| 566 | new TMG set TMG(1)="ADDED^Additions",TMG(2)="KILLED^Kills",TMG(3)="CHANGED^Changes"
|
---|
| 567 | new i for i=1,2,3 do
|
---|
| 568 | . new node set node=$piece(TMG(i),"^",1)
|
---|
| 569 | . new title set title=$piece(TMG(i),"^",2)
|
---|
| 570 | . if $data(@tmgRefDelta@(node)) do
|
---|
| 571 | . . write title,": "
|
---|
| 572 | . . new varname set varname=""
|
---|
| 573 | . . for set varname=$order(@tmgRefDelta@(node,varname)) quit:(varname="") do
|
---|
| 574 | . . . write varname,"=",$get(@tmgRefDelta@(node,varname))," ; "
|
---|
| 575 | . . write !
|
---|
| 576 | quit
|
---|
| 577 |
|
---|
| 578 |
|
---|
| 579 | RecordVTrace
|
---|
| 580 | ;"Purpose: To keep a trace of changes to the system variable table.
|
---|
| 581 | new tmgFullRef set tmgFullRef=$name(^TMG("TMGIDE",$J,"VARTRACE","FULL"))
|
---|
| 582 | new tmgRefNum set tmgRefNum=+$order(@tmgFullRef@(""),-1)+1
|
---|
| 583 | if tmgRefNum'>0 goto RVTDn
|
---|
| 584 | new tmgRefCurF set tmgRefCurF=$name(@tmgFullRef@(tmgRefNum))
|
---|
| 585 | new tmgRefPriorF set tmgRefPriorF=$name(@tmgFullRef@(tmgRefNum-1))
|
---|
| 586 | new tmgRefDelta set tmgRefDelta=$name(^TMG("TMGIDE",$J,"VARTRACE","DELTA",tmgRefNum))
|
---|
| 587 | do StoreVars(tmgRefCurF)
|
---|
| 588 | if $data(@tmgRefPriorF) do
|
---|
| 589 | . do DiffVars(tmgRefCurF,tmgRefPriorF,tmgRefDelta)
|
---|
| 590 | . kill @tmgRefPriorF
|
---|
| 591 | RVTDn quit
|
---|
| 592 |
|
---|
| 593 | StoreVars(tmgRef)
|
---|
| 594 | ;"Purpose: To copy system variable table to a storage area
|
---|
| 595 | ;"Input: Ref -- the NAME of the global to store table at
|
---|
| 596 | ;"Results: none
|
---|
| 597 | ;"NOTICE: all vars beginning with "tmg" are NOT shown.
|
---|
| 598 | new tmgArray zshow "V":tmgArray ;"copy system table to local variable
|
---|
| 599 | new idx set idx=0
|
---|
| 600 | for set idx=$order(tmgArray("V",idx)) quit:(idx="") do
|
---|
| 601 | . new s set s=tmgArray("V",idx)
|
---|
| 602 | . new varname set varname=$piece(s,"=",1)
|
---|
| 603 | . quit:(varname="")!($extract(varname,1,3)="tmg")
|
---|
| 604 | . new value set value=$p(s,"=",2,999)
|
---|
| 605 | . set @tmgRef@(varname)=value ;"reformat and store in a global var
|
---|
| 606 | quit
|
---|
| 607 |
|
---|
| 608 | DiffVars(tmgRefCurF,tmgRefPriorF,tmgRefDelta)
|
---|
| 609 | ;"Purpose: To create a record that shows difference between tmgRefCurF and
|
---|
| 610 | ;" tmgRefPriorF, and stores the difference
|
---|
| 611 | ;"Note: Possible differences:
|
---|
| 612 | ;" 1. New record has a new variable, not previously in existence
|
---|
| 613 | ;" 2. New record has same variable, but changed value
|
---|
| 614 | ;" 3. New record does NOT have variable that previously existed.
|
---|
| 615 | ;"Input: tmgRefCurF -- reference of current full variable store
|
---|
| 616 | ;" tmgRefPriorF -- reference of prior full viariable store
|
---|
| 617 | ;" tmgRefDelta -- reference to store changes to. Output Format:
|
---|
| 618 | ;" @tmgRefDelta@('ADDED',varname)=value
|
---|
| 619 | ;" @tmgRefDelta@('KILLED',varname)=""
|
---|
| 620 | ;" @tmgRefDelta@('CHANGED',varname)=new value
|
---|
| 621 | ;"Result: None. But any prior entry in @tmgRefDelta is deleted and changed as above.
|
---|
| 622 | ;
|
---|
| 623 | kill @tmgRefDelta
|
---|
| 624 | new varname
|
---|
| 625 | ;"First look for additions and changes
|
---|
| 626 | set varname=""
|
---|
| 627 | for set varname=$order(@tmgRefCurF@(varname)) quit:(varname="") do
|
---|
| 628 | . if $data(@tmgRefPriorF@(varname)) do quit
|
---|
| 629 | . . if $get(@tmgRefPriorF@(varname))'=$get(@tmgRefCurF@(varname)) do
|
---|
| 630 | . . . set @tmgRefDelta@("CHANGED",varname)=$get(@tmgRefCurF@(varname))
|
---|
| 631 | . set @tmgRefDelta@("ADDED",varname)=$get(@tmgRefCurF@(varname))
|
---|
| 632 | ;
|
---|
| 633 | ;"Next, look for deletions
|
---|
| 634 | set varname=""
|
---|
| 635 | for set varname=$order(@tmgRefPriorF@(varname)) quit:(varname="") do
|
---|
| 636 | . if $data(@tmgRefCurF@(varname)) quit
|
---|
| 637 | . set @tmgRefDelta@("KILLED",varname)=$get(@tmgRefPriorF@(varname))
|
---|
| 638 | ;
|
---|
| 639 | quit
|
---|
| 640 | ;";"Finally, look for changes
|
---|
| 641 | ;"set varname=""
|
---|
| 642 | ;"for set varname=$order(@tmgRefCurF@(varname)) quit:(varname="") do
|
---|
| 643 | ;". if $data(@tmgRefPriorF@(varname))=0 quit
|
---|
| 644 | ;". if $get(@tmgRefPriorF@(varname))=$get(@tmgRefCurF@(varname)) quit
|
---|
| 645 | ;". set @tmgRefDelta@("CHANGED",varname)=$get(@tmgRefCurF@(varname))
|
---|
| 646 | ;"quit
|
---|
| 647 |
|
---|
| 648 | ;"================================================================ |
---|