DATA MASTER (INDEX = (VARIABLE=(VARIABLE) ) ); INPUT @03 VARIABLE $CHAR2. @10 D_COUNT 1. @15 DEP_01 $CHAR5. @20 DEP_02 $CHAR5. @25 DEP_03 $CHAR5. @30 DEP_04 $CHAR5. @35 DEP_05 $CHAR5. @40 DEP_06 $CHAR5. @45 DEP_07 $CHAR5. @50 DEP_08 $CHAR5. @55 DEP_09 $CHAR5. @60 DEP_10 $CHAR5. ; CARDS; AA 6 BB CC DD EE FF GG BB 2 GG HH CC 3 EE FF HH DD 3 FF GG HH EE 0 FF 1 MM GG 0 HH 1 II II 1 JJ JJ 1 KK KK 1 LL LL 1 MM MM 0 ;;;; /******************************************************************* /* MACRO DEPEND - A PSEUDO-RECURSIVE MACRO /******************************************************************/ %MACRO DEPEND(UP_LVL,IDX_VAR,NEXT_LVL); LEVEL = LEVEL + &UP_LVL; LINK PUSH_VAR; DO &IDX_VAR = 1 TO 10; IF T_STACK{LEVEL,&IDX_VAR} NOT = ' ' THEN DO; VARIABLE = T_STACK{LEVEL,&IDX_VAR}; LINK GET_MSTR; IF (READ_OK = 'OK') THEN OUTPUT; IF (T_COUNT{LEVEL} > 0 AND READ_OK = 'OK') THEN DO; T_COUNT{LEVEL} = T_COUNT{LEVEL} - 1; LINK DEPEND&NEXT_LVL; END; END; END; LINK POP_VARS; LEVEL = LEVEL - &UP_LVL; %MEND DEPEND; /******************************************************************* /* SEARCH - A ROUTINE TO FIND ALL DEPENDENT VARIABLES, GIVEN A LIST /******************************************************************/ DATA DEP_LIST(KEEP=VARIABLE LEVEL ) /STACK=40; ARRAY DEP {10} $5 DEP_01-DEP_10; ARRAY VAR_NAME {0:10} $5 _TEMPORARY_; ARRAY T_COUNT {0:10} 5 _TEMPORARY_; ARRAY T_STACK {0:10,10} $5 _TEMPORARY_; RETAIN LEVEL 0; INFILE CARDS; /* VARLIST is a user-supplied filename reference */ INPUT @01 VARIABLE $CHAR5.; /* adjust ** to data location on line */ LEVEL = 0; LINK GET_MSTR; IF READ_OK = 'OK' THEN DO; OUTPUT; IF D_COUNT > 0 THEN LINK DEPEND; END; RETURN; /******************************************************************* /* CLEAR VARIABLE STACK. /******************************************************************/ EMPTY_ST: DO Y = 0 TO 10; VAR_NAME{Y} = ''; T_COUNT {Y} = 0; DO Z = 1 TO 10; T_STACK {Y,Z} = ''; END; END; RETURN; /******************************************************************* /* POP VARIABLE AND DEPENDENCIES FROM A STACK. /******************************************************************/ POP_VARS: VARIABLE = VAR_NAME{LEVEL}; D_COUNT = T_COUNT {LEVEL}; VAR_NAME{LEVEL} = ''; T_COUNT {LEVEL} = 0; DO Z = 1 TO 10; DEP{Z} = T_STACK {LEVEL,Z}; T_STACK {LEVEL,Z} = ''; END; RETURN; /******************************************************************* /* PUSH VARIABLE AND DEPENDENCIES ONTO A STACK. /******************************************************************/ PUSH_VAR: VAR_NAME{LEVEL} = VARIABLE; T_COUNT {LEVEL} = D_COUNT; DO Z = 1 TO 10; T_STACK {LEVEL,Z} = DEP {Z}; END; RETURN; /****************************************************************** /* SELECT OUT OF GROUP DEPENDENCIES. /*****************************************************************/ DEPEND : LINK EMPTY_ST ; %DEPEND(0,A,0); RETURN; DEPEND0: %DEPEND(1,B,1); RETURN; DEPEND1: %DEPEND(1,C,2); RETURN; DEPEND2: %DEPEND(1,D,3); RETURN; DEPEND3: %DEPEND(1,E,4); RETURN; DEPEND4: %DEPEND(1,F,5); RETURN; DEPEND5: %DEPEND(1,G,6); RETURN; DEPEND6: %DEPEND(1,H,7); RETURN; DEPEND7: %DEPEND(1,I,8); RETURN; DEPEND8: %DEPEND(1,J,9); RETURN; DEPEND9: %DEPEND(1,K,A); RETURN; DEPENDA: ABORT RETURN 1111 ; RETURN; /****************************************************************** /* LOOK UP VARIABLE NAME ON THE MASTER LIST OF VARIABLES. /*****************************************************************/ GET_MSTR: _IORC_ = 0; _ERROR_ = 0; SET MASTER(KEEP=VARIABLE D_COUNT DEP_01-DEP_10 ) KEY=VARIABLE/UNIQUE; IORC_ = RESOLVE(_IORC_); READ_OK = 'NO'; SELECT (IORC_); WHEN(%SYSRC(_DSEMTR)) PUT 'MULT TRANS NOT ON MASTER '; WHEN(%SYSRC(_DSENMR)) PUT 'TRANS NOT ON MASTER '; WHEN(%SYSRC(_DSENOM)) PUT 'NOT ON MASTER '; WHEN(%SYSRC(_SEDSKFL)) PUT 'TAPE/DISK IS FULL '; WHEN(%SYSRC(_SEINVPS)) PUT 'VALUE OF POSITION INVALID '; WHEN(%SYSRC(_SENOCHN)) PUT 'NO CHANGE/NO DUPS ALLOWED '; WHEN(%SYSRC(_SENOLCK)) PUT 'RECORD LOCK NOT AVAILABLE '; WHEN(%SYSRC(_SENODEL)) PUT 'RECORD MAY NOT BE DELETED '; WHEN(%SYSRC(_SERECRD)) PUT 'NO REC READ FROM INPUT '; WHEN(%SYSRC(_SWDLREC)) PUT 'REC DELETED FROM FILE '; WHEN(%SYSRC(_SWNOUPD)) PUT 'RECORD CANNOT BE UPDATED '; WHEN(%SYSRC(_SWNOWHR)) PUT 'NO LONGER SATISFY "WHERE" '; OTHERWISE READ_OK = 'OK'; END; _ERROR_=0; RETURN; CARDS; BB EE FF ;;;; PROC PRINT ; RUN;