Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XPDANLYZ5

XPDANLYZ5.m

Go to the documentation of this file.
  1. XPDANLYZ5 ;OAK/RSF- BUILD ANALYZER ;10/28/22
  1. ;;8.0;KERNEL;**782**;Jul 10, 1995;Build 4
  1. ;;Per VHA Directive 2004-038, this routine should not be modified.
  1. ;
  1. FILEME(ITEM) ;Output some build files
  1. Q:$G(ITEM)<1
  1. N XPFNAME,RME,NB S RME("*")="-",NB=$$REPLACE^XLFSTR(XPDBN,.RME)
  1. I ITEM=1 S XPFNAME1="XPBA_Anal_"_NB_"_"_$E(DT,4,5)_"-"_$E(DT,6,7)_"-"_$E(DT,2,3)_".TXT",XPFNAME=XPFNAME1
  1. I ITEM=3 S XPFNAME3="XPBA_Spell_"_NB_"_"_$E(DT,4,5)_"-"_$E(DT,6,7)_"-"_$E(DT,2,3)_".TXT",XPFNAME=XPFNAME3
  1. I ITEM=4 S XPFNAME4="XPBA_SQA_"_NB_"_"_$E(DT,4,5)_"-"_$E(DT,6,7)_"-"_$E(DT,2,3)_".TXT",XPFNAME=XPFNAME4
  1. N POP
  1. D OPEN^%ZISH("XPBA",XPPATH,XPFNAME,"W")
  1. I POP>0 D Q
  1. . W:XPDR=3 !,"Could not open "_XPFNAME_". Unable to write to file. " Q
  1. U IO
  1. I ITEM=1 D BA I $D(XPBA1) N LL S LL=0 F S LL=$O(XPBA1(LL)) Q:'LL W !,XPBA1(LL)
  1. I ITEM=3 D SPELLST
  1. I ITEM=4 D SQAMM N LL S LL=0 F S LL=$O(XPMM(LL)) Q:'LL W !,XPMM(LL) ;D SQALINES
  1. D CLOSE^%ZISH("XPBA")
  1. Q
  1. ;
  1. SPELLST ;
  1. Q:'$D(XPDMM)
  1. W !,"Text for Review/Spell Check, Build "_XPDBN_"; "_$$FMTE^XLFDT($$DT^XLFDT,"2D"),!
  1. N TTT S TTT=0 F S TTT=$O(XPDMM(TTT)) Q:'TTT W !,XPDMM(TTT)
  1. Q
  1. ;
  1. BA ;SET BA ARRAY
  1. N TMPT,LNUM Q:'$D(XPDW)
  1. N RR S RR=0,LNUM=0 F S RR=$O(XPDW(RR)) Q:'RR D
  1. . I $L(XPDW(RR))<80 S LNUM=LNUM+1,XPBA1(LNUM)=XPDW(RR)
  1. . E D CUTME(XPDW(RR),1)
  1. I $D(XPBA1) D
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=""
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=""
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=$TR($J("=",79)," ","=")
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=""
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=" This build may include references to components (i.e. Routines,"
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=" Globals, etc.) outside the build namespace. Review and validate "
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=" that all appropriate Integration Control Registrations (ICRs) "
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=" exist for each external reference."
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=""
  1. . S LNUM=LNUM+1,XPBA1(LNUM)=$TR($J("=",79)," ","=")
  1. Q
  1. CUTME(LTXT,IND) ;5 MAY BE OPEN
  1. ;get any preliminary spacing
  1. N RSF,RR S RSF="" F RR=1:1:$L(LTXT) Q:'($E(LTXT,RR)?1" ") S RSF=RSF_$E(LTXT,RR)
  1. N T0,T1,T2 S T0=LTXT,T1="",T2=""
  1. ;REMOVE/SAVE PRELIMINARY SPACING
  1. I RR>0 S T0=$E(LTXT,RR,99999)
  1. N AL,LL,I S AL=(80-$L(RSF)) ;THIS IS THE LINE LENGTH ACCOUNTING FOR THE PRELIMINARY SPACES
  1. S:IND>2 AL=AL-1
  1. A1 ;
  1. F I=AL:-1:(AL-20) D Q:T1]""
  1. . I $E(T0,I)?1P S T1=RSF_$E(T0,1,I),T2=$E(T0,(I+1),9999) Q
  1. . Q:T1]""
  1. Q:$L(T1)<2&(T1'?1(1U,1P))
  1. S:IND=1 LNUM=LNUM+1,XPBA1(LNUM)=T1
  1. ;W:IND=2 !,T1
  1. S:IND=3 MCNT=MCNT+1,XPMM(MCNT)=T1
  1. S:IND=4 TCNT=TCNT+1,XPDKT(NSP,TWOP,TCNT)=T1
  1. S:IND=5 TCNT=TCNT+1,XPDTRR(NSP,TWOP,TCNT)=T1
  1. Q:$G(T2)']""
  1. N T3,E1 S T3=RSF_T2,E1=0
  1. I IND=1 D G:E1 A1
  1. . I $L(T3)<80 S LNUM=LNUM+1,XPBA1(LNUM)=T3 Q
  1. . I $L(T3)>79 S T0=T2 K T1,T2,T3 S T1="",T2="",E1=1 Q
  1. I IND=3 D G:E1 A1
  1. . ;I $L(T3)+13<79 S MCNT=MCNT+1,XPMM(MCNT)=$J(" ",12)_T3 Q
  1. . ;I $L(T3)+13>78 S T0=$J(" ",12)_T2 K T1,T2,T3 S T1="",T2="",E1=1 Q
  1. . I $L(T3)+13<79 S MCNT=MCNT+1,XPMM(MCNT)=$J(" ",ML+1)_T3 Q
  1. . I $L(T3)+13>78 S T0=$J(" ",ML+1)_T2 K T1,T2,T3 S T1="",T2="",E1=1 Q
  1. I IND=4 D G:E1 A1
  1. . N PAD S PAD=24 ;($L(ROU)+14)
  1. . I $L(T3)+PAD<79 S TCNT=TCNT+1,XPDKT(NSP,TWOP,TCNT)=$J(" ",PAD)_T3 Q
  1. . I $L(T3)+PAD>78 S T0=$J(" ",PAD)_T2 K T1,T2,T3 S T1="",T2="",E1=1 Q
  1. I IND=5 D G:E1 A1
  1. . N PAD S PAD=24
  1. . I $L(T3)+PAD<79 S TCNT=TCNT+1,XPDTRR(NSP,TWOP,TCNT)=$J(" ",PAD)_T3 Q
  1. . I $L(T3)+PAD>78 S T0=$J(" ",PAD)_T2 K T1,T2,T3 S T1="",T2="",E1=1 Q
  1. Q
  1. ;
  1. FSHOW ; called from menu and deletes Build Analyzer text files
  1. N XPPATH,XPDEL,J,END S XPPATH=$$PWD^%ZISH(),END=0
  1. W @IOF S DIR(0)="F",DIR("A",1)="Set the path to find the .TXT files",DIR("A",2)="or accept the standard default."
  1. S DIR("A",3)="",DIR("A")="PATH",DIR("B")=XPPATH
  1. S DIR("?",1)="Full path specification where XPBA* files reside. Path up to, but not including,"
  1. S DIR("?",2)="the filename. This includes any trailing slashes or brackets."
  1. S DIR("?")=" "
  1. D ^DIR S:$D(DTOUT) END=1 S:$D(DIRUT) END=1 Q:END
  1. S XPPATH=Y
  1. K FILESPEC,XPFILE,XPF S FILESPEC("XPBA*")=""
  1. S Y=$$LIST^%ZISH("","FILESPEC","XPFILE")
  1. W !!,"Build Analyzer text files:",! N K,L S K=" ",L=0 F S K=$O(XPFILE(K)) Q:K']"" S L=L+1,XPF(L)=K,XPDEL(K)="" W !,$J(L,3),". ",K
  1. I $G(L)<1 W @IOF,"There are no Build Analyzer files to delete.",!! Q
  1. W !! K DIR S DIR(0)="Y",DIR("B")="NO"
  1. S DIR("?")="Respond YES to delete the files listed above."
  1. S DIR("A")="Delete all the files above"
  1. D ^DIR Q:$D(DTOUT) Q:$D(DIRUT)
  1. I Y=1 D G:END X1
  1. . S J=$$DEL^%ZISH("",$NA(XPDEL))
  1. . I J=1 W !,"Deletions completed." S END=1 Q
  1. . I J=0 W !,"Unable to complete deletions." S END=1 Q
  1. W !! K DIR S DIR(0)="L^1:"_L
  1. S DIR("A")="Select number of file or files to delete"
  1. D ^DIR G:$D(DTOUT) X1 G:$D(DIRUT) X1
  1. N DME,DARR S DME="" I Y S DME=$$TRIM^XLFSTR(Y,"R",",") D
  1. . N PCE,KK F KK=1:1:$L(DME,",") S PCE=$P(DME,",",KK) Q:'$G(PCE) S DARR(XPF(PCE))=""
  1. I $D(DARR) N J S J=$$DEL^%ZISH(XPPATH,$NA(DARR))
  1. I J=1 W !,"Deletions completed."
  1. I J=0 W !,"Unable to complete deletions."
  1. X1 K FILESPEC,XPFILE,XPF Q
  1. ;
  1. PB1 ;FOR BUILD
  1. S XPDCNT=XPDCNT+1,XPDW(XPDCNT)=""
  1. S XPDCNT=XPDCNT+1,XPDW(XPDCNT)=XPDARR("BUILD",XPDBB,"NAME")_" BUILD OVERVIEW"
  1. S XPDW(XPDCNT)=XPDW(XPDCNT)_$$RJ^XLFSTR($$FMTE^XLFDT($$NOW^XLFDT),79-$L(XPDW(XPDCNT))," ")
  1. S XPDHR(XPDCNT)="BUILD OVERVIEW"
  1. S XPDCNT=XPDCNT+1,XPDW(XPDCNT)=$TR($J(" ",79)," ","-")
  1. N TMPTXT,XPDTX1
  1. S XPDCS("FILES")="1"
  1. N XPDTX2 S XPDTX2=" " F S XPDTX2=$O(XPDCS(XPDTX2)) Q:XPDTX2']"" D
  1. . S XPDTX1=XPDTX2_$J(" ",(40-$L(XPDTX2)))
  1. . S TMPTXT="Not Included"
  1. . I '$D(XPDCAR(XPDCS(XPDTX2),0)) S TMPTXT="Not Included"
  1. . E I XPDCAR(XPDCS(XPDTX2),0)]"" S TMPTXT="Included"
  1. . I XPDTX2="FILES",$D(^XPD(9.6,XPDBB,4,"B"))>1 S TMPTXT="Included"
  1. . S XPDCNT=XPDCNT+1,XPDW(XPDCNT)=XPDTX1_TMPTXT
  1. S XPDCNT=XPDCNT+1 ;,XPDW(XPDCNT)=$TR($J(" ",70)," ","-")
  1. K XPDCS("FILES")
  1. Q
  1. ;
  1. SQAMM ;
  1. N MCNT,ML,MR1 S MCNT=0
  1. I '$D(XPDSQA) S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)=" *** No SQA issues were found in the included routines. ***" Q
  1. ;^TMP
  1. I $D(XPTK) D
  1. . N TWW,JL S MR1=0,TWW=" " F S TWW=$O(XPTK(TWW)) Q:TWW']"" D
  1. .. S JL=$L(XPTK(TWW),"^") N II,SK F II=1:1:JL S:$L($P(XPTK(TWW),"^",II))>MR1 MR1=$L($P(XPTK(TWW),"^",II))
  1. . S MR1=MR1+2,MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="These ^TMP calls have kill statements within the included routines:" D
  1. .. N WWW,JK,JL S (WWW,JK)=" ",JL=0 F S WWW=$O(XPTK(WWW)) Q:WWW']"" D
  1. ... S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)=WWW,JL=$L(XPTK(WWW),"^") N II,SK F II=1:1:JL S SK=$P(XPTK(WWW),"^",II),MCNT=MCNT+1,XPMM(MCNT)=$J(" ",10)_$P(SK," ")_$J(" ",(MR1-($L($P(SK," "))+10)))_$P(SK," ",2,99)
  1. I $D(XPDKT) D
  1. . N NSP,NSP1 S (NSP,NSP1)=" " F S NSP=$O(XPDTRR(NSP)) Q:NSP']"" F S NSP1=$O(XPDTRR(NSP,NSP1)) Q:NSP1']"" K:$D(XPDKT(NSP,NSP1)) XPDTRR(NSP,NSP1)
  1. . I $D(XPDTRR) D
  1. .. S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="These ^TMP calls have no associated kill in this build's included routines:"
  1. .. N JK,JL S (NSP,JK)=" ",JL=0 F S NSP=$O(XPDTRR(NSP)) Q:NSP']"" F S JK=$O(XPDTRR(NSP,JK)) Q:JK']"" F S JL=$O(XPDTRR(NSP,JK,JL)) Q:'JL S MCNT=MCNT+1,XPMM(MCNT)=XPDTRR(NSP,JK,JL)
  1. . I '$D(XPDTRR) S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="All ^TMP calls have at least one kill statement in this build's routines."
  1. ;^XTMP
  1. N RRR,XRRR S RRR=" ",XRRR="" F S RRR=$O(XPDXRR(RRR)) Q:RRR']"" I '$D(XTMPARR(RRR)) S XRRR=XRRR_"^"_RRR
  1. I $D(XTMPARR) D
  1. . S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="General ^XTMP Notes"
  1. . S MCNT=MCNT+1,XPMM(MCNT)="These ^XTMP calls have zero nodes defined in this build's included routines:"
  1. . N WWW,BBB S (WWW,BBB)=" " F S WWW=$O(XTMPARR(WWW)) Q:WWW']"" F S BBB=$O(XTMPARR(WWW,BBB)) Q:BBB']"" D
  1. .. N XLNE S XLNE=$J(" ",5)_"Routine: "_BBB_$J(" ",5)_XTMPARR(WWW,BBB)
  1. .. I $L(XLNE)<79 S MCNT=MCNT+1,XPMM(MCNT)=XLNE
  1. .. I $L(XLNE)>78 S ML=$L("Routine: "_BBB_$J(" ",5)) D CUTME(XLNE,3)
  1. I XRRR]"" S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="These ^XTMP calls have no zero nodes defined in this build's included routines" D
  1. . N LLL F LLL=2:1:$L(XRRR,"^") S MCNT=MCNT+1,XPMM(MCNT)=$J(" ",5)_"Routine: "_XPDXRR($P(XRRR,"^",LLL))_$J(" ",5)_"^XTMP("_$P(XRRR,"^",LLL)
  1. I XRRR']"" S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)="ALL ^XTMP calls have zero nodes defined in this build's routines"
  1. N RT1,RT2,SQAM,SQAM1,JJ,TXTC,TTAG S JJ=0,(RT1,RT2,SQAM1)="",ML=XPTL+3
  1. F S RT1=$O(XPDSQA(RT1)) Q:RT1']"" S SQAM=" " F S SQAM=$O(XPDSQA(RT1,SQAM)) Q:SQAM']"" F S JJ=$O(XPDSQA(RT1,SQAM,JJ)) Q:'JJ D
  1. . S XPDROUT(0)="",TTAG=" ",TTAG=$O(XPDSQA(RT1,SQAM,JJ,TTAG)) Q:TTAG']"" ;S:TTAG["+0" TTAG=TTAG_" "
  1. . I RT1'=RT2 D
  1. .. S:RT2]"" MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)=$$CJ^XLFSTR("<><><>",70)
  1. .. S SQAM1="",MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)=RT1,RT2=RT1
  1. . S XPDROUT(MCNT)=RT1
  1. . I SQAM'=SQAM1 S MCNT=MCNT+1,XPMM(MCNT)="",MCNT=MCNT+1,XPMM(MCNT)=" "_SQAM_" "_$TR($J(" ",77-$L(SQAM))," ","."),SQAM1=SQAM
  1. . ;S TXTC=$J(" ",5)_"LINE #"_$J(JJ,3)_" "_XPDSQA(RT1,SQAM,JJ)
  1. . N TABME S TABME=ML-$L(TTAG) S:TTAG["+0" TABME=TABME+1
  1. . S TXTC=$J(" ",3)_TTAG_$J(" ",TABME)_XPDSQA(RT1,SQAM,JJ,TTAG)
  1. . I $L(TXTC)<79 S MCNT=MCNT+1,XPMM(MCNT)=TXTC
  1. . I $L(TXTC)>78 D CUTME(TXTC,3)
  1. Q
  1. TMPX(XLINE) ;
  1. N NSP,PX,EXT S EXT=0,PX=$L(XLINE,"^XTMP(") F I=2:1:PX D
  1. . S NSP=$P($P($P(XLINE,"^XTMP(",I),")"),",") I NSP]"" S XPDXRR(NSP)=ROU I $$NSPACE^XPDANLYZ6($$TRIM^XLFSTR(NSP,"LR",$C(34))) S TCHK=1
  1. N ZN,JJ,POS,QNUM S JJ=1,ZN="" I XLINE?.E1"S ".E1"^XTMP(".E1",0)=".E1(1"^",1"_U_").E D
  1. . N XXL S XXL=0 F I=2:1:PX S QNUM=0 D Q:EXT
  1. .. S:ZN'[",0)=" JJ=XXL+1,ZN="" S POS=$F(XLINE,"XTMP(",JJ)-6 F XXL=POS:1:$L(XLINE) S:$E(XLINE,XXL)=$C(34) QNUM=QNUM+1 S ZN=ZN_$E(XLINE,XXL) Q:('QNUM#2)&($E(XLINE,XXL)=$C(32))
  1. . Q:ZN']""
  1. . I ZN]"" S XTMPARR($P($P(ZN,"(",2),","),ROU)=$P(ZN,"=")_"="_$P(XLINE,",0)=",2)
  1. Q
  1. TMP(XLINE) ;XPDTRR (all TMP) XPDKT (kill array)
  1. N TTAB S TTAB=25 ;S:TAGME["+0" TTAB=26;
  1. N FMTY,NSP,NSPT,PX,TLINE,T9,FTWP,EXT S PX=$L(XLINE,"^TMP(") F I=2:1:PX D Q:EXT
  1. . S EXT=0,NSP="",FMTY=""
  1. . S T9=$J(" ",2)_ROU_" "_TAGME,T9=T9_$J(" ",(TTAB-$L(T9))),TLINE=T9_XLINE
  1. . S FMTY=$P($P(XLINE,"^TMP(",I),")"),NSP=$$TRIM^XLFSTR($P(FMTY,","),"LR",$C(34)),NSPT=T9_"^TMP("_FMTY_")"
  1. . I (NSP']"")!(FMTY']"") Q
  1. . N TWOP S TWOP=$$TRIM^XLFSTR($P(FMTY,",",2),"LR",$C(34)) S:$G(TWOP)']"" TWOP="0"
  1. . Q:NSPT'["" Q:$L(NSPT)<2
  1. . I XLINE["K ^TMP("_FMTY_")" D
  1. .. S FTWP="^TMP("_NSP_","_TWOP S:$D(XPTK(FTWP)) XPTK(FTWP)=XPTK(FTWP)_"^"_ROU_" "_TAGME S:'$D(XPTK(FTWP)) XPTK(FTWP)=ROU_" "_TAGME
  1. .. I $L(TLINE)<75 S TCNT=TCNT+1,XPDKT(NSP,TWOP,TCNT)=NSPT ;TLINE
  1. .. I $L(TLINE)>74 D CUTME(NSPT,4) Q
  1. . I $P(FMTY,",")="$J" S TCHK=1
  1. . I $$NSPACE^XPDANLYZ6(NSP)&($P(FMTY,",",2)["$J") S TCHK=1
  1. . I NSP]"" D
  1. .. I $L(NSPT)<76 S XPDTRR(NSP,TWOP,TCNT)=NSPT
  1. .. I $L(NSPT)>74 D CUTME(NSPT,5)
  1. Q
  1. ;
  1. KCOLON(XLINE) ;
  1. N TC1,TCL,J,PP S TCL=$L(XLINE,"K:") F J=2:1:TCL S TC1=$P(XLINE,"K:",J) I TC1]"" D
  1. . F PP=1:1:$L(TC1) I $E(TC1,PP)=$C(32) Q:$E(TC1,PP+1)'="^"&($E(TC1,PP+1)'="@") D
  1. .. I 'XPDIS2,$E(TC1,PP+1)'="@" N TC2 S TC2="K:"_$E(TC1,PP+1,99) Q:$$KCHK(TC2,"K:")'=3
  1. .. S XPDSQA(ROU,XPD1,K,TAGME)=XLINE S:XPDARRR(XPD1,JJ,0)]"" XPDARRR(XPD1,JJ,0)=XPDARRR(XPD1,JJ,0)_" "_K_"," S:XPDARRR(XPD1,JJ,0)']"" XPDARRR(XPD1,JJ,0)="Lines: "_K_"," Q
  1. Q
  1. ;
  1. MSQA(XLINE,SQAT) ;IO, %, $I
  1. N SL S SL=($L(SQAT)+1)
  1. S XLINE=" "_XLINE
  1. N NSP,PX,EXT,END,J,XT,I,AA,BB S (END,XT,J)=0,PX=$L(XLINE,SQAT) F I=1:1:(PX-1) D Q:END
  1. . N POS S POS=$F(XLINE,SQAT,J),J=POS,XT=0
  1. . I SQAT="%" D Q:XT Q:END
  1. .. I $E(XLINE,POS)?1P,$E(XLINE,(POS-SL))?1P S XT=1 Q ;IF ITEM SURRONDED BY PUNCTUATION (like "%"), SKIP IT
  1. .. I $E(XLINE,POS)'?1U I $E(XLINE,(POS-SL))="=" S XT=1 Q ;Q IF SOMETHING = %
  1. .. I $E(XLINE,POS)="=",$E(XLINE,-SL)?1P S XT=1 Q ;%= ALLOWED
  1. .. I 'XT,'END,XLINE[$C(34) N I F I=1:2:($L(XLINE,$C(34))-1) I POS>$F(XLINE,$P(XLINE,$C(34),I)),POS<=$F(XLINE,$P(XLINE,$C(34),I+1)) S XT=1 Q
  1. .. N PCT S PCT="" F AA=POS:1:$L(XLINE) Q:$E(XLINE,AA)'?1U S PCT=PCT_$E(XLINE,AA) ;GETS THE LETERS AFTER THE % LIKE %ZIS
  1. .. I PCT]"" D
  1. ... I PCT="%ZIS" S XT=1 Q
  1. ... I "DRZ"[$E(XLINE,POS) S:PCT="DT" XT=1 S:PCT="DTC" XT=1 S:PCT="RCR" XT=1 S:PCT="ZIS" XT=1 S:PCT="ZTLOAD" XT=1 S:PCT="ZOSF" XT=1
  1. .. S BB="" F AA=(POS-SL):-1:0 S:($E(XLINE,AA)="$")&($E(XLINE,AA-1)="$") XT=1 Q:XT I $E(XLINE,AA)=$C(32),$E(XLINE,AA-2)=$C(32) S BB=$E(XLINE,(AA-1)) S:"XDI"[BB XT=1 S:"SKNMR"[BB END=1 Q
  1. . I SQAT="IO" D
  1. .. I POS-SL=1 S XT=1 Q ;I $E(XLINE,POS)?1P I "UI"[$E(XLINE,(POS-(SL+1))) S XT=1 Q
  1. .. I ($E(XLINE,POS)?1U)!($E(XLINE,(POS-SL))?1U) S XT=1 Q
  1. .. S BB="" F AA=(POS-SL):-1:0 I $E(XLINE,AA)=$C(32),$E(XLINE,AA-2)=$C(32) S BB=$E(XLINE,(AA-1)) S:"UI"[BB XT=1 S:"SKN"[BB END=1 Q
  1. . I SQAT="$I" N SP1 S SP1=(POS-SL) I ($E(XLINE,SP1,(SL+1))="$$")!($E(XLINE,POS)?1A) S XT=1 Q
  1. . I SQAT="DIC(0)" D
  1. .. I $F(XLINE,"FILE^DICN") D Q:XT
  1. ... N P1,P2,C1 S P1=$P(XLINE,"FILE^DICN"),P2=$P(XLINE,"FILE^DICN",2),C1=0 N XPDI F XPDI=P1,P2 D
  1. .... N DO1,D2 S DO1=$F(XPDI,"DO") Q:'$G(DO1) S D2=(DO1-3),BB="" F AA=D2:-1:0 I $E(XPDI,AA)=$C(32),$E(XPDI,AA-2)=$C(32) S BB=$E(XPDI,(AA-1)) S:"K"[BB C1=C1+1 Q
  1. ... I C1>1 S XT=1 Q
  1. ... S END=1
  1. .. Q:END
  1. .. I '$F(XLINE,"FILE^DICN") D Q:XT
  1. ... N DO1,D1 S D1="",DO1=$F(XLINE,"DIC(0)=") F AA=DO1:1:$L(XLINE) Q:($E(XLINE,AA)=$C(32))!($E(XLINE,AA)=",") S D1=D1_$E(XLINE,AA)
  1. ... Q:D1']"" S:D1'["L" XT=1 Q:XT
  1. ... I D1["L" S:'$F(XLINE,"DLAYGO") END=1 Q:END N D2 S BB=0,D2=$F(XLINE,"DLAYGO") F AA=D2:1:$L(XLINE) Q:$E(XLINE,AA)=$C(32) I $E(XLINE,AA)="=" S BB=1
  1. ... I BB=1 S XT=1 Q
  1. . Q:XT Q:END
  1. . S END=1
  1. Q END
  1. ;
  1. KCHK(XLINE,REF) ;
  1. ;CHECK REF IS K ^ OR K: EXCLUDE K: @
  1. N XPS,J,T,XPNUM,XPCON,PCON,END,FOP,FCP,TTT S END=0,PCON=""
  1. S XPS=$L(XLINE,REF) F J=2:1:XPS S XPNUM=$P(XLINE,REF,J) D Q:END=3
  1. K1 . S XPCON="",(END,FOP)=0,FCP=99 F T=1:1:$L(XPNUM) D Q:END=1!(END=3)
  1. .. I $E(XPNUM,T)?1P S TTT=$E(XPNUM,T) D Q:END=1
  1. ... I TTT=",",T>FCP S XPCON="^"_$E(XPNUM,1,(T-1)),PCON=$E(XPNUM,(T+2),999),END=1 Q
  1. ... I $E(XPNUM,T)=")" S FCP=T,XPCON="^"_$E(XPNUM,1,T) I
  1. ... I (T>FCP)&(TTT=$C(32)) S END=1 Q
  1. .. I XPCON']"" S XPCON=XPNUM
  1. . I XPCON]"" D
  1. .. I XPCON["^(" S END=1 Q
  1. .. I (XPCON["^TMP")!(XPCON["^UTILITY") S END=1 Q
  1. .. N INNER,OUTER,FP S OUTER=$P(XPCON,"("),INNER=$P($P(XPCON,"(",2),")"),FP=$P(INNER,",")
  1. .. I $L(INNER,",")=1,FP="0" S END=3 Q
  1. .. I $F(XPCON,"(")=0 S END=3 Q
  1. .. Q:+FP<1 ;Q:FP'?.N
  1. .. Q:$L(INNER,",")>2
  1. .. I $D(^DIC(FP,0,"GL")),^DIC(FP,0,"GL")=(OUTER_"("_FP_",") I ($L(INNER,",")=1!($P(INNER,",",2)=0)) S END=3 Q
  1. . Q:END=3
  1. . I PCON]"" Q:$P(PCON," ")'["^" S XPNUM=$P(PCON,"^",2),PCON="" D K1
  1. Q END
  1. ;