/* REXX SEQ2PDS This is the anti-process of PDS2SEQ that converts a PDS to a form ready for IEBUPDTE. Each member in such a dataset begins with a control statement for IEBUPDTE: ./ REPL NAME= PDS2SEQ also adds a line to hold the statistics as of the time the snapshot was taken. The text of the member follows immediately. SEQ2PDS (this routine) parses out those statistics and writes the text to a PDS(E) with the original statistics intact. Use '(routine name) ?' for HELP-text. |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| | | | WARNING: EMBEDDED COMPONENTS. | | See text following TOOLKIT_INIT | | | |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| Written by Frank Clarke rexxhead@yahoo.com 20211018 Impact Analysis . SYSEXEC SYSUMON . SYSEXEC S2PTRIM . SYSEXEC TRAPOUT . SYSEXEC UPDSTAT Modification History 20230111 fxc Fix incorr HELP-text 20230226 fxc Fix ALLOC outputds 20230401 fxc SYSUMON only if not testing 20230608 fxc use &ZUP/&ZCONT 20230725 fxc use hhmm for log file name; 20230729 fxc clip long lines; 20230806 fxc chg SYSPROC to SYSEXEC in Impact Analysis; 20230810 fxc set msglim based on screen width; 20230827 fxc fix errors induced by CLIPLINE; make KEEP the default; implement REPL; exclude *ALIAS entries; use Edit Macro S2PTRIM instead of EXECIO; make default process SELECT, overrideable with AUTO; 20230829 fxc must EXECIO to create stem inp.; 20230913 fxc adjust HELP; 20240305 fxc align panel names; 20240308 fxc chg dollar-sign to @ everywhere; 20240415 fxc DUMP_QUEUE quiet; */ arg argline address TSO /* REXXSKEL ver.20210402 */ 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 /* Initializations -*/ if sw.0Select then, call I_ISPF_SERVICES /* select mbrs to load -*/ else, call M_MASS_CONVERT /* load all members -*/ call ZB_SAVELOG /* -*/ if \sw.nested then call DUMP_QUEUE 'quiet' /* -*/ exit /*@ SEQ2PDS */ /* Initializations . ----------------------------------------------------------------- */ A_INIT: /*@ */ if branch then call BRANCH address TSO if tv = 'N' then, /* only if not testing */ "SYSUMON USER" Userid() "TOOL" exec_name parse value "" with, stats. lastmbr mbrnames parse value "0 0 0 0 0 0 0 0 0 0 0 0 0 0" with, flag. ct. lastln. line. , . call AL_SETUP_LOG /* -*/ call AP_PARMS /* -*/ call AS_SCAN_INPUT /* -*/ return /*@ A_INIT */ /* Allocate LOG dataset . ----------------------------------------------------------------- */ AL_SETUP_LOG: /*@ */ if branch then call BRANCH address TSO msglim = SYSVAR( "SYSWTERM" ) - 12 parse value "0 0 0 0 0" with, log# log. . parse value Date("S") Time("S") Time("N") with, yyyymmdd sssss hhmmss . hhmmss = Space( Translate( hhmmss,' ',':' ) ,0 ) parse var yyyymmdd 4 yrdigit 5 mm 7 dd /* 9 12 14 maybe */ if Pos(yrdigit,"13579") > 0 then mm = mm + 12 /* mm=24 */ logtag = Substr("ABCDEFGHIJKLMNOPQRSTUVWX",mm,1) /* logtag=X */ subid = logtag""dd""Left( hhmmss,4 ) /* X141743 ? */ vb4k.0 = "NEW CATALOG UNIT( SYSDA ) SPACE( 1 5 ) TRACKS", "RECFM( V B ) LRECL( 255 ) BLKSIZE( 0 )" vb4k.1 = "SHR" /* if it already exists... */ logdsn = "@LOG."exec_name"."subid".LIST" logpref = exec_name "("Branch( "ID" )")" call ZL_LOGMSG( logpref, "started by" Userid() yyyymmdd hhmmss) call ZL_LOGMSG( logpref "Arg:" argline ) return /*@ AL_SETUP_LOG */ /* Parse parms. Purge old copy of output. . ----------------------------------------------------------------- */ AP_PARMS: /*@ */ if branch then call BRANCH address TSO parse value KEYWD("INDS") "pds2seq.data" with, inputds . parse value KEYWD("OUTDS") "seq2pds.data" with, outputds . sw.0Select = SWITCH( "AUTO" ) = 0 /* default is 'SELECT' */ sw.0Keep = SWITCH( "REPL" ) = 0 /* default is 'KEEP' */ if Left(inputds,1) = "'" then, inputds = Strip( inputds,,"'" ) else, inputds = Userid()"."inputds if Left(outputds,1) = "'" then, outputds = Strip( outputds,,"'" ) else, outputds = Userid()"."outputds alloc.0 = "NEW CATALOG UNIT(SYSDA) SPACE(15 15) TRACKS", "DSORG(PO) DSNTYPE(LIBRARY)", "RECFM(F B) LRECL(80) BLKSIZE(0)" alloc.1 = "SHR" tempstat = Sysdsn("'"outputds"'") = "OK" /* 0 = missing */ if sw.0Keep = 0 then, /* REPL was specified */ if tempstat then do "DELETE '"outputds"'" tempstat = 0 end "ALLOC FI(@OUT) DA('"outputds"') REU" alloc.tempstat return /*@ AP_PARMS */ /* Scan to determine starting line# (line.), ending line# (lastln.), and member name. . ----------------------------------------------------------------- */ AS_SCAN_INPUT: /*@ */ if branch then call BRANCH address TSO "NEWSTACK" address ISPEXEC "VIEW DATASET( '"inputds"' ) MACRO( S2PTRIM ) " logpref = exec_name "("Branch( "ID" )")" call ZL_LOGMSG( logpref queued(), "members identified in" inputds ) do queued() parse pull mbr line.mbr lastln.mbr stats.mbr mbrnames = mbrnames mbr ct.0mbrs = ct.0mbrs + 1 call ZL_LOGMSG( logpref, Right(ct.0mbrs,5) Left(mbr,8) Right(line.mbr,5) ) end "DELSTACK" call ZL_LOGMSG( logpref ct.0mbrs "members found." ) return /*@ AS_SCAN_INPUT */ /* Set up ISPF assets; load member names and stats to table; display table for selection; load selected members. . ----------------------------------------------------------------- */ I_ISPF_SERVICES: /*@ */ if branch then call BRANCH address ISPEXEC "CONTROL ERRORS RETURN" i_tv = trace() /* what setting at entry ? */ rc = Trace("O") call DEIMBED /* extract ISPF assets -*/ 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" /* attach */ end ddnlist = ddnlist dd rc = trace(i_tv) call IG_LOAD_MBRLIST /* prep table -*/ call IK_DISPLAY /* display table -*/ call IL_LOAD_SELECTED /* transfer to PDS -*/ dd = "" do Words(ddnlist) /* each LIBDEF DD */ parse value ddnlist dd with dd ddnlist @ddn = @ddn.dd /* PLIB322 <- PLIB */ "LIBDEF ISP"dd /* drop */ address TSO "FREE FI("@ddn")" end ddnlist = ddnlist dd return /*@ I_ISPF_SERVICES */ /* Populate the table. . ----------------------------------------------------------------- */ IG_LOAD_MBRLIST: /*@ */ if branch then call BRANCH address ISPEXEC ig_tv = trace() /* what setting at entry ? */ @tn@ = "S2PTBL" "TBCREATE" @tn@ "KEYS( S2PMBR ) NAMES( S2PLO S2PHI S2PSTAT S2PFLG )", "NOWRITE REPLACE" w1 = "" s2pflag = "" logpref = exec_name "("Branch( "ID" )")" do Words( mbrnames ) /* every member */ rc = Trace("O") parse value mbrnames w1 with w1 mbrnames rc = trace( ig_tv ) s2pmbr = w1 s2plo = line.w1 s2phi = lastln.w1 s2pstat = Strip( stats.w1 ) "TBADD" @tn@ call ZL_LOGMSG( logpref, "Tabled" Left(w1,8) "F:"Right( s2plo,6 ), "T:"Right( s2phi,6 ) s2pstat ) end /* mbrnames */ mbrnames = mbrnames w1 /* restore */ return /*@ IG_LOAD_MBRLIST */ /* Display the table. Allow the user to specify which members are to be rolled from the sequential file to the partitioned dataset. The user can command 'ALL ON' to mark every member for capture, or 'ALL OFF' to start fresh. After 'ALL ON', individual members may be deselected. This is easier than selecting a large number of members one-by-one and ignoring a smaller number. If all members are to be copied, do not specify 'SELECT' when invoking the routine. . ----------------------------------------------------------------- */ IK_DISPLAY: /*@ */ if branch then call BRANCH address ISPEXEC "TBTOP" @tn@ sel = '' do forever "TBDISPL" @tn@ "PANEL(LISTMBRS)" if rc > 4 then leave if zcmd <> "" then, if zcmd = 'ALL ON' then, call IKN_ALL_ON /* -*/ else, if zcmd = 'ALL OFF' then, call IKF_ALL_OFF /* -*/ do ztdsels flag.s2pmbr = ^flag.s2pmbr if flag.s2pmbr then s2pflg = "X" else s2pflg = " " "TBMOD" @tn@ if ztdsels > 1 then "TBDISPL" @tn@ end /* ztdsels */ sel = "" end /* forever */ return /*@ IK_DISPLAY */ /* Clear marks from every line. . ----------------------------------------------------------------- */ IKF_ALL_OFF: /*@ */ if branch then call BRANCH address ISPEXEC "TBTOP" @tn@ do forever "TBSKIP" @tn@ /* next line */ if rc > 0 then leave /* end of table */ s2pflg = "" "TBMOD" @tn@ end /* forever */ flag. = 0 /* Off */ return /*@ IKF_ALL_OFF */ /* Set marks on every line . ----------------------------------------------------------------- */ IKN_ALL_ON: /*@ */ if branch then call BRANCH address ISPEXEC "TBTOP" @tn@ do forever "TBSKIP" @tn@ /* next line */ if rc > 0 then leave /* end of table */ s2pflg = "X" "TBMOD" @tn@ end /* forever */ flag. = 1 /* On */ return /*@ IKN_ALL_ON */ /* Copy marked members from to . . ----------------------------------------------------------------- */ IL_LOAD_SELECTED: /*@ */ if branch then call BRANCH address TSO il_tv = trace() /* what setting at entry ? */ "ALLOC FI(@IN) DA('"inputds"') SHR REU" "EXECIO * DISKR @IN (STEM INP. FINIS" "FREE FI(@IN)" logpref = exec_name "("Branch( "ID" )")" w1 = "" do Words( mbrnames ) /* every member */ parse value mbrnames w1 with w1 mbrnames if flag.w1 then do /* transfer */ call ZL_LOGMSG( logpref "Load" Left(w1,8) stats.w1 ) "NEWSTACK" do idx = line.w1 to lastln.w1 queue inp.idx end /* idx */ rc = Trace("O"); rc = trace(il_tv) "ALLOC FI(@OUT) DA('"outputds"("w1")') SHR REU" "EXECIO" queued() "DISKW @OUT (FINIS" "DELSTACK" /* if stats, set stats on this mbr */ if stats.w1 <> "" then do parse var stats.w1 vvmm others parse var vvmm vv '.' mm . "UPDSTAT" w1 outputds vv mm others end /* stats */ ct.0xfer = ct.0xfer + 1 /* transferred */ end /* flagged */ end /* mbrnames */ mbrnames = mbrnames w1 /* restore */ call ZL_LOGMSG( logpref ct.0xfer "members transferred." ) return /*@ IL_LOAD_SELECTED */ /* Load all members to output. . ----------------------------------------------------------------- */ M_MASS_CONVERT: /*@ */ if branch then call BRANCH address TSO flag. = 1 /* every member */ call IL_LOAD_SELECTED /* transfer to PDS -*/ return /*@ M_MASS_CONVERT */ /* . ----------------------------------------------------------------- */ LOCAL_PREINIT: /*@ customize opts */ address TSO 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 REU UNIT(SYSDA) SPACE(1 5) TRACKS DIR(40)", "RECFM(F B) LRECL(80) BLKSIZE(0)" fb80po.1 = "SHR REU" 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 length(ddn) > 4 then do /* data, not ISPF */ call DESPOOL /* -*/ currln = currln - 1 /* previous line */ iterate end if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */ ddnlist = ddnlist ddn /* keep track */ @ddn = ddn || Random(999) /* PLIB322 maybe */ @ddn.ddn = @ddn /* @ddn.PLIB = PLIB322 */ 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 /* Subroutine of DEIMBED for non-ISPF data. Given: the stack, ddn, and mbr . ----------------------------------------------------------------- */ DESPOOL: /*@ */ if branch then call BRANCH address TSO if Sysdsn(ddn".DATA") <> "OK" then, "ALLOC FI("ddn") DA("ddn".DATA)" fb80po.0 "ALLOC FI("ddn") DA("ddn".DATA("mbr")) SHR REU" "EXECIO" queued() "DISKW" ddn "(FINIS" "DELSTACK" "NEWSTACK" /* re-establish */ return /*@ DESPOOL */ return /*@ DEIMBED */ /* . ----------------------------------------------------------------- */ ZB_SAVELOG: /*@ */ if branch then call BRANCH address TSO if Symbol("LOG#") = "LIT" then return /* not yet set */ "ALLOC FI(@LOG) DA("logdsn") REU" vb4k.0 "EXECIO" log# "DISKW @LOG (STEM LOG. FINIS" "FREE FI(@LOG)" return /*@ ZB_SAVELOG */ /* . ----------------------------------------------------------------- */ ZL_LOGMSG: Procedure expose, /*@ */ (tk_globalvars) log. log# msglim rc = Trace("O") address TSO parse arg msgtext /* for making the msgline always reasonably short: */ do while Length(msgtext) > msglim pt = LastPos(" ",msgtext,msglim) slug = Left(msgtext,pt) parse value log#+1 slug with, zz log.zz 1 log# . msgtext = " "Substr(msgtext,pt) end /* while msglim */ /* ------ make sure MSGLIM is set and --exposed-- */ parse value log#+1 msgtext with, zz log.zz 1 log# . if monitor then say, msgtext return /*@ ZL_LOGMSG */ /* . ----------------------------------------------------------------- */ HELP: /*@ */ address TSO;"CLEAR" if helpmsg <> "" then say helpmsg; say "" ex_nam = Left(exec_name,8) /* predictable size */ say " "ex_nam" is the anti-process of PDS2SEQ. It converts the output of" say " PDS2SEQ into a PDS again. " say " " say " Syntax: "ex_nam" INDS inputds " say " OUTDS outputds " say " AUTO " say " REPL " say " " say " inputds is the name in TSO-format of the dataset containing " say " the PDS2SEQ output to be re-converted. Default is " say " PDS2SEQ.DATA " say " " say " outputds is the name in TSO-format of the output dataset. " say " Default is SEQ2PDS.DATA " "NEWSTACK"; pull ; "CLEAR" ; "DELSTACK" say " AUTO causes the automatic reloading of from " say " . The default action is to present the " say " memberlist for selection. Selected members are " say " extracted and transferred to the output dataset with" say " original stats if available. " say " " say " REPL if specified, the output dataset, if it exists, is " say " purged and reallocated. If not specified, the " say " default action is to update the target. " say " " "NEWSTACK"; pull ; "CLEAR" ; "DELSTACK" say " Debugging tools provided include: " 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" (( BRANCH TRACE ?R " if sysvar("SYSISPF") = "ACTIVE" 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 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 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")", info if wordpos(dlm,back) = 0 then /* search for ending delimiter*/ helpmsg = helpmsg "No matching second delimiter("dlm") with KEYPHRS("kp")", info 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 ssend . if ssend = "" then ssend = 10 if \datatype(ssbeg,"W") | \datatype(ssend,"W") then return ssend = ssbeg + ssend do ssii = ssbeg to ssend ; say Strip(sourceline(ssii),'T') ; end return /*@ SS */ /* . ----------------------------------------------------------------- */ SWITCH: Procedure expose info /*@ */ arg kw 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") "N" 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 LISTMBRS .. )ATTR % TYPE( TEXT ) INTENS( HIGH ) SKIP( ON ) + TYPE( TEXT ) INTENS( LOW ) SKIP( ON ) _ TYPE( INPUT ) INTENS( HIGH ) CAPS( ON ) ! TYPE( OUTPUT ) INTENS( HIGH ) SKIP( ON ) ^ TYPE( OUTPUT ) INTENS( LOW ) SKIP( ON ) @ TYPE( OUTPUT ) INTENS( LOW ) SKIP( ON ) JUST( RIGHT ) )BODY EXPAND(||) WIDTH(&ZSCREENW) %|-| Members found in!inputds +|-| %Command ===>_ZCMD %Scroll ===>_ZAMT+ + Member Start End Stats )MODEL _Z!S2PMBR @Z@S2PLO @S2PHI +^S2PSTAT )INIT .ZVARS = '(SEL S2PFLG)' .HELP = LISTMBRH )REINIT )PROC )END ))) PLIB LISTMBRH .. )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(||) WIDTH(&ZSCREENW) %TUTORIAL |-| Members found in!outputds |-| TUTORIAL %Next Selection ===>_ZCMD + Select any member with any character to mark it for capture. + Select any%already marked+member to de-select. + Command%ALL ON+to set all members 'selected'. If many members are to be transferred and a few are to be ignored, specify%ALL ON+and then individually de-select the names to be ignored. + Command%ALL OFF+to set all members 'unselected'. This enables you to start fresh or to 'kill' a process without transferring any material. )PROC &ZUP = LISTMBRH &ZCONT = LISTMBRH )END */