1 | TMGIDE6 ;TMG/kst/GT/M debugger Code Coloration ;4/4/09, 5/27/10
|
---|
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 | ;"write "$DATA(@ref)=",$DATA(@ref),!
|
---|
344 | new refMaster set refMaster=$name(^TMG("TMGIDE","COLORS"))
|
---|
345 | ;"write "refMaster=",refMaster,!
|
---|
346 | ;"write "$DATA(@refMaster)=",$DATA(@refMaster),!
|
---|
347 | ;"write "here is dump...",!
|
---|
348 | ;"zwr ^TMG("TMGIDE","COLORS",*)
|
---|
349 | ;"do PressToCont^TMGUSRIF
|
---|
350 | if ($data(@ref)=0) do
|
---|
351 | . if ($data(@refMaster)'=0) do
|
---|
352 | . . merge @ref=^TMG("TMGIDE","COLORS") ;"copy master into job's
|
---|
353 | . else do
|
---|
354 | . . if $data(TMGcBlack)=0 do SetGlobals^TMGTERM
|
---|
355 | . . set @ref@("BACKGROUND")=TMGcBlue
|
---|
356 | . . set @ref@("HighExecPos")=TMGcGrey
|
---|
357 | . . set @ref@("HighBkPos")=TMGcBRed
|
---|
358 | . . set @ref@("BkPos")=TMGcRed
|
---|
359 | . . set @ref@("Highlight")=TMGcFGBWhite
|
---|
360 | . . ;"-----------------------------------
|
---|
361 | . . set @ref@("LABEL","fg")=TMGcBYellow
|
---|
362 | . . set @ref@("LABEL","bg")=TMGcRed
|
---|
363 | . . set @ref@("SPECIAL","fg")=TMGcBYellow
|
---|
364 | . . set @ref@("SPECIAL","bg")=TMGcRed
|
---|
365 | . . ;"-----------------------------------
|
---|
366 | . . set @ref@("NORM","fg")=TMGcFGBWhite
|
---|
367 | . . set @ref@("NORM","bg")="@" ;"signal to use current background color
|
---|
368 | . . set @ref@("CMD","fg")=TMGcBRed
|
---|
369 | . . set @ref@("CMD","bg")="@"
|
---|
370 | . . set @ref@("FN","fg")=TMGcBCyan
|
---|
371 | . . set @ref@("FN","bg")="@"
|
---|
372 | . . set @ref@("MOD","fg")=TMGcBBlue
|
---|
373 | . . set @ref@("MOD","bg")="@"
|
---|
374 | . . set @ref@("IFN","fg")=TMGcRed
|
---|
375 | . . set @ref@("IFN","bg")="@"
|
---|
376 | . . set @ref@("STR","fg")=TMGcBMagenta
|
---|
377 | . . set @ref@("STR","bg")="@"
|
---|
378 | . . set @ref@("PC","fg")=TMGcBRed
|
---|
379 | . . set @ref@("PC","bg")="@"
|
---|
380 | . . set @ref@("#","fg")=TMGcBYellow
|
---|
381 | . . set @ref@("#","bg")="@"
|
---|
382 | . . merge @refMaster=@ref
|
---|
383 | quit
|
---|
384 | ;
|
---|
385 | EditColors
|
---|
386 | ;"Purpose: Enable Edit Colors
|
---|
387 | write #
|
---|
388 | new ref set ref=$name(^TMG("TMGIDE",$J,"COLORS"))
|
---|
389 | new Menu,Menu2,UsrSlct,UsrSlct2,UsrRaw,fg,bg,ct
|
---|
390 | set ct=1
|
---|
391 | set Menu(0)="Pick Color to Edit"
|
---|
392 | set Menu(ct)="Window Background color"_$char(9)_"BACKGROUND",ct=ct+1
|
---|
393 | set Menu(ct)="Current Execution Position Background Color"_$char(9)_"HighExecPos",ct=ct+1
|
---|
394 | set Menu(ct)="Highlighted Breakpoint Background Color"_$char(9)_"HighBkPos",ct=ct+1
|
---|
395 | set Menu(ct)="Breakpoint Background Color"_$char(9)_"BkPos",ct=ct+1
|
---|
396 | set Menu(ct)="Highlight Background Color"_$char(9)_"Highlight",ct=ct+1
|
---|
397 |
|
---|
398 | set Menu(ct)="Label Foreground & Background Color"_$char(9)_"LABEL",ct=ct+1
|
---|
399 | set Menu(ct)="'Special' Foreground & Background Color"_$char(9)_"SPECIAL",ct=ct+1
|
---|
400 |
|
---|
401 | set Menu(ct)="Normal Text Foreground Color"_$char(9)_"NORM",ct=ct+1
|
---|
402 | set Menu(ct)="Command Foreground Color"_$char(9)_"CMD",ct=ct+1
|
---|
403 | set Menu(ct)="Functions Foreground Color"_$char(9)_"FN",ct=ct+1
|
---|
404 | set Menu(ct)="Module/Global reference Foreground Color"_$char(9)_"MOD",ct=ct+1
|
---|
405 | set Menu(ct)="Mumps intrinsic functions Foreground Color"_$char(9)_"IFN",ct=ct+1
|
---|
406 | set Menu(ct)="String Foreground Color"_$char(9)_"STR",ct=ct+1
|
---|
407 | set Menu(ct)="Post-conditional Foreground Color"_$char(9)_"PC",ct=ct+1
|
---|
408 | set Menu(ct)="Comments Foreground Color"_$char(9)_"#",ct=ct+1
|
---|
409 | new i
|
---|
410 | M1 set i=0
|
---|
411 | for set i=$order(Menu(i)) quit:(i="") do
|
---|
412 | . new bg,fg
|
---|
413 | . new mode set mode=$piece(Menu(i),$char(9),2)
|
---|
414 | . if "BACKGROUND,Highlight,HighBkPos,HighExecPos,BkPos"[mode do
|
---|
415 | . . set bg=$get(@ref@(mode))
|
---|
416 | . . set fg=$select(bg=0:7,1:10)
|
---|
417 | . else do
|
---|
418 | . . set fg=$get(@ref@(mode,"fg"))
|
---|
419 | . . set bg=$get(@ref@(mode,"bg"))
|
---|
420 | . . if bg="@" set bg=$get(@ref@("BACKGROUND"),0)
|
---|
421 | . set Menu(i,"COLOR","fg")=fg
|
---|
422 | . set Menu(i,"COLOR","bg")=bg
|
---|
423 | ;
|
---|
424 | set UsrSlct=$$Menu^TMGUSRIF(.Menu,"^",.UsrRaw)
|
---|
425 | if UsrSlct="^" goto ECDn
|
---|
426 | if "BACKGROUND,Highlight,HighBkPos,HighExecPos,BkPos"[UsrSlct do goto M1
|
---|
427 | . set @ref@(UsrSlct)=$$PickBGColor^TMGTERM()
|
---|
428 | if UsrSlct=0 set UsrSlct="" goto M1
|
---|
429 | if "SPECIAL,LABEL"'[UsrSlct do goto M1
|
---|
430 | . new bg set bg=$get(@ref@("BACKGROUND"),0)
|
---|
431 | . write "Setting bg=",bg,!
|
---|
432 | . set @ref@(UsrSlct,"fg")=$$PickFGColor^TMGTERM(@ref@(UsrSlct,"fg"),bg)
|
---|
433 |
|
---|
434 | new Label set Label=$get(Menu(UsrRaw))
|
---|
435 | kill Menu2
|
---|
436 | set Menu2(0)="For "_$piece(Label,$char(9),1)_"..."
|
---|
437 | set Menu2(1)="Edit Foreground color"_$char(9)_"fg"
|
---|
438 | set Menu2(2)="Edit Background color"_$char(9)_"bg"
|
---|
439 | set Menu2(3)="Edit BOTH colors"_$char(9)_"fg&bg"
|
---|
440 | write !
|
---|
441 | M2 set fg=+$get(@ref@(UsrSlct,"fg"),1)
|
---|
442 | set bg=+$get(@ref@(UsrSlct,"bg"),0)
|
---|
443 | do VCOLORS^TMGTERM(fg,bg)
|
---|
444 | write "Here are the current colors..."
|
---|
445 | do VTATRIB^TMGTERM(0) ;"Reset colors
|
---|
446 | write !
|
---|
447 | set UsrSlct2=$$Menu^TMGUSRIF(.Menu2,"^",.UsrRaw)
|
---|
448 | if UsrSlct2="^" goto M1
|
---|
449 |
|
---|
450 | M3 if UsrSlct2="fg" do goto M2
|
---|
451 | . set @ref@(UsrSlct,"fg")=$$PickFGColor^TMGTERM(@ref@(UsrSlct,"fg"),@ref@(UsrSlct,"bg"))
|
---|
452 | if UsrSlct2="bg" do goto M2
|
---|
453 | . set @ref@(UsrSlct,"bg")=$$PickBGColor^TMGTERM(@ref@(UsrSlct,"bg"))
|
---|
454 | if UsrSlct2="fg&bg" do goto M2
|
---|
455 | . do PickColors^TMGTERM(.fg,.bg)
|
---|
456 | . set @ref@(UsrSlct,"fg")=fg
|
---|
457 | . set @ref@(UsrSlct,"bg")=bg
|
---|
458 | goto M2
|
---|
459 |
|
---|
460 | ECDn
|
---|
461 | new % set %=2
|
---|
462 | write "Set current colors as default"
|
---|
463 | do YN^DICN
|
---|
464 | if %=1 do
|
---|
465 | . kill ^TMG("TMGIDE","COLORS")
|
---|
466 | . merge ^TMG("TMGIDE","COLORS")=^TMG("TMGIDE",$J,"COLORS")
|
---|
467 | quit
|
---|
468 | ;
|
---|
469 | ;
|
---|
470 | TestColors
|
---|
471 | do InitColors
|
---|
472 | new mode
|
---|
473 | for mode="Highlight","HighExecPos","BkPos","HighBkPos","SPECIAL","NORM","LABEL","CMD","FN","MOD","IFN","STR","PC","#" do
|
---|
474 | . do SetColors^TMGIDE2(mode)
|
---|
475 | . write "Here is text for ",mode,"...."
|
---|
476 | . do SetColors^TMGIDE2("Reset")
|
---|
477 | . write !
|
---|
478 | quit
|
---|
479 |
|
---|
480 |
|
---|
481 | ;"============== Code for TRACE functionality =================
|
---|
482 |
|
---|
483 | ShowTrace
|
---|
484 | ;"Purpose: to show current trace record of execution.
|
---|
485 | ;"if $get(tmgDbgOptions("TRACE"))=1 quit
|
---|
486 | new ref set ref=$name(^TMG("TMGIDE",$J,"TRACE"))
|
---|
487 | if $data(@ref) do
|
---|
488 | . write "SHOW TRACE RECORDS:",!
|
---|
489 | . new NumRecs set NumRecs=$order(@ref@(""),-1)
|
---|
490 | . write NumRecs," trace lines to display",!
|
---|
491 | . new count set count=1
|
---|
492 | . new % set %=1
|
---|
493 | . write "Also display code for each line" do YN^DICN write !
|
---|
494 | . if %=-1 quit
|
---|
495 | . new showCode set showCode=(%=1)
|
---|
496 | . new Colorize set Colorize=0
|
---|
497 | . if %=1 do quit:(%=-1)
|
---|
498 | . . set %=1 write "Colorize code" do YN^DICN write !
|
---|
499 | . . set Colorize=(%=1)
|
---|
500 | . new %ZIS
|
---|
501 | . set %ZIS("A")="Enter Output Device: "
|
---|
502 | . set %ZIS("B")="HOME"
|
---|
503 | . do ^%ZIS ;"standard device call
|
---|
504 | . if POP do quit
|
---|
505 | . . do ShowError^TMGDEBUG(.PriorErrorFound,"Error opening output. Aborting.")
|
---|
506 | . use IO
|
---|
507 | . new i set i=""
|
---|
508 | . for set i=$order(@ref@(i)) quit:(i="")!($get(TMGPTCABORT)=1) do
|
---|
509 | . . new s set s=$get(@ref@(i))
|
---|
510 | . . write s
|
---|
511 | . . if showCode do
|
---|
512 | . . . new pos set pos=$piece(s,".",$length(s,"."))
|
---|
513 | . . . if pos="" write " ??",! quit
|
---|
514 | . . . ;"write "pos=",pos,!
|
---|
515 | . . . new code
|
---|
516 | . . . do
|
---|
517 | . . . . new $etrap set $etrap="set code=""Error -- ""_pos,$etrap="""",$ecode="""""
|
---|
518 | . . . . set code=$text(@pos)
|
---|
519 | . . . write ?25,":"
|
---|
520 | . . . new x for x=1:1:$length(s,".")-1 write " "
|
---|
521 | . . . if Colorize do
|
---|
522 | . . . . if $$ShowLine(code,.tmgDbgOptions)
|
---|
523 | . . . . do SetColors^TMGIDE2("Reset")
|
---|
524 | . . . else write code
|
---|
525 | . . . write !
|
---|
526 | . . else write " ",!
|
---|
527 | . . ;"set count=count+1
|
---|
528 | . . if count>20 do
|
---|
529 | . . . do PressToCont^TMGUSRIF ;" will set TMGPTCABORT=1 if user entered ^
|
---|
530 | . . . do CUU^TMGTERM(1)
|
---|
531 | . . . write " ",!
|
---|
532 | . . . do CUU^TMGTERM(1)
|
---|
533 | . . . set count=1
|
---|
534 | else do
|
---|
535 | . write "(No Trace record found)",!
|
---|
536 | do ^%ZISC ;" Close the output device
|
---|
537 | do PressToCont^TMGUSRIF
|
---|
538 | quit
|
---|
539 |
|
---|
540 | RecordTrace(ExecPos)
|
---|
541 | ;"Purpose: To keep trace record of execution as program runs.
|
---|
542 | ;"Input:ExecPos -- Current execution position
|
---|
543 | new ref set ref=$name(^TMG("TMGIDE",$J,"TRACE"))
|
---|
544 | new Stack do GetStackInfo^TMGIDE2(.Stack,ExecPos)
|
---|
545 | new str set str=$$StackStr(.Stack)
|
---|
546 | new i set i=+$get(@ref)+1
|
---|
547 | set @ref@(i)=str
|
---|
548 | set @ref=i
|
---|
549 | quit
|
---|
550 |
|
---|
551 | StackStr(Stack)
|
---|
552 | ;"Purpose: Turn stack array into a single string
|
---|
553 | ;"Input: Stack -- PASS BY REFERENCE, Numbered array, as created by GetStackInfo^TMGIDE2
|
---|
554 | ;"Result: returns string with latest position, with
|
---|
555 | ;" a "." leading for each level of indenction.
|
---|
556 | ;"
|
---|
557 | new result set result=""
|
---|
558 | new count set count=+$order(Stack(""),-1)
|
---|
559 | if count>0 do
|
---|
560 | . new x for x=1:1:(count-1) set result=result_"."
|
---|
561 | . new s set s=$get(Stack(count))
|
---|
562 | . if s[" <--" set s=$piece(s," <--",1)
|
---|
563 | . if s[" " set s=$piece(s," ",2)
|
---|
564 | . set result=result_s
|
---|
565 | quit result
|
---|
566 |
|
---|
567 | ;"============== Code for VAR TRACING functionality =================
|
---|
568 |
|
---|
569 | ShowVTrace
|
---|
570 | ;"Purpose: Output changes from last step
|
---|
571 | new tmgRefNum set tmgRefNum=+$order(^TMG("TMGIDE",$J,"VARTRACE","DELTA",""),-1)
|
---|
572 | new tmgRefDelta set tmgRefDelta=$name(^TMG("TMGIDE",$J,"VARTRACE","DELTA",tmgRefNum))
|
---|
573 | new TMG set TMG(1)="ADDED^Additions",TMG(2)="KILLED^Kills",TMG(3)="CHANGED^Changes"
|
---|
574 | new i for i=1,2,3 do
|
---|
575 | . new node set node=$piece(TMG(i),"^",1)
|
---|
576 | . new title set title=$piece(TMG(i),"^",2)
|
---|
577 | . if $data(@tmgRefDelta@(node)) do
|
---|
578 | . . write title,": "
|
---|
579 | . . new varname set varname=""
|
---|
580 | . . for set varname=$order(@tmgRefDelta@(node,varname)) quit:(varname="") do
|
---|
581 | . . . write varname,"=",$get(@tmgRefDelta@(node,varname))," ; "
|
---|
582 | . . write !
|
---|
583 | quit
|
---|
584 |
|
---|
585 |
|
---|
586 | RecordVTrace
|
---|
587 | ;"Purpose: To keep a trace of changes to the system variable table.
|
---|
588 | new tmgFullRef set tmgFullRef=$name(^TMG("TMGIDE",$J,"VARTRACE","FULL"))
|
---|
589 | new tmgRefNum set tmgRefNum=+$order(@tmgFullRef@(""),-1)+1
|
---|
590 | if tmgRefNum'>0 goto RVTDn
|
---|
591 | new tmgRefCurF set tmgRefCurF=$name(@tmgFullRef@(tmgRefNum))
|
---|
592 | new tmgRefPriorF set tmgRefPriorF=$name(@tmgFullRef@(tmgRefNum-1))
|
---|
593 | new tmgRefDelta set tmgRefDelta=$name(^TMG("TMGIDE",$J,"VARTRACE","DELTA",tmgRefNum))
|
---|
594 | do StoreVars(tmgRefCurF)
|
---|
595 | if $data(@tmgRefPriorF) do
|
---|
596 | . do DiffVars(tmgRefCurF,tmgRefPriorF,tmgRefDelta)
|
---|
597 | . kill @tmgRefPriorF
|
---|
598 | RVTDn quit
|
---|
599 |
|
---|
600 | StoreVars(tmgRef)
|
---|
601 | ;"Purpose: To copy system variable table to a storage area
|
---|
602 | ;"Input: Ref -- the NAME of the global to store table at
|
---|
603 | ;"Results: none
|
---|
604 | ;"NOTICE: all vars beginning with "tmg" are NOT shown.
|
---|
605 | new tmgArray zshow "V":tmgArray ;"copy system table to local variable
|
---|
606 | new idx set idx=0
|
---|
607 | for set idx=$order(tmgArray("V",idx)) quit:(idx="") do
|
---|
608 | . new s set s=tmgArray("V",idx)
|
---|
609 | . new varname set varname=$piece(s,"=",1)
|
---|
610 | . quit:(varname="")!($extract(varname,1,3)="tmg")
|
---|
611 | . new value set value=$p(s,"=",2,999)
|
---|
612 | . set @tmgRef@(varname)=value ;"reformat and store in a global var
|
---|
613 | quit
|
---|
614 |
|
---|
615 | DiffVars(tmgRefCurF,tmgRefPriorF,tmgRefDelta)
|
---|
616 | ;"Purpose: To create a record that shows difference between tmgRefCurF and
|
---|
617 | ;" tmgRefPriorF, and stores the difference
|
---|
618 | ;"Note: Possible differences:
|
---|
619 | ;" 1. New record has a new variable, not previously in existence
|
---|
620 | ;" 2. New record has same variable, but changed value
|
---|
621 | ;" 3. New record does NOT have variable that previously existed.
|
---|
622 | ;"Input: tmgRefCurF -- reference of current full variable store
|
---|
623 | ;" tmgRefPriorF -- reference of prior full viariable store
|
---|
624 | ;" tmgRefDelta -- reference to store changes to. Output Format:
|
---|
625 | ;" @tmgRefDelta@('ADDED',varname)=value
|
---|
626 | ;" @tmgRefDelta@('KILLED',varname)=""
|
---|
627 | ;" @tmgRefDelta@('CHANGED',varname)=new value
|
---|
628 | ;"Result: None. But any prior entry in @tmgRefDelta is deleted and changed as above.
|
---|
629 | ;
|
---|
630 | kill @tmgRefDelta
|
---|
631 | new varname
|
---|
632 | ;"First look for additions and changes
|
---|
633 | set varname=""
|
---|
634 | for set varname=$order(@tmgRefCurF@(varname)) quit:(varname="") do
|
---|
635 | . if $data(@tmgRefPriorF@(varname)) do quit
|
---|
636 | . . if $get(@tmgRefPriorF@(varname))'=$get(@tmgRefCurF@(varname)) do
|
---|
637 | . . . set @tmgRefDelta@("CHANGED",varname)=$get(@tmgRefCurF@(varname))
|
---|
638 | . set @tmgRefDelta@("ADDED",varname)=$get(@tmgRefCurF@(varname))
|
---|
639 | ;
|
---|
640 | ;"Next, look for deletions
|
---|
641 | set varname=""
|
---|
642 | for set varname=$order(@tmgRefPriorF@(varname)) quit:(varname="") do
|
---|
643 | . if $data(@tmgRefCurF@(varname)) quit
|
---|
644 | . set @tmgRefDelta@("KILLED",varname)=$get(@tmgRefPriorF@(varname))
|
---|
645 | ;
|
---|
646 | quit
|
---|
647 | ;";"Finally, look for changes
|
---|
648 | ;"set varname=""
|
---|
649 | ;"for set varname=$order(@tmgRefCurF@(varname)) quit:(varname="") do
|
---|
650 | ;". if $data(@tmgRefPriorF@(varname))=0 quit
|
---|
651 | ;". if $get(@tmgRefPriorF@(varname))=$get(@tmgRefCurF@(varname)) quit
|
---|
652 | ;". set @tmgRefDelta@("CHANGED",varname)=$get(@tmgRefCurF@(varname))
|
---|
653 | ;"quit
|
---|
654 |
|
---|
655 | ;"================================================================ |
---|