- CIAUSTX1 ;MSC/IND/DKM - Continuation of CIAUSTX;04-May-2006 08:19;DKM
- ;;1.2;CIA UTILITIES;;Mar 20, 2007
- ;;Copyright 2000-2006, Medsphere Systems Corporation
- ;=================================================================
- ; Parse an expression
- EXP(CIAEX) ;
- N CIAF,CIAC,CIAPN
- S (CIAF,CIAPN)=0,CIAEX=$G(CIAEX)
- F D Q:CIAF<0!CIAERR
- .S CIAC=$E(CIAM,CIAPSN),CIAPSN=CIAPSN+1
- .D @("OP"_CIAF)
- I 'CIAERR,CIAPN S CIAERR=3
- S CIAEX=$S($G(CIAPN(CIAPN,"@")):"@",1:"")_CIAEX
- Q
- ; Operands
- OP0 I CIAC'=".",CIAEX["." S CIAEX=$TR(CIAEX,".")
- G:CIAC'="" COLON2:CIAC=":",GLBL:CIAC=U,DOT:CIAC=".",INDIR:CIAC="@",FCN:CIAC="$",UNARY:"'+-"[CIAC,QT:CIAC=CIAQT,NUM:CIAC?1N,OPNPAR:CIAC="(",VAR:CIAC?1A,VAR:CIAC="%"
- S CIAERR=6
- Q
- ; Operators
- OP1 G END:CIAC="",INDIR2:CIAC="@",DONE:CIAEX["="&'CIAPN!(CIAC=" ")
- K CIAPN(CIAPN,"@")
- I CIAC="*",$$NEXT(CIAC)
- G COLON:CIAC=":",CLSPAR:CIAC=")",RBRKT:CIAC="]",BINARY:"!#&*-_+=\/<>["[CIAC,NOT:CIAC="'",PTRN:CIAC="?"
- DONE S CIAPSN=CIAPSN-1
- END S CIAF=-1
- Q
- ; Negated operator
- NOT S:'$$NEXT("=<>[]?&!",0) CIAERR=2
- Q
- ; Parse a global reference
- GLBL D:$$NEXT("[") PLIST(";1-2","]")
- Q:CIAERR
- S:'$$NEXT("(",0) CIAPSN=$$NAME^CIAUSTX0(CIAPSN,"$%")
- I 'CIAERR,$$NEXT("(") D PLIST(";1-999")
- S CIAF=1
- Q
- ; Indirection (prefix)
- INDIR S CIAPN(CIAPN,"@")=$G(CIAPN(CIAPN,"@"))+1
- Q
- ; Indirection (suffix)
- INDIR2 I +$G(CIAPN(CIAPN,"@"))'>0 S CIAERR=2
- E I '$$NEXT("(") S CIAERR=2
- E D
- .S CIAPN(CIAPN,"@")=-(CIAPN(CIAPN,"@")>1)
- .D PLIST()
- Q
- ; Intrinsic function/system variable
- FCN G:$$NEXT("$") EXT
- INT N CIAZ,CIAZ1
- S CIAZ1=$E(CIAM,CIAPSN),CIAZ=$$INT^CIAUSTX0(.CIAPSN),CIAF=1
- I 'CIAERR,$$NEXT("(") D PLIST(CIAZ)
- Q
- ; Extrinsic function
- EXT S:'$$NEXT(U,0) CIAPSN=$$LABEL^CIAUSTX0
- Q:CIAERR
- S:$$NEXT(U) CIAPSN=$$LABEL^CIAUSTX0
- Q:CIAERR
- D:$$NEXT("(") PLIST(".;0-999")
- S CIAF=1
- Q
- ; Unary operator
- UNARY Q
- ; String literal
- QT D QT2
- S CIAF=1
- Q
- ; Find matching quote
- QT2 F CIAPSN=CIAPSN:1:CIALEN I $$NEXT(CIAQT),'$$NEXT(CIAQT,0) Q
- S:$E(CIAM,CIAPSN-1)'=CIAQT CIAERR=9
- Q
- ; Numeric constant
- NUM N CIAZ,CIAZ1
- S CIAZ=0,CIAF=1
- F CIAPSN=CIAPSN-1:1 S CIAZ1=$E(CIAM,CIAPSN) D @("NUM"_CIAZ) Q:CIAZ<0
- S:CIAZ=-2 CIAERR=2
- Q
- NUM0 S CIAZ=$S(CIAZ1?1N:1,CIAZ1=".":2,1:-2)
- Q
- NUM1 S CIAZ=$S(CIAZ1?1N:1,CIAZ1=".":3,1:-1)
- Q
- NUM2 S CIAZ=$S(CIAZ1?1N:3,1:-2)
- Q
- NUM3 S CIAZ=$S(CIAZ1?1N:3,CIAZ1="E":4,1:-1)
- Q
- NUM4 S CIAZ=$S(CIAZ1="+":5,CIAZ1="-":5,CIAZ1=".":7,CIAZ1?1N:6,1:-2)
- Q
- NUM5 S CIAZ=$S(CIAZ1?1N:6,CIAZ1=".":7,1:-2)
- Q
- NUM6 S CIAZ=$S(CIAZ1?1N:6,CIAZ1=".":8,1:-1)
- Q
- NUM7 S CIAZ=$S(CIAZ1?1N:8,1:-2)
- Q
- NUM8 S CIAZ=$S(CIAZ1?1N:8,1:-1)
- Q
- ; Open parenthesis
- OPNPAR S CIAPN=CIAPN+1
- K CIAPN(CIAPN)
- Q
- ; Period (variable by reference or FP number)
- DOT I CIAEX[".",$E(CIAM,CIAPSN)'?1N D
- .I '$$NEXT("@") S CIAPSN=$$NAME^CIAUSTX0(CIAPSN,"%"),CIAF=-1
- .E D INDIR
- E D NUM
- Q
- ; Variable name
- VAR S CIAPSN=$$NAME^CIAUSTX0(CIAPSN-1,"%"),CIAF=1
- D:$$NEXT("(") PLIST()
- Q
- ; Closing parenthesis
- CLSPAR I 'CIAPN,CIAEX[")" G DONE
- I CIAPN S CIAPN=CIAPN-1
- E S CIAERR=3
- Q
- ; Right bracket (] or ]])
- RBRKT I 'CIAPN,CIAEX["]" G DONE
- I $$NEXT(CIAC)
- ; Binary operator
- BINARY S CIAF=0
- Q
- ; Colon operand
- COLON2 S:CIAEX'["M" CIAERR=6
- Q
- ; Colon operator
- COLON G:CIAEX'[":" DONE
- S CIAF=0
- S:CIAEX'["M" CIAEX=$TR(CIAEX,":")
- Q
- ; Pattern match
- PTRN N CIAZ,CIAZ1
- I $$NEXT("@") S CIAF=0 Q
- S CIAZ=CIAPSN,@$$TRAP^CIAUOS("PERR^CIAUSTX1"),CIAZ1=0
- F D Q:CIAZ1<0!CIAERR
- .D QT2:$$NEXT(CIAQT),PTRN1:$$NEXT("("),PTRN2:$$NEXT(")")
- .I CIAZ1,$$NEXT(",")
- .S:'$$NEXT("ACELNPU.0123456789") CIAZ1=-1
- S:'CIAERR CIAZ=CIAZ?@$E(CIAM,CIAZ,CIAPSN-1)
- Q
- PTRN1 S CIAZ1=CIAZ1+1
- Q
- PTRN2 S CIAZ1=CIAZ1-1
- S:CIAZ1<0 CIAPSN=CIAPSN-1
- Q
- PERR S CIAERR=10
- Q
- ; Process a parameter list
- PLIST(CIAP,CIAT) ;
- N CIAC,CIAP1,CIAP2,CIAZ
- S CIAT=$G(CIAT,")"),CIAP=$G(CIAP,";0-999"),CIAP2=$P(CIAP,";",2),CIAP1=+CIAP2,CIAP2=+$P(CIAP2,"-",2),CIAC=0,CIAZ=$P(CIAP,";")
- I '$$NEXT(CIAT,0) D
- .F CIAC=1:1 D Q:CIAERR!'$$NEXT(",")
- ..D @("PL"_$P(CIAP,";",CIAC+2))
- I 'CIAERR,CIAC<CIAP1!(CIAC>CIAP2) S CIAERR=8
- I 'CIAERR,'$$NEXT(CIAT) S CIAERR=3
- Q
- PL N CIAEX
- I CIAZ=".",$$NEXT(",",0) Q
- S CIAEX=CIAT_CIAZ
- D EXP(.CIAEX)
- I CIAZ[":",CIAEX[":" S CIAERR=2
- Q
- PLV D LVAL^CIAUSTX0("LG")
- Q
- PLL D LBL1^CIAUSTX0()
- Q
- ; Get next character
- NEXT(CIAC,CIAI) ;
- Q $$NEXT^CIAUSTX0(CIAC,.CIAI)
- CIAUSTX1 ;MSC/IND/DKM - Continuation of CIAUSTX;04-May-2006 08:19;DKM
- +1 ;;1.2;CIA UTILITIES;;Mar 20, 2007
- +2 ;;Copyright 2000-2006, Medsphere Systems Corporation
- +3 ;=================================================================
- +4 ; Parse an expression
- EXP(CIAEX) ;
- +1 NEW CIAF,CIAC,CIAPN
- +2 SET (CIAF,CIAPN)=0
- SET CIAEX=$GET(CIAEX)
- +3 FOR
- Begin DoDot:1
- +4 SET CIAC=$EXTRACT(CIAM,CIAPSN)
- SET CIAPSN=CIAPSN+1
- +5 DO @("OP"_CIAF)
- End DoDot:1
- IF CIAF<0!CIAERR
- QUIT
- +6 IF 'CIAERR
- IF CIAPN
- SET CIAERR=3
- +7 SET CIAEX=$SELECT($GET(CIAPN(CIAPN,"@")):"@",1:"")_CIAEX
- +8 QUIT
- +9 ; Operands
- OP0 IF CIAC'="."
- IF CIAEX["."
- SET CIAEX=$TRANSLATE(CIAEX,".")
- +1 IF CIAC'=""
- IF CIAC=":"
- GOTO COLON2
- IF CIAC=U
- GOTO GLBL
- IF CIAC="."
- GOTO DOT
- IF CIAC="@"
- GOTO INDIR
- IF CIAC="$"
- GOTO FCN
- IF "'+-"[CIAC
- GOTO UNARY
- IF CIAC=CIAQT
- GOTO QT
- IF CIAC?1N
- GOTO NUM
- IF CIAC="("
- GOTO OPNPAR
- IF CIAC?1A
- GOTO VAR
- IF CIAC="%"
- GOTO VAR
- +2 SET CIAERR=6
- +3 QUIT
- +4 ; Operators
- OP1 IF CIAC=""
- GOTO END
- IF CIAC="@"
- GOTO INDIR2
- IF CIAEX["="&'CIAPN!(CIAC=" ")
- GOTO DONE
- +1 KILL CIAPN(CIAPN,"@")
- +2 IF CIAC="*"
- IF $$NEXT(CIAC)
- +3 IF CIAC=":"
- GOTO COLON
- IF CIAC=")"
- GOTO CLSPAR
- IF CIAC="]"
- GOTO RBRKT
- IF "!#&*-_+=\/<>["[CIAC
- GOTO BINARY
- IF CIAC="'"
- GOTO NOT
- IF CIAC="?"
- GOTO PTRN
- DONE SET CIAPSN=CIAPSN-1
- END SET CIAF=-1
- +1 QUIT
- +2 ; Negated operator
- NOT IF '$$NEXT("=<>[]?&!",0)
- SET CIAERR=2
- +1 QUIT
- +2 ; Parse a global reference
- GLBL IF $$NEXT("[")
- DO PLIST(";1-2","]")
- +1 IF CIAERR
- QUIT
- +2 IF '$$NEXT("(",0)
- SET CIAPSN=$$NAME^CIAUSTX0(CIAPSN,"$%")
- +3 IF 'CIAERR
- IF $$NEXT("(")
- DO PLIST(";1-999")
- +4 SET CIAF=1
- +5 QUIT
- +6 ; Indirection (prefix)
- INDIR SET CIAPN(CIAPN,"@")=$GET(CIAPN(CIAPN,"@"))+1
- +1 QUIT
- +2 ; Indirection (suffix)
- INDIR2 IF +$GET(CIAPN(CIAPN,"@"))'>0
- SET CIAERR=2
- +1 IF '$TEST
- IF '$$NEXT("(")
- SET CIAERR=2
- +2 IF '$TEST
- Begin DoDot:1
- +3 SET CIAPN(CIAPN,"@")=-(CIAPN(CIAPN,"@")>1)
- +4 DO PLIST()
- End DoDot:1
- +5 QUIT
- +6 ; Intrinsic function/system variable
- FCN IF $$NEXT("$")
- GOTO EXT
- INT NEW CIAZ,CIAZ1
- +1 SET CIAZ1=$EXTRACT(CIAM,CIAPSN)
- SET CIAZ=$$INT^CIAUSTX0(.CIAPSN)
- SET CIAF=1
- +2 IF 'CIAERR
- IF $$NEXT("(")
- DO PLIST(CIAZ)
- +3 QUIT
- +4 ; Extrinsic function
- EXT IF '$$NEXT(U,0)
- SET CIAPSN=$$LABEL^CIAUSTX0
- +1 IF CIAERR
- QUIT
- +2 IF $$NEXT(U)
- SET CIAPSN=$$LABEL^CIAUSTX0
- +3 IF CIAERR
- QUIT
- +4 IF $$NEXT("(")
- DO PLIST(".;0-999")
- +5 SET CIAF=1
- +6 QUIT
- +7 ; Unary operator
- UNARY QUIT
- +1 ; String literal
- QT DO QT2
- +1 SET CIAF=1
- +2 QUIT
- +3 ; Find matching quote
- QT2 FOR CIAPSN=CIAPSN:1:CIALEN
- IF $$NEXT(CIAQT)
- IF '$$NEXT(CIAQT,0)
- QUIT
- +1 IF $EXTRACT(CIAM,CIAPSN-1)'=CIAQT
- SET CIAERR=9
- +2 QUIT
- +3 ; Numeric constant
- NUM NEW CIAZ,CIAZ1
- +1 SET CIAZ=0
- SET CIAF=1
- +2 FOR CIAPSN=CIAPSN-1:1
- SET CIAZ1=$EXTRACT(CIAM,CIAPSN)
- DO @("NUM"_CIAZ)
- IF CIAZ<0
- QUIT
- +3 IF CIAZ=-2
- SET CIAERR=2
- +4 QUIT
- NUM0 SET CIAZ=$SELECT(CIAZ1?1N:1,CIAZ1=".":2,1:-2)
- +1 QUIT
- NUM1 SET CIAZ=$SELECT(CIAZ1?1N:1,CIAZ1=".":3,1:-1)
- +1 QUIT
- NUM2 SET CIAZ=$SELECT(CIAZ1?1N:3,1:-2)
- +1 QUIT
- NUM3 SET CIAZ=$SELECT(CIAZ1?1N:3,CIAZ1="E":4,1:-1)
- +1 QUIT
- NUM4 SET CIAZ=$SELECT(CIAZ1="+":5,CIAZ1="-":5,CIAZ1=".":7,CIAZ1?1N:6,1:-2)
- +1 QUIT
- NUM5 SET CIAZ=$SELECT(CIAZ1?1N:6,CIAZ1=".":7,1:-2)
- +1 QUIT
- NUM6 SET CIAZ=$SELECT(CIAZ1?1N:6,CIAZ1=".":8,1:-1)
- +1 QUIT
- NUM7 SET CIAZ=$SELECT(CIAZ1?1N:8,1:-2)
- +1 QUIT
- NUM8 SET CIAZ=$SELECT(CIAZ1?1N:8,1:-1)
- +1 QUIT
- +2 ; Open parenthesis
- OPNPAR SET CIAPN=CIAPN+1
- +1 KILL CIAPN(CIAPN)
- +2 QUIT
- +3 ; Period (variable by reference or FP number)
- DOT IF CIAEX["."
- IF $EXTRACT(CIAM,CIAPSN)'?1N
- Begin DoDot:1
- +1 IF '$$NEXT("@")
- SET CIAPSN=$$NAME^CIAUSTX0(CIAPSN,"%")
- SET CIAF=-1
- +2 IF '$TEST
- DO INDIR
- End DoDot:1
- +3 IF '$TEST
- DO NUM
- +4 QUIT
- +5 ; Variable name
- VAR SET CIAPSN=$$NAME^CIAUSTX0(CIAPSN-1,"%")
- SET CIAF=1
- +1 IF $$NEXT("(")
- DO PLIST()
- +2 QUIT
- +3 ; Closing parenthesis
- CLSPAR IF 'CIAPN
- IF CIAEX[")"
- GOTO DONE
- +1 IF CIAPN
- SET CIAPN=CIAPN-1
- +2 IF '$TEST
- SET CIAERR=3
- +3 QUIT
- +4 ; Right bracket (] or ]])
- RBRKT IF 'CIAPN
- IF CIAEX["]"
- GOTO DONE
- +1 IF $$NEXT(CIAC)
- +2 ; Binary operator
- BINARY SET CIAF=0
- +1 QUIT
- +2 ; Colon operand
- COLON2 IF CIAEX'["M"
- SET CIAERR=6
- +1 QUIT
- +2 ; Colon operator
- COLON IF CIAEX'["
- GOTO DONE
- +1 SET CIAF=0
- +2 IF CIAEX'["M"
- SET CIAEX=$TRANSLATE(CIAEX,":")
- +3 QUIT
- +4 ; Pattern match
- PTRN NEW CIAZ,CIAZ1
- +1 IF $$NEXT("@")
- SET CIAF=0
- QUIT
- +2 SET CIAZ=CIAPSN
- SET @$$TRAP^CIAUOS("PERR^CIAUSTX1")
- SET CIAZ1=0
- +3 FOR
- Begin DoDot:1
- +4 IF $$NEXT(CIAQT)
- DO QT2
- IF $$NEXT("(")
- DO PTRN1
- IF $$NEXT(")")
- DO PTRN2
- +5 IF CIAZ1
- IF $$NEXT(",")
- +6 IF '$$NEXT("ACELNPU.0123456789")
- SET CIAZ1=-1
- End DoDot:1
- IF CIAZ1<0!CIAERR
- QUIT
- +7 IF 'CIAERR
- SET CIAZ=CIAZ?@$EXTRACT(CIAM,CIAZ,CIAPSN-1)
- +8 QUIT
- PTRN1 SET CIAZ1=CIAZ1+1
- +1 QUIT
- PTRN2 SET CIAZ1=CIAZ1-1
- +1 IF CIAZ1<0
- SET CIAPSN=CIAPSN-1
- +2 QUIT
- PERR SET CIAERR=10
- +1 QUIT
- +2 ; Process a parameter list
- PLIST(CIAP,CIAT) ;
- +1 NEW CIAC,CIAP1,CIAP2,CIAZ
- +2 SET CIAT=$GET(CIAT,")")
- SET CIAP=$GET(CIAP,";0-999")
- SET CIAP2=$PIECE(CIAP,";",2)
- SET CIAP1=+CIAP2
- SET CIAP2=+$PIECE(CIAP2,"-",2)
- SET CIAC=0
- SET CIAZ=$PIECE(CIAP,";")
- +3 IF '$$NEXT(CIAT,0)
- Begin DoDot:1
- +4 FOR CIAC=1:1
- Begin DoDot:2
- +5 DO @("PL"_$PIECE(CIAP,";",CIAC+2))
- End DoDot:2
- IF CIAERR!'$$NEXT(",")
- QUIT
- End DoDot:1
- +6 IF 'CIAERR
- IF CIAC<CIAP1!(CIAC>CIAP2)
- SET CIAERR=8
- +7 IF 'CIAERR
- IF '$$NEXT(CIAT)
- SET CIAERR=3
- +8 QUIT
- PL NEW CIAEX
- +1 IF CIAZ="."
- IF $$NEXT(",",0)
- QUIT
- +2 SET CIAEX=CIAT_CIAZ
- +3 DO EXP(.CIAEX)
- +4 IF CIAZ[":"
- IF CIAEX[":"
- SET CIAERR=2
- +5 QUIT
- PLV DO LVAL^CIAUSTX0("LG")
- +1 QUIT
- PLL DO LBL1^CIAUSTX0()
- +1 QUIT
- +2 ; Get next character
- NEXT(CIAC,CIAI) ;
- +1 QUIT $$NEXT^CIAUSTX0(CIAC,.CIAI)