1 | TMGCODT1 ;TMG/kst/A Code Analysis Tools ;08/17/08
|
---|
2 | ;;1.0;TMG-LIB;**1**;08/17/08
|
---|
3 |
|
---|
4 | ScanAll
|
---|
5 | new pArray
|
---|
6 | set pArray=$name(^TMG("MODULE CALLS"))
|
---|
7 |
|
---|
8 | new Itr,index
|
---|
9 | new abort set abort=0
|
---|
10 | set index=$$ItrAInit^TMGITR($name(^DIC(9.8,"B")),.Itr)
|
---|
11 | do PrepProgress^TMGITR(.Itr,20,1,"index")
|
---|
12 | set index="TMGKIDS" ;"temp!
|
---|
13 | if index'="" for do quit:($$ItrANext^TMGITR(.Itr,.index)="")!abort
|
---|
14 | . if $$UserAborted^TMGUSRIF set abort=1 quit
|
---|
15 | . ;"write index,!
|
---|
16 | . do GetCalls(index,pArray)
|
---|
17 | do ProgressDone^TMGITR(.Itr)
|
---|
18 |
|
---|
19 | quit
|
---|
20 |
|
---|
21 | GetCalls(Module,pArray)
|
---|
22 | ;"Purpose: To scan one code module and look for *static* calls to other
|
---|
23 | ;" modules. It will NOT detect indirection (i.e. do @X).
|
---|
24 | ;" Call MUST have a tag. MyTag^MyMod is detected, but ^MyMod is NOT
|
---|
25 | ;"Input: Module -- the name of the module to scan, as would be used
|
---|
26 | ;" in $text(). I.e. XUP, but not ^XUP, not XUP.m
|
---|
27 | ;" Array -- PASS BY NAME, an OUT PARAMETER. Format below.
|
---|
28 | ;"Output: Array filled as follows:
|
---|
29 | ;" Array(Module,Addr)=OutSideAddr (Example of Addr=A+5^MYFUNCT)
|
---|
30 |
|
---|
31 | new curModule set curModule=$get(Module)
|
---|
32 | new blankLines set blankLines=0
|
---|
33 | new offset set offset=1
|
---|
34 | new curLabel set curLabel=""
|
---|
35 |
|
---|
36 | for do quit:(blankLines>30)
|
---|
37 | . new Addr set Addr=curLabel_"+"_offset_"^"_curModule
|
---|
38 | . new oneLine set oneLine=$text(@Addr)
|
---|
39 | . new firstChar set firstChar=$extract(oneLine,1,1)
|
---|
40 | . set offset=offset+1
|
---|
41 | . if oneLine="" set blankLines=blankLines+1 quit
|
---|
42 | . set oneLine=$$CutComment(oneLine)
|
---|
43 | . new tempLabel set tempLabel=$$GetLabel(oneLine)
|
---|
44 | . if tempLabel'="" set curLabel=tempLabel,offset=1
|
---|
45 | . new tempS set tempS=oneLine
|
---|
46 | . if tempS'["^" quit
|
---|
47 | . new done set done=0
|
---|
48 | . for quit:(tempS'["^")!(done=1) do
|
---|
49 | . . if $$InQt^TMGSTUTL(tempS,$find(tempS,"^")-1)=1 set done=1 quit
|
---|
50 | . . new preS,postS
|
---|
51 | . . do GetPrePost(.tempS,.preS,.postS)
|
---|
52 | . . if (preS="")!(postS="") quit
|
---|
53 | . . ;"write curLabel,"+",offset,"--> "
|
---|
54 | . . ;"write preS,"^",postS," [",$$Trim^TMGSTUTL(oneLine),"]",!
|
---|
55 | . . ;"if preS["$" quit
|
---|
56 | . . new tempAddr set tempAddr=preS_"^"_postS
|
---|
57 | . . ;"write "==> ",$text(@tempAddr),!
|
---|
58 | . . ;"set @pArray@("CALLS OUT",curModule,curLabel,offset,tempAddr)=""
|
---|
59 | . . set @pArray@("CALLS IN",postS_"::"_preS,curModule,curLabel,offset)=""
|
---|
60 |
|
---|
61 | quit
|
---|
62 |
|
---|
63 |
|
---|
64 | CutComment(oneLine)
|
---|
65 | ;"Purpose: to cut off any comments from line, indicated by ;
|
---|
66 | ;"Input: oneLine : string to alter
|
---|
67 | ;"Result: modified inputline
|
---|
68 |
|
---|
69 | new i,L,result
|
---|
70 | set result=$get(oneLine)
|
---|
71 | if result'[";" goto CCmDone
|
---|
72 |
|
---|
73 | new inStr,done,ch
|
---|
74 | set inStr=0,done=0
|
---|
75 | set L=$length(oneLine)
|
---|
76 | for i=1:1:L do quit:done
|
---|
77 | . set ch=$extract(oneLine,i)
|
---|
78 | . if ch="""" do
|
---|
79 | . . if inStr=0 set inStr=1 quit
|
---|
80 | . . if $extract(oneLine,i+1)="""" set i=i+1 quit
|
---|
81 | . . set inStr=0
|
---|
82 | . if (ch=";")&(inStr=0) do quit
|
---|
83 | . . set result=$extract(oneLine,1,i-1)
|
---|
84 | . . set done=1
|
---|
85 |
|
---|
86 | CCmDone quit result
|
---|
87 |
|
---|
88 |
|
---|
89 | GetLabel(oneLine)
|
---|
90 | ;"Purpose: Get label for a line, if one exists
|
---|
91 | ;"Input: oneLine : string to scan
|
---|
92 | ;"Result: Label, or "" if none
|
---|
93 |
|
---|
94 | new result set result=$get(oneLine) ;"default to entire line is label
|
---|
95 | new ch set ch=$extract(oneLine,1)
|
---|
96 | if (ch=" ")!(ch=$char(9)) do goto GLDone
|
---|
97 | . set result=""
|
---|
98 |
|
---|
99 | new i,done set done=0
|
---|
100 | for i=1:1:$length(oneLine) do quit:done
|
---|
101 | . set ch=$extract(oneLine,i)
|
---|
102 | . if (ch=" ")!(ch=$char(9))!(ch="(")!(ch=";") do quit
|
---|
103 | . . set result=$extract(oneLine,1,i-1)
|
---|
104 | . . set done=1
|
---|
105 |
|
---|
106 | GLDone quit result
|
---|
107 |
|
---|
108 |
|
---|
109 | GetPrePost(oneLine,preS,postS)
|
---|
110 | ;"Purpose: To take a string like 'write $$MyFunct^MyModule(123)' and return
|
---|
111 | ;" '$$MyFunct' in preS, and 'MyModule' in postS. Also shorten
|
---|
112 | ;" input string, oneLine, so that other calls on the same line
|
---|
113 | ;" can be processed on a separate run.
|
---|
114 | ;"Input: oneLine -- the string to process. PASS BY REFERENCE to get back
|
---|
115 | ;" shortened line with first instance cut off.
|
---|
116 | ;" preS -- PASS BY REFERENCE, an OUT PARAMETER
|
---|
117 | ;" postS -- PASS BY REFERENCE, an OUT PARAMETER
|
---|
118 | ;"Output: See purpose above
|
---|
119 | ;"Result: none
|
---|
120 |
|
---|
121 | new done,p
|
---|
122 |
|
---|
123 | ;"Work first on preS
|
---|
124 | set preS=$piece(oneLine,"^",1)
|
---|
125 | set p=$length(preS)
|
---|
126 | set done=0
|
---|
127 | if p>0 for do quit:(p=0)!(done=1)
|
---|
128 | . new ch set ch=$extract(preS,p)
|
---|
129 | . set p=p-1
|
---|
130 | . if ch?1(1A,1N) quit
|
---|
131 | . set p=p+2,done=1
|
---|
132 | set preS=$extract(preS,p,999)
|
---|
133 |
|
---|
134 | ;"weed out entries like '_^DIC' or '_U_^TMP'
|
---|
135 | ;"if ($extract(preS,1)="_")!($extract(preS,$length(preS))="_" set preS=""
|
---|
136 |
|
---|
137 |
|
---|
138 | ;"Now work on postS
|
---|
139 | set postS=$piece(oneLine,"^",2,$length(oneLine,"^"))
|
---|
140 | set p=1,done=0
|
---|
141 | for do quit:(p>$length(postS))!(done=1)
|
---|
142 | . new ch set ch=$extract(postS,p)
|
---|
143 | . set p=p+1
|
---|
144 | . if ch?1(1A,1N,1"_") quit
|
---|
145 | . set p=p-2,done=1
|
---|
146 |
|
---|
147 | set oneLine=$extract(postS,p+1,999)
|
---|
148 | set postS=$extract(postS,1,p)
|
---|
149 |
|
---|
150 | quit
|
---|
151 |
|
---|
152 | ;"=======================================================
|
---|
153 | test
|
---|
154 | new array
|
---|
155 | new DIC,X,Y
|
---|
156 | set DIC=9.8
|
---|
157 | set DIC(0)="MAEQ"
|
---|
158 | t1
|
---|
159 | do ^DIC write !
|
---|
160 | if +Y'>0 goto testDone
|
---|
161 | ;"kill array
|
---|
162 | do GetCallsOut($piece(Y,"^",2),"array")
|
---|
163 | if $data(array) zwr array
|
---|
164 | goto t1
|
---|
165 |
|
---|
166 | testDone
|
---|
167 | quit
|
---|
168 |
|
---|