OCXOCMPF ;SLC/RJS,CLA - ORDER CHECK CODE COMPILER (Parse a Rule Relation Expression continued...) ;10/29/98  12:37
 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32**;Dec 17,1997
 ;;  ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
 ;
 Q
 ;
SYNTXER(EXP,PTR,FLD1,FLD2) ;
 N OCXWTXT,OCXDASH
 S OCXDASH="",$P(OCXDASH,"_",250)="_"
 S OCXWTXT(1)=" "_EXP
 S OCXWTXT(2)="_"_$E(OCXDASH,1,$L($P(EXP," ",1,PTR-1)))_"/"
 S OCXWTXT(3)=" "
 I 'FLD1,FLD2 S OCXWTXT(4)=" Syntax Error: A Boolean expression cannot start with a  '"_$$TKTXT(FLD2)_"'."
 I 'FLD1,'FLD2 S OCXWTXT(4)=" Unknown Symbol:  '"_$P(EXP," ",PTR)_"'."
 I FLD1,FLD2 S OCXWTXT(4)=" Syntax Error: A '"_$$TKTXT(FLD2)_"' cannot follow a '"_$$TKTXT(FLD1)_"'."
 I '$D(OCXWTXT(4)) S OCXWTXT(4)="Unknown error with:  '"_$P(EXP," ",PTR)_"'."
 D WARN^OCXOCMPV(.OCXWTXT,2,OCXD0,$P($T(+1)," ",1)) Q
 Q
 ;
OPCODE(TXT) ;
 ;
 N OPNUM,SUB,OPFUNC,OPCNT,OCXX,OCXPFN
 S OPNUM=0 F  S OPNUM=$O(^OCXS(863.9,"B",TXT,OPNUM)) Q:'OPNUM  Q:($P($G(^OCXS(863.9,OPNUM,0)),U,2)=OCXBOOL)
 I 'OPNUM F  S OPNUM=$O(^OCXS(863.9,"SYN",TXT,OPNUM)) Q:'OPNUM  Q:($P($G(^OCXS(863.9,OPNUM,0)),U,2)=OCXBOOL)
 Q:'OPNUM ""
 S OPFUNC=$$GETPARM(39,OPNUM,"OCXO GENERATE CODE FUNCTION")
 I OPFUNC S OCXPFN=+OPFUNC
 E  S OCXPFN=0 F  S OCXPFN=$O(^OCXS(863.7,"B",$E(OPFUNC,1,30),OCXPFN)) Q:'OCXPFN  Q:($P($G(^OCXS(863.7,+OCXPFN,0)),U,1)=OPFUNC)
 S OCXX=0 F OPCNT=0:1 S OCXX=$O(^OCXS(863.7,+OCXPFN,"PAR",OCXX)) Q:'OCXX
 ;
 Q:(OPCNT=1) 0
 ;
 Q OPCNT_U_OPFUNC
 ;
GETPARM(FILE,INST,PARM) ;
 Q:'$L(FILE) "" Q:'$L(INST) "" Q:'$L(PARM) ""
 N OCXP,OCXP1,OCXI,OCXGL
 S OCXGL="^OCXS" S:(FILE=1) OCXGL="^OCXD" S:(FILE=7) OCXGL="^OCXD" S:(FILE=10) OCXGL="^OCXD" S FILE=FILE/10+860
 Q:'$D(@OCXGL@(+FILE,0)) ""
 I (PARM=+PARM),$D(^OCXS(863.8,PARM,0)) S OCXP=PARM
 E  S OCXP=$O(^OCXS(863.8,"B",PARM,0))
 Q:'OCXP ""
 I (INST=+INST),$D(@OCXGL@(FILE,INST,0)) S OCXI=INST
 E  S OCXI=$O(@OCXGL@(FILE,"B",INST,0))
 Q:'OCXI ""
 S OCXP1=$O(@OCXGL@(FILE,OCXI,"PAR","B",OCXP,0)) S:'OCXP1 OCXP1=$O(@OCXGL@(FILE,OCXI,"PAR","B",PARM,0))
 Q:'OCXP1 ""
 Q $G(@OCXGL@(FILE,OCXI,"PAR",OCXP1,"VAL"))
 ;
