PSOHLPIS ;BIR/RTR-Parse out and create CPRS Sig ;7/21/96
 ;;7.0;OUTPATIENT PHARMACY;**46,225,282**;DEC 1997;Build 18
 ;External reference to File #50.7 supported by DBIA 2223
 ;External reference to File #51 supported by DBIA 2224
 ;External reference to File #51.1 supported by DBIA 2225
 ;External reference to File #51.2 supported by DBIA 2226
 ;External reference to File #50.606 supported by DBIA 2174
EN ;
 Q:'$D(^PS(52.41,PENDING,1,0))
 N PISI,PSOFX,SDF,SZZ,ZZS,ZZSB,SSZZ,SCHHOLD,GGGZ,SGLFLAG,SGLOOP,ZSCHED,SPFG,PSNOUN,MEDEXP,PSDUR,NOUN,SCHED,INTERVAL,SIG0,SIG2,SIG3,SDL,WW,TODOSE,PDAYS,WWFL,PSOCJS,PSOFDCT,PSODCT
 N SSS,TT,DCOUNT,PREP,VERB,FFF,GGG,SIGDS,SIGRT,PSOROUTE,PSOSG1,PSOSG2,FTC,FTCA,FTCF,FTCNT
 N SIG
 F PISI=0:0 S PISI=$O(^PS(52.41,PENDING,1,PISI)) Q:'PISI  D:$D(^(PISI,0))
 .S PSOFX("DOSE",PISI)=$P($G(^PS(52.41,PENDING,1,PISI,2)),"^") I $P($G(^(2)),"^",2)'="" S PSOFX("DOSE ORDERED",PISI)=$P($G(^(2)),"^",2)
 .S PSOFX("SCHEDULE",PISI)=$P($G(^PS(52.41,PENDING,1,PISI,1)),"^"),PSOFX("ROUTE",PISI)=$P($G(^(1)),"^",8),PSOFX("DURATION",PISI)=$P($G(^(1)),"^",2),PSOFX("NOUN",PISI)=$P($G(^(1)),"^",5),PSOFX("CONJUNCTION",PISI)=$P($G(^(1)),"^",6)
 .I $G(PSOFX("DURATION",PISI)) S PSOFX("DURATION",PISI)="D"_$G(PSOFX("DURATION",PISI))
 .I $G(PSOFX("DURATION",PISI))'="" S PSOFX("DURATION",PISI)=$E(PSOFX("DURATION",PISI),2,999)_$E(PSOFX("DURATION",PISI))
 S TODOSE=0 F WW=0:0 S WW=$O(PSOFX("DOSE",WW)) Q:'WW  S TODOSE=WW
 Q:'TODOSE
 S SIGDS=+$P($G(^PS(50.7,+$G(PSORDITE),0)),"^",2),VERB=$P($G(^PS(50.606,SIGDS,"MISC")),"^"),PREP=$P($G(^("MISC")),"^",3)
 S FTCNT=0 K FTC,FTCA,FTCF F SSS=1:1:TODOSE D
 .S SIG0(SSS)=$S($G(PSOFX("DOSE ORDERED",SSS))'="":$G(PSOFX("DOSE ORDERED",SSS)),1:$G(PSOFX("DOSE",SSS)))
 .S PSNOUN(SSS)=$G(PSOFX("NOUN",SSS))
 .S FTC=+$G(PSOFX("ROUTE",SSS)) I FTC S:'FTCNT FTCA=FTC S FTCNT=FTCNT+1
 .I FTCNT>1,$G(FTC),$G(FTC)'=$G(FTCA) S FTCF=1
 .S PSOROUTE(SSS)=$S($P($G(^PS(51.2,+$G(PSOFX("ROUTE",SSS)),0)),"^",2)'="":$P(^(0),"^",2),$P($G(^(0)),"^",3)'="":$P(^(0),"^",3),1:$P($G(^(0)),"^")) S MEDEXP(SSS)=$S($P($G(^PS(51.2,+$G(PSOFX("ROUTE",SSS)),0)),"^",2)="":0,1:1)
 .S PDAYS(SSS)=$G(PSOFX("DURATION",SSS))
 .I $G(PSOFX("DURATION",SSS))'="",($E(PSOFX("DURATION",SSS),$L(PSOFX("DURATION",SSS)))'?1A) S PDAYS(SSS)=PDAYS(SSS)_"D"
 .S PSDUR(SSS)=$S($G(PDAYS(SSS))="":"NULL",1:"FOR "_$E($G(PDAYS(SSS)),1,($L($G(PDAYS(SSS)))-1))) D  I PSDUR(SSS)'="NULL" S PSDUR(SSS)=PSDUR(SSS)_" "_INTERVAL
 ..I PSDUR(SSS)'="NULL" S INTERVAL=$E(PDAYS(SSS),$L(PDAYS(SSS))),INTERVAL=$S(INTERVAL="D":"DAYS",INTERVAL="W":"WEEKS",INTERVAL="H":"HOURS",INTERVAL="L":"MONTHS",INTERVAL="M":"MINUTES",INTERVAL="S":"SECONDS",1:"") D
 ...I $G(INTERVAL)'="",$G(PSOFX("DURATION",SSS)),$G(PSOFX("DURATION",SSS))'>1 S INTERVAL=$E(INTERVAL,1,($L(INTERVAL)-1))
 ;282 Schedule Expander Changed
 F GGG=1:1:TODOSE S SCHED(GGG)=$$SCHE^PSOSIG($G(PSOFX("SCHEDULE",GGG)))
 ;282 End Change
 S (FTC,FTCA,PSOFDCT)=0 F FFF=0:0 S FFF=$O(SIG0(FFF)) Q:'FFF  D
 .K PSOSG1,PSOSG2 D VERB D:$G(PSNOUN(FFF))'=""&('$G(PSOSG1)) SSS
 .D FRAC
 .S SIG2(FFF)=$S(VERB'=""&('$G(PSOSG1)):VERB_" ",1:"")_$S($G(PSOFX("DOSE ORDERED",FFF))'="":$S($G(PSOFRAC)'="":$G(PSOFRAC),1:$G(PSOFX("DOSE ORDERED",FFF)))_" ",1:$G(PSOFX("DOSE",FFF))_" ")
 .S PSOFDCT=PSOFDCT+1
 .K PSOFRAC,PSOFRACX
 .I FTC>0,$G(PSOROUTE(FFF))'="",'$G(FTCF) S FTCA=1
 .I $G(PSOROUTE(FFF))'="" S FTC=FTC+1
 .S SIG2(FFF)=SIG2(FFF)_$S($G(PSNOUN(FFF))'=""&('$G(PSOSG2)):$G(PSNOUN(FFF))_" ",1:"")_$S(PREP'=""&($G(MEDEXP(FFF)))&('FTCA):PREP_" ",1:"")
 .S SIG2(FFF)=SIG2(FFF)_$S(PSOROUTE(FFF)'=""&('FTCA):PSOROUTE(FFF)_" ",1:"")
 .;S SIG2(FFF)=SIG2(FFF)_$S(SCHED(FFF)'="":SCHED(FFF)_" ",1:"")_$S(PSDUR(FFF)'="NULL":PSDUR(FFF)_" ",1:"")_$S($G(PSOFX("CONJUNCTION",FFF))="A":"AND",$G(PSOFX("CONJUNCTION",FFF))="T":"THEN",$G(PSOFX("CONJUNCTION",FFF))="S":"THEN",1:"")
 .S SIG2(FFF)=SIG2(FFF)_$S(SCHED(FFF)'="":SCHED(FFF)_$S($G(PSDUR(FFF))="NULL"&($G(PSOFX("CONJUNCTION",FFF))="")&('$O(SIG0(FFF))):"",1:" "),1:"")
 .S PSOCJS=$G(PSOFX("CONJUNCTION",FFF))
 .S SIG2(FFF)=SIG2(FFF)_$S(PSDUR(FFF)'="NULL":PSDUR(FFF)_$S($G(PSOFX("CONJUNCTION",FFF))=""&('$O(SIG0(FFF))):"",1:", "),1:"")_$S($G(PSOCJS)="A":"AND",$G(PSOCJS)="T":"THEN",$G(PSOCJS)="S":"THEN",$G(PSOCJS)="X":"EXCEPT",1:"")
 .K PSOSG1,PSOSG2
 .K PSOUCS S SIG2(FFF)=$$UPPER(SIG2(FFF)) K PSOUCS
 ;I $G(PSOFX("INS"))'="" S TODOSE=TODOSE+1,SIG2(TODOSE)=$G(PSOFX("INS"))
 S PSODCT="" F  S PSODCT=$O(^PS(52.41,PENDING,"INS1",PSODCT)) Q:PSODCT=""  I $D(^(PSODCT,0)) S PSOFDCT=PSOFDCT+1 S SIG2(PSOFDCT)=$G(^(0)) K PSOUCS S SIG2(PSOFDCT)=$$UPPER(SIG2(PSOFDCT)) K PSOUCS
