1 | OCXOCMPC ;SLC/RJS,CLA - ORDER CHECK CODE COMPILER (Optimize a Boolean Expression) ;10/29/98 12:37
|
---|
2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32**;Dec 17,1997
|
---|
3 | ;; ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
|
---|
4 | ;
|
---|
5 | Q
|
---|
6 | ;
|
---|
7 | OPTMIZ(OCXD0,OCXEXP) ;
|
---|
8 | ;
|
---|
9 | Q 0
|
---|
10 | N OCXRES,OCXSTAK,OCXPTR,OCXFLST,OCXTKN,OCXERR,OCXTEXP,OCXDASH,OCXBOOL,OCXPTKN,OCXX
|
---|
11 | ;
|
---|
12 | S OCXEXP=$$PARCNT(OCXEXP) Q:'$L(OCXEXP) OCXWARN Q:OCXWARN OCXWARN
|
---|
13 | ;
|
---|
14 | S OCXEXP=$TR(OCXEXP,"~","")
|
---|
15 | ;
|
---|
16 | S OCXEXP=$$STRIP(OCXEXP)
|
---|
17 | ;
|
---|
18 | I 0 W ! S OCXOP="" F OCXPTR=1:1:$L(OCXEXP," ") D
|
---|
19 | .F Q:'(+$$TOP) Q:'($$TOP=$$TOP(2)) S OCXX=$$POP,OCXX=$$POP D DISP
|
---|
20 | .;
|
---|
21 | .I (+$P(OCXEXP," ",OCXPTR)) D PUSH(+$P(OCXEXP," ",OCXPTR)) D DISP Q
|
---|
22 | .;
|
---|
23 | .I ($P(OCXEXP," ",OCXPTR)="(") D PUSH("(") S OCXOP="" D DISP Q
|
---|
24 | .;
|
---|
25 | .I ($P(OCXEXP," ",OCXPTR)=")") D S OCXOP="" D DISP Q
|
---|
26 | ..N SUB,POP S SUB="" F S POP=$$POP Q:'$L(POP) Q:(POP="(") S:$L(SUB) SUB=" "_SUB S SUB=POP_SUB
|
---|
27 | ..D PUSH($$TOKEN(SUB))
|
---|
28 | .;
|
---|
29 | .I '$L(OCXOP) S OCXOP=$P(OCXEXP," ",OCXPTR) D PUSH(OCXOP) D DISP Q
|
---|
30 | .;
|
---|
31 | .I '(OCXOP=$P(OCXEXP," ",OCXPTR)) D D DISP Q
|
---|
32 | ..N SUB,POP S SUB="" F S POP=$$POP Q:'$L(POP) Q:(POP="(") S:$L(SUB) SUB=" "_SUB S SUB=POP_SUB
|
---|
33 | ..D PUSH("(")
|
---|
34 | ..D PUSH($$TOKEN(SUB))
|
---|
35 | ..S OCXOP=$P(OCXEXP," ",OCXPTR)
|
---|
36 | ..D PUSH(OCXOP)
|
---|
37 | .;
|
---|
38 | .D PUSH($P(OCXEXP," ",OCXPTR)) D DISP Q
|
---|
39 | ;
|
---|
40 | S OCXEXP=$$EXPAND(OCXEXP)
|
---|
41 | ;
|
---|
42 | Q 0_U_$TR(OCXEXP," ","")
|
---|
43 | ;
|
---|
44 | DISP ;
|
---|
45 | Q:$G(OCXAUTO)
|
---|
46 | W !,$P(OCXEXP," ",1,OCXPTR),!
|
---|
47 | Q
|
---|
48 | TOKEN(VAL) ;
|
---|
49 | ;
|
---|
50 | Q:($L(VAL," ")=1) VAL
|
---|
51 | N ORD,OPER,PTR
|
---|
52 | S OPER=$P(VAL," ",2)
|
---|
53 | F PTR=1:2:$L(VAL," ") S ORD($P(VAL," ",PTR))=""
|
---|
54 | S VAL="",PTR=0 F S PTR=$O(ORD(PTR)) Q:'PTR S:$L(VAL) VAL=VAL_" "_OPER_" " S VAL=VAL_PTR
|
---|
55 | ;
|
---|
56 | S PTR=+$G(^TMP("OCXCMP",$J,"B TOKEN","B",VAL)) Q:PTR PTR
|
---|
57 | ;
|
---|
58 | F PTR=$O(^OCXS(860.3,999999),-1)+1:1 Q:'$D(^TMP("OCXCMP",$J,"B TOKEN",+PTR))
|
---|
59 | S ^TMP("OCXCMP",$J,"B TOKEN",+PTR)=VAL
|
---|
60 | S ^TMP("OCXCMP",$J,"B TOKEN","B",VAL)=+PTR
|
---|
61 | Q +PTR
|
---|
62 | ;
|
---|
63 | PUSH(V) S OCXSTAK($O(OCXSTAK(99999),-1)+1)=V Q
|
---|
64 | ;
|
---|
65 | POP() N L,V S L=$O(OCXSTAK(99999),-1) Q:'L "" S V=OCXSTAK(L) K OCXSTAK(L) Q V
|
---|
66 | ;
|
---|
67 | TOP(C) ;
|
---|
68 | Q:'$D(OCXSTAK) "" Q:'$D(C) OCXSTAK($O(OCXSTAK(999999),-1))
|
---|
69 | N L,X S L=$O(OCXSTAK(99999),-1) Q:'L "" F X=1:1:C S L=$O(OCXSTAK(L),-1) Q:'L
|
---|
70 | Q:'L "" Q OCXSTAK(L)
|
---|
71 | K C
|
---|
72 | ;
|
---|
73 | STRIP(EXP) ;
|
---|
74 | ;
|
---|
75 | N QUIT,PTR
|
---|
76 | F S QUIT=1 D Q:QUIT
|
---|
77 | .F PTR=1:1:($L(EXP," ")-2) I ($P(EXP," ",PTR)="("),(+$P(EXP," ",PTR+1)),($P(EXP," ",PTR+2)=")") S QUIT=0 D Q
|
---|
78 | ..I (PTR>1) S EXP=$P(EXP," ",1,PTR-1)_" "_(+$P(EXP," ",PTR+1))_" "_$P(EXP," ",PTR+3,99999) Q
|
---|
79 | ..S EXP=(+$P(EXP," ",PTR+1))_" "_$P(EXP," ",PTR+3,99999)
|
---|
80 | Q EXP
|
---|
81 | ;
|
---|
82 | PARCNT(EXP) ;
|
---|
83 | N CNT,PTR,TEMP
|
---|
84 | S CNT=0,TEMP="" F PTR=1:1:$L(EXP) D
|
---|
85 | .N CHAR S CHAR=$E(EXP,PTR)
|
---|
86 | .I (CHAR="(") S CNT=CNT+1,TEMP=TEMP_" ( "
|
---|
87 | .E I (CHAR=")") S CNT=CNT-1,TEMP=TEMP_" ) "
|
---|
88 | .E I '(CHAR=" "),'(CHAR="~"),(CHAR?1P) S TEMP=TEMP_" "_CHAR_" "
|
---|
89 | .E S TEMP=TEMP_CHAR
|
---|
90 | I CNT D Q ""
|
---|
91 | .N MSG
|
---|
92 | .S MSG(1)=" "_EXP,MSG(2)=" "
|
---|
93 | .I (CNT>0) S MSG(3)=" "_(CNT)_" Unmatched LEFT '(' parenthesis in expression"
|
---|
94 | .I (CNT<0) S MSG(3)=" "_(CNT*(-1))_" Unmatched RIGHT ')' parenthesis in expression"
|
---|
95 | .D WARN^OCXOCMPV(.MSG,2,OCXD0,$P($T(+1)," ",1)) Q
|
---|
96 | ;
|
---|
97 | F Q:'(TEMP[" ") S TEMP=$P(TEMP," ",1)_" "_$P(TEMP," ",2,999)
|
---|
98 | F Q:'($E(TEMP,1)=" ") S TEMP=$E(TEMP,2,$L(TEMP))
|
---|
99 | Q TEMP
|
---|
100 | ;
|
---|
101 | EXPAND(EXP) ;
|
---|
102 | ;
|
---|
103 | N QUIT,PTR
|
---|
104 | F PTR=1:1:$L(EXP," ") S:+$P(EXP," ",PTR) $P(EXP," ",PTR)="~"_$P(EXP," ",PTR)_"~"
|
---|
105 | F Q:'(EXP["~") S EXP=$P(EXP,"~",1)_$G(^TMP("OCXCMP",$J,"B TOKEN",+$P(EXP,"~",2)))_$P(EXP,"~",3,999)
|
---|
106 | Q EXP
|
---|
107 | ;
|
---|