| 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 | 
 | 
|---|