STUFF ;
 S DCOUNT=0
 I '$D(SIG2(1)) G QUIT
 I '$O(SIG2(1)),$L(SIG2(1))<71 S ^PS(52.41,PENDING,"SIG",0)="^52.4124A^"_1_"^"_1 S ^PS(52.41,PENDING,"SIG",1,0)=$$UNESC^ORHLESC(SIG2(1)) S DCOUNT=1 G QUITIN
 S (VAR,VAR1)="",II=1
 F FF=0:0 S FF=$O(SIG2(FF)) Q:'FF  S CT=0 F NN=1:1:$L(SIG2(FF)) I $E(SIG2(FF),NN)=" "!($L(SIG2(FF))=NN) S CT=CT+1 D  I $L(VAR)>70 S SIG(II)=LIM_" ",II=II+1,VAR=VAR1
 .S VAR1=$P(SIG2(FF)," ",(CT))
 .S LIM=VAR
 .S VAR=$S(VAR="":VAR1,1:VAR_" "_VAR1)
 I $G(VAR)'="" S SIG(II)=VAR
 F II=0:0 S II=$O(SIG(II)) Q:'II  S DCOUNT=DCOUNT+1 S ^PS(52.41,PENDING,"SIG",DCOUNT,0)=$$UNESC^ORHLESC(SIG(II))
 I DCOUNT S ^PS(52.41,PENDING,"SIG",0)="^52.4124A^"_DCOUNT_"^"_DCOUNT
