Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: CIAUSTX1

CIAUSTX1.m

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