| 1 | KMPDU2 ;OAK/RAK - CM Tools Routine Utilities ;7/22/04  09:06
 | 
|---|
| 2 |  ;;2.0;CAPACITY MANAGEMENT TOOLS;**2**;Mar 22, 2002
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | IRSRC(KMPDDA) ;-- extrinsic function - check for local mods in INSTALL file
 | 
|---|
| 5 |  ;-----------------------------------------------------------------------
 | 
|---|
| 6 |  ; KMPDDA... DA as defined in fileman programmers manual.
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ; Return: "NO"  - no local mods.
 | 
|---|
| 9 |  ;         "YES" - local mods.
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ; This extrinsic function is called from computed field #573099 (LOCAL
 | 
|---|
| 12 |  ; MODIFICATIONS) in file #9.7 (INSTALL).
 | 
|---|
| 13 |  ;-----------------------------------------------------------------------
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 |  Q:'$G(KMPDDA) "NO"
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  N I,RTN,RETURN
 | 
|---|
| 18 |  S I=0,RETURN="NO"
 | 
|---|
| 19 |  F  S I=$O(^XPD(9.7,KMPDDA,"RTN",I)) Q:'I  D  Q:RETURN="YES"
 | 
|---|
| 20 |  .Q:'$D(^XPD(9.7,KMPDDA,"RTN",I,0))  S RTN=$P(^(0),U)
 | 
|---|
| 21 |  .S:$$ROUSRC1(RTN,"LOCAL MOD/") RETURN="YES"
 | 
|---|
| 22 |  .;S:$$ROUSRC1(RTN,"/LOCAL MOD/") RETURN="YES"
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  Q RETURN
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 | ROUFIND(KMPDY,KMPDRNM,KMPDGBL) ;-- find routines.
 | 
|---|
| 27 |  ;-----------------------------------------------------------------------
 | 
|---|
| 28 |  ; KMPDRNM.. Routine name to search for.
 | 
|---|
| 29 |  ; KMPDGBL... Global to store data.  Stored in format:
 | 
|---|
| 30 |  ;              RoutineName^RoutineSize^Checksum
 | 
|---|
| 31 |  ;-----------------------------------------------------------------------
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  K KMPDY
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  S KMPDRNM=$G(KMPDRNM),KMPDGBL=$G(KMPDGBL)
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  I KMPDGBL="" S KMPDY="[Global for storage is not defined]" Q
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 |  N DATA,LN,ROU,RTN,X,Y
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  ; kill global with check for ^tmp or ^utility.
 | 
|---|
| 42 |  D KILL^KMPDU(.DATA,KMPDGBL)
 | 
|---|
| 43 |  ; if error.
 | 
|---|
| 44 |  I $E(DATA)="[" S KMPDY=DATA Q
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 |  S KMPDY=$NA(@KMPDGBL)
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 |  ; if no asterisk (*) then look for routine.
 | 
|---|
| 49 |  I KMPDRNM'["*" D  Q
 | 
|---|
| 50 |  .; if routine name greater than 8 characters
 | 
|---|
| 51 |  .I $L(KMPDRNM)>8 S @KMPDGBL@(0)="<"_KMPDRNM_" is greater than 8 characters>" Q
 | 
|---|
| 52 |  .; if routine not defined.
 | 
|---|
| 53 |  .I '$D(^$ROUTINE(KMPDRNM)) S @KMPDGBL@(0)="<Routine "_KMPDRNM_" not defined>" Q
 | 
|---|
| 54 |  .; if defined.
 | 
|---|
| 55 |  .S $P(@KMPDGBL@(0),U)=KMPDRNM
 | 
|---|
| 56 |  .; checksum
 | 
|---|
| 57 |  .S X=KMPDRNM X ^%ZOSF("RSUM") S $P(@KMPDGBL@(0),U,2)=Y
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  ; remove "*" if any.
 | 
|---|
| 60 |  S:$E(KMPDRNM,$L(KMPDRNM))="*" KMPDRNM=$E(KMPDRNM,1,$L(KMPDRNM)-1)
 | 
|---|
| 61 |  S (ROU,RTN)=KMPDRNM,LN=0
 | 
|---|
| 62 |  S ROU=$E(ROU,1,$L(ROU)-1)
 | 
|---|
| 63 |  S ROU=ROU_$C(($A($E(KMPDRNM,$L(KMPDRNM)))-1))_"zz"
 | 