QUITIN ;I $P($G(^PS(50.7,+$G(PSORDITE),"INS")),"^")'="",DCOUNT S DCOUNT=DCOUNT+1,^PS(52.41,PENDING,"SIG",0)="^52.4124A^"_DCOUNT_"^"_DCOUNT,^PS(52.41,PENDING,"SIG",DCOUNT,0)=$P($G(^PS(50.7,+$G(PSORDITE),"INS")),"^")
 ;I $P($G(^PS(50.7,+$G(PSORDITE),"INS")),"^")'="" S $P(^PS(52.41,PENDING,"INS"),"^")=$P(^PS(50.7,+$G(PSORDITE),"INS"),"^")
QUIT K SSS,TT,DCOUNT,PREP,VERB,FFF,GGG,SIGDS,SIGRT,PSOROUTE,PSOSG1,PSOSG2 Q
SIG1 ;
 F FFF=0:0 S FFF=$O(SIG0(FFF)) Q:'FFF  S SIG2(FFF)=SIG0(FFF)
 Q
DAYS I +$E($P(SIG1(TT),"^",2))!($E($P(SIG1(TT),"^",2))=0) S $P(SIG1(TT),"^",2)="D"_$P(SIG1(TT),"^",2)
 Q
NON ;
 I $P($G(SIG0(SSS)),"&",2)'="" S PSNOUN(SSS)=$P($G(SIG0(SSS)),"&",2) Q
 Q
 F NOUN=0:0 S NOUN=$O(^PS(50.606,SIGDS,"NOUN",NOUN)) Q:'NOUN!($G(PSNOUN(SSS))'="")  I $P($G(^PS(50.606,SIGDS,"NOUN",NOUN,0)),"^")'="" S PSNOUN(SSS)=$P(^(0),"^")
 Q
