XINDX2 ;ISC/REL,GRK,RWF - PROCESS "GRB" ;4/2/08 16:35
;;7.3;TOOLKIT;**20,27,48,110,121,133**;Apr 25, 1995;Build 16
; Per VHA Directive 2004-038, this routine should not be modified.
% S LINE=GRB,(CM,COM)="" F I=0:0 S STR=$P(LINE,$C(9),1),LINE=$P(LINE,$C(9),2,999),NOA=0 D:STR]"" ARGG Q:LINE']""
Q
;Process argument
ARGG D ^XINDX9 S I=0,AC=999 F %=0:0 S %=$O(LV(%)) Q:%'>0 S I(%)=0
ARGS ;Proccess all agruments at this level
S AC=LI+AC F Q:AC'>LI D INC Q:S="" D ARG
Q
;
ARG ;Process one argument
I CH="," D PEEK I ","[Y Q:$$OBJF() D E^XINDX1(21):($$FNC()'="$$") Q ;if ",," must be function of object method
Q:CH=Q
;Cache Objects; Package.Class.method or ##class(package.class).method
I $D(LV(LV,"OBJ",LI)) G OBJ2:CH=".",OBJ1
I CH="#",$E(S,1,2)="##" D OBJ Q
I S'[".",(CH?1A)!(CH="%") D LOC Q
I CH="^" S LOC="G" G NAK:S="^",EXTGLO:S["[",EXTGLO:S["|",GLO Q
I CH="$" D FUN Q
I CH="?" D PAT Q
I CH="(" D INC S NOA=S D DN,INC Q
Q
;
NAK S LOC="N"
G GLO
;
EXTGLO D E^XINDX1(50),EG,INC S S=U_S
G GLO
;
EG N GK,LOC S GK="",LOC="L" ;HANDLE EXTENDED GLOBAL
F D INC Q:"]"[CH Q:"|"[CH D ARG
Q
GLO S X=$E(S,2,99) I X]"",S'["^$",X'?1(1U,1"%").7UN D E^XINDX1(12)
I GK["*",$E(S,1,2)["^%" D E^XINDX1(45)
I S1="(" S S=S_S1 D PEEKDN S:(Y?1N.NP)!($A(Y)=34)!("^$J^$I^$H^"[(U_Y)) S=S_Y
D ST(LOC,S) I S1="(" D INC2 S NOA=S D DN,INC
Q
;
LOC S LOC="L" ;Check variables at end. I S'?1.8UN,S'?1"%".7UN,S'?1.8LN,S'?1"%".7LN D E^XINDX1(11)
I S1="(" S S=S_S1 D PEEKDN S:(Y?1.N)!($A(Y)=34) S=S_Y
D ST(LOC,S) I S1="(" D INC2 S NOA=S D DN,INC
Q
OBJ ;Cache Objects within ##class
S LOC="O"
I S1'="(" D E^XINDX1(3)
D PEEKDN S S=Y I S[".",'$$OBJTST(S) D E^XINDX1(64)
D ST(LOC,S),INC2 S NOA=S D DN,INC
Q
OBJ1 ;Cache Objects not within ##class, contains "."
S LOC="O"
D ST(LOC,S)
Q
OBJ2 ;Method
D PEEKDN
I 'Y D INC2 S NOA=S D DN,INC
Q
;
OBJF() ; return line where object has an open "(" for parameters
N %
Q:LV<2 0 ;must be down at least 1 level
S %=$O(LV(LV-1,"OBJ",""),-1) ;find last object at previous level
Q $S('%:0,LV(LV-1,%+1)="(":%,1:0) ; returns 0 if can't find object or object has no parameter
;
PEEK S Y=$G(LV(LV,LI+1))
Q
;
INC2 S LI=LI+1 ;Drop into INC
INC S LI=LI+1,S=$G(LV(LV,LI)),S1=$G(LV(LV,LI+1)),CH=$E(S) G:$A(S)=10 ERR
Q
;
DN S LI(LV)=LI,LI(LV,1)=AC,LV=LV+1,LI=LI(LV),AC=NOA
D ARGS,UP
Q
UP ;Inc LI as we save to skip the $C(10).
D PEEK D:$A(Y)'=10 ERR S LI(LV)=LI+1,LV=LV-1,LI=LI(LV),AC=LI(LV,1)
Q
;
PEEKDN S Y=$G(LV(LV+1,LI(LV+1)+1))
Q
;
ERR D E^XINDX1(43) S (S,S1,CH)="" Q
S Z=$P(LV(LV+1),$C(9),LI(LV+1),99),Z=$P(Z,$C(10)) W !,"COUNT=",$L(Z,",")
;functions
FUN N FUN S FUN=S G EXT:S["$$",PKG:S["$&",SPV:S1'["(" S NOA=$P(S,"^",2)
D INC2 I S'>0 D E^XINDX1(43) ;Sit on NOA
G:FUN["$TE" TEXT
S Y=1 F Z1=LI(LV+1)+1:1 S X=$G(LV(LV+1,Z1)) Q:$A(X)=10!(X="") S:X="," Y=Y+1
I NOA,Y<NOA!(Y>$P(NOA,";",2)) D E^XINDX1(43)
S NOA=S D DN,INC
Q
;
TEXT ; process $T
N X1,X2
S Y=$$ASM^XINDX3(LV+1,LI(LV+1)+1,$C(10)) D ST("MK","$T("_$S($E(Y)'="+":Y,1:""))
I $$VT(Y) D ST("I",Y) ;internal label
;check if external routine
I Y["^",$$VT($P(Y,"^",2)) S X1=$P(Y,"^"),X2=$P(Y,"^",2),Y=X1 D ST("X",X2_$S($$VT(X1):" "_X1,1:""))
D FLUSH(LV+1)
Q
;special variables
SPV ;
I "^$D^$EC^$ES^$ET^$I^$K^$P^$Q^$ST^$SY^"[("^"_X_"^") D ST("MK",X)
Q
;
EXT ;Extrinsic functions
I $E(S1)="^" S Y=$E(S1,2,99)_" "_S D INC S S=Y ;Build S and fall thru
D ST($S(S[" ":"X",1:"I"),S) ;Internal, eXternal
I S1["(" D INC2 S NOA=S D DN,INC ;Process param.
Q
;
PKG ;External Package
D ST("X",S) ;Record External name
I S1["(" D INC2 S NOA=S D DN,INC ;Process param.
Q
;
PAT D INC I $E(S)="@" D INC,ARG Q
F D REPCNT,PATCODE Q:$E(S)=""
Q
;
REPCNT F I=1:1 Q:("0123456789."'[$E(S,I))!($E(S,I)="")
S X=$E(S,1,I-1),S=$E(S,I,999) I ('$L(X))!($L(X,".")>2) S S="" D E^XINDX1(16)
Q
;
PATCODE I $E(S)=Q S I=1 D PATQ S S=$E(S,I,999) S:$L(CH)&(",)"[CH) S=$E(S,2,999) Q
F I=1:1 Q:("ACELNPUacelnpu()"'[$E(S,I))!($E(S,I)="")
S X=$E(S,1,I-1),S=$E(S,I,999) I I=1 S S="" D E^XINDX1(16)
I $E(S)="," S S=$E(S,2,999) ;Pull ',' out of alternation
Q
;
PATQ F I=I+1:1 S CH=$E(S,I) Q:CH=""!(CH=Q)
S I=I+1 D:CH="" E^XINDX1(6) S CH=$E(S,I) G:CH=Q PATQ
Q
;
ST(LOC,S) S:'$D(V(LOC,S)) V(LOC,S)="" I $D(GK),GK]"",V(LOC,S)'[GK S V(LOC,S)=V(LOC,S)_GK
S GK=""
Q
;
VT(X) ;Check if a valid label
Q (X?1A.31AN)!(X?1"%".31UN)!(X?1.31N)
;
VA(X) ;Check if VA Standard label
Q (X?1U.7UN)!(X?1"%".7UN)!(X?1.8N)
;
FLUSH(L) ;Flush rest of list with this offset
N I,CH S I=LI(L)+1 F I=I:1 S CH=$G(LV(L,I)) Q:$C(10)[CH D:CH="(" FLUSH(L+1)
S LI(L)=I Q
;
FNC(NEW) ;Sets or returns the current function
I $D(NEW) S LV(LV+1,"FNC",LI)=NEW Q
N W
S W=+$S($D(LV(LV,"FNC",LI)):LI,$O(LV(LV,"FNC",LI),-1):$O(LV(LV,"FNC",LI),-1),1:$O(LV(LV,"FNC",LI))) ;patch 119,121
Q $G(LV(LV,"FNC",W))
;
OP(NEW) ;Sets or returns the current operator
I $D(NEW) S LV(LV,"OP",LI)=NEW Q
N W S W=+$S($D(LV(LV,"OP",LI)):LI,1:$O(LV(LV,"OP",LI),-1))
Q $G(LV(LV,"OP",W))
;
OBJTST(OBJ) ;test if OBJ exists, returns 1 if exists
Q:$G(OBJ)="" 0
Q ##class(%Dictionary.ClassDefinition).%ExistsId(""_OBJ_"")
;
XINDX2 ;ISC/REL,GRK,RWF - PROCESS "GRB" ;4/2/08 16:35
+1 ;;7.3;TOOLKIT;**20,27,48,110,121,133**;Apr 25, 1995;Build 16
+2 ; Per VHA Directive 2004-038, this routine should not be modified.
% SET LINE=GRB
SET (CM,COM)=""
FOR I=0:0
SET STR=$PIECE(LINE,$CHAR(9),1)
SET LINE=$PIECE(LINE,$CHAR(9),2,999)
SET NOA=0
IF STR]""
DO ARGG
IF LINE']""
QUIT
+1 QUIT
+2 ;Process argument
ARGG DO ^XINDX9
SET I=0
SET AC=999
FOR %=0:0
SET %=$ORDER(LV(%))
IF %'>0
QUIT
SET I(%)=0
ARGS ;Proccess all agruments at this level
+1 SET AC=LI+AC
FOR
IF AC'>LI
QUIT
DO INC
IF S=""
QUIT
DO ARG
+2 QUIT
+3 ;
ARG ;Process one argument
+1 ;if ",," must be function of object method
IF CH=","
DO PEEK
IF ","[Y
IF $$OBJF()
QUIT
IF ($$FNC()'="$$")
DO E^XINDX1(21)
QUIT
+2 IF CH=Q
QUIT
+3 ;Cache Objects; Package.Class.method or ##class(package.class).method
+4 IF $DATA(LV(LV,"OBJ",LI))
IF CH="."
GOTO OBJ2
GOTO OBJ1
+5 IF CH="#"
IF $EXTRACT(S,1,2)="##"
DO OBJ
QUIT
+6 IF S'["."
IF (CH?1A)!(CH="%")
DO LOC
QUIT
+7 IF CH="^"
SET LOC="G"
IF S="^"
GOTO NAK
IF S["["
GOTO EXTGLO
IF S["|"
GOTO EXTGLO
GOTO GLO
QUIT
+8 IF CH="$"
DO FUN
QUIT
+9 IF CH="?"
DO PAT
QUIT
+10 IF CH="("
DO INC
SET NOA=S
DO DN
DO INC
QUIT
+11 QUIT
+12 ;
NAK SET LOC="N"
+1 GOTO GLO
+2 ;
EXTGLO DO E^XINDX1(50)
DO EG
DO INC
SET S=U_S
+1 GOTO GLO
+2 ;
EG ;HANDLE EXTENDED GLOBAL
NEW GK,LOC
SET GK=""
SET LOC="L"
+1 FOR
DO INC
IF "]"[CH
QUIT
IF "|"[CH
QUIT
DO ARG
+2 QUIT
GLO SET X=$EXTRACT(S,2,99)
IF X]""
IF S'["^$"
IF X'?1(1U,1"%").7UN
DO E^XINDX1(12)
+1 IF GK["*"
IF $EXTRACT(S,1,2)["^%"
DO E^XINDX1(45)
+2 IF S1="("
SET S=S_S1
DO PEEKDN
IF (Y?1N.NP)!($ASCII(Y)=34)!("^$J^$I^$H^"[(U_Y))
SET S=S_Y
+3 DO ST(LOC,S)
IF S1="("
DO INC2
SET NOA=S
DO DN
DO INC
+4 QUIT
+5 ;
LOC ;Check variables at end. I S'?1.8UN,S'?1"%".7UN,S'?1.8LN,S'?1"%".7LN D E^XINDX1(11)
SET LOC="L"
+1 IF S1="("
SET S=S_S1
DO PEEKDN
IF (Y?1.N)!($ASCII(Y)=34)
SET S=S_Y
+2 DO ST(LOC,S)
IF S1="("
DO INC2
SET NOA=S
DO DN
DO INC
+3 QUIT
OBJ ;Cache Objects within ##class
+1 SET LOC="O"
+2 IF S1'="("
DO E^XINDX1(3)
+3 DO PEEKDN
SET S=Y
IF S["."
IF '$$OBJTST(S)
DO E^XINDX1(64)
+4 DO ST(LOC,S)
DO INC2
SET NOA=S
DO DN
DO INC
+5 QUIT
OBJ1 ;Cache Objects not within ##class, contains "."
+1 SET LOC="O"
+2 DO ST(LOC,S)
+3 QUIT
OBJ2 ;Method
+1 DO PEEKDN
+2 IF 'Y
DO INC2
SET NOA=S
DO DN
DO INC
+3 QUIT
+4 ;
OBJF() ; return line where object has an open "(" for parameters
+1 NEW %
+2 ;must be down at least 1 level
IF LV<2
QUIT 0
+3 ;find last object at previous level
SET %=$ORDER(LV(LV-1,"OBJ",""),-1)
+4 ; returns 0 if can't find object or object has no parameter
QUIT $SELECT('%:0,LV(LV-1,%+1)="(":%,1:0)
+5 ;
PEEK SET Y=$GET(LV(LV,LI+1))
+1 QUIT
+2 ;
INC2 ;Drop into INC
SET LI=LI+1
INC SET LI=LI+1
SET S=$GET(LV(LV,LI))
SET S1=$GET(LV(LV,LI+1))
SET CH=$EXTRACT(S)
IF $ASCII(S)=10
GOTO ERR
+1 QUIT
+2 ;
DN SET LI(LV)=LI
SET LI(LV,1)=AC
SET LV=LV+1
SET LI=LI(LV)
SET AC=NOA
+1 DO ARGS
DO UP
+2 QUIT
UP ;Inc LI as we save to skip the $C(10).
+1 DO PEEK
IF $ASCII(Y)'=10
DO ERR
SET LI(LV)=LI+1
SET LV=LV-1
SET LI=LI(LV)
SET AC=LI(LV,1)
+2 QUIT
+3 ;
PEEKDN SET Y=$GET(LV(LV+1,LI(LV+1)+1))
+1 QUIT
+2 ;
ERR DO E^XINDX1(43)
SET (S,S1,CH)=""
QUIT
+1 SET Z=$PIECE(LV(LV+1),$CHAR(9),LI(LV+1),99)
SET Z=$PIECE(Z,$CHAR(10))
WRITE !,"COUNT=",$LENGTH(Z,",")
+2 ;functions
FUN NEW FUN
SET FUN=S
IF S["$$"
GOTO EXT
IF S["$&"
GOTO PKG
IF S1'["("
GOTO SPV
SET NOA=$PIECE(S,"^",2)
+1 ;Sit on NOA
DO INC2
IF S'>0
DO E^XINDX1(43)
+2 IF FUN["$TE"
GOTO TEXT
+3 SET Y=1
FOR Z1=LI(LV+1)+1:1
SET X=$GET(LV(LV+1,Z1))
IF $ASCII(X)=10!(X="")
QUIT
IF X=","
SET Y=Y+1
+4 IF NOA
IF Y<NOA!(Y>$PIECE(NOA,";",2))
DO E^XINDX1(43)
+5 SET NOA=S
DO DN
DO INC
+6 QUIT
+7 ;
TEXT ; process $T
+1 NEW X1,X2
+2 SET Y=$$ASM^XINDX3(LV+1,LI(LV+1)+1,$CHAR(10))
DO ST("MK","$T("_$SELECT($EXTRACT(Y)'="+":Y,1:""))
+3 ;internal label
IF $$VT(Y)
DO ST("I",Y)
+4 ;check if external routine
+5 IF Y["^"
IF $$VT($PIECE(Y,"^",2))
SET X1=$PIECE(Y,"^")
SET X2=$PIECE(Y,"^",2)
SET Y=X1
DO ST("X",X2_$SELECT($$VT(X1):" "_X1,1:""))
+6 DO FLUSH(LV+1)
+7 QUIT
+8 ;special variables
SPV ;
+1 IF "^$D^$EC^$ES^$ET^$I^$K^$P^$Q^$ST^$SY^"[("^"_X_"^")
DO ST("MK",X)
+2 QUIT
+3 ;
EXT ;Extrinsic functions
+1 ;Build S and fall thru
IF $EXTRACT(S1)="^"
SET Y=$EXTRACT(S1,2,99)_" "_S
DO INC
SET S=Y
+2 ;Internal, eXternal
DO ST($SELECT(S[" ":"X",1:"I"),S)
+3 ;Process param.
IF S1["("
DO INC2
SET NOA=S
DO DN
DO INC
+4 QUIT
+5 ;
PKG ;External Package
+1 ;Record External name
DO ST("X",S)
+2 ;Process param.
IF S1["("
DO INC2
SET NOA=S
DO DN
DO INC
+3 QUIT
+4 ;
PAT DO INC
IF $EXTRACT(S)="@"
DO INC
DO ARG
QUIT
+1 FOR
DO REPCNT
DO PATCODE
IF $EXTRACT(S)=""
QUIT
+2 QUIT
+3 ;
REPCNT FOR I=1:1
IF ("0123456789."'[$EXTRACT(S,I))!($EXTRACT(S,I)="")
QUIT
+1 SET X=$EXTRACT(S,1,I-1)
SET S=$EXTRACT(S,I,999)
IF ('$LENGTH(X))!($LENGTH(X,".")>2)
SET S=""
DO E^XINDX1(16)
+2 QUIT
+3 ;
PATCODE IF $EXTRACT(S)=Q
SET I=1
DO PATQ
SET S=$EXTRACT(S,I,999)
IF $LENGTH(CH)&(",)"[CH)
SET S=$EXTRACT(S,2,999)
QUIT
+1 FOR I=1:1
IF ("ACELNPUacelnpu()"'[$EXTRACT(S,I))!($EXTRACT(S,I)="")
QUIT
+2 SET X=$EXTRACT(S,1,I-1)
SET S=$EXTRACT(S,I,999)
IF I=1
SET S=""
DO E^XINDX1(16)
+3 ;Pull ',' out of alternation
IF $EXTRACT(S)=","
SET S=$EXTRACT(S,2,999)
+4 QUIT
+5 ;
PATQ FOR I=I+1:1
SET CH=$EXTRACT(S,I)
IF CH=""!(CH=Q)
QUIT
+1 SET I=I+1
IF CH=""
DO E^XINDX1(6)
SET CH=$EXTRACT(S,I)
IF CH=Q
GOTO PATQ
+2 QUIT
+3 ;
ST(LOC,S) IF '$DATA(V(LOC,S))
SET V(LOC,S)=""
IF $DATA(GK)
IF GK]""
IF V(LOC,S)'[GK
SET V(LOC,S)=V(LOC,S)_GK
+1 SET GK=""
+2 QUIT
+3 ;
VT(X) ;Check if a valid label
+1 QUIT (X?1A.31AN)!(X?1"%".31UN)!(X?1.31N)
+2 ;
VA(X) ;Check if VA Standard label
+1 QUIT (X?1U.7UN)!(X?1"%".7UN)!(X?1.8N)
+2 ;
FLUSH(L) ;Flush rest of list with this offset
+1 NEW I,CH
SET I=LI(L)+1
FOR I=I:1
SET CH=$GET(LV(L,I))
IF $CHAR(10)[CH
QUIT
IF CH="("
DO FLUSH(L+1)
+2 SET LI(L)=I
QUIT
+3 ;
FNC(NEW) ;Sets or returns the current function
+1 IF $DATA(NEW)
SET LV(LV+1,"FNC",LI)=NEW
QUIT
+2 NEW W
+3 ;patch 119,121
SET W=+$SELECT($DATA(LV(LV,"FNC",LI)):LI,$ORDER(LV(LV,"FNC",LI),-1):$ORDER(LV(LV,"FNC",LI),-1),1:$ORDER(LV(LV,"FNC",LI)))
+4 QUIT $GET(LV(LV,"FNC",W))
+5 ;
OP(NEW) ;Sets or returns the current operator
+1 IF $DATA(NEW)
SET LV(LV,"OP",LI)=NEW
QUIT
+2 NEW W
SET W=+$SELECT($DATA(LV(LV,"OP",LI)):LI,1:$ORDER(LV(LV,"OP",LI),-1))
+3 QUIT $GET(LV(LV,"OP",W))
+4 ;
OBJTST(OBJ) ;test if OBJ exists, returns 1 if exists
+1 IF $GET(OBJ)=""
QUIT 0
+2 QUIT ##class(%Dictionary.ClassDefinition).%ExistsId(""_OBJ_"")
+3 ;