|---|
| 64 |  F  S ROU=$O(^$ROUTINE(ROU)) Q:ROU=""!($E(ROU,1,$L(RTN))'=RTN)  D 
 | 
|---|
| 65 |  .S $P(@KMPDGBL@(LN),U)=ROU
 | 
|---|
| 66 |  .; checksum
 | 
|---|
| 67 |  .S X=ROU X ^%ZOSF("RSUM") S $P(@KMPDGBL@(LN),U,2)=Y
 | 
|---|
| 68 |  .S LN=LN+1
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  S:'$D(@KMPDGBL) KMPDY(0)="<No Data To Report>"
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | ROUINQ(KMPDY,KMPDROU) ;-- routine inquiry.
 | 
|---|
| 75 |  ;----------------------------------------------------------------------
 | 
|---|
| 76 |  ; KMPDROU.. Routine(s) to search (this may be a partial name.
 | 
|---|
| 77 |  ;----------------------------------------------------------------------
 | 
|---|
| 78 |  ;
 | 
|---|
| 79 |  K KMPDY
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  S KMPDROU=$G(KMPDROU)
 | 
|---|
| 82 |  I KMPDROU="" S KMPDY(0)="[Routine name not defined]" Q
 | 
|---|
| 83 |  I '$D(^$ROUTINE(KMPDROU)) S KMPDY(0)="[Routine '"_KMPDROU_"' not defined]" Q
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 |  N DIF,I,LN,ROU,X,XCNP
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 |  S DIF="ROU(",XCNP=0
 | 
|---|
| 88 |  S X=KMPDROU X ^%ZOSF("TEST")
 | 
|---|
| 89 |  I '$T S KMPDY(0)="[Routine '"_KMPDROU_"' not defined]" Q
 | 
|---|
| 90 |  X ^%ZOSF("LOAD")
 | 
|---|
| 91 |  S (I,LN)=0
 | 
|---|
| 92 |  F  S I=$O(ROU(I)) Q:'I  I $D(ROU(I,0)) D 
 | 
|---|
| 93 |  .S KMPDY(LN)=ROU(I,0),LN=LN+1
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  S:'$D(KMPDY) KMPDY(0)="[Unable to load routine]"
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  Q
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 | ROUSRC(KMPDY,KMPDROU,KMPDTXT) ;-- routine search
 | 
|---|
| 100 |  ;----------------------------------------------------------------------
 | 
|---|
| 101 |  ; KMPDROU.. Routine(s) to search (this may be a partial name.
 | 
|---|
| 102 |  ; KMPDTXT.. Text to search for in routine.
 | 
|---|
| 103 |  ;----------------------------------------------------------------------
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 |  K KMPDY
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  S KMPDROU=$G(KMPDROU),KMPDTXT=$$UP^XLFSTR($G(KMPDTXT))
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 |  I KMPDROU="" S KMPDY(0)="[Routine(s) not defined]" Q
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 |  I KMPDTXT="" S KMPDY(0)="[Search Text not defined]" Q
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  N LN,RN,RTN,STAR
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 |  S RTN=KMPDROU,STAR=$E(RTN,$L(RTN))
 | 
|---|
| 116 |  S:STAR="*" RTN=$E(RTN,1,$L(RTN)-1)
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  ; if just one routine.
 | 
|---|
| 119 |  I STAR'="*" D  Q
 | 
|---|
| 120 |  .; if match.
 | 
|---|
| 121 |  .I $$ROUSRC1(RTN,KMPDTXT) S KMPDY(0)=RTN Q
 | 
|---|
| 122 |  .; else no match.
 | 
|---|
| 123 |  .S KMPDY(0)="<No Matches Found>"
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  S RN=RTN,LN=0
 | 
|---|
| 126 |  F  S RN=$O(^$ROUTINE(RN)) Q:RN=""!($E(RN,1,$L(RTN))'=RTN)  D 
 | 
|---|
| 127 |  .; if match.
 | 
|---|
| 128 |  .I $$ROUSRC1(RN,KMPDTXT) S KMPDY(LN)=RN,LN=LN+1 Q
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  S:'$D(KMPDY) KMPDY(0)="<No Matches Found>"
 | 
|---|
| 131 |  ;
 | 
|---|
| 132 |  Q
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 | ROUSRC1(KMPDROU,KMPDTXT) ;-- extrinsic function - check for text.
 | 
|---|
| 135 |  ;----------------------------------------------------------------------
 | 
|---|
| 136 |  ; KMPDROU.. Routine(s) to search (this may be a partial name.
 | 
|---|
| 137 |  ; KMPDTXT.. Text to search for in routine.
 | 
|---|
| 138 |  ;
 | 
|---|
| 139 |  ; Return: 0 - no match.
 | 
|---|
| 140 |  ;         1 - match.
 | 
|---|
| 141 |  ;----------------------------------------------------------------------
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  S KMPDROU=$G(KMPDROU),KMPDTXT=$$UP^XLFSTR($G(KMPDTXT))
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  Q:KMPDROU="" 0
 | 
|---|
| 146 |  Q:KMPDTXT="" 0
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 |  N DIF,I,RETURN,ROU,X,XCNP
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  S DIF="ROU(",(I,RETURN,XCNP)=0,RETURN=0
 | 
|---|
| 151 |  S X=KMPDROU X ^%ZOSF("TEST")
 | 
|---|
| 152 |  Q:'$T 0
 | 
|---|
| 153 |  X ^%ZOSF("LOAD")
 | 
|---|
| 154 |  F  S I=$O(ROU(I)) Q:'I  I $D(ROU(I,0)) D  Q:RETURN
 | 
|---|
| 155 |  .I $$UP^XLFSTR(ROU(I,0))[KMPDTXT S RETURN=1
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  Q RETURN
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 | ROUSRC2(KMPDY,KMPDROU,KMPDTXT,KMPDGBL) ;-- search for text in routine.
 | 
|---|
| 160 |  ;----------------------------------------------------------------------
 | 
|---|
| 161 |  ; KMPDROU.. Routine(s) to search.
 | 
|---|
| 162 |  ; KMPDTXT.. Text to search for in routine.
 | 
|---|
| 163 |  ; KMPDGBL... Global to store data.
 | 
|---|
| 164 |  ;-----------------------------------------------------------------------
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  K KMPDY
 | 
|---|
| 167 |  ;
 | 
|---|
| 168 |  S KMPDROU=$G(KMPDROU),KMPDGBL=$G(KMPDGBL)
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 |  I KMPDGBL="" S KMPDY="[Global for storage is not defined]" Q
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  N DATA,DIF,I,LABEL,LN,OFFSET,ONE,ROU,RTN,X,XCNP
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 |  ; kill global with check for ^tmp or ^utility.
 | 
|---|
| 175 |  D KILL^KMPDU(.DATA,KMPDGBL)
 | 
|---|
| 176 |  ; if error.
 | 
|---|
| 177 |  I $E(DATA)="[" S KMPDY=DATA Q
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 |  S KMPDY=$NA(@KMPDGBL)
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  S KMPDROU=$G(KMPDROU),KMPDTXT=$$UP^XLFSTR($G(KMPDTXT))
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  I KMPDROU="" S @KMPDGBL@(0)="[Routine(s) name not defined]" Q
 | 
|---|
| 184 |  I KMPDTXT="" S @KMPDGBL@(0)="[Search text not defined]" Q
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 |  S ONE=1
 | 
|---|
| 187 |  ; remove "*" if any.
 | 
|---|
| 188 |  I $E(KMPDROU,$L(KMPDROU))="*" D 
 | 
|---|
| 189 |  .S KMPDROU=$E(KMPDROU,1,$L(KMPDROU)-1)
 | 
|---|
| 190 |  .S ONE=0
 | 
|---|
| 191 |  ; get ready to $order.
 | 
|---|
| 192 |  S RTN=KMPDROU
 | 
|---|
| 193 |  S DATA=KMPDROU
 | 
|---|
| 194 |  S DATA=$E(DATA,1,$L(DATA)-1)
 | 
|---|
| 195 |  S DATA=DATA_$C(($A($E(KMPDROU,$L(KMPDROU)))-1))_"zz"
 | 
|---|
| 196 |  S KMPDROU=DATA
 | 
|---|
| 197 |  ;
 | 
|---|
| 198 |  S ROU=KMPDROU,LN=0
 | 
|---|
| 199 |  F  S ROU=$O(^$ROUTINE(ROU)) Q:ROU=""!($E(ROU,1,$L(RTN))'=RTN)  D  Q:ONE
 | 
|---|
| 200 |  .K ROUT
 | 
|---|
| 201 |  .S DIF="ROUT(",(I,OFFSET,XCNP)=0,LABEL=ROU
 | 
|---|
| 202 |  .S X=ROU X ^%ZOSF("TEST") Q:'$T
 | 
|---|
| 203 |  .X ^%ZOSF("LOAD")
 | 
|---|
| 204 |  .F  S I=$O(ROUT(I)) Q:'I  I $D(ROUT(I,0)) D 
 | 
|---|
| 205 |  ..S OFFSET=OFFSET+1
 | 
|---|
| 206 |  ..; if new label.
 | 
|---|
| 207 |  ..I $E(ROUT(I,0))'=" " S LABEL=$$ROULABEL^KMPDU2(ROUT(I,0)),OFFSET=0
 | 
|---|
| 208 |  ..; quit if no match.
 | 
|---|
| 209 |  ..Q:$$UP^XLFSTR(ROUT(I,0))'[KMPDTXT
 | 
|---|
| 210 |  ..S @KMPDGBL@(LN)=ROU_"^"_LABEL_$S(OFFSET:"+"_OFFSET,1:"")_"  "_ROUT(I,0)
 | 
|---|
| 211 |  ..S LN=LN+1
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 |  S:'$D(@KMPDGBL) @KMPDGBL@(0)="<No Match Found>"
 | 
|---|
| 214 |  ;
 | 
|---|
| 215 |  Q
 | 
|---|
| 216 |  ;
 | 
|---|
| 217 | ROULABEL(TEXT) ;-- routine label.
 | 
|---|
| 218 |  Q:$G(TEXT)="" ""
 | 
|---|
| 219 |  N I,LABEL
 | 
|---|
| 220 |  S LABEL=""
 | 
|---|
| 221 |  F I=1:1 Q:$E(TEXT,I)=" "!($E(TEXT,I)="(")  S LABEL=$E(TEXT,0,I)
 | 
|---|
| 222 |  Q LABEL
 | 
|---|