VERB ;Check if verb and noun need to be added to SIG
 K PSOLCS,PSOUCS,PSOISL,PSOVL
 I $G(VERB)'="" S PSOVL=$L(VERB),PSOISL=$E($G(SIG0(FFF)),1,$G(PSOVL)) I $G(PSOISL)'="" D
 .S PSOUCS=VERB
 .S PSOUCS=$$UPPER(PSOUCS) I PSOUCS=PSOISL S PSOSG1=1 Q
 .S PSOUCS=$$LOWER(PSOUCS) I PSOUCS=PSOISL S PSOSG1=1 Q
 .S PSOUCS=$$UPPER($E(PSOUCS,1))_$$LOWER($E(PSOUCS,2,99)) I PSOUCS=PSOISL S PSOSG1=1 Q
 I $G(PSNOUN(FFF))="" G VERBEX
 S PSOISL=$G(SIG0(FFF)) I $G(PSOISL)="" G VERBEX
 S PSOVL=$F(PSNOUN(FFF),"(")
 I $G(PSOVL)>2 S PSOUCS=$E(PSNOUN(FFF),1,(PSOVL-2))
 I $G(PSOVL)'>2 S PSOUCS=PSNOUN(FFF)
 I $G(PSOISL)'="" D
 .S PSOUCS=$$UPPER(PSOUCS) I PSOISL[PSOUCS S PSOSG2=1 Q
 .S PSOUCS=$$LOWER(PSOUCS) I PSOISL[PSOUCS S PSOSG2=1 Q
 .S PSOUCS=$$UPPER($E(PSOUCS,1))_$$LOWER($E(PSOUCS,2,99)) I PSOISL[PSOUCS S PSOSG2=1
VERBEX K PSOLCS,PSOUCS,PSOISL,PSOVL Q
 ;
UPPER(PSOUCS) ;
 Q $TR(PSOUCS,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 ;
LOWER(PSOLCS) ;
 Q $TR(PSOLCS,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
 Q
 ;
SSS ;
 K PSOFNL,PSOFNLF,PSOFNLX
 Q:$G(PSNOUN(FFF))=""
 Q:$L(PSNOUN(FFF))'>3
 Q:'$G(PSOFX("DOSE ORDERED",FFF))
 ;Q:$G(PSOFX("DOSE ORDERED",FFF))>1
 S PSOFNL=$E(PSNOUN(FFF),($L(PSNOUN(FFF))-2),$L(PSNOUN(FFF)))
 I $G(PSOFNL)="(S)"!($G(PSOFNL)="(s)") D
 .I $G(PSOFX("DOSE ORDERED",FFF))'>1 S PSNOUN(FFF)=$E(PSNOUN(FFF),1,($L(PSNOUN(FFF))-3))
 .I $G(PSOFX("DOSE ORDERED",FFF))>1 S PSNOUN(FFF)=$E(PSNOUN(FFF),1,($L(PSNOUN(FFF))-3))_$E(PSOFNL,2)
 Q
FRAC ;
 K PSOFRAC,PSOFRACX,PSOFRAC1,PSOFRAC2
 I $G(PSOFX("DOSE ORDERED",FFF))="" Q
 I $G(PSOFX("DOSE ORDERED",FFF))'["." S (PSOFRAC1,PSOFRAC)=$G(PSOFX("DOSE ORDERED",FFF)) D NUM D  G FRACQ
 .I $G(PSOFRAC1)=$G(PSOFRAC) K PSOFRAC,PSOFRAC1 Q
 .S PSOFRAC=$G(PSOFRAC1)
 S PSOFRAC1=$P(PSOFX("DOSE ORDERED",FFF),"."),PSOFRAC2=$P(PSOFX("DOSE ORDERED",FFF),".",2)
 S PSOFRACX="."_$G(PSOFRAC2)
 S PSOFRAC=$S(PSOFRACX=".5":"ONE-HALF",PSOFRACX=".25":"ONE-FOURTH",PSOFRACX=".33":"ONE-THIRD",PSOFRACX=".34":"ONE-THIRD",PSOFRACX=".50":"ONE-HALF",PSOFRACX=".66":"TWO-THIRDS",PSOFRACX=".67":"TWO-THIRDS",PSOFRACX=".75":"THREE-FOURTHS",1:"")
 I $G(PSOFRAC)="" K PSOFRAC G FRACQ
 I $G(PSOFRAC1)'="",+$G(PSOFRAC1) D NUM S PSOFRAC=$G(PSOFRAC1)_" AND "_$G(PSOFRAC)
FRACQ K PSOFRAC1,PSOFRAC2
 Q
NUM ;
 Q:$G(PSOFRAC1)=""
 S PSOFRAC1=$S(PSOFRAC1="1":"ONE",PSOFRAC1="2":"TWO",PSOFRAC1="3":"THREE",PSOFRAC1="4":"FOUR",PSOFRAC1="5":"FIVE",PSOFRAC1="6":"SIX",PSOFRAC1="7":"SEVEN",PSOFRAC1="8":"EIGHT",PSOFRAC1="9":"NINE",PSOFRAC1="10":"TEN",1:PSOFRAC1)
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSOHLPIS   8675     printed  Sep 23, 2025@20:06:26                                                                                                                                                                                                    Page 2
PSOHLPIS  ;BIR/RTR-Parse out and create CPRS Sig ;7/21/96
 +1       ;;7.0;OUTPATIENT PHARMACY;**46,225,282**;DEC 1997;Build 18
 +2       ;External reference to File #50.7 supported by DBIA 2223
 +3       ;External reference to File #51 supported by DBIA 2224
 +4       ;External reference to File #51.1 supported by DBIA 2225
 +5       ;External reference to File #51.2 supported by DBIA 2226
 +6       ;External reference to File #50.606 supported by DBIA 2174
EN        ;
 +1        if '$DATA(^PS(52.41,PENDING,1,0))
               QUIT 
 +2        NEW PISI,PSOFX,SDF,SZZ,ZZS,ZZSB,SSZZ,SCHHOLD,GGGZ,SGLFLAG,SGLOOP,ZSCHED,SPFG,PSNOUN,MEDEXP,PSDUR,NOUN,SCHED,INTERVAL,SIG0,SIG2,SIG3,SDL,WW,TODOSE,PDAYS,WWFL,PSOCJS,PSOFDCT,PSODCT
 +3        NEW SSS,TT,DCOUNT,PREP,VERB,FFF,GGG,SIGDS,SIGRT,PSOROUTE,PSOSG1,PSOSG2,FTC,FTCA,FTCF,FTCNT
 +4        NEW SIG
 +5        FOR PISI=0:0
               SET PISI=$ORDER(^PS(52.41,PENDING,1,PISI))
               if 'PISI
                   QUIT 
               if $DATA(^(PISI,0))
                   Begin DoDot:1
 +6                    SET PSOFX("DOSE",PISI)=$PIECE($GET(^PS(52.41,PENDING,1,PISI,2)),"^")
                       IF $PIECE($GET(^(2)),"^",2)'=""
                           SET PSOFX("DOSE ORDERED",PISI)=$PIECE($GET(^(2)),"^",2)
 +7                    SET PSOFX("SCHEDULE",PISI)=$PIECE($GET(^PS(52.41,PENDING,1,PISI,1)),"^")
                       SET PSOFX("ROUTE",PISI)=$PIECE($GET(^(1)),"^",8)
                       SET PSOFX("DURATION",PISI)=$PIECE($GET(^(1)),"^",2)
                       SET PSOFX("NOUN",PISI)=$PIECE($GET(^(1)),"^",5)
                       SET PSOFX("CONJUNCTION",PISI)=$PIECE($GET(^(1)),"^",6)
 +8                    IF $GET(PSOFX("DURATION",PISI))
                           SET PSOFX("DURATION",PISI)="D"_$GET(PSOFX("DURATION",PISI))
 +9                    IF $GET(PSOFX("DURATION",PISI))'=""
                           SET PSOFX("DURATION",PISI)=$EXTRACT(PSOFX("DURATION",PISI),2,999)_$EXTRACT(PSOFX("DURATION",PISI))
                   End DoDot:1
 +10       SET TODOSE=0
           FOR WW=0:0
               SET WW=$ORDER(PSOFX("DOSE",WW))
               if 'WW
                   QUIT 
               SET TODOSE=WW
 +11       if 'TODOSE
               QUIT 
 +12       SET SIGDS=+$PIECE($GET(^PS(50.7,+$GET(PSORDITE),0)),"^",2)
           SET VERB=$PIECE($GET(^PS(50.606,SIGDS,"MISC")),"^")
           SET PREP=$PIECE($GET(^("MISC")),"^",3)
 +13       SET FTCNT=0
           KILL FTC,FTCA,FTCF
           FOR SSS=1:1:TODOSE
               Begin DoDot:1
 +14               SET SIG0(SSS)=$SELECT($GET(PSOFX("DOSE ORDERED",SSS))'="":$GET(PSOFX("DOSE ORDERED",SSS)),1:$GET(PSOFX("DOSE",SSS)))
 +15               SET PSNOUN(SSS)=$GET(PSOFX("NOUN",SSS))
 +16               SET FTC=+$GET(PSOFX("ROUTE",SSS))
                   IF FTC
                       if 'FTCNT
                           SET FTCA=FTC
                       SET FTCNT=FTCNT+1
 +17               IF FTCNT>1
                       IF $GET(FTC)
                           IF $GET(FTC)'=$GET(FTCA)
                               SET FTCF=1
 +18               SET PSOROUTE(SSS)=$SELECT($PIECE($GET(^PS(51.2,+$GET(PSOFX("ROUTE",SSS)),0)),"^",2)'="":$PIECE(^(0),"^",2),$PIECE($GET(^(0)),"^",3)'="":$PIECE(^(0),"^",3),1:$PIECE($GET(^(0)),"^"))
                   SET MEDEXP(SSS)=$SELECT($PIECE($GET(^PS(51.2,+$GET(PSOFX("ROUTE",SSS)),0)),"^",2)="":0,1:1)
 +19               SET PDAYS(SSS)=$GET(PSOFX("DURATION",SSS))
 +20               IF $GET(PSOFX("DURATION",SSS))'=""
                       IF ($EXTRACT(PSOFX("DURATION",SSS),$LENGTH(PSOFX("DURATION",SSS)))'?1A)
                           SET PDAYS(SSS)=PDAYS(SSS)_"D"
 +21               SET PSDUR(SSS)=$SELECT($GET(PDAYS(SSS))="":"NULL",1:"FOR "_$EXTRACT($GET(PDAYS(SSS)),1,($LENGTH($GET(PDAYS(SSS)))-1)))
                   Begin DoDot:2
 +22                   IF PSDUR(SSS)'="NULL"
                           SET INTERVAL=$EXTRACT(PDAYS(SSS),$LENGTH(PDAYS(SSS)))
                           SET INTERVAL=$SELECT(INTERVAL="D":"DAYS",INTERVAL="W":"WEEKS",INTERVAL="H":"HOURS",INTERVAL="L":"MONTHS",INTERVAL="M":"MINUTES",INTERVAL="S":"SECONDS",1:"")
                           Begin DoDot:3
 +23                           IF $GET(INTERVAL)'=""
                                   IF $GET(PSOFX("DURATION",SSS))
                                       IF $GET(PSOFX("DURATION",SSS))'>1
                                           SET INTERVAL=$EXTRACT(INTERVAL,1,($LENGTH(INTERVAL)-1))
                           End DoDot:3
                   End DoDot:2
                   IF PSDUR(SSS)'="NULL"
                       SET PSDUR(SSS)=PSDUR(SSS)_" "_INTERVAL
               End DoDot:1
 +24      ;282 Schedule Expander Changed
 +25       FOR GGG=1:1:TODOSE
               SET SCHED(GGG)=$$SCHE^PSOSIG($GET(PSOFX("SCHEDULE",GGG)))
 +26      ;282 End Change
 +27       SET (FTC,FTCA,PSOFDCT)=0
           FOR FFF=0:0
               SET FFF=$ORDER(SIG0(FFF))
               if 'FFF
                   QUIT 
               Begin DoDot:1
 +28               KILL PSOSG1,PSOSG2
                   DO VERB
                   if $GET(PSNOUN(FFF))'=""&('$GET(PSOSG1))
                       DO SSS
 +29               DO FRAC
 +30               SET SIG2(FFF)=$SELECT(VERB'=""&('$GET(PSOSG1)):VERB_" ",1:"")_$SELECT($GET(PSOFX("DOSE ORDERED",FFF))'="":$SELECT($GET(PSOFRAC)'="":$GET(PSOFRAC),1:$GET(PSOFX("DOSE ORDERED",FFF)))_" ",1:$GET(PSOFX("DOSE",FFF))_" ")
 +31               SET PSOFDCT=PSOFDCT+1
 +32               KILL PSOFRAC,PSOFRACX
 +33               IF FTC>0
                       IF $GET(PSOROUTE(FFF))'=""
                           IF '$GET(FTCF)
                               SET FTCA=1
 +34               IF $GET(PSOROUTE(FFF))'=""
                       SET FTC=FTC+1
 +35               SET SIG2(FFF)=SIG2(FFF)_$SELECT($GET(PSNOUN(FFF))'=""&('$GET(PSOSG2)):$GET(PSNOUN(FFF))_" ",1:"")_$SELECT(PREP'=""&($GET(MEDEXP(FFF)))&('FTCA):PREP_" ",1:"")
 +36               SET SIG2(FFF)=SIG2(FFF)_$SELECT(PSOROUTE(FFF)'=""&('FTCA):PSOROUTE(FFF)_" ",1:"")
 +37      ;S SIG2(FFF)=SIG2(FFF)_$S(SCHED(FFF)'="":SCHED(FFF)_" ",1:"")_$S(PSDUR(FFF)'="NULL":PSDUR(FFF)_" ",1:"")_$S($G(PSOFX("CONJUNCTION",FFF))="A":"AND",$G(PSOFX("CONJUNCTION",FFF))="T":"THEN",$G(PSOFX("CONJUNCTION",FFF))="S":"THEN",1:"")
 +38               SET SIG2(FFF)=SIG2(FFF)_$SELECT(SCHED(FFF)'="":SCHED(FFF)_$SELECT($GET(PSDUR(FFF))="NULL"&($GET(PSOFX("CONJUNCTION",FFF))="")&('$ORDER(SIG0(FFF))):"",1:" "),1:"")
 +39               SET PSOCJS=$GET(PSOFX("CONJUNCTION",FFF))
 +40              SET SIG2(FFF)=SIG2(FFF)_$SELECT(PSDUR(FFF)'="NULL":PSDUR(FFF)_$SELECT($GET(PSOFX("CONJUNCTION",FFF))=""&('$ORDER(SIG0(FFF))):"",1:", "),1:"")_$SELECT($GET(PSOCJS)="A":"AND",$GET(PSOCJS)="T":"THEN",$GET(PSOCJS)="S":"THEN",...
                   ... $GET(PSOCJS)="X":"EXCEPT",1:"")
 +41               KILL PSOSG1,PSOSG2
 +42               KILL PSOUCS
                   SET SIG2(FFF)=$$UPPER(SIG2(FFF))
                   KILL PSOUCS
               End DoDot:1
 +43      ;I $G(PSOFX("INS"))'="" S TODOSE=TODOSE+1,SIG2(TODOSE)=$G(PSOFX("INS"))
 +44       SET PSODCT=""
           FOR 
               SET PSODCT=$ORDER(^PS(52.41,PENDING,"INS1",PSODCT))
               if PSODCT=""
                   QUIT 
               IF $DATA(^(PSODCT,0))
                   SET PSOFDCT=PSOFDCT+1
                   SET SIG2(PSOFDCT)=$GET(^(0))
                   KILL PSOUCS
                   SET SIG2(PSOFDCT)=$$UPPER(SIG2(PSOFDCT))
                   KILL PSOUCS