PARCNT(EXP) ;
 N CNT,PTR
 ;
 S CNT=$L(EXP,"(")-$L(EXP,")") I CNT D  Q ""
 .N MSG
 .S MSG(1)=" "_EXP,MSG(2)=" "
 .S MSG(3)=" "_$S((CNT<0):(-CNT),1:CNT)_" Unmatched "_$S((CNT>0):"LEFT '('",1:"RIGHT ')'")_" parenthesis in expression"
 .S MSG(4)="   PARCNT^OCXOCMPF "
 .D WARN^OCXOCMPV(.MSG,2,OCXD0,$P($T(+1)," ",1)) Q
 ;
 F  Q:'(EXP["(")  S EXP=$P(EXP,"(",1)_" @ "_$P(EXP,"(",2,999)
 S EXP=$TR(EXP,"@","(")
 F  Q:'(EXP[")")  S EXP=$P(EXP,")",1)_" @ "_$P(EXP,")",2,999)
 S EXP=$TR(EXP,"@",")")
 ;
 F  Q:'(EXP["  ")  S EXP=$P(EXP,"  ",1)_" "_$P(EXP,"  ",2,999)
 ;
 F PTR=1:1:$L(EXP) Q:'($E(EXP,PTR)=" ")
 S EXP=$E(EXP,PTR,$L(EXP))
 ;
 F PTR=$L(EXP):-1:1 Q:'($E(EXP,PTR)=" ")
 S EXP=$E(EXP,1,PTR)
 ;
 Q EXP
 ;
TKTXT(T) Q $S(T=1:"Data Field 1",T=2:"Data Field 2",T=3:"AND Operator",T=4:"OR Operator",T=5:"Left Parenthesis",T=6:"Right Parenthesis",1:"Token not found")
 ;
