/* REXX JCLXREF Analyze JCL to find TASKS (proc or pgm), PROGRAMS, and DDNAMES. |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| | | | WARNING: EMBEDDED COMPONENTS. | | See text following TOOLKIT_INIT | | | |**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**| Written by Frank Clarke 20020122 Impact Analysis . SYSPROC LOADPROC . SYSPROC STRSORT . SYSPROC TRAPOUT Modification History ccyymmdd xxx ..... .... */ arg argline address TSO /* REXXSKEL ver.20010802 */ arg parms "((" opts signal on syntax signal on novalue call TOOLKIT_INIT /* conventional start-up -*/ rc = trace(tv) info = parms /* to enable parsing */ call A_INIT /* -*/ if \sw.0error_found then, call B_SPIN_JCL /* -*/ if \sw.0error_found then, call C_REPORT /* -*/ if \sw.nested then call DUMP_QUEUE /* -*/ exit /*@ JCLXREF */ /* Initialization . ----------------------------------------------------------------- */ A_INIT: /*@ */ if branch then call BRANCH address TSO parse value "0 0 0 0 0 0 0 0" with , jobname. , . parse value "" with , jobnm jclid , /* JOBNAME and dataid for CA7 */ procid , /* dataid for PROCLIB */ joblist TASKS. , /* jobnames and pgms-by-job */ pgmlist DDNAMES. , /* programs and dds-by-pgm */ proclist PROGRAMS. , /* PROCs and pgms-by-proc */ STEPLIST. EXECLIST. , /* procsteps and procpgms */ . call AA_SETUP_LOG /* -*/ call AB_KEYWDS /* -*/ call AC_SETUP_PROCLIB /* -*/ return /*@ A_INIT */ /* Create and start the activity log dataset. . ----------------------------------------------------------------- */ AA_SETUP_LOG: /*@ */ if branch then call BRANCH address TSO parse value "0" with, log# log. parse value Date("S") Time("S") Time("N") with, yyyymmdd sssss hhmmss . 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""Right(sssss,5,0) /* X1423722 ? */ vb4k.0 = "NEW CATALOG UNIT(SYSDA) SPACE(1 5) TRACKS", "RECFM(V B) LRECL(4096) BLKSIZE(0)" vb4k.1 = "SHR" /* if it already existsTSO */ logdsn = "@@LOG."exec_name"."subid".LIST" call ZL_LOGMSG("Log started by" Userid() yyyymmdd hhmmss) call ZL_LOGMSG("Arg:" argline) return /*@ AA_SETUP_LOG */ /* Pick up parameters . ----------------------------------------------------------------- */ AB_KEYWDS: /*@ */ if branch then call BRANCH address TSO ca7_dslist = KEYPHRS("JCL") if ca7_dslist = "" then do call ABA_GET_PARMS /* start ISPF dialog for data */ if sw.0error_found then return /* Ka-boom! */ end "ALLOC FI($JCL) DA("ca7_dslist") SHR REU" if rc > 0 then do sw.0error_found = "1" zerrsm = "Allocation failed for primary JCL datasets:", "<<"ca7_dslist">>" call ZL_LOGMSG(zerrlm) return /* yer outa here */ end jobnameds = KEYWD("JOBNAMES") if jobnameds = "" then do helpmsg = "JOBNAMES is a required parameter." call HELP /* ...and don't come back */ end if jobnameds = "*" then return /* names are set */ "ALLOC FI($JOB) DA("jobnameds") SHR REU" "NEWSTACK" "EXECIO * DISKR $JOB (FINIS" do queued() pull line do Words(line) parse var line jn line parse value jobname.0+1 jn with , $z$ jobname.$z$ 1 jobname.0 . end /* line */ end "DELSTACK" "FREE FI($JOB)" /* DDNAME $JCL identifies the relevant CA-7 datasets. */ /* Stem JOBNAME. identifies all relevant JOBNAMEs */ return /*@ AB_KEYWDS */ /* . ----------------------------------------------------------------- */ ABA_GET_PARMS: /*@ */ if branch then call BRANCH address ISPEXEC "CONTROL ERRORS RETURN" /* I'll handle my own */ call ABAA_PROLOG /* -*/ call ABAD_DISPLAY /* -*/ call ABAZ_EPILOG /* -*/ return /*@ ABA_GET_PARMS */ /* . ----------------------------------------------------------------- */ ABAA_PROLOG: /*@ */ if branch then call BRANCH address ISPEXEC call DEIMBED /* extract ISPF components -*/ 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 /*@ ABAA_PROLOG */ /* . ----------------------------------------------------------------- */ ABAD_DISPLAY: /*@ */ if branch then call BRANCH address ISPEXEC "DISPLAY PANEL(JXPARM)" if rc > 0 then do /* PF3 */ sw.0error_found = 1 zerrsm = "Poof !" zerrlm = "The information on panel JXPARM is required. ", "Entry of that information was declined. ", exec_name "is terminating." "SETMSG MSG(ISRZ002)" call ZL_LOGMSG(zerrlm) return end /* PF3 */ ca7_dslist = jclds info = info "JOBNAMES *" do Words(joblist) parse var joblist jn joblist parse value jobname.0+1 jn with , $z$ jobname.$z$ 1 jobname.0 . end /* joblist */ return /*@ ABAD_DISPLAY */ /* . ----------------------------------------------------------------- */ ABAZ_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 /*@ ABAZ_EPILOG */ /* . ----------------------------------------------------------------- */ AC_SETUP_PROCLIB: /*@ */ if branch then call BRANCH address TSO "LOADPROC" /* alloc all proclibs */ return /*@ AC_SETUP_PROCLIB */ /* Main process . ----------------------------------------------------------------- */ B_SPIN_JCL: /*@ */ if branch then call BRANCH address ISPEXEC "LMINIT DATAID(PROCID) DDNAME(PROCLIB)" "LMOPEN DATAID("procid") OPTION(INPUT)" call BA_SPIN_JOBS /* devel proclist pgmlist -*/ "LMCLOSE DATAID("procid")" "LMFREE DATAID("procid")" return /*@ B_SPIN_JCL */ /* Establish addressability to the JCL datasets and start processing the list of jobnames. . ----------------------------------------------------------------- */ BA_SPIN_JOBS: /*@ */ if branch then call BRANCH address ISPEXEC "CONTROL ERRORS RETURN" /* I'll handle my own */ "LMINIT DATAID(JCLID) DDNAME($JCL)" "LMOPEN DATAID("jclid") OPTION(INPUT)" call BAA_RUN_JOBLIST /* -*/ "LMCLOSE DATAID("jclid")" "LMFREE DATAID("jclid")" return /*@ BA_SPIN_JOBS */ /* Point to each jobname-member in turn for the following LMGET . ----------------------------------------------------------------- */ BAA_RUN_JOBLIST: /*@ */ if branch then call BRANCH address ISPEXEC do bax = 1 to jobname.0 /* each jobname */ "LMMFIND DATAID("jclid") MEMBER("jobname.bax")" if rc > 4 then do /* mbr not found */ call ZL_LOGMSG("Member" jobname.bax "was not found.") iterate end if rc = 4 then do /* mbr not found */ call ZL_LOGMSG("Member" jobname.bax "was in use.") iterate end call ZL_LOGMSG("Member" jobname.bax "processed.") jobnm = jobname.bax /* non-stem token */ joblist = joblist jobnm call BAAA_READ_JOB /* -*/ if sw.0error_found then return end /* bax */ return /*@ BAA_RUN_JOBLIST */ /* Read each line of the JOB and analyze. Keep a list of programs-by-job and ddnames-by-program. . ----------------------------------------------------------------- */ BAAA_READ_JOB: /*@ */ if branch then call BRANCH address ISPEXEC do forever /* */ "LMGET DATAID("jclid") MODE(INVAR) DATALOC(JCLLINE)" if rc > 0 then leave /* EOF */ if Left(jclline,3) = "//*" then iterate if Left(jclline,2) <> "//" then iterate if WordPos("EXEC",jclline) = 2 then do parse var jclline . "EXEC" back "," 73 . back = Strip(back) if Pos("=",back) > 0 then do parse var back xtype "=" xtoken . if xtype = "PGM" then do if WordPos(xtoken,TASKS.jobnm) > 0 then iterate pgm = xtoken if WordPos(pgm,pgmlist) = 0 then, pgmlist = pgmlist pgm end /* pgm */ else do /* get PROC from PROCLIB and analyze if nec */ if WordPos(xtoken,proclist) = 0 then do call BAAAP_PARSE_PROC(xtoken) /*examine PROC -*/ proclist = proclist xtoken end else do call BAAAS_SEED /*use existing list -*/ end xtoken = "PROC:"xtoken end /* proc */ end else do /* no equal sign! */ /* get PROC from PROCLIB and analyze if nec */ if WordPos(xtoken,proclist) = 0 then do call BAAAP_PARSE_PROC(xtoken) /*examine PROC -*/ proclist = proclist xtoken end xtoken = "PROC:"xtoken end /* proc */ TASKS.jobnm = TASKS.jobnm xtoken end /* EXEC */ if WordPos("DD",jclline) = 2 then do parse var jclline "//" ddname . "DD" . if ddname = "" then iterate /* concatenated */ DDNAMES.pgm = DDNAMES.pgm ddname end /* DD */ end /* forever */ return /*@ BAAA_READ_JOB */ /* Examine PROC to build PROGRAMS.xtoken. Keep STEPLIST.proc and EXECLIST.proc in synch . ----------------------------------------------------------------- */ BAAAP_PARSE_PROC: Procedure expose, /*@ */ (tk_globalvars) procid TASKS. pgmlist proclist DDNAMES. if branch then call BRANCH address ISPEXEC arg origproc . do forever /* */ "LMGET DATAID("procid") MODE(INVAR) DATALOC(JCLLINE)" if rc > 0 then leave /* EOF */ if Left(jclline,3) = "//*" then iterate if WordPos("EXEC",jclline) = 2 then do parse var jclline front . "EXEC" back "," 73 . back = Strip(back) parse var front "//" stepname . if Pos("=",back) > 0 then do parse var back xtype "=" xtoken . if xtype = "PGM" then do if WordPos(xtoken,TASKS.jobnm) > 0 then iterate pgm = xtoken if WordPos(pgm,pgmlist) = 0 then, pgmlist = pgmlist pgm end /* pgm */ else do xtoken = "PROC:"xtoken end /* proc */ end else do /* no equalsign */ xtoken = "PROC:"xtoken end /* proc */ TASKS.jobnm = TASKS.jobnm xtoken /* proc or pgm */ STEPLIST.origproc = STEPLIST.origproc stepname EXECLIST.origproc = EXECLIST.origproc xtoken end /* EXEC */ if WordPos("DD",jclline) = 2 then do parse var jclline "//" ddname . "DD" . if ddname = "" then iterate /* concatenated */ DDNAMES.xtoken = DDNAMES.xtoken ddname end /* DD */ end /* forever */ return /*@ BAAAP_PARSE_PROC */ /* Load TASKS.jobn from PROGRAMS.xtoken . ----------------------------------------------------------------- */ BAAAS_SEED: /*@ */ if branch then call BRANCH address TSO return /*@ BAAAS_SEED */ /* Produce a report showing JOBNAME-PROGRAM-DDNAME . ----------------------------------------------------------------- */ C_REPORT: /*@ */ if branch then call BRANCH address TSO "NEWSTACK" /* isolate the queue */ ctr = 0 do Words(joblist) /* each job */ parse var joblist job joblist /* isolate */ do Words(TASKS.job) /* */ parse var TASKS.job task TASKS.job if Left(task,5) = "PROC:" then do proc = Substr(task,6) call CA_SPIN_PROC /* -*/ end /* proc */ else do /* pgm */ do Words(DDNAMES.pgm) /* each DD */ parse var DDNAMES.pgm dd DDNAMES.pgm call CB_LOAD_QUEUE /* -*/ end /* DD */ end /* pgm */ end /* task */ end /* joblist */ call CD_DUMP_QUEUE /* -*/ "DELSTACK" /* restore the queue */ call CS_SORT /* -*/ return /*@ C_REPORT */ /* . ----------------------------------------------------------------- */ CA_SPIN_PROC: /*@ */ if branch then call BRANCH address TSO do Words(PROGRAMS.proc) /* each program */ parse var PROGRAMS.proc pgm PROGRAMS.proc do Words(DDNAMES.pgm) /* each DD */ parse var DDNAMES.pgm dd DDNAMES.pgm call CB_LOAD_QUEUE /* -*/ end /* DD */ end /* programs */ return /*@ CA_SPIN_PROC */ /* . ----------------------------------------------------------------- */ CB_LOAD_QUEUE: /*@ */ if branch then call BRANCH address TSO ctr = ctr + 1 queue Right(ctr,6,0), Left(job,8), Left(pgm,8), Left(dd,8) return /*@ CB_LOAD_QUEUE */ /* . ----------------------------------------------------------------- */ CD_DUMP_QUEUE: /*@ */ if branch then call BRANCH address TSO outdsn = "jclxref.temp" alloc.0 = "NEW CATALOG UNIT(SYSDA) SPACE(5 5) TRACKS", "RECFM(F B) LRECL(60) BLKSIZE(0)" alloc.1 = "SHR" /* if it already exists... */ tempstat = Sysdsn(outdsn) = "OK" /* 1=exists, 0=missing */ "ALLOC FI($TMP) DA("outdsn") REU" alloc.tempstat "EXECIO" queued() "DISKW $TMP (FINIS" "FREE FI($TMP)" return /*@ CD_DUMP_QUEUE */ /* . ----------------------------------------------------------------- */ CS_SORT: /*@ */ if branch then call BRANCH address TSO "ALLOC FI(SORTIN) DA(JCLXREF.TEMP) SHR REU" "ALLOC FI(SORTOUT) DA(JCLXREF.TEMP) SHR REU" "ALLOC FI(SYSIN) NEW TRACKS SPACE(1) UNIT(SYSDA)", "LRECL(80) BLKSIZE(0) RECFM(F B) REU" queue " SORT FIELDS=(8,17,CH,A,1,6,CH,A)" "EXECIO" queued() "DISKW SYSIN (FINIS" "ALLOC FI(SYSOUT) DUMMY REU" "CALL *(SORT)" "FREE FI(SORTIN SORTOUT SYSOUT)" "ALLOC FI(SYSIN) DA(*) REU" "ALLOC FI(SYSPRINT) DA(*) REU" return /*@ CS_SORT */ /* . ----------------------------------------------------------------- */ 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 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 */ /* . ----------------------------------------------------------------- */ 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# rc = Trace("O") address TSO parse arg msgtext 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 do ; say helpmsg; say ""; end ex_nam = Left(exec_name,8) /* predictable size */ say " "ex_nam" Analyzes JCL to find TASKS (proc or pgm), PROGRAMS, and " say " DDNAMES. " say " " say " Syntax: "ex_nam" " say " " say " " say " ds-list is a list of datasetnames in KEYPHRS-format, that " say " is: a leading 2-character token followed by a " say " dataset list and trailed by an identical 2-character" say " token. " say " " say " The dataset list must be appropriate for use in a " say " canonical ALLOC statement; it is not edited in any " say " way; if the ALLOC fails, the routine terminates. " say " " say " dsn is the name of a dataset which contains, n-per-line," say " the members of which are to be scanned. " 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 " 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 "QSTACK" /* how many stacks? */ stk2dump = rc - tk_init_stacks /* remaining stacks */ if stk2dump = 0 & queued() = 0 then return 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. */ say "Processing Stack #" dd " Total Lines:" queued() do queued();pull line;say line;end /* pump to the screen */ "DELSTACK" /* remove stack */ end /* dd = 1 to rc */ return /*@ DUMP_QUEUE */ /* . ----------------------------------------------------------------- */ 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+1) /* 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")" 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 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 */ 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 . sw.nested = sysvar("SYSNEST") = "YES" sw.batch = sysvar("SYSENV") = "BACK" sw.inispf = sysvar("SYSISPF") = "ACTIVE" 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 JXPARM )ATTR % TYPE(TEXT) INTENS(HIGH) SKIP(ON) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) INTENS(LOW) CAPS(ON) @ TYPE(TEXT) INTENS(HIGH) COLOR(YELLOW) ! TYPE(INPUT) INTENS(NON) )BODY EXPAND(ºº) @º-º% JCLXREF Parameter Specification @º-º %COMMAND ===>_ZCMD + + + JCL Library ===>_jclds + Jobs ===>_joblist + )INIT &JCLDS = &Z &JOBLIST = &Z )PROC VER (&JCLDS,NB,DSNAME) VER (&JOBLIST,NB) )END */