STUFF     ;
 +1        SET DCOUNT=0
 +2        IF '$DATA(SIG2(1))
               GOTO QUIT
 +3        IF '$ORDER(SIG2(1))
               IF $LENGTH(SIG2(1))<71
                   SET ^PS(52.41,PENDING,"SIG",0)="^52.4124A^"_1_"^"_1
                   SET ^PS(52.41,PENDING,"SIG",1,0)=$$UNESC^ORHLESC(SIG2(1))
                   SET DCOUNT=1
                   GOTO QUITIN
 +4        SET (VAR,VAR1)=""
           SET II=1
 +5        FOR FF=0:0
               SET FF=$ORDER(SIG2(FF))
               if 'FF
                   QUIT 
               SET CT=0
               FOR NN=1:1:$LENGTH(SIG2(FF))
                   IF $EXTRACT(SIG2(FF),NN)=" "!($LENGTH(SIG2(FF))=NN)
                       SET CT=CT+1
                       Begin DoDot:1
 +6                        SET VAR1=$PIECE(SIG2(FF)," ",(CT))
 +7                        SET LIM=VAR
 +8                        SET VAR=$SELECT(VAR="":VAR1,1:VAR_" "_VAR1)
                       End DoDot:1
                       IF $LENGTH(VAR)>70
                           SET SIG(II)=LIM_" "
                           SET II=II+1
                           SET VAR=VAR1
 +9        IF $GET(VAR)'=""
               SET SIG(II)=VAR
 +10       FOR II=0:0
               SET II=$ORDER(SIG(II))
               if 'II
                   QUIT 
               SET DCOUNT=DCOUNT+1
               SET ^PS(52.41,PENDING,"SIG",DCOUNT,0)=$$UNESC^ORHLESC(SIG(II))
 +11       IF DCOUNT
               SET ^PS(52.41,PENDING,"SIG",0)="^52.4124A^"_DCOUNT_"^"_DCOUNT
