[613] | 1 | DIKZ ;SFISC/XAK-XREF COMPILER ;7JUN2004
|
---|
| 2 | ;;22.0;VA FileMan;**140**;Mar 30, 1999
|
---|
| 3 | ;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
| 4 | I $G(DUZ(0))'="@" W $C(7),$$EZBLD^DIALOG(101) Q
|
---|
| 5 | EN1 N DIKJ,%X D:'$D(DISYS) OS^DII
|
---|
| 6 | I '$D(^DD("OS",DISYS,"ZS")) W $C(7),$$EZBLD^DIALOG(820) Q
|
---|
| 7 | S U="^" S:'$G(DTIME) DTIME=300
|
---|
| 8 | D SIZ^DIPZ0(8036) G:$D(DTOUT)!($D(DUOUT))!('X) Q1 S DMAX=X
|
---|
| 9 | FILE K DIC S DMAX=X,DIC="^DIC(",DIC(0)="AEQ" D ^DIC G Q1:Y'>0 N DIPZ S DIPZ=+Y
|
---|
| 10 | D RNM^DIPZ0(8036) G:$D(DTOUT)!($D(DUOUT))!(X="") Q1 S DNM=X
|
---|
| 11 | W ! S DIR(0)="Y",DIR("A")=$$EZBLD^DIALOG(8020) D ^DIR K DIR G:'Y!($D(DIRUT)) Q1
|
---|
| 12 | S X=DNM,Y=DIPZ K DIPZ
|
---|
| 13 | EN ;
|
---|
| 14 | S Y(1)=$$EZBLD^DIALOG(8036),Y(3)=Y D BLD^DIALOG(8024,.Y,"","DIR") W:'$G(DIKZS) !!,DIR,! K Y(1),Y(3)
|
---|
| 15 | K ^UTILITY($J),^UTILITY("DIK",$J) N DIK,DIFILENO
|
---|
| 16 | S DNM=X,(DH,DIFILENO)=+Y I $D(^DIC(+Y,0,"GL")) S DIK2=^("GL")
|
---|
| 17 | I '$D(DIK2)!(DMAX<2400) G Q
|
---|
| 18 | S X=DH D A^DIU21,WAIT^DICD:'$G(DIKZS),DT^DICRW
|
---|
| 19 | S (DRN,DIKZQ,T)=0,DMAX=DMAX-100
|
---|
| 20 | ;
|
---|
| 21 | ;Load indexes defined in Index file
|
---|
| 22 | N DIXRLIST,DIKMF
|
---|
| 23 | K ^TMP("DIKC",$J)
|
---|
| 24 | D LOADALL^DIKC1(DIFILENO,"KS","R","",$NA(^TMP("DIKC",$J)),"",.DIKMF)
|
---|
| 25 | ;
|
---|
| 26 | ; compile kill logic
|
---|
| 27 | S (DIKA,A)=1,X=2,DIKVR="DIKILL",DIK=DIK2
|
---|
| 28 | D Q2,NEWR S ^UTILITY($J,0,3)=" S DIKZK="_X
|
---|
| 29 | S DIKGO="^"_DNM_1 ;starting ROUTINE name
|
---|
| 30 | D ^DIKZ0 G:DIKZQ Q D RTE
|
---|
| 31 | ;
|
---|
| 32 | ; compile set logic
|
---|
| 33 | S (DIKA,A)=1,X=1,DIKVR="DISET",DIK=DIK2
|
---|
| 34 | D Q2,NEWR S ^UTILITY($J,0,3)=" S DIKZK="_X
|
---|
| 35 | S DIKGO=DIKGO_",^"_DNM_DRN
|
---|
| 36 | D ^DIKZ0 G:DIKZQ Q D RTE
|
---|
| 37 | ;
|
---|
| 38 | ; compile driver code
|
---|
| 39 | D Q2,^DIKZ1
|
---|
| 40 | ;
|
---|
| 41 | ; finish up
|
---|
| 42 | S:'DIKZQ ^DD(DIFILENO,0,"DIKOLD")=DNM
|
---|
| 43 | Q I DIKZQ S X=DH(1) D A^DIU21
|
---|
| 44 | Q1 K DH,X,Y,DIK4,DIKQ,DIKC,T,DV,DIK8,DU,DW,DW1,DIKGO,DRN,DNM,DTOUT,DIRUT,DIROUT,DUOUT,DIC,A,%,%H,%Y
|
---|
| 45 | K DIKVR,DIK6,DIKA,DIKR,DMAX,DIK2,DIKCT,DIK1,DIK0,^UTILITY($J),^("DIK"),DIK,DIKZQ,DIKZZ,DIKZZ1,DIKZOVFL
|
---|
| 46 | K ^TMP("DIKC",$J)
|
---|
| 47 | Q2 K DIKRT,DIKLW,DIKL2
|
---|
| 48 | Q
|
---|
| 49 | SV ; transfer the accumulated code in ^UTILITY($J,#) to ^UTILITY($J,0,#)
|
---|
| 50 | ; (the routine buffer) and call SAVE to flush the buffer into a routine
|
---|
| 51 | ; whenever it's full. Flush the buffer one more time when done.
|
---|
| 52 | S DNM(1)=DNM_DRN
|
---|
| 53 | F DIKR=0:0 S DIKR=$O(^UTILITY($J,DIKR)) Q:DIKR'>0 S %=^(DIKR) K ^(DIKR) D:T+$L(%)>DMAX S ^UTILITY($J,0,DIKR)=%,T=T+$L(%)+2
|
---|
| 54 | . N DIKZMORE S DIKZMORE=1 D SAVE
|
---|
| 55 | D SAVE
|
---|
| 56 | Q
|
---|
| 57 | SAVE ; save the accumulated code in ^UTILITY($J,0,#) as a routine
|
---|
| 58 | I DIKR,$E($P(%," ",2))="." F D Q:$E($P(%," ",2))'="."
|
---|
| 59 | . S ^UTILITY($J,DIKR)=%
|
---|
| 60 | . S DIKR=$O(^UTILITY($J,0,DIKR),-1),%=^(DIKR) K ^(DIKR)
|
---|
| 61 | I $D(DIKLW),'DIKR S ^UTILITY($J,0,997)=" G:'$D(DIKLM) "_$C(64+DIKCT)_$S(DNM_DRN'=DNM(1):"^"_DNM(1),1:"")_" Q:$D("_DIKVR_")"
|
---|
| 62 | I $D(DIKLW),DIKR S ^UTILITY($J,0,998)=" G ^"_DNM_(DRN+1)
|
---|
| 63 | S ^UTILITY($J,0,999)="END "_$S($D(DIKRT)&'DIKR:"Q",1:"G "_$S(DIKR&($D(DIKLW)):"END",1:"")_U_DNM_(DRN+1))
|
---|
| 64 | N X,DIR S X=DNM_DRN X ^DD("OS",DISYS,"ZS") S X(1)=X D BLD^DIALOG(8025,.X,"","DIR") W:'$G(DIKZS) !,DIR S:$G(DIKZRLA)]"" @DIKZRLA@(DNM_DRN)="",DIKZRLAF=1
|
---|
| 65 | D NEWR:'$D(DIKRT)!$G(DIKZMORE) Q:DIKZQ S ^DD(DH,0,"DIK")=DNM K DIKL2
|
---|
| 66 | Q
|
---|
| 67 | NEWR ;
|
---|
| 68 | I '$D(DIKRT),T,$D(%),T+$L(%)>DMAX S DIKZDH=+$P(^UTILITY($J,0,1),"#",2)
|
---|
| 69 | K ^UTILITY($J,0) S DIKR=4,T=0,DRN=DRN+1 I $L(DNM_DRN)>8 W:'$G(DIKZS) $C(7),!,DNM_DRN_$$EZBLD^DIALOG(1503) S:$G(DIKZRLA)]"" DIKZRLAF=0 S DIKZQ=1 Q
|
---|
| 70 | S ^UTILITY($J,0,1)=DNM_DRN_" ; COMPILED XREF FOR FILE #"_$S($D(DIKZDH):DIKZDH,1:DH)_" ; "_$E(DT,4,5)_"/"_$E(DT,6,7)_"/"_$E(DT,2,3),^(2)=" ; "
|
---|
| 71 | K DIKZDH Q
|
---|
| 72 | RTE ;
|
---|
| 73 | N DIKFIL,DIKSUB,DIKLIST,DIKP
|
---|
| 74 | ;Build DIKSUB(file)=subfile1,subfile2,... list
|
---|
| 75 | S DIKFIL=0 F S DIKFIL=$O(DIK(X,DIKFIL)) Q:'DIKFIL D
|
---|
| 76 | . S DIKSUB=0 F S DIKSUB=$O(^DD(DIKFIL,"SB",DIKSUB)) Q:'DIKSUB D
|
---|
| 77 | .. S:$D(DIK(X,DIKSUB))#2 DIKSUB(DIKFIL)=$G(DIKSUB(DIKFIL))_DIKSUB_","
|
---|
| 78 | ;
|
---|
| 79 | ;Build DIKLIST(file)=subfile1,subfile2,...
|
---|
| 80 | M DIKLIST=DIKSUB
|
---|
| 81 | S DIKFIL=0 F S DIKFIL=$O(DIKSUB(DIKFIL)) Q:'DIKFIL D
|
---|
| 82 | . S DIKP=0
|
---|
| 83 | . F D Q:DIKP'<($L(DIKLIST(DIKFIL),",")-1)
|
---|
| 84 | .. F DIKP=DIKP+1:1:$L(DIKLIST(DIKFIL),",")-1 D
|
---|
| 85 | ... S DIKSUB=$P(DIKLIST(DIKFIL),",",DIKP)
|
---|
| 86 | ... S DIKLIST(DIKFIL)=DIKLIST(DIKFIL)_$G(DIKSUB(DIKSUB))
|
---|
| 87 | K DIKSUB
|
---|
| 88 | ;
|
---|
| 89 | ;Convert file numbers in DIKLIST to routine list
|
---|
| 90 | S DIKFIL=0 F S DIKFIL=$O(DIKLIST(DIKFIL)) Q:'DIKFIL D
|
---|
| 91 | . S $E(DIKLIST(DIKFIL),$L(DIKLIST(DIKFIL)))=""
|
---|
| 92 | . S DIKLIST(DIKFIL)=DIKFIL_","_DIKLIST(DIKFIL)
|
---|
| 93 | . F DIKP=1:1:$L(DIKLIST(DIKFIL),",") D
|
---|
| 94 | .. S DIKSUB=$P(DIKLIST(DIKFIL),",",DIKP)
|
---|
| 95 | .. S $P(DIKLIST(DIKFIL),",",DIKP)=DIK(X,DIKSUB)
|
---|
| 96 | ;
|
---|
| 97 | ;Move list to DIK
|
---|
| 98 | M DIK(X)=DIKLIST
|
---|
| 99 | K DIKFIL,DIKLIST,DIKP
|
---|
| 100 | S DIKRT=1,A=A-1,DH=DH(1) G SV
|
---|
| 101 | ;
|
---|
| 102 | EN2(Y,DIKZFLGS,X,DMAX,DIKZRLA,DIKZZMSG) ;Silent or Talking with parameter passing
|
---|
| 103 | ;and optionally return list of routines built and if successful
|
---|
| 104 | ;FILE#,FLAGS,ROUTINE,RTNMAXSIZE,RTNLISTARRAY,MSGARRAY
|
---|
| 105 | ;Y=FILE NUMBER (required)
|
---|
| 106 | ;FLAGS="T"alk (optional)
|
---|
| 107 | ;X=ROUTINE NAME (required)
|
---|
| 108 | ;DMAX=ROUTINE SIZE (optional)
|
---|
| 109 | ;DIKZRLA=ROUTINE LIST ARRAY, by value (optional)
|
---|
| 110 | ;DIKZZMSG=MESSAGE ARRAY (optional) (default ^TMP)
|
---|
| 111 | ;*
|
---|
| 112 | ;DIKZS will be used to indicate "silent" if set to 1
|
---|
| 113 | ;Write statements are made conditional, if not "silent"
|
---|
| 114 | ;*
|
---|
| 115 | N DIKZS,DNM,DIQUIET,DIKZRIEN,DIKZRLAZ,%X,DIKJ,DIR,DIKZRLAF,DK1
|
---|
| 116 | N DIK,DIC,%I,DICS
|
---|
| 117 | S DIKZS=$G(DIKZFLGS)'["T"
|
---|
| 118 | S:DIKZS DIQUIET=1
|
---|
| 119 | I '$D(DIFM) N DIFM S DIFM=1 D
|
---|
| 120 | .N Y,DIKZFLGS,X,DMAX,DIKZRLA,DIKZS
|
---|
| 121 | .D INIZE^DIEFU
|
---|
| 122 | I $G(Y)'>0 D BLD^DIALOG(1700,"File Number missing or invalid") G EN2E
|
---|
| 123 | I '$D(^DD(Y,0)) D BLD^DIALOG(1700,"File Number: "_Y_" Invalid") G EN2E
|
---|
| 124 | I $G(X)']"" D BLD^DIALOG(1700,"Routine name missing") G EN2E
|
---|
| 125 | I X'?1U.NU&(X'?1"%"1U.NU) D BLD^DIALOG(1700,"Routine name invalid") G EN2E
|
---|
| 126 | I $L(X)>7 D BLD^DIALOG(1700,"Routine name too long") G EN2E
|
---|
| 127 | S DIKZRLA=$G(DIKZRLA,"DIKZRLAZ"),DIKZRIEN=Y
|
---|
| 128 | S:DIKZRLA="" DIKZRLA="DIKZRLAZ" S:$G(DMAX)<2500!($G(DMAX)>^DD("ROU")) DMAX=^DD("ROU")
|
---|
| 129 | S DIKZRLAF=""
|
---|
| 130 | K @DIKZRLA
|
---|
| 131 | D EN
|
---|
| 132 | G:'DIKZS!(DIKZRLAF) EN2E
|
---|
| 133 | D BLD^DIALOG(1700,"Compiling Cross-references (FILE#:"_DIKZRIEN_")"_$S(DIKZRLAF=0:", routine name too long",1:""))
|
---|
| 134 | EN2E I 'DIKZS D MSG^DIALOG() Q
|
---|
| 135 | I $G(DIKZZMSG)]"" D CALLOUT^DIEFU(DIKZZMSG)
|
---|
| 136 | Q
|
---|
| 137 | ;
|
---|
| 138 | ;DIALOG #101 'only those with programmer's access'
|
---|
| 139 | ; #820 'no way to save routines on the system'
|
---|
| 140 | ; #8020 'Should the compilation run now?'
|
---|
| 141 | ; #8024 'Compiling template name Input template of file n'
|
---|
| 142 | ; #8036 'Cross-References'
|
---|
| 143 | ; #8025 'Routine filed'
|
---|
| 144 | ; #1503 'routine name is too long...'
|
---|