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

RGUTSTX1.m

Go to the documentation of this file.
  1. RGUTSTX1 ;CAIRO/DKM - Continuation of RGUTSTX;04-Sep-1998 11:26;DKM
  1. ;;2.1;RUN TIME LIBRARY;;Mar 22, 1999
  1. ;=================================================================
  1. ; Parse an expression
  1. EXP(RGEX) ;
  1. N RGF,RGC,RGPN
  1. S (RGF,RGPN)=0,RGEX=$G(RGEX)
  1. F D Q:RGF<0!RGERR
  1. .S RGC=$E(RGM,RGPSN),RGPSN=RGPSN+1
  1. .D @("OP"_RGF)
  1. I 'RGERR,RGPN S RGERR=3
  1. S RGEX=$S($G(RGPN(RGPN,"@")):"@",1:"")_RGEX
  1. Q
  1. ; Operands
  1. OP0 I RGC'=".",RGEX["." S RGEX=$TR(RGEX,".")
  1. G:RGC'="" COLON2:RGC=":",GLBL:RGC=U,DOT:RGC=".",INDIR:RGC="@",FCN:RGC="$",UNARY:"'+-"[RGC,QT:RGC=RGQT,NUM:RGC?1N,OPNPAR:RGC="(",VAR:RGC?1A,VAR:RGC="%"
  1. S RGERR=6
  1. Q
  1. ; Operators
  1. OP1 G END:RGC="",INDIR2:RGC="@",DONE:RGEX["="&'RGPN!(RGC=" ")
  1. K RGPN(RGPN,"@")
  1. G COLON:RGC=":",CLSPAR:RGC=")",RBRKT:RGC="]",BINARY:"!#&*-_+=\/<>["[RGC,NOT:RGC="'",PTRN:RGC="?"
  1. DONE S RGPSN=RGPSN-1
  1. END S RGF=-1
  1. Q
  1. ; Negated operator
  1. NOT S:'$$NEXT("=<>[]?&!",0) RGERR=2
  1. Q
  1. ; Parse a global reference
  1. GLBL D:$$NEXT("[") PLIST(";1-2","]")
  1. Q:RGERR
  1. S:'$$NEXT("(",0) RGPSN=$$NAME^RGUTSTX0(RGPSN,"$%")
  1. I 'RGERR,$$NEXT("(") D PLIST(";1-999")
  1. S RGF=1
  1. Q
  1. ; Indirection (prefix)
  1. INDIR S RGPN(RGPN,"@")=$G(RGPN(RGPN,"@"))+1
  1. Q
  1. ; Indirection (suffix)
  1. INDIR2 I +$G(RGPN(RGPN,"@"))'>0 S RGERR=2
  1. E I '$$NEXT("(") S RGERR=2
  1. E D
  1. .S RGPN(RGPN,"@")=-(RGPN(RGPN,"@")>1)
  1. .D PLIST()
  1. Q
  1. ; Intrinsic function/system variable
  1. FCN G:$$NEXT("$") EXT
  1. INT N RGZ,RGZ1
  1. S RGZ1=$E(RGM,RGPSN),RGZ=$$INT^RGUTSTX0(.RGPSN),RGF=1
  1. I 'RGERR,$$NEXT("(") D PLIST(RGZ)
  1. Q
  1. ; Extrinsic function
  1. EXT S:'$$NEXT(U,0) RGPSN=$$LABEL^RGUTSTX0
  1. Q:RGERR
  1. S:$$NEXT(U) RGPSN=$$LABEL^RGUTSTX0
  1. Q:RGERR
  1. D:$$NEXT("(") PLIST(".;0-999")
  1. S RGF=1
  1. Q
  1. ; Unary operator
  1. UNARY Q
  1. ; String literal
  1. QT D QT2
  1. S RGF=1
  1. Q
  1. ; Find matching quote
  1. QT2 F RGPSN=RGPSN:1:RGLEN I $$NEXT(RGQT),'$$NEXT(RGQT,0) Q
  1. S:$E(RGM,RGPSN-1)'=RGQT RGERR=9
  1. Q
  1. ; Numeric constant
  1. NUM N RGZ,RGZ1
  1. S RGZ=0,RGF=1
  1. F RGPSN=RGPSN-1:1 S RGZ1=$E(RGM,RGPSN) D @("NUM"_RGZ) Q:RGZ<0
  1. S:RGZ=-2 RGERR=2
  1. Q
  1. NUM0 S RGZ=$S(RGZ1?1N:1,RGZ1=".":2,1:-2)
  1. Q
  1. NUM1 S RGZ=$S(RGZ1?1N:1,RGZ1=".":3,1:-1)
  1. Q
  1. NUM2 S RGZ=$S(RGZ1?1N:3,1:-2)
  1. Q
  1. NUM3 S RGZ=$S(RGZ1?1N:3,RGZ1="E":4,1:-1)
  1. Q
  1. NUM4 S RGZ=$S(RGZ1="+":5,RGZ1="-":5,RGZ1=".":7,RGZ1?1N:6,1:-2)
  1. Q
  1. NUM5 S RGZ=$S(RGZ1?1N:6,RGZ1=".":7,1:-2)
  1. Q
  1. NUM6 S RGZ=$S(RGZ1?1N:6,RGZ1=".":8,1:-1)
  1. Q
  1. NUM7 S RGZ=$S(RGZ1?1N:8,1:-2)
  1. Q
  1. NUM8 S RGZ=$S(RGZ1?1N:8,1:-1)
  1. Q
  1. ; Open parenthesis
  1. OPNPAR S RGPN=RGPN+1
  1. K RGPN(RGPN)
  1. Q
  1. ; Period (variable by reference or FP number)
  1. DOT I RGEX[".",$E(RGM,RGPSN)'?1N D
  1. .I '$$NEXT("@") S RGPSN=$$NAME^RGUTSTX0(RGPSN,"%"),RGF=-1
  1. .E D INDIR
  1. E D NUM
  1. Q
  1. ; Variable name
  1. VAR S RGPSN=$$NAME^RGUTSTX0(RGPSN-1,"%"),RGF=1
  1. D:$$NEXT("(") PLIST()
  1. Q
  1. ; Closing parenthesis
  1. CLSPAR I 'RGPN,RGEX[")" G DONE
  1. I RGPN S RGPN=RGPN-1
  1. E S RGERR=3
  1. Q
  1. ; Right bracket (] or ]])
  1. RBRKT I 'RGPN,RGEX["]" G DONE
  1. I $$NEXT(RGC)
  1. ; Binary operator
  1. BINARY S RGF=0
  1. Q
  1. ; Colon operand
  1. COLON2 S:RGEX'["M" RGERR=6
  1. Q
  1. ; Colon operator
  1. COLON G:RGEX'[":" DONE
  1. S RGF=0
  1. S:RGEX'["M" RGEX=$TR(RGEX,":")
  1. Q
  1. ; Pattern match
  1. PTRN N RGZ,RGZ1
  1. I $$NEXT("@") S RGF=0 Q
  1. S RGZ=RGPSN,@$$TRAP^RGZOSF("PERR^RGUTSTX1"),RGZ1=0
  1. F D Q:RGZ1<0!RGERR
  1. .D QT2:$$NEXT(RGQT),PTRN1:$$NEXT("("),PTRN2:$$NEXT(")")
  1. .I RGZ1,$$NEXT(",")
  1. .S:'$$NEXT("ACELNPU.0123456789") RGZ1=-1
  1. S:'RGERR RGZ=RGZ?@$E(RGM,RGZ,RGPSN-1)
  1. Q
  1. PTRN1 S RGZ1=RGZ1+1
  1. Q
  1. PTRN2 S RGZ1=RGZ1-1
  1. S:RGZ1<0 RGPSN=RGPSN-1
  1. Q
  1. PERR S RGERR=10
  1. Q
  1. ; Process a parameter list
  1. PLIST(RGP,RGT) ;
  1. N RGC,RGP1,RGP2,RGZ
  1. S RGT=$G(RGT,")"),RGP=$G(RGP,";0-999"),RGP2=$P(RGP,";",2),RGP1=+RGP2,RGP2=+$P(RGP2,"-",2),RGC=0,RGZ=$P(RGP,";")
  1. I '$$NEXT(RGT,0) D
  1. .F RGC=1:1 D Q:RGERR!'$$NEXT(",")
  1. ..D @("PL"_$P(RGP,";",RGC+2))
  1. I 'RGERR,RGC<RGP1!(RGC>RGP2) S RGERR=8
  1. I 'RGERR,'$$NEXT(RGT) S RGERR=3
  1. Q
  1. PL N RGEX
  1. I RGZ=".",$$NEXT(",",0) Q
  1. S RGEX=RGT_RGZ
  1. D EXP(.RGEX)
  1. I RGZ[":",RGEX[":" S RGERR=2
  1. Q
  1. PLV D LVAL^RGUTSTX0("LG")
  1. Q
  1. PLL D LBL1^RGUTSTX0()
  1. Q
  1. ; Get next character
  1. NEXT(RGC,RGI) ;
  1. Q $$NEXT^RGUTSTX0(RGC,.RGI)