QUITIN    ;I $P($G(^PS(50.7,+$G(PSORDITE),"INS")),"^")'="",DCOUNT S DCOUNT=DCOUNT+1,^PS(52.41,PENDING,"SIG",0)="^52.4124A^"_DCOUNT_"^"_DCOUNT,^PS(52.41,PENDING,"SIG",DCOUNT,0)=$P($G(^PS(50.7,+$G(PSORDITE),"INS")),"^")
 +1       ;I $P($G(^PS(50.7,+$G(PSORDITE),"INS")),"^")'="" S $P(^PS(52.41,PENDING,"INS"),"^")=$P(^PS(50.7,+$G(PSORDITE),"INS"),"^")
QUIT       KILL SSS,TT,DCOUNT,PREP,VERB,FFF,GGG,SIGDS,SIGRT,PSOROUTE,PSOSG1,PSOSG2
           QUIT 
SIG1      ;
 +1        FOR FFF=0:0
               SET FFF=$ORDER(SIG0(FFF))
               if 'FFF
                   QUIT 
               SET SIG2(FFF)=SIG0(FFF)
 +2        QUIT 
DAYS       IF +$EXTRACT($PIECE(SIG1(TT),"^",2))!($EXTRACT($PIECE(SIG1(TT),"^",2))=0)
               SET $PIECE(SIG1(TT),"^",2)="D"_$PIECE(SIG1(TT),"^",2)
 +1        QUIT 
