DIOS ;SFISC/GFT,TKW-BUILD SORT LOGIC ;4SEP2003
 ;;22.2;VA FileMan;;Jan 05, 2016;Build 42
 ;;Per VA Directive 6402, this routine should not be modified.
 ;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
 ;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
 ;;Licensed under the terms of the Apache License, Version 2.0.
 ;
 D INIT S ^UTILITY($J,"DX")=DX,^("F")="^UTILITY($J,0,"_DCC_U_(DPP+1)
 F X=-1:0 S X=$O(DX(X)) Q:X=""  S ^UTILITY($J,"DX",X)=DX(X)
C K DX F DL=1:1:DPP S DX=+DPP(DL),V(DX,2)=DL,X=DP,(DPQ,DJ)=0,Z(DL)="" D A S X=999-$P($G(DPP(DL,"SER")),U,2),Y(DPQ,DX,X,$E($P(DPP(DL),U,2,3),1,30))=DL
 F DL=1:1:DPP D  I D5,DE>0,$D(DE(DL))=1 S DE(DL)=DE(DL)-(DE\D5) S:DE(DL)<4 DE(DL)=4
 .K % S Z=Z(DL)
U .F %=1:1 S D="",Y=$P(Z,",",%) Q:Y=""  D
 ..S %(%)="D"_V(Y) I $D(V(Y,9)) F I=1:1:%-1 S DIOS=$P(Z,",",I),%(I)="$$SUB^DIOS("_DIOS_")"
 ..F I=1:1:% S D=D_","_%(I) I I=1 S D=D_","_DL
 ..S DX(Y,U)=D_"))"
 K DIOS S I=DP G GO
 ;
SUB(F) ;
 N S,L
 S L="",S=-1
 F  S L=$O(J(L)) Q:L=""  I J(L)=F,$D(I(L,0)) S S=I(L,0) Q
 Q S
 ;
A S W=$D(DPP(DL,X)),V(X)=DJ,Z(DL)=Z(DL)_X_"," G ^DIOS1:'W
 I W=1 S Z=X,V=DPP(DL,X),DJ=DJ+1,DPQ=DPQ+1,X=$O(DPP(DL,X)) S:X="" X=-1 S:+V'=V V=Q_V_Q S:$S($D(^DD(X,0,"UP")):^("UP")-Z,1:1) X=DX K J(DJ,X) S:J'<DJ&$D(J(DJ)) J=DJ-1 S J(DJ,X)=DL,V(X,1)=V,V(X,0)=Z,I(Z,X)=DL G A
 S W=-1
O S W=$O(DPP(DL,X,W)) I W="" S X=+V G A
 S V=DPP(DL,X,W),DJ=W#100,V(+V,9,DL)=W,V(+V,8)=U_$P(V,U,2),DPQ=DPQ+1+DJ,I(X,+V)=DL,J=-1,J(DJ,X)=DL G O
 ;
GO K DISETP,DISAVX S X=I,I="" I $D(V(X,2)) S I=" X P("_X_")" I $D(DIBTPGM) S I=" D P"_DICP,DISETP=1
 I V(X) S W="D"_V(X),I="F "_W_"="_W_":0"_I
 S DX(X)=I,DPQ=X
 S DX=X,I=$O(I(X,X)),F=-1 I I="" D  I I="" G DIO1
 . I $D(I)<9 Q:'$D(DIBTPGM)  Q:$D(DISAVX(X))  S %=DX(X),%(1)=X,%(2)="DX" D SETU Q
 . S I=$O(I(X,-1)) Q:I]""
 . S I=$O(I(DP,-1)) I I]"" S DX=DP Q
 . S DX=+$O(I(-1)),I=+$O(I(DX,-1))
 . Q
 S P=I(DX,I) K I(DX,I) G COLON:$D(V(I,9)) D MULPATH
 S F="",(DX,%(0))=I,W="D"_V(I),%=DCC S:$D(DXIX(I)) F=DXIX(I) D:F="" GREF^DIOU(.V,.%,.F)
 S DX(X)=DX(X)_" S "_D2_W_"=$O("_$E(F,1,$L(F)-2)_"0))"_DN_$P(")",U,'$D(DIBTPGM))_D1
 I $D(DIBTPGM) S %=DX(X),%(1)=X,%(2)="DX" D SETU
 G GO
COLON S F=$O(V(I,9,F)) I F="" G GO
 D MULPATH S DX(X)=DX(X)_$E(" S "_D2,1,$S(D2]"":$L(D2)+2,1:0))_DN I '$D(DIBTPGM) S DX(X)=DX(X)_","_F_")"
 S DX(X)=DX(X)_D1
 I $D(DIBTPGM) S %=DX(X),%(1)=X,%(2)="DX" D SETU
 S DN=DPP(F,DX,V(I,9,F)),V=$P(DN,U,4,99)
 I $P(DN,U,3) S V="S DIXX="_I_" "_V
 E  S V=V_" S D0=D(0) " D
 .I '$D(DIBTPGM) S V=V_"X DX("_I_")" Q
 .S V=V_"D DX"_DICDX
 .Q
 S DX(I,F)=V I $D(DIBTPGM) S %=V,%(1)=I_","_F,%(2)="DX" D SETU
 G COLON
 ;
