/* REXX CONFIG Displays the CONFIG table showing PROL modules and their components. |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| | | | WARNING: EMBEDDED COMPONENTS. | | See text following TOOLKIT_INIT | | | |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| Written by Frank Clarke 20060310 Impact Analysis . SYSEXEC TRAPOUT Modification History 20070328 fxc enable LOCATE on the first panel; 20080521 fxc enable USES: find modules which INCLUDE specific names; 20091012 fxc add "as of" date to show date and time of last update; */ arg argline address TSO /* REXXSKEL ver.20040227 */ arg parms "((" opts signal on syntax signal on novalue call TOOLKIT_INIT /* conventional start-up -*/ rc = Trace("O"); rc = Trace(tv) info = parms /* to enable parsing */ call A_INIT /* */ call B_ISPF_OPS /* */ if \sw.nested then call DUMP_QUEUE /* -*/ exit /*@ CONFIG */ /* Initialization . ----------------------------------------------------------------- */ A_INIT: /*@ */ if branch then call BRANCH address TSO parse value "" with , lastupdt pfkey . openmode. = "NOWRITE" return /*@ A_INIT */ /* Begin mainline. . ----------------------------------------------------------------- */ B_ISPF_OPS: /*@ */ if branch then call BRANCH address ISPEXEC call BA_PROLOG /* */ call BT_TABLE_OPS /* */ call BZ_EPILOG /* */ return /*@ B_ISPF_OPS */ /* Activate ISPF assets . ----------------------------------------------------------------- */ BA_PROLOG: /*@ */ if branch then call BRANCH address ISPEXEC call DEIMBED /* */ dd = "" do Words(ddnlist) /* each LIBDEF DD */ parse value ddnlist dd with dd ddnlist $ddn = $ddn.dd /* PLIB322 <- PLIB */ "LIBDEF ISP"dd "LIBRARY ID("$ddn") STACK" end ddnlist = ddnlist dd return /*@ BA_PROLOG */ /* Open, display, close table . ----------------------------------------------------------------- */ BT_TABLE_OPS: /*@ */ if branch then call BRANCH address ISPEXEC call BTA_OPEN_CONFIG /* */ call BTD_DISP_CONFIG /* */ call BTZ_DROP_CONFIG /* */ return /*@ BT_TABLE_OPS */ /* Open table if available Table ID ===> CF Table Name ===> CONFIG Description ===> Configuration Management Elements Key Fields ===> CFMODULE Name Fields ===> CFROOT CFVER CFDATE CFUSER CFCT Sort Sequence ===> CFMODULE,C,A . ----------------------------------------------------------------- */ BTA_OPEN_CONFIG: /*@ */ if branch then call BRANCH address ISPEXEC "LIBDEF ISPTLIB DATASET ID("isptlib") STACK" "TBSTATS" $tn$ "STATUS1(s1) STATUS2(s2)" if s1 > 1 then do say "Table" $tn$ "not available." zerrsm = "Table" $tn$ "not available." zerrlm = "Table" $tn$ "not found in the ISPTLIB library chain" sw.0error_found = "1"; return end; else, if s2 = 1 then do /* table is not open */ "TBOPEN " $tn$ openmode.noupdt end else "TBTOP" $tn$ "LIBDEF ISPTLIB" cfmodule = '3f3f'x "TBGET" $tn$ /* populate LASTUPDT */ return /*@ BTA_OPEN_CONFIG */ /* Display table for selection. . ----------------------------------------------------------------- */ BTD_DISP_CONFIG: /*@ */ if branch then call BRANCH address ISPEXEC "TBVCLEAR" $tn$ cfmodule = " " "TBSARG" $tn$ "NAMECOND(CFMODULE,GT)" /* exclude control row */ sel = "" "TBTOP" $tn$ do forever "TBDISPL" $tn$ "PANEL(CONFIG)" if rc > 4 then leave if zcmd ^= "" then do "CONTROL DISPLAY SAVE" call BTDC_PROCESS_CMD /* */ "CONTROL DISPLAY RESTORE" iterate end do ztdsels select when sel = "U" then do /* Rework */ address TSO "CM" cfroot "((MONITOR" end otherwise do "CONTROL DISPLAY SAVE" call BTDD_DISPLAY_DETAIL /* -*/ "CONTROL DISPLAY RESTORE" end end /* Select */ end /* ztdsels */ sel = "" end /* forever */ return /*@ BTD_DISP_CONFIG */ /* A command was entered. . ----------------------------------------------------------------- */ BTDC_PROCESS_CMD: /*@ */ if branch then call BRANCH address ISPEXEC parse var zcmd verb text select /* which verb ? */ when verb = "L" then do /* Locate */ if Pos("=",text) = 0 then, parse value "CFMODULE" text with fld val else, parse var text fld . "=" val . "TBVCLEAR" $tn$ $z$ = Value(fld,val"*") /* load value */ "TBTOP" $tn$ call Z_TBSCAN /* -*/ end /* Locate */ when verb = "USES" then do /* Find INCLUDE */ "TBVCLEAR" $tn$ argl = text spec = "" do Words( text ) parse var text token text /* isolate one */ spec = spec","token",NE" $z = Value(token,' ') end spec = Strip( spec,,"," ) "TBSARG" $tn$ "ARGLIST("argl") NAMECOND("spec")" "TBTOP" $tn$ end /* Find INCLUDE */ when verb = "RESET" then do /* Restore display */ "TBVCLEAR" $tn$ cfmodule = " " "TBSARG" $tn$ "NAMECOND(CFMODULE,GT)" end /* Restore display */ otherwise do zerrsm = "Command?" zerrlm = "Command >"verb"< not recognized." "SETMSG MSG(ISRZ002)" end /* otherwise */ end /* select */ return /*@ BTDC_PROCESS_CMD */ /* The table is positioned to find a row and the argument is set. . ----------------------------------------------------------------- */ Z_TBSCAN: /*@ */ if branch then call BRANCH address ISPEXEC parse value "0 0 0 0 0 0" with , lastfnd lastcrp . "TBSCAN" $tn$ "ROWID(LASTFND) POSITION(LASTCRP)", "ARGLIST("fld") CONDLIST(EQ)" /* set LASTFND and LASTCRP if successful */ if rc = 8 then do /* not found */ zerrsm = "Not found" if pfkey = "F5" then, zerrlm = "End of table encountered." else, zerrlm = "No rows found to match" fld"="val zerrlm = exec_name "("BRANCH("ID")")", zerrlm "SETMSG MSG(ISRZ002)" end /* not found */ else, /* */ "TBSKIP" $tn$ "ROW("lastfnd") NOREAD" /* position to LASTFND */ return /*@ Z_TBSCAN */ /* A row was selected. Display detail associated. The extension variables on the selected row are the include-names and their values are the dataset-where-found. Table Name ===> CFTMP Description ===> Configuration Management Details Key Fields ===> CFINCL Name Fields ===> CFDSN . ----------------------------------------------------------------- */ BTDD_DISPLAY_DETAIL: Procedure expose, /*@ */ (tk_globalvars) cfmodule $tn$ cfct isptlib if branch then call BRANCH address ISPEXEC "TBGET" $tn$ "SAVENAME(XVARS)" /* read from CONFIG */ parse var xvars "(" xvars ")" "TBCREATE CFTMP KEYS(CFINCL) NAMES(CFDSN) NOWRITE REPLACE" do zz = 1 to cfct cfincl = Word(xvars,zz) /* select one */ cfdsn = Value(cfincl) "TBADD CFTMP" end "TBTOP CFTMP" sel = "" do forever "TBDISPL CFTMP PANEL(CONFIGD)" if rc > 4 then leave /* PF3 ? */ do ztdsels "CONTROL DISPLAY SAVE" call BTDDI_SHOW_BACKTRACE /* */ "CONTROL DISPLAY RESTORE" if ztdsels = 1 then, /* never do the last one */ ztdsels = 0 else "TBDISPL CFTMP" /* next row #*/ end /* ztdsels */ sel = '' /* clear for re-display */ end /* forever */ "TBEND CFTMP" return /*@ BTDD_DISPLAY_DETAIL */ /* One of the rows on CFTMP was selected. . ----------------------------------------------------------------- */ BTDDI_SHOW_BACKTRACE: Procedure expose,/*@ */ (tk_globalvars) cfincl isptlib if branch then call BRANCH address ISPEXEC parse var cfincl ciroot . /* key of CI-table */ $tn$ = "CFGINC" "LIBDEF ISPTLIB DATASET ID("isptlib") STACK" "TBSTATS" $tn$ "STATUS1(s1) STATUS2(s2)" if s1 > 1 then do say "Table" $tn$ "not available." zerrsm = "Table" $tn$ "not available." zerrlm = "Table" $tn$ "not found in the ISPTLIB library chain" sw.0error_found = "1"; return end; else, if s2 = 1 then do /* table is not open */ "TBOPEN " $tn$ "NOWRITE" end else "TBTOP" $tn$ "LIBDEF ISPTLIB" "TBGET" $tn$ "SAVENAME(XVARS)" parse var xvars "(" xvars ")" "TBCREATE CITMP KEYS(INCNAME PROGNAME) NOWRITE REPLACE" do zz = 1 to Words( xvars ) /* */ incname = Word(xvars,zz) modlist = Value( incname ) do z2 = 1 to Words( modlist ) progname = Word( modlist,z2 ) "TBADD CITMP" end /* modlist */ end /* xvars */ if cixvarct = 1 then, pnltag = "1 active version:" xvars else, pnltag = cixvarct "active versions:" xvars sel = "" "TBTOP CITMP" do forever "TBDISPL CITMP PANEL(CONFIGI)" if rc > 4 then leave end /* forever */ "TBEND CITMP" return /*@ BTDDI_SHOW_BACKTRACE */ /* Table ops are complete. . ----------------------------------------------------------------- */ BTZ_DROP_CONFIG: /*@ */ if branch then call BRANCH address ISPEXEC "TBEND" $tn$ /* finished with table */ return /*@ BTZ_DROP_CONFIG */ /* Deactivate ISPF assets . ----------------------------------------------------------------- */ BZ_EPILOG: /*@ */ if branch then call BRANCH address ISPEXEC dd = "" do Words(ddnlist) /* each LIBDEF DD */ parse value ddnlist dd with dd ddnlist $ddn = $ddn.dd /* PLIB322 <- PLIB */ "LIBDEF ISP"dd address TSO "FREE FI("$ddn")" end ddnlist = ddnlist dd return /*@ BZ_EPILOG */ /* . ----------------------------------------------------------------- */ LOCAL_PREINIT: /*@ customize opts */ address TSO parse value KEYWD("ISPTLIB") "'???.ISPTLIB'" with, isptlib . parse value KEYWD("USETBL") "CONFIG" with, $tn$ . return /*@ LOCAL_PREINIT */ /* subroutines below LOCAL_PREINIT are not selected by SHOWFLOW */ /* Parse out the embedded components at the back of the source code. . ----------------------------------------------------------------- */ DEIMBED: Procedure expose, /*@ */ (tk_globalvars) ddnlist $ddn. daid. address TSO fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)", "RECFM(F B) LRECL(80) BLKSIZE(0)" parse value "" with ddnlist $ddn. daid. lastln = sourceline() currln = lastln /* */ if Left(sourceline(currln),2) <> "*/" then return currln = currln - 1 /* previous line */ "NEWSTACK" address ISPEXEC do while sourceline(currln) <> "/*" text = sourceline(currln) /* save with a short name ! */ if Left(text,3) = ")))" then do /* package the queue */ parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */ if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */ ddnlist = ddnlist ddn /* keep track */ $ddn = ddn || Random(999) $ddn.ddn = $ddn address TSO "ALLOC FI("$ddn")" fb80po.0 "LMINIT DATAID(DAID) DDNAME("$ddn")" daid.ddn = daid end daid = daid.ddn "LMOPEN DATAID("daid") OPTION(OUTPUT)" do queued() parse pull line "LMPUT DATAID("daid") MODE(INVAR) DATALOC(LINE) DATALEN(80)" end "LMMADD DATAID("daid") MEMBER("mbr")" "LMCLOSE DATAID("daid")" end /* package the queue */ else push text /* onto the top of the stack */ currln = currln - 1 /* previous line */ end /* while */ address TSO "DELSTACK" return /*@ DEIMBED */ /* . ----------------------------------------------------------------- */ HELP: /*@ */ address TSO;"CLEAR" ; say "" if helpmsg <> "" then do ; say helpmsg; say ""; end ex_nam = Left(exec_name,8) /* predictable size */ say " "ex_nam" Displays the CONFIG table showing PROL modules and their " say " components. " say " " say " Syntax: "ex_nam" " say " (( (Defaults)" say " (Defaults)" say " " say " dsn names an ISPF table library on which table can" say " be found. If is not specified, " say " '???.ISPTLIB' will be used. " say " " say " tbl names the table to be used. If not specified, the " say " default is 'CONFIG'. " say " " "NEWSTACK"; pull ; "CLEAR" ; "DELSTACK" say " Debugging tools provided include: " say " " say " MONITOR: displays key information throughout processing. " say " " say " BRANCH: show all paragraph entries. " say " " say " TRACE tv: will use value following TRACE to place the " say " execution in REXX TRACE Mode. " say " " say " " say " Debugging tools can be accessed in the following manner: " say " " say " TSO "ex_nam" parameters (( debug-options " say " " say " For example: " say " " say " TSO "ex_nam" (( MONITOR TRACE ?R " if sw.inispf then, address ISPEXEC "CONTROL DISPLAY REFRESH" exit /*@ HELP */ /* . ----------------------------------------------------------------- */ BRANCH: Procedure expose, /*@ */ sigl exec_name rc = trace("O") /* we do not want to see this */ arg brparm . origin = sigl /* where was I called from ? */ do currln = origin to 1 by -1 /* inch backward to label */ if Right(Word(Sourceline(currln),1),1) = ":" then do parse value sourceline(currln) with pgfname ":" . /* Label */ leave ; end /* name */ end /* currln */ select when brparm = "NAME" then return(pgfname) /* Return full name */ when brparm = "ID" then do /* wants the prefix */ parse var pgfname pgfpref "_" . /* get the prefix */ return(pgfpref) end /* brparm = "ID" */ otherwise say left(sigl,6) left(pgfname,40) exec_name "Time:" time("L") end /* select */ return /*@ BRANCH */ /* . ----------------------------------------------------------------- */ DUMP_QUEUE: /*@ Take whatever is in stack */ rc = trace("O") /* and write to the screen */ address TSO arg mode . "QSTACK" /* how many stacks? */ stk2dump = rc - tk_init_stacks /* remaining stacks */ if stk2dump = 0 & queued() = 0 then return if mode <> "QUIET" then, say "Total Stacks" rc , /* rc = #of stacks */ " Begin Stacks" tk_init_stacks , /* Stacks present at start */ " Excess Stacks to dump" stk2dump do dd = rc to tk_init_stacks by -1 /* empty each one. */ if mode <> "QUIET" then, say "Processing Stack #" dd " Total Lines:" queued() do queued();parse pull line;say line;end /* pump to the screen */ "DELSTACK" /* remove stack */ end /* dd = 1 to rc */ return /*@ DUMP_QUEUE */ /* Handle CLIST-form keywords added 20020513 . ----------------------------------------------------------------- */ CLKWD: Procedure expose info /*@ hide all except info */ arg kw kw = kw"(" /* form is 'KEY(DATA)' */ kw_pos = Pos(kw,info) /* find where it is, maybe */ if kw_pos = 0 then return "" /* send back a null, not found*/ rtpt = Pos(") ",info" ",kw_pos) /* locate end-paren */ slug = Substr(info,kw_pos,rtpt-kw_pos+1) /* isolate */ info = Delstr(info,kw_pos,rtpt-kw_pos+1) /* excise */ parse var slug (kw) slug /* drop kw */ slug = Reverse(Substr(Reverse(Strip(slug)),2)) return slug /*@CLKWD */ /* Handle multi-word keys 20020513 . ----------------------------------------------------------------- */ KEYWD: Procedure expose info /*@ hide all vars, except info*/ arg kw /* form is 'KEY DATA' */ kw_pos = wordpos(kw,info) /* find where it is, maybe */ if kw_pos = 0 then return "" /* send back a null, not found*/ kw_val = word(info,kw_pos+Words(kw))/* get the next word */ info = Delword(info,kw_pos,2) /* remove both */ return kw_val /*@ KEYWD */ /* . ----------------------------------------------------------------- */ KEYPHRS: Procedure expose, /*@ */ info helpmsg exec_name /* except these three */ arg kp /* form is 'KEY ;: DATA ;:' */ wp = wordpos(kp,info) /* where is it? */ if wp = 0 then return "" /* not found */ front = subword(info,1,wp-1) /* everything before kp */ back = subword(info,wp+1) /* everything after kp */ parse var back dlm back /* 1st token must be 2 bytes */ if length(dlm) <> 2 then /* Must be two bytes */ helpmsg = helpmsg "Invalid length for delimiter("dlm") with KEYPHRS("kp")" if wordpos(dlm,back) = 0 then /* search for ending delimiter*/ helpmsg = helpmsg "No matching second delimiter("dlm") with KEYPHRS("kp")" if helpmsg <> "" then call HELP /* Something is wrong */ parse var back kpval (dlm) back /* get everything b/w delim */ info = front back /* restore remainder */ return Strip(kpval) /*@ KEYPHRS */ /* . ----------------------------------------------------------------- */ NOVALUE: /*@ */ say exec_name "raised NOVALUE at line" sigl say " " say "The referenced variable is" condition("D") say " " zsigl = sigl signal SHOW_SOURCE /*@ NOVALUE */ /* . ----------------------------------------------------------------- */ SHOW_SOURCE: /*@ */ call DUMP_QUEUE /* Spill contents of stacks -*/ if sourceline() <> "0" then /* to screen */ say sourceline(zsigl) rc = trace("?R") nop exit /*@ SHOW_SOURCE */ /* . ----------------------------------------------------------------- */ SS: Procedure /*@ Show Source */ arg ssbeg ssct . /* 'call ss 122 6' maybe */ if ssct = "" then ssct = 10 if \datatype(ssbeg,"W") | \datatype(ssct,"W") then return ssend = ssbeg + ssct do ssii = ssbeg to ssend ; say Strip(sourceline(ssii),'T') ; end return /*@ SS */ /* . ----------------------------------------------------------------- */ SWITCH: Procedure expose info /*@ */ arg kw /* form is 'KEY' */ sw_val = Wordpos(kw,info) > 0 /* exists = 1; not found = 0 */ if sw_val then /* exists */ info = Delword(info,Wordpos(kw,info),1) /* remove it */ return sw_val /*@ SWITCH */ /* . ----------------------------------------------------------------- */ SYNTAX: /*@ */ errormsg = exec_name "encountered REXX error" rc "in line" sigl":", errortext(rc) say errormsg zsigl = sigl signal SHOW_SOURCE /*@ SYNTAX */ /* Can call TRAPOUT. . ----------------------------------------------------------------- */ TOOLKIT_INIT: /*@ */ address TSO info = Strip(opts,"T",")") /* clip trailing paren */ parse source sys_id how_invokt exec_name DD_nm DS_nm, as_invokt cmd_env addr_spc usr_tokn parse value "" with tv helpmsg . parse value 0 "ISR00000 YES" "Error-Press PF1" with, sw. zerrhm zerralrm zerrsm if SWITCH("TRAPOUT") then do "TRAPOUT" exec_name parms "(( TRACE R" info exit end /* trapout */ sw.nested = sysvar("SYSNEST") = "YES" sw.batch = sysvar("SYSENV") = "BACK" sw.inispf = sysvar("SYSISPF") = "ACTIVE" if Word(parms,1) = "?" then call HELP /* I won't be back */ "QSTACK" ; tk_init_stacks = rc /* How many stacks? */ parse value SWITCH("BRANCH") SWITCH("MONITOR") SWITCH("NOUPDT") with, branch monitor noupdt . parse value mvsvar("SYSNAME") sysvar("SYSNODE") with, #tk_cpu node . parse value KEYWD("TRACE") "O" with tv . tk_globalvars = "exec_name tv helpmsg sw. zerrhm zerralrm ", "zerrsm zerrlm tk_init_stacks branch monitor ", "noupdt" call LOCAL_PREINIT /* for more opts -*/ return /*@ TOOLKIT_INIT */ /* )))PLIB CONFIG )ATTR % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) INTENS(HIGH) ~ TYPE(INPUT) INTENS(HIGH) CAPS(ON) ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) } TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) JUST(RIGHT) @ TYPE(OUTPUT) INTENS(LOW) SKIP(ON) )BODY EXPAND(||) %|-| Configuration Elements +|-| %Command ===>_ZCMD +as of!lastupdt %Scroll ===>_ZAMT+ +V -Module- CCYYMMDD HHMM --User-- Ct (L xxx to Locate) )MODEL ROWS(SCAN) ~z+!cfmodule !cfdate !cfuser }z + )INIT .ZVARS = '(SEL CFCT)' .HELP = CONFIGH )REINIT )PROC IF (.PFKEY = 'PF05') &PFKEY = 'F5' .RESP = END )END )))PLIB CONFIGH )ATTR % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) INTENS(HIGH) ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) @ TYPE(OUTPUT) INTENS(LOW) SKIP(ON) )BODY EXPAND(||) %TUTORIAL |-| Configuration Elements |-| TUTORIAL %Next Selection ===>_ZCMD + Select any row or rows with any character to see the INCLUDEs which are used by that module. When the INCLUDEs are displayed, you may select any INCLUDE to see which programs use that format. Primary commands supported: %L+(Locate),%USES, RESET+ ===>%l ta4d +(for example) + to position the list to a program. ===>%uses tp4802c4 tp1002c7 +(for example) + to show only the programs which use the formats listed. The format names must be exact; no generic specification is allowed. The condition is ANDed if more than one; only programs which use ALL named INCLUDEs are returned. ===>%reset + to restore the display to "all programs". )PROC )END )))PLIB CONFIGD )ATTR % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) INTENS(HIGH) ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) @ TYPE(OUTPUT) INTENS(LOW) SKIP(ON) )BODY EXPAND(||) %|-| Configuration Detail +|-| %Command ===>_ZCMD %Scroll ===>_ZAMT+ + + Module name ===>!cfmodule +(@cfct+) + +V Include Dataset )MODEL ROWS(ALL) _z+!cfincl !cfdsn )INIT .ZVARS = '( SEL )' .HELP = CONFIGDH )REINIT )PROC IF (.PFKEY = 'PF05') &PFKEY = 'F5' .RESP = END )END )))PLIB CONFIGDH )ATTR % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) INTENS(HIGH) ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) @ TYPE(OUTPUT) INTENS(LOW) SKIP(ON) )BODY EXPAND(||) %TUTORIAL |-| Configuration Detail |-| TUTORIAL %Next Selection ===>_ZCMD + The INCLUDEs used by!cfmodule+are shown. Select any row or rows with any character to see which programs use that format. )PROC )END )))PLIB CONFIGI )ATTR % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) INTENS(HIGH) ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) @ TYPE(OUTPUT) INTENS(LOW) SKIP(ON) )BODY EXPAND(||) %|-| INCLUDE -> PROGRAM Backtrace +|-| %Command ===>_ZCMD %Scroll ===>_ZAMT+ !pnltag + Include Used in Program )MODEL !incname !progname )INIT .HELP = CONFIGIH )REINIT )PROC IF (.PFKEY = 'PF05') &PFKEY = 'F5' .RESP = END )END )))PLIB CONFIGIH )ATTR % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) INTENS(HIGH) ! TYPE(OUTPUT) INTENS(HIGH) SKIP(ON) @ TYPE(OUTPUT) INTENS(LOW) SKIP(ON) )BODY EXPAND(||) %TUTORIAL |-| Configuration Detail |-| TUTORIAL %Next Selection ===>_ZCMD + For the selected root-name (1st six characters of the INCLUDE name) the programs which use each of the active formats are shown. )PROC )END */