NON       ;
 +1        IF $PIECE($GET(SIG0(SSS)),"&",2)'=""
               SET PSNOUN(SSS)=$PIECE($GET(SIG0(SSS)),"&",2)
               QUIT 
 +2        QUIT 
 +3        FOR NOUN=0:0
               SET NOUN=$ORDER(^PS(50.606,SIGDS,"NOUN",NOUN))
               if 'NOUN!($GET(PSNOUN(SSS))'="")
                   QUIT 
               IF $PIECE($GET(^PS(50.606,SIGDS,"NOUN",NOUN,0)),"^")'=""
                   SET PSNOUN(SSS)=$PIECE(^(0),"^")
 +4        QUIT 
VERB      ;Check if verb and noun need to be added to SIG
 +1        KILL PSOLCS,PSOUCS,PSOISL,PSOVL
 +2        IF $GET(VERB)'=""
               SET PSOVL=$LENGTH(VERB)
               SET PSOISL=$EXTRACT($GET(SIG0(FFF)),1,$GET(PSOVL))
               IF $GET(PSOISL)'=""
                   Begin DoDot:1
 +3                    SET PSOUCS=VERB
 +4                    SET PSOUCS=$$UPPER(PSOUCS)
                       IF PSOUCS=PSOISL
                           SET PSOSG1=1
                           QUIT 
 +5                    SET PSOUCS=$$LOWER(PSOUCS)
                       IF PSOUCS=PSOISL
                           SET PSOSG1=1
                           QUIT 
 +6                    SET PSOUCS=$$UPPER($EXTRACT(PSOUCS,1))_$$LOWER($EXTRACT(PSOUCS,2,99))
                       IF PSOUCS=PSOISL
                           SET PSOSG1=1
                           QUIT 
                   End DoDot:1
 +7        IF $GET(PSNOUN(FFF))=""
               GOTO VERBEX
 +8        SET PSOISL=$GET(SIG0(FFF))
           IF $GET(PSOISL)=""
               GOTO VERBEX
 +9        SET PSOVL=$FIND(PSNOUN(FFF),"(")
 +10       IF $GET(PSOVL)>2
               SET PSOUCS=$EXTRACT(PSNOUN(FFF),1,(PSOVL-2))
 +11       IF $GET(PSOVL)'>2
               SET PSOUCS=PSNOUN(FFF)
 +12       IF $GET(PSOISL)'=""
               Begin DoDot:1
 +13               SET PSOUCS=$$UPPER(PSOUCS)
                   IF PSOISL[PSOUCS
                       SET PSOSG2=1
                       QUIT 
 +14               SET PSOUCS=$$LOWER(PSOUCS)
                   IF PSOISL[PSOUCS
                       SET PSOSG2=1
                       QUIT 
 +15               SET PSOUCS=$$UPPER($EXTRACT(PSOUCS,1))_$$LOWER($EXTRACT(PSOUCS,2,99))
                   IF PSOISL[PSOUCS
                       SET PSOSG2=1
               End DoDot:1
VERBEX     KILL PSOLCS,PSOUCS,PSOISL,PSOVL
           QUIT 
 +1       ;
UPPER(PSOUCS) ;
 +1        QUIT $TRANSLATE(PSOUCS,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 +2       ;
LOWER(PSOLCS) ;
 +1        QUIT $TRANSLATE(PSOLCS,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
 +2        QUIT 
 +3       ;
SSS       ;
 +1        KILL PSOFNL,PSOFNLF,PSOFNLX
 +2        if $GET(PSNOUN(FFF))=""
               QUIT 
 +3        if $LENGTH(PSNOUN(FFF))'>3
               QUIT 
 +4        if '$GET(PSOFX("DOSE ORDERED",FFF))
               QUIT 
 +5       ;Q:$G(PSOFX("DOSE ORDERED",FFF))>1
 +6        SET PSOFNL=$EXTRACT(PSNOUN(FFF),($LENGTH(PSNOUN(FFF))-2),$LENGTH(PSNOUN(FFF)))
 +7        IF $GET(PSOFNL)="(S)"!($GET(PSOFNL)="(s)")
               Begin DoDot:1
 +8                IF $GET(PSOFX("DOSE ORDERED",FFF))'>1
                       SET PSNOUN(FFF)=$EXTRACT(PSNOUN(FFF),1,($LENGTH(PSNOUN(FFF))-3))
 +9                IF $GET(PSOFX("DOSE ORDERED",FFF))>1
                       SET PSNOUN(FFF)=$EXTRACT(PSNOUN(FFF),1,($LENGTH(PSNOUN(FFF))-3))_$EXTRACT(PSOFNL,2)
               End DoDot:1
 +10       QUIT 
FRAC      ;
 +1        KILL PSOFRAC,PSOFRACX,PSOFRAC1,PSOFRAC2
 +2        IF $GET(PSOFX("DOSE ORDERED",FFF))=""
               QUIT 
 +3        IF $GET(PSOFX("DOSE ORDERED",FFF))'["."
               SET (PSOFRAC1,PSOFRAC)=$GET(PSOFX("DOSE ORDERED",FFF))
               DO NUM
               Begin DoDot:1
 +4                IF $GET(PSOFRAC1)=$GET(PSOFRAC)
                       KILL PSOFRAC,PSOFRAC1
                       QUIT 
 +5                SET PSOFRAC=$GET(PSOFRAC1)
               End DoDot:1
               GOTO FRACQ
 +6        SET PSOFRAC1=$PIECE(PSOFX("DOSE ORDERED",FFF),".")
           SET PSOFRAC2=$PIECE(PSOFX("DOSE ORDERED",FFF),".",2)
 +7        SET PSOFRACX="."_$GET(PSOFRAC2)
 +8        SET PSOFRAC=$SELECT(PSOFRACX=".5":"ONE-HALF",PSOFRACX=".25":"ONE-FOURTH",PSOFRACX=".33":"ONE-THIRD",PSOFRACX=".34":"ONE-THIRD",PSOFRACX=".50":"ONE-HALF",PSOFRACX=".66":"TWO-THIRDS",PSOFRACX=".67":"TWO-THIRDS",PSOFRACX=".75":"THREE-FOURTHS",1:""
)
 +9        IF $GET(PSOFRAC)=""
               KILL PSOFRAC
               GOTO FRACQ
 +10       IF $GET(PSOFRAC1)'=""
               IF +$GET(PSOFRAC1)
                   DO NUM
                   SET PSOFRAC=$GET(PSOFRAC1)_" AND "_$GET(PSOFRAC)
FRACQ      KILL PSOFRAC1,PSOFRAC2
 +1        QUIT 
NUM       ;
 +1        if $GET(PSOFRAC1)=""
               QUIT 
 +2        SET PSOFRAC1=$SELECT(PSOFRAC1="1":"ONE",PSOFRAC1="2":"TWO",PSOFRAC1="3":"THREE",PSOFRAC1="4":"FOUR",PSOFRAC1="5":"FIVE",PSOFRAC1="6":"SIX",PSOFRAC1="7":"SEVEN",PSOFRAC1="8":"EIGHT",PSOFRAC1="9":"NINE",PSOFRAC1="10":"TEN",1:PSOFRAC1)
 +3        QUIT