EXPAND(OPFUNC,OCXP) ;
 ;
 N OCXCOD1,OCXCODE,OCXD1
 S OCXCODE="",OCXP=$G(^OCXS(863.7,+OPFUNC,"EX")),OCXCOD1="S OCXCODE=$$"_OCXP
 S OCXD1=0 F  S OCXD1=$O(^OCXS(863.7,+OPFUNC,"PAR",OCXD1)) Q:'OCXD1  D
 .N OCXPOS,OCXVNAM
 .S OCXPOS=+$G(^OCXS(863.7,+OPFUNC,"PAR",OCXD1,"IN")) Q:'OCXPOS  Q:$D(OCXP(OCXPOS))
 .S OCXVNAM=+$G(^OCXS(863.7,+OPFUNC,"PAR",OCXD1,0)) Q:'OCXVNAM
 .S OCXVNAM=$P($G(^OCXS(863.8,+OCXVNAM,0)),U,2) Q:'$L(OCXVNAM)
 .S OCXP(+OCXPOS)=OCXVNAM
 I $O(OCXP(0)) D
 .S OCXCOD1=OCXCOD1_"(",OCXD1=0 F  S OCXD1=$O(OCXP(OCXD1)) Q:'OCXD1  D
 ..I ($E(OCXP(OCXP(OCXD1)),1)="""") S OCXCOD1=OCXCOD1_""""""_OCXP(OCXP(OCXD1))_""""""
 ..E  S OCXCOD1=OCXCOD1_""""_OCXP(OCXP(OCXD1))_""""
 ..I $O(OCXP(OCXD1)) S OCXCOD1=OCXCOD1_","
 ..E  S OCXCOD1=OCXCOD1_")"
 .X OCXCOD1
 ;
 Q OCXCODE
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HOCXOCMPF   3807     printed  Sep 23, 2025@20:01:08                                                                                                                                                                                                    Page 2
OCXOCMPF  ;SLC/RJS,CLA - ORDER CHECK CODE COMPILER (Parse a Rule Relation Expression continued...) ;10/29/98  12:37
 +1       ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32**;Dec 17,1997
 +2       ;;  ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
 +3       ;
 +4        QUIT 
 +5       ;
SYNTXER(EXP,PTR,FLD1,FLD2) ;
 +1        NEW OCXWTXT,OCXDASH
 +2        SET OCXDASH=""
           SET $PIECE(OCXDASH,"_",250)="_"
 +3        SET OCXWTXT(1)=" "_EXP
 +4        SET OCXWTXT(2)="_"_$EXTRACT(OCXDASH,1,$LENGTH($PIECE(EXP," ",1,PTR-1)))_"/"
 +5        SET OCXWTXT(3)=" "
 +6        IF 'FLD1
               IF FLD2
                   SET OCXWTXT(4)=" Syntax Error: A Boolean expression cannot start with a  '"_$$TKTXT(FLD2)_"'."
 +7        IF 'FLD1
               IF 'FLD2
                   SET OCXWTXT(4)=" Unknown Symbol:  '"_$PIECE(EXP," ",PTR)_"'."
 +8        IF FLD1
               IF FLD2
                   SET OCXWTXT(4)=" Syntax Error: A '"_$$TKTXT(FLD2)_"' cannot follow a '"_$$TKTXT(FLD1)_"'."
 +9        IF '$DATA(OCXWTXT(4))
               SET OCXWTXT(4)="Unknown error with:  '"_$PIECE(EXP," ",PTR)_"'."
 +10       DO WARN^OCXOCMPV(.OCXWTXT,2,OCXD0,$PIECE($TEXT(+1)," ",1))
           QUIT 
 +11       QUIT 
 +12      ;
OPCODE(TXT) ;
 +1       ;
 +2        NEW OPNUM,SUB,OPFUNC,OPCNT,OCXX,OCXPFN
 +3        SET OPNUM=0
           FOR 
               SET OPNUM=$ORDER(^OCXS(863.9,"B",TXT,OPNUM))
               if 'OPNUM
                   QUIT 
               if ($PIECE($GET(^OCXS(863.9,OPNUM,0)),U,2)=OCXBOOL)
                   QUIT 
 +4        IF 'OPNUM
               FOR 
                   SET OPNUM=$ORDER(^OCXS(863.9,"SYN",TXT,OPNUM))
                   if 'OPNUM
                       QUIT 
                   if ($PIECE($GET(^OCXS(863.9,OPNUM,0)),U,2)=OCXBOOL)
                       QUIT 
 +5        if 'OPNUM
               QUIT ""
 +6        SET OPFUNC=$$GETPARM(39,OPNUM,"OCXO GENERATE CODE FUNCTION")
 +7        IF OPFUNC
               SET OCXPFN=+OPFUNC
 +8       IF '$TEST
               SET OCXPFN=0
               FOR 
                   SET OCXPFN=$ORDER(^OCXS(863.7,"B",$EXTRACT(OPFUNC,1,30),OCXPFN))
                   if 'OCXPFN
                       QUIT 
                   if ($PIECE($GET(^OCXS(863.7,+OCXPFN,0)),U,1)=OPFUNC)
                       QUIT 
 +9        SET OCXX=0
           FOR OPCNT=0:1
               SET OCXX=$ORDER(^OCXS(863.7,+OCXPFN,"PAR",OCXX))
               if 'OCXX
                   QUIT 
 +10      ;
 +11       if (OPCNT=1)
               QUIT 0
 +12      ;
 +13       QUIT OPCNT_U_OPFUNC
 +14      ;
GETPARM(FILE,INST,PARM) ;
 +1        if '$LENGTH(FILE)
               QUIT ""
           if '$LENGTH(INST)
               QUIT ""
           if '$LENGTH(PARM)
               QUIT ""
 +2        NEW OCXP,OCXP1,OCXI,OCXGL
 +3        SET OCXGL="^OCXS"
           if (FILE=1)
               SET OCXGL="^OCXD"
           if (FILE=7)
               SET OCXGL="^OCXD"
           if (FILE=10)
               SET OCXGL="^OCXD"
           SET FILE=FILE/10+860
 +4        if '$DATA(@OCXGL@(+FILE,0))
               QUIT ""
 +5        IF (PARM=+PARM)
               IF $DATA(^OCXS(863.8,PARM,0))
                   SET OCXP=PARM
 +6       IF '$TEST
               SET OCXP=$ORDER(^OCXS(863.8,"B",PARM,0))
 +7        if 'OCXP
               QUIT ""
 +8        IF (INST=+INST)
               IF $DATA(@OCXGL@(FILE,INST,0))
                   SET OCXI=INST
 +9       IF '$TEST
               SET OCXI=$ORDER(@OCXGL@(FILE,"B",INST,0))
 +10       if 'OCXI
               QUIT ""
 +11       SET OCXP1=$ORDER(@OCXGL@(FILE,OCXI,"PAR","B",OCXP,0))
           if 'OCXP1
               SET OCXP1=$ORDER(@OCXGL@(FILE,OCXI,"PAR","B",PARM,0))
 +12       if 'OCXP1
               QUIT ""
 +13       QUIT $GET(@OCXGL@(FILE,OCXI,"PAR",OCXP1,"VAL"))
 +14      ;
PARCNT(EXP) ;
 +1        NEW CNT,PTR
 +2       ;
 +3        SET CNT=$LENGTH(EXP,"(")-$LENGTH(EXP,")")
           IF CNT
               Begin DoDot:1
 +4                NEW MSG
 +5                SET MSG(1)=" "_EXP
                   SET MSG(2)=" "
 +6                SET MSG(3)=" "_$SELECT((CNT<0):(-CNT),1:CNT)_" Unmatched "_$SELECT((CNT>0):"LEFT '('",1:"RIGHT ')'")_" parenthesis in expression"
 +7                SET MSG(4)="   PARCNT^OCXOCMPF "
 +8                DO WARN^OCXOCMPV(.MSG,2,OCXD0,$PIECE($TEXT(+1)," ",1))
                   QUIT 
               End DoDot:1
               QUIT ""
 +9       ;
 +10       FOR 
               if '(EXP["(")
                   QUIT 
               SET EXP=$PIECE(EXP,"(",1)_" @ "_$PIECE(EXP,"(",2,999)
 +11       SET EXP=$TRANSLATE(EXP,"@","(")
 +12       FOR 
               if '(EXP[")")
                   QUIT 
               SET EXP=$PIECE(EXP,")",1)_" @ "_$PIECE(EXP,")",2,999)
 +13       SET EXP=$TRANSLATE(EXP,"@",")")
 +14      ;
 +15       FOR 
               if '(EXP["  ")
                   QUIT 
               SET EXP=$PIECE(EXP,"  ",1)_" "_$PIECE(EXP,"  ",2,999)
 +16      ;
 +17       FOR PTR=1:1:$LENGTH(EXP)
               if '($EXTRACT(EXP,PTR)=" ")
                   QUIT 
 +18       SET EXP=$EXTRACT(EXP,PTR,$LENGTH(EXP))
 +19      ;
 +20       FOR PTR=$LENGTH(EXP):-1:1
               if '($EXTRACT(EXP,PTR)=" ")
                   QUIT 
 +21       SET EXP=$EXTRACT(EXP,1,PTR)
 +22      ;
 +23       QUIT EXP
 +24      ;
TKTXT(T)   QUIT $SELECT(T=1:"Data Field 1",T=2:"Data Field 2",T=3:"AND Operator",T=4:"OR Operator",T=5:"Left Parenthesis",T=6:"Right Parenthesis",1:"Token not found")
 +1       ;
EXPAND(OPFUNC,OCXP) ;
 +1       ;
 +2        NEW OCXCOD1,OCXCODE,OCXD1
 +3        SET OCXCODE=""
           SET OCXP=$GET(^OCXS(863.7,+OPFUNC,"EX"))
           SET OCXCOD1="S OCXCODE=$$"_OCXP
 +4        SET OCXD1=0
           FOR 
               SET OCXD1=$ORDER(^OCXS(863.7,+OPFUNC,"PAR",OCXD1))
               if 'OCXD1
                   QUIT 
               Begin DoDot:1
 +5                NEW OCXPOS,OCXVNAM
 +6                SET OCXPOS=+$GET(^OCXS(863.7,+OPFUNC,"PAR",OCXD1,"IN"))
                   if 'OCXPOS
                       QUIT 
                   if $DATA(OCXP(OCXPOS))
                       QUIT 
 +7                SET OCXVNAM=+$GET(^OCXS(863.7,+OPFUNC,"PAR",OCXD1,0))
                   if 'OCXVNAM
                       QUIT 
 +8                SET OCXVNAM=$PIECE($GET(^OCXS(863.8,+OCXVNAM,0)),U,2)
                   if '$LENGTH(OCXVNAM)
                       QUIT 
 +9                SET OCXP(+OCXPOS)=OCXVNAM
               End DoDot:1
 +10       IF $ORDER(OCXP(0))
               Begin DoDot:1
 +11               SET OCXCOD1=OCXCOD1_"("
                   SET OCXD1=0
                   FOR 
                       SET OCXD1=$ORDER(OCXP(OCXD1))
                       if 'OCXD1
                           QUIT 
                       Begin DoDot:2
 +12                       IF ($EXTRACT(OCXP(OCXP(OCXD1)),1)="""")
                               SET OCXCOD1=OCXCOD1_""""""_OCXP(OCXP(OCXD1))_""""""
 +13                      IF '$TEST
                               SET OCXCOD1=OCXCOD1_""""_OCXP(OCXP(OCXD1))_""""
 +14                       IF $ORDER(OCXP(OCXD1))
                               SET OCXCOD1=OCXCOD1_","
 +15                      IF '$TEST
                               SET OCXCOD1=OCXCOD1_")"
                       End DoDot:2
 +16               XECUTE OCXCOD1
               End DoDot:1
 +17      ;
 +18       QUIT OCXCODE
 +19      ;