MULPATH S DN=" "_$E("XD",$D(DIBTPGM)+1)_$P(":$T",1,$D(V(X,2)))_" DX" D
 .I $D(DIBTPGM) S DN=DN_DICDX Q
 .S DN=DN_"("_I Q
 S (D1,D2)="" F Z=J+1:1:V(X) S W="D"_Z,D(X)="("_X_","_P_")",%=W_D(X),D2=%_"="_W_","_D2,D1=$S(D1]"":D1_",",1:" S ")_W_"="_%
 F V=0:1 S Y=$S($D(J(V,X)):X,$O(J(V,-1)):$O(J(V,-1)),1:-1) D:$D(D(Y))  Q:V'<V(X)
 . I V<V(X) S DN=" S D"_V_"=D"_V_D(Y)_DN
 . Q:'$D(V(X,9))
 . S:V=0 DN=" N I,DIXX"_DN
 . Q:V<V(X)
 . I $D(V(X,2)) S DN=" S D"_V_"=D"_V_D(Y)_DN
 . Q
 Q
 ;
SETU ;FILE A LINE TO ^TMP FOR LATER INCLUSION IN ROUTINE
 Q:%=""  N A
 I %(2)="DX" S A=$S(DICDX=1:"O",1:"DX"_(DICDX-1)),DISAVX(X)=""
 I %(2)'="DX" S A=%(2)_DICOV,DICOV=DICOV+1
 S %=A_$E(" ",$E(%)'=" ")_%
 S ^TMP("DIBTC",$J,%(1),DICNT)=%,^((DICNT+.001))=" Q"
 S A="DIC"_%(2) S @(A)=@(A)+1,DICNT=DICNT+1
 I %(2)="DX",$D(DISETP) S DICP(X)=DICP,DICP=DICP+1 K DISETP
 Q
 ;
INIT S:'$D(L) L=1 I $G(IO)=IO(0),L'=0,($G(IOST)=""!($G(IOST)?1"C".E)) D WAIT^DICD
 S I=^DD("OS",DISYS,0),J=$P(I,U,7),DIOS=$S(J:J,1:63),J=$P(I,U,3),DE=$S(J:J,$G(^DD("SUB")):^("SUB"),1:255)
 K I,J,Z S J=99,Q="""",DE=DPP*8-DE+23,D5=0
 Q
 ;
DIO1 K %,I,J,P G ^DIO1
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDIOS   3785     printed  Sep 23, 2025@20:28:38                                                                                                                                                                                                        Page 2
DIOS      ;SFISC/GFT,TKW-BUILD SORT LOGIC ;4SEP2003
 +1       ;;22.2;VA FileMan;;Jan 05, 2016;Build 42
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3       ;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
 +4       ;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
 +5       ;;Licensed under the terms of the Apache License, Version 2.0.
 +6       ;
 +7        DO INIT
           SET ^UTILITY($JOB,"DX")=DX
           SET ^("F")="^UTILITY($J,0,"_DCC_U_(DPP+1)
 +8        FOR X=-1:0
               SET X=$ORDER(DX(X))
               if X=""
                   QUIT 
               SET ^UTILITY($JOB,"DX",X)=DX(X)
C          KILL DX
           FOR DL=1:1:DPP
               SET DX=+DPP(DL)
               SET V(DX,2)=DL
               SET X=DP
               SET (DPQ,DJ)=0
               SET Z(DL)=""
               DO A
               SET X=999-$PIECE($GET(DPP(DL,"SER")),U,2)
               SET Y(DPQ,DX,X,$EXTRACT($PIECE(DPP(DL),U,2,3),1,30))=DL
 +1        FOR DL=1:1:DPP
               Begin DoDot:1
 +2                KILL %
                   SET Z=Z(DL)
U                  FOR %=1:1
                       SET D=""
                       SET Y=$PIECE(Z,",",%)
                       if Y=""
                           QUIT 
                       Begin DoDot:2
 +1                        SET %(%)="D"_V(Y)
                           IF $DATA(V(Y,9))
                               FOR I=1:1:%-1
                                   SET DIOS=$PIECE(Z,",",I)
                                   SET %(I)="$$SUB^DIOS("_DIOS_")"
 +2                        FOR I=1:1:%
                               SET D=D_","_%(I)
                               IF I=1
                                   SET D=D_","_DL
 +3                        SET DX(Y,U)=D_"))"
                       End DoDot:2
               End DoDot:1
               IF D5
                   IF DE>0
                       IF $DATA(DE(DL))=1
                           SET DE(DL)=DE(DL)-(DE\D5)
                           if DE(DL)<4
                               SET DE(DL)=4
 +4        KILL DIOS
           SET I=DP
           GOTO GO
 +5       ;
SUB(F)    ;
 +1        NEW S,L
 +2        SET L=""
           SET S=-1
 +3        FOR 
               SET L=$ORDER(J(L))
               if L=""
                   QUIT 
               IF J(L)=F
                   IF $DATA(I(L,0))
                       SET S=I(L,0)
                       QUIT 
 +4        QUIT S
 +5       ;
A          SET W=$DATA(DPP(DL,X))
           SET V(X)=DJ
           SET Z(DL)=Z(DL)_X_","
           if 'W
               GOTO ^DIOS1
 +1        IF W=1
               SET Z=X
               SET V=DPP(DL,X)
               SET DJ=DJ+1
               SET DPQ=DPQ+1
               SET X=$ORDER(DPP(DL,X))
               if X=""
                   SET X=-1
               if +V'=V
                   SET V=Q_V_Q
               if $SELECT($DATA(^DD(X,0,"UP"))
                   SET X=DX
               KILL J(DJ,X)
               if J'<DJ&$DATA(J(DJ))
                   SET J=DJ-1
               SET J(DJ,X)=DL
               SET V(X,1)=V
               SET V(X,0)=Z
               SET I(Z,X)=DL
               GOTO A
 +2        SET W=-1
O          SET W=$ORDER(DPP(DL,X,W))
           IF W=""
               SET X=+V
               GOTO A
 +1        SET V=DPP(DL,X,W)
           SET DJ=W#100
           SET V(+V,9,DL)=W
           SET V(+V,8)=U_$PIECE(V,U,2)
           SET DPQ=DPQ+1+DJ
           SET I(X,+V)=DL
           SET J=-1
           SET J(DJ,X)=DL
           GOTO O
 +2       ;
GO         KILL DISETP,DISAVX
           SET X=I
           SET I=""
           IF $DATA(V(X,2))
               SET I=" X P("_X_")"
               IF $DATA(DIBTPGM)
                   SET I=" D P"_DICP
                   SET DISETP=1
 +1        IF V(X)
               SET W="D"_V(X)
               SET I="F "_W_"="_W_":0"_I
 +2        SET DX(X)=I
           SET DPQ=X
 +3        SET DX=X
           SET I=$ORDER(I(X,X))
           SET F=-1
           IF I=""
               Begin DoDot:1
 +4                IF $DATA(I)<9
                       if '$DATA(DIBTPGM)
                           QUIT 
                       if $DATA(DISAVX(X))
                           QUIT 
                       SET %=DX(X)
                       SET %(1)=X
                       SET %(2)="DX"
                       DO SETU
                       QUIT 
 +5                SET I=$ORDER(I(X,-1))
                   if I]""
                       QUIT 
 +6                SET I=$ORDER(I(DP,-1))
                   IF I]""
                       SET DX=DP
                       QUIT 
 +7                SET DX=+$ORDER(I(-1))
                   SET I=+$ORDER(I(DX,-1))
 +8                QUIT 
               End DoDot:1
               IF I=""
                   GOTO DIO1
 +9        SET P=I(DX,I)
           KILL I(DX,I)
           if $DATA(V(I,9))
               GOTO COLON
           DO MULPATH
 +10       SET F=""
           SET (DX,%(0))=I
           SET W="D"_V(I)
           SET %=DCC
           if $DATA(DXIX(I))
               SET F=DXIX(I)
           if F=""
               DO GREF^DIOU(.V,.%,.F)
 +11       SET DX(X)=DX(X)_" S "_D2_W_"=$O("_$EXTRACT(F,1,$LENGTH(F)-2)_"0))"_DN_$PIECE(")",U,'$DATA(DIBTPGM))_D1
 +12       IF $DATA(DIBTPGM)
               SET %=DX(X)
               SET %(1)=X
               SET %(2)="DX"
               DO SETU
 +13       GOTO GO
COLON      SET F=$ORDER(V(I,9,F))
           IF F=""
               GOTO GO
 +1        DO MULPATH
           SET DX(X)=DX(X)_$EXTRACT(" S "_D2,1,$SELECT(D2]"":$LENGTH(D2)+2,1:0))_DN
           IF '$DATA(DIBTPGM)
               SET DX(X)=DX(X)_","_F_")"
 +2        SET DX(X)=DX(X)_D1
 +3        IF $DATA(DIBTPGM)
               SET %=DX(X)
               SET %(1)=X
               SET %(2)="DX"
               DO SETU
 +4        SET DN=DPP(F,DX,V(I,9,F))
           SET V=$PIECE(DN,U,4,99)
 +5        IF $PIECE(DN,U,3)
               SET V="S DIXX="_I_" "_V
 +6       IF '$TEST
               SET V=V_" S D0=D(0) "
               Begin DoDot:1
 +7                IF '$DATA(DIBTPGM)
                       SET V=V_"X DX("_I_")"
                       QUIT 
 +8                SET V=V_"D DX"_DICDX
 +9                QUIT 
               End DoDot:1
 +10       SET DX(I,F)=V
           IF $DATA(DIBTPGM)
               SET %=V
               SET %(1)=I_","_F
               SET %(2)="DX"
               DO SETU
 +11       GOTO COLON
 +12      ;
MULPATH    SET DN=" "_$EXTRACT("XD",$DATA(DIBTPGM)+1)_$PIECE(":$T",1,$DATA(V(X,2)))_" DX"
           Begin DoDot:1
 +1            IF $DATA(DIBTPGM)
                   SET DN=DN_DICDX
                   QUIT 
 +2            SET DN=DN_"("_I
               QUIT 
           End DoDot:1
 +3        SET (D1,D2)=""
           FOR Z=J+1:1:V(X)
               SET W="D"_Z
               SET D(X)="("_X_","_P_")"
               SET %=W_D(X)
               SET D2=%_"="_W_","_D2
               SET D1=$SELECT(D1]"":D1_",",1:" S ")_W_"="_%
 +4        FOR V=0:1
               SET Y=$SELECT($DATA(J(V,X)):X,$ORDER(J(V,-1)):$ORDER(J(V,-1)),1:-1)
               if $DATA(D(Y))
                   Begin DoDot:1
 +5                    IF V<V(X)
                           SET DN=" S D"_V_"=D"_V_D(Y)_DN
 +6                    if '$DATA(V(X,9))
                           QUIT 
 +7                    if V=0
                           SET DN=" N I,DIXX"_DN
 +8                    if V<V(X)
                           QUIT 
 +9                    IF $DATA(V(X,2))
                           SET DN=" S D"_V_"=D"_V_D(Y)_DN
 +10                   QUIT 
                   End DoDot:1
               if V'<V(X)
                   QUIT 
 +11       QUIT 
 +12      ;
SETU      ;FILE A LINE TO ^TMP FOR LATER INCLUSION IN ROUTINE
 +1        if %=""
               QUIT 
           NEW A
 +2        IF %(2)="DX"
               SET A=$SELECT(DICDX=1:"O",1:"DX"_(DICDX-1))
               SET DISAVX(X)=""
 +3        IF %(2)'="DX"
               SET A=%(2)_DICOV
               SET DICOV=DICOV+1
 +4        SET %=A_$EXTRACT(" ",$EXTRACT(%)'=" ")_%
 +5        SET ^TMP("DIBTC",$JOB,%(1),DICNT)=%
           SET ^((DICNT+.001))=" Q"
 +6        SET A="DIC"_%(2)
           SET @(A)=@(A)+1
           SET DICNT=DICNT+1
 +7        IF %(2)="DX"
               IF $DATA(DISETP)
                   SET DICP(X)=DICP
                   SET DICP=DICP+1
                   KILL DISETP
 +8        QUIT 
 +9       ;
INIT       if '$DATA(L)
               SET L=1
           IF $GET(IO)=IO(0)
               IF L'=0
                   IF ($GET(IOST)=""!($GET(IOST)?1"C".E))
                       DO WAIT^DICD
 +1        SET I=^DD("OS",DISYS,0)
           SET J=$PIECE(I,U,7)
           SET DIOS=$SELECT(J:J,1:63)
           SET J=$PIECE(I,U,3)
           SET DE=$SELECT(J:J,$GET(^DD("SUB")):^("SUB"),1:255)
 +2        KILL I,J,Z
           SET J=99
           SET Q=""""
           SET DE=DPP*8-DE+23
           SET D5=0
 +3        QUIT 
 +4       ;
DIO1       KILL %,I,J,P
           GOTO ^DIO1