Return to Mainframe Utilities Page
Module
ISREDIT MACRO (OPT1 OPT2)
ISPEXEC CONTROL ERRORS RETURN
/**** SET MESSAGE DISPLAY ON/OFF BASED ON THE DEBUG SWITCH ***/
ISPEXEC VGET (DBGSWTCH) PROFILE
IF &DBGSWTCH = &STR(ON) THEN CONTROL MSG LIST CONLIST SYMLIST NOFLUSH
ELSE CONTROL NOMSG NOLIST NOFLUSH NOPROMPT
IF &STR(&OPT1) = HELP THEN GOTO HELPSEC
/**********************************************************************
/* UTILITY: JCLSCAN *
/* AUTHOR: DAVID LEIGH *
/* FUNCTION: SCAN A JOB AND INSERT ALL EXPANDED LINES AND ERROR LINES *
/* INTO TO THE JCL BEING EDITED AS MESSAGE LINES. *
/**********************************************************************
/**********************************************************************
/* VGET A VARIABLE TO DETERMINE WHAT PROCESSING TO DO *
/**********************************************************************
ISPEXEC VGET JSCNGOTO SHARED
IF &STR(&JSCNGOTO) > THEN GOTO &STR(&JSCNGOTO)
/**********************************************************************
/* INFORM THE USER OF THE CURRENT ACTIVITY *
/**********************************************************************
SET ZEDLMSG = &STR(*** CREATING "SCAN" JCL TO EXPAND THIS JOB ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* PARSE THE USER INPUT IF ANY *
/**********************************************************************
IF &STR(&OPT1) = WRITE THEN +
DO
SET PROCLIB = &STR(&OPT2)
SET WRITE = YES
SET OPT1 =
SET OPT2 =
END
IF &STR(&OPT2) = WRITE THEN +
DO
SET PROCLIB = &STR(&OPT1)
SET WRITE = YES
SET OPT1 =
SET OPT2 =
END
IF &STR(&OPT1) = PRINT THEN +
DO
SET PROCLIB = &STR(&OPT2)
SET PRINT = YES
SET OPT1 =
SET OPT2 =
END
IF &STR(&OPT2) = PRINT THEN +
DO
SET PROCLIB = &STR(&OPT1)
SET PRINT = YES
SET OPT1 =
SET OPT2 =
END
IF &STR(&OPT1) = EDIT THEN +
DO
SET PROCLIB = &STR(&OPT2)
SET EDIT = YES
SET OPT1 =
SET OPT2 =
END
IF &STR(&OPT2) = EDIT THEN +
DO
SET PROCLIB = &STR(&OPT1)
SET EDIT = YES
SET OPT1 =
SET OPT2 =
END
IF &STR(&OPT2) > THEN SET PROCLIB = &STR(&OPT2)
IF &STR(&OPT1) > THEN SET PROCLIB = &STR(&OPT1)
IF &STR(&PROCLIB) > THEN +
DO
SET L = &LENGTH(&STR(&PROCLIB))
SET K = &L - 1
IF &K > 0 THEN +
DO
SET NUMBER = &SUBSTR(&K:&L,&STR(&PROCLIB))
SET TYPE = &DATATYPE(&NUMBER)
END
SET K = &K - 1
IF &K > 0 THEN +
SET PREFIX = &SUBSTR(1:&K,&STR(&PROCLIB))
IF &L < 5 OR +
&L > 6 OR +
&STR(&TYPE) ¬= NUM OR +
&STR(&PREFIX) ¬= PROC THEN +
DO
SET ZEDSMSG = &STR(INVALID PROCLIB PARM)
SET ZEDLMSG = &STR(VALID PARM FORMAT: "PROC99" WHERE +
"99" = "00" THROUGH "99")
ISPEXEC SETMSG MSG(UTLZ001W)
EXIT CODE(12)
END
END
/**********************************************************************
/* FIND THE JOB CARD AND INSERT A SPECIAL ONE *
/**********************************************************************
SET TEMPNAME = &SUBSTR(1:8,&STR(&SYSUID.ZYX ))
SET SLASH = &STR(/)
SET ASTERISK = &STR(*)
SET JCLCOMMENT = &STR(&SLASH&SLASH&ASTERISK)
CALL 'SYS2.USC1.LINKLIB(USERINFO)' '&SYSUID '
ISPEXEC VGET (BINNM CCNTR) PROFILE
SET ACCT = &STR(&CCNTR,&BINNM)
ISREDIT FIND LAST P'¬' 1 72 .ZFIRST .ZFIRST
ISREDIT (LN,CL1) = CURSOR
ISREDIT FIND LAST ',' 1 72 .ZFIRST .ZFIRST
ISREDIT (LN,CL2) = CURSOR
DO WHILE &CL1 = &CL2
ISREDIT FIND NEXT '// ' 1
ISREDIT FIND LAST P'¬' 1 72 .ZCSR .ZCSR
ISREDIT (LN,CL1) = CURSOR
ISREDIT FIND LAST ',' 1 72 .ZCSR .ZCSR
IF &LASTCC = 0 THEN +
ISREDIT (LN,CL2) = CURSOR
ELSE +
SET CL2 = 100
END
ISREDIT LABEL .ZCSR = .JSCNJ
ISREDIT FIND NEXT P'=' 1
ISREDIT LABEL .ZCSR = .CURR
ISREDIT LINE_BEFORE .CURR = +
'//&TEMPNAME JOB (&ACCT,A00000,O),SCAN,MSGCLASS=X,'
ISREDIT LINE_BEFORE .CURR = +
'// CLASS=V,TIME=(0,01),TYPRUN=SCAN'
ISREDIT FIND P'=' 1 .CURR .CURR
ISREDIT FIND PREV P'=' 1
ISREDIT LABEL .ZCSR = .JSCNB
ISREDIT FIND PREV P'=' 1
ISREDIT LABEL .ZCSR = .JSCNA
/**********************************************************************
/* PERFORM PROCLIB PROCESSING *
/**********************************************************************
SET SAVEPROC = &STR(&PROCLIB)
ISREDIT FIND FIRST '&SLASH&ASTERISK.JOBPARM ' 1 .CURR .ZLAST
SET PROCCC = &LASTCC
DO WHILE &PROCCC = 0
ISREDIT FIND FIRST ' P=' .ZCSR .ZCSR
SET SAVECC1 = &LASTCC
ISREDIT (LINENUM,CL1) = CURSOR
ISREDIT FIND FIRST ',P=' .ZCSR .ZCSR
SET SAVECC2 = &LASTCC
ISREDIT (LINENUM,CL2) = CURSOR
ISREDIT FIND FIRST ' PROCLIB=' .ZCSR .ZCSR
SET SAVECC3 = &LASTCC
ISREDIT (LINENUM,CL3) = CURSOR
ISREDIT FIND FIRST ',PROCLIB=' .ZCSR .ZCSR
SET SAVECC4 = &LASTCC
ISREDIT (LINENUM,CL4) = CURSOR
IF &SAVECC1 = 0 THEN +
DO
SET CL1 = &CL1 + 3
ISREDIT CURSOR = &LINENUM &CL1
ISREDIT FIND NEXT ',' .ZCSR .ZCSR
ISREDIT (LINENUM,CLA) = CURSOR
ISREDIT CURSOR = &LINENUM &CL1
ISREDIT FIND NEXT ' ' .ZCSR .ZCSR
ISREDIT (LINENUM,CLB) = CURSOR
SET X = 0
IF &CLA > &CL1 THEN +
IF &CLB > &CL1 THEN +
IF &CLA > &CLB THEN SET X = &CLB
ELSE SET X = &CLA
ELSE SET X = &CLA
ELSE +
IF &CLB > &CL1 THEN SET X = &CLB
ELSE SET X = &CL1
SET X = &X - 1
IF &STR(&PROCLIB) > THEN +
DO
SET EQL =
DO &I = 1 TO &EVAL(&X - &CL1 + 1)
SET EQL = &STR(&EQL¬=)
END
ISREDIT (SAVELINE) = LINE .ZCSR
ISREDIT LABEL .ZCSR = .JSCNC
ISREDIT CHANGE P'&STR(&EQL)' '&STR(&PROCLIB)' +
&CL1 FIRST .JSCNC .JSCNC
END
ELSE +
DO
ISREDIT (LINE) = LINE .ZCSR
SET PROCLIB = &SUBSTR(&CL1:&X,+
&STR(&SYSNSUB(1,&LINE)))
END
SET PROCCC = 2000
END
ELSE IF &SAVECC2 = 0 THEN +
DO
SET CL2 = &CL2 + 3
ISREDIT CURSOR = &LINENUM &CL2
ISREDIT FIND NEXT ',' .ZCSR .ZCSR
ISREDIT (LINENUM,CLA) = CURSOR
ISREDIT CURSOR = &LINENUM &CL2
ISREDIT FIND NEXT ' ' .ZCSR .ZCSR
ISREDIT (LINENUM,CLB) = CURSOR
SET X = 0
IF &CLA > &CL2 THEN +
IF &CLB > &CL2 THEN +
IF &CLA > &CLB THEN SET X = &CLB
ELSE SET X = &CLA
ELSE SET X = &CLA
ELSE +
IF &CLB > &CL2 THEN SET X = &CLB
ELSE SET X = &CL2
SET X = &X - 1
IF &STR(&PROCLIB) > THEN +
DO
SET EQL =
DO &I = 1 TO &EVAL(&X - &CL2 + 1)
SET EQL = &STR(&EQL¬=)
END
ISREDIT (SAVELINE) = LINE .ZCSR
ISREDIT LABEL .ZCSR = .JSCNC
ISREDIT CHANGE P'&STR(&EQL)' '&STR(&PROCLIB)' +
&CL2 FIRST .JSCNC .JSCNC
END
ELSE +
DO
ISREDIT (LINE) = LINE .ZCSR
SET PROCLIB = &SUBSTR(&CL2:&X,+
&STR(&SYSNSUB(1,&LINE)))
END
SET PROCCC = 2000
END
ELSE IF &SAVECC3 = 0 THEN +
DO
SET CL3 = &CL3 + 3
ISREDIT CURSOR = &LINENUM &CL3
ISREDIT FIND NEXT ',' .ZCSR .ZCSR
ISREDIT (LINENUM,CLA) = CURSOR
ISREDIT CURSOR = &LINENUM &CL3
ISREDIT FIND NEXT ' ' .ZCSR .ZCSR
ISREDIT (LINENUM,CLB) = CURSOR
SET X = 0
IF &CLA > &CL3 THEN +
IF &CLB > &CL3 THEN +
IF &CLA > &CLB THEN SET X = &CLB
ELSE SET X = &CLA
ELSE SET X = &CLA
ELSE +
IF &CLB > &CL3 THEN SET X = &CLB
ELSE SET X = &CL3
SET X = &X - 1
IF &STR(&PROCLIB) > THEN +
DO
SET EQL =
DO &I = 1 TO &EVAL(&X - &CL3 + 1)
SET EQL = &STR(&EQL¬=)
END
ISREDIT (SAVELINE) = LINE .ZCSR
ISREDIT LABEL .ZCSR = .JSCNC
ISREDIT CHANGE P'&STR(&EQL)' '&STR(&PROCLIB)' +
&CL3 FIRST .JSCNC .JSCNC
END
ELSE +
DO
ISREDIT (LINE) = LINE .ZCSR
SET PROCLIB = &SUBSTR(&CL3:&X,+
&STR(&SYSNSUB(1,&LINE)))
END
SET PROCCC = 2000
END
ELSE IF &SAVECC4 = 0 THEN +
DO
SET CL1 = &CL1 + 3
ISREDIT CURSOR = &LINENUM &CL1
ISREDIT FIND NEXT ',' .ZCSR .ZCSR
ISREDIT (LINENUM,CLA) = CURSOR
ISREDIT CURSOR = &LINENUM &CL1
ISREDIT FIND NEXT ' ' .ZCSR .ZCSR
ISREDIT (LINENUM,CLB) = CURSOR
SET X = 0
IF &CLA > &CL4 THEN +
IF &CLB > &CL4 THEN +
IF &CLA > &CLB THEN SET X = &CLB
ELSE SET X = &CLA
ELSE SET X = &CLA
ELSE +
IF &CLB > &CL4 THEN SET X = &CLB
ELSE SET X = &CL4
SET X = &X - 1
IF &STR(&PROCLIB) > THEN +
DO
SET EQL =
DO &I = 1 TO &EVAL(&X - &CL1 + 1)
SET EQL = &STR(&EQL¬=)
END
ISREDIT (SAVELINE) = LINE .ZCSR
ISREDIT LABEL .ZCSR = .JSCNC
ISREDIT CHANGE P'&STR(&EQL)' '&STR(&PROCLIB)' +
&CL1 FIRST .JSCNC .JSCNC
END
ELSE +
DO
ISREDIT (LINE) = LINE .ZCSR
SET PROCLIB = &SUBSTR(&CL4:&X,+
&STR(&SYSNSUB(1,&LINE)))
END
SET PROCCC = 2000
END
ELSE +
DO
ISREDIT FIND NEXT '&SLASH&ASTERISK.JOBPARM ' 1 .CURR .ZLAST
SET PROCCC = &LASTCC
END
END
IF &PROCCC = 4 AND &STR(&PROCLIB) > THEN +
DO
ISREDIT FIND NEXT P'=' 1
ISREDIT LINE_AFTER .ZCSR = '&STR(&SLASH&ASTERISK.JOBPARM +
P=&PROCLIB)'
ISREDIT FIND LAST P'=' .ZCSR .ZCSR
ISREDIT FIND NEXT P'=' 1
ISREDIT LABEL .ZCSR = .JSCNC
SET PROCCC = 2000
END
IF &PROCCC = 2000 OR +
(&STR(&PROCLIB) ¬= PROC00 AND +
&STR(&PROCLIB) > ) THEN +
DO
ISREDIT LINE_BEFORE .ZCSR = MSGLINE ' '
ISREDIT LINE_BEFORE .ZCSR = MSGLINE '&STR(!!! WARNING !!! +
PROCLIB IN +
USE ON THIS SCAN +
WAS "&PROCLIB" +
!!! WARNING !!!)'
ISREDIT LINE_BEFORE .ZCSR = MSGLINE ' '
ISREDIT LINE_AFTER .ZCSR = MSGLINE ' '
ISREDIT LINE_AFTER .ZCSR = MSGLINE '&STR(!!! WARNING !!! +
PROCLIB IN +
USE ON THIS SCAN +
WAS "&PROCLIB" +
!!! WARNING !!!)'
ISREDIT LINE_AFTER .ZCSR = MSGLINE ' '
SET PROCMSG = 6
END
ELSE SET PROCMSG = 0
/**********************************************************************
/* CREATE A TEMP FILE OF THE JCL TO SCAN *
/**********************************************************************
SET TEMPFILE = &STR(&SYSUID..TEMP.JCLSCAN.JCL)
DELETE '&TEMPFILE'
FREE DD(TEMPDD)
ALLOC DD(TEMPDD) DSN('&TEMPFILE') +
NEW CATALOG +
UNIT(SYSDA) VOLUME(WRK$$$) +
SPACE(2,2) TRACKS RELEASE +
RECFM(F B) LRECL(80) BLKSIZE(23440) DSORG(PS)
OPENFILE TEMPDD OUTPUT
/**********************************************************************
/* LOAD THE JCL INTO THE TEMP FILE *
/**********************************************************************
ISREDIT FIND FIRST P'=' 1 .JSCNA .ZLAST
DO WHILE &LASTCC = 0
ISREDIT (TEMPDD) = LINE .ZCSR
PUTFILE TEMPDD
ISREDIT FIND NEXT P'=' 1 .JSCNA .ZLAST
END
CLOSFILE TEMPDD
/**********************************************************************
/* INFORM THE USER OF THE CURRENT ACTIVITY *
/**********************************************************************
SET ZEDLMSG = &STR(*** "SCANNING" THE JCL ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* FIND WHAT ZYX JOBS EXIST CURRENTLY *
/**********************************************************************
SET SYSOUTTRAP = 1000
CONTROL MSG
STATUS &TEMPNAME
CONTROL NOMSG
SET SYSOUTTRAP = 0
SET SYSDVAL = &&SYSOUTLINE&SYSOUTLINE
SET SYSDVAL = &SYSDVAL
READDVAL NULL LASTJOB
/**********************************************************************
/* SUBMIT THE SCAN *
/**********************************************************************
SUBMIT '&TEMPFILE'
/**********************************************************************
/* CLEAN UP THE TEMP JCL FILE *
/**********************************************************************
FREE DD(TEMPDD)
DELETE '&TEMPFILE'
/**********************************************************************
/* DELETE THE TEMPORARY JOB CARD LINES *
/**********************************************************************
ISREDIT FIND FIRST P'=' 1 .JSCNA .JSCNA
ISREDIT DELETE .JSCNA
ISREDIT DELETE .JSCNB
IF &STR(&SYSNSUB(1,&SAVELINE)) > THEN +
ISREDIT LINE_BEFORE .JSCNC = (SAVELINE)
SET SAVENUM = 0
ISREDIT (SAVENUM) = LINENUM .JSCNC
/**********************************************************************
/* GET PAST ANY JES2 STATEMENTS. *
/**********************************************************************
ISREDIT FIND FIRST '&STR(&SLASH&ASTERISK)' 1
DO WHILE &LASTCC = 0
ISREDIT LABEL .ZCSR = .HOLD
ISREDIT FIND PREV ' EXEC ' 4 65
DO WHILE &LASTCC = 0
ISREDIT FIND FIRST '//*' 1 .ZCSR .ZCSR
SET COMCC = &LASTCC
ISREDIT FIND FIRST P'¬' 3 .ZCSR .ZCSR
SET NONBLANKCC = &LASTCC
IF &COMCC > 0 AND &NONBLANKCC = 0 THEN +
DO
ISREDIT FIND PREV '&STR(&SLASH&ASTERISK)' 1
GOTO JES_CONTINUE
END
ISREDIT FIND PREV ' EXEC ' 4 65
END
ISREDIT FIND LAST P'=' .HOLD .HOLD
ISREDIT FIND NEXT '&STR(&SLASH&ASTERISK)' 1
END
JES_CONTINUE: +
ISREDIT FIND FIRST '&STR(&SLASH&ASTERISK)' 1 .ZCSR .ZCSR
IF &LASTCC = 0 THEN +
DO
ISREDIT FIND LAST P'=' .ZCSR .ZCSR
ISREDIT FIND NEXT P'=' 1
END
ISREDIT (CURRLINE) = LINE .ZCSR
ISREDIT DELETE &SAVENUM
/**********************************************************************
/* KEEP LOOKING FOR THE OUTPUT OF THE SCAN *
/**********************************************************************
SET SCANJOB = &STR(&LASTJOB)
DO WHILE &STR(&SCANJOB) = &STR(&LASTJOB) OR +
&STR(&TOKEN3 &TOKEN4 &TOKEN5) = &STR(WAITING FOR EXECUTION)
SET SYSOUTTRAP = 1000
CONTROL MSG
STATUS &TEMPNAME
CONTROL NOMSG
SET SYSOUTTRAP = 0
SET SYSDVAL = &&SYSOUTLINE&SYSOUTLINE
SET SYSDVAL = &SYSDVAL
READDVAL NULL SCANJOB TOKEN3 TOKEN4 TOKEN5
END
/**********************************************************************
/* RETRIEVE THE SCAN OUTPUT INTO A DATASET *
/**********************************************************************
SET LISTDSN = &STR(&SYSUID..TEMP.JCLSCAN.JOB)
DELETE '&LISTDSN'
FREE DD(TEMPDD)
ALLOC DD(TEMPDD) DSN('&LISTDSN') +
NEW CATALOG +
UNIT(SYSDA) VOLUME(WRK$$$) +
SPACE(1,1) CYLINDERS RELEASE +
RECFM(F B A) LRECL(132) BLKSIZE(23364) DSORG(PS)
OUTPUT &SCANJOB PRINT('&LISTDSN')
FREE DD(TEMPDD)
/**********************************************************************
/* EDIT THE SCAN OUTPUT AND PUT THE MESSAGE LINES WHERE THEY BELONG *
/**********************************************************************
SET JSCNGOTO = &STR(MESSAGE_SECTION)
ISPEXEC VPUT JSCNGOTO SHARED
ISPEXEC EDIT DATASET('&LISTDSN') MACRO(JCLSCAN)
SET JSCNGOTO =
ISPEXEC VPUT JSCNGOTO SHARED
/**********************************************************************
/* INFORM THE USER OF THE CURRENT ACTIVITY *
/**********************************************************************
SET ZEDLMSG = &STR(*** INSERTING MESSAGE LINES INTO THE JCL ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* ADD A DUMMY LINE AT THE END SO THAT INSERTS ARE DONE PROPERLY *
/**********************************************************************
ISREDIT (LASTLINE) = LINENUM .ZLAST
SET TEMPLINE = &STR(//* **** JCLSCAN TEMP LINE **** &ZDATE/&ZTIME ****)
ISREDIT LINE_AFTER &LASTLINE = '&STR(&TEMPLINE)'
/**********************************************************************
/* FIND OUT IF THERE IS A JES2 ERROR TO MARK *
/**********************************************************************
ISPEXEC VGET (JSCNERRC JSCNJERL JSCNJERS) SHARED
IF &STR(&SYSNSUB(1,&JSCNJERL)) > THEN +
DO
ISREDIT FIND FIRST +
'&SUBSTR(1:72,&STR(&SYSNSUB(1,&JSCNJERS)))' 1
ISREDIT LINE_AFTER .ZCSR = MSGLINE '*** REMAINDER OF JOB WAS +
NOT SCANNED DUE TO THE +
JES2 ERROR ***'
ISREDIT LINE_AFTER .ZCSR = MSGLINE (JSCNJERL)
SET INSERTED = 2 + &PROCMSG
SET ZEDLMSG = &STR(*** &INSERTED MESSAGE LINES+
INSERTED (&JSCNERRC +
ERROR MESSAGES) ***)
ISPEXEC SETMSG MSG(UTLZ000W)
GOTO FINISH
END
ELSE +
SET INSERTED = 0
/**********************************************************************
/* LOAD THE EXPANDED LINES AS MSGLINES IN THE JCL *
/**********************************************************************
ISPEXEC VGET (JSCNVARS) SHARED
DO &I = 1 TO &JSCNVARS
ISPEXEC VGET (JSCN&I) SHARED
END
ISREDIT FIND FIRST '&STR(&SYSNSUB(1,&JSCN1))' 1
IF &LASTCC ¬= 0 THEN +
DO
SET ZEDLMSG = &STR(*** COULD NOT FIND FIRST LINE TO MARK ***)
ISPEXEC SETMSG MSG(UTLZ001W)
GOTO FINISH
END
SET TYPE = BEFORE
ISREDIT (CURRLINE) = LINE .ZCSR
DO &I = 1 TO &JSCNVARS
SET THISLINE = &&JSCN&I
SET THISLINE = &STR(&SYSNSUB(2,&THISLINE))
IF &SUBSTR(1:72,&STR(&SYSNSUB(1,&CURRLINE))) ¬= +
&STR(&SYSNSUB(1,&THISLINE)) THEN +
DO
IF &SUBSTR(1:2,&STR(&SYSNSUB(2,&&JSCN&I))) = &STR(//) AND +
&STR(&WRITE) = YES THEN +
ISREDIT LINE_&TYPE .ZCSR = (JSCN&I)
ELSE +
ISREDIT LINE_&TYPE .ZCSR = MSGLINE (JSCN&I)
SET INSERTED = &INSERTED + 1
END
ELSE +
DO
ISREDIT FIND ' DD ' FIRST .ZCSR .ZCSR
IF &LASTCC = 0 THEN +
DO
ISREDIT FIND NEXT P'¬' .ZCSR .ZCSR
ISREDIT FIND NEXT ' ' .ZCSR .ZCSR
ISREDIT (LN1,CL1) = CURSOR
IF &CL1 < 16 THEN SET X = 16
ELSE SET X = &CL1 + 1
ISREDIT FIND NEXT P'¬' .ZCSR .ZCSR
ISREDIT (LN2,CL2) = CURSOR
IF &CL2 <= &X THEN +
DO
ISREDIT FIND '*' &CL2 FIRST .ZCSR .ZCSR
SET CC1 = &LASTCC
ISREDIT FIND 'DATA' &CL2 FIRST .ZCSR .ZCSR
SET CC2 = &LASTCC
IF &CC1 = 0 OR &CC2 = 0 THEN +
DO
ISREDIT FIND NEXT '//' 1
IF &LASTCC ¬= 0 THEN +
DO
ISREDIT FIND FIRST P'=' .ZL
SET TYPE = AFTER
END
ELSE +
ISREDIT FIND PREV P'=' 1
END
END
END
ISREDIT FIND NEXT P'=' 1
IF &LASTCC ¬= 0 THEN SET TYPE = AFTER
ELSE ISREDIT (CURRLINE) = LINE .ZCSR
END
END
SET ZEDLMSG = &STR(*** &INSERTED MESSAGE LINES INSERTED (&JSCNERRC +
ERROR MESSAGES) ***)
ISPEXEC SETMSG MSG(UTLZ000W)
FINISH: +
ISREDIT FIND '&STR(&TEMPLINE)' LAST
IF &LASTCC = 0 THEN +
ISREDIT DELETE .ZCSR
ISREDIT CURSOR = 1 1
ISPEXEC VERASE (JSCNGOTO JSCNERRC JSCNJERL JSCNJERS) SHARED
DO &I = 1 TO &JSCNVARS
ISPEXEC VERASE (JSCN&JSCNVARS) SHARED
END
ISPEXEC VERASE (JSCNVARS) SHARED
IF &PRINT = YES THEN %PRINTIT PDSN(&LISTDSN)
IF &EDIT = YES THEN ISPEXEC EDIT DATASET('&LISTDSN')
EXIT
/**********************************************************************
/* MOVE MESSAGES TO WHERE THEY BELONG IN THE OUTPUT LISTING *
/**********************************************************************
MESSAGE_SECTION: +
SET JSCNERRC = 0
ISREDIT FIND FIRST 'STMT NO. MESSAGE' 3
IF &LASTCC = 0 THEN +
DO
SET SPACE = &STR( !!ERROR!!)
ISREDIT LABEL .ZCSR = .STMT
ISREDIT FIND NEXT P'# ' 10
DO WHILE &LASTCC = 0
ISREDIT LABEL .ZCSR = .JSCNC
ISREDIT FIND FIRST 'IEFC001I' .ZCSR .ZCSR
IF &LASTCC = 0 THEN GOTO ERROR_LOOP
SET JSCNERRC = &JSCNERRC + 1
ISREDIT (LINE) = LINE .ZCSR
ISREDIT FIND LAST P'¬' .ZCSR .ZCSR
ISREDIT (LN,CL) = CURSOR
SET SYSDVAL = &SUBSTR(2:&CL,&STR(&SYSNSUB(1,&LINE)))
READDVAL MARKLINE
SET MARKLINE = &MARKLINE + 1
SET LINE = &SUBSTR(12:&CL,&STR(&SYSNSUB(1,&LINE)))
SET LINE = &STR(&SPACE.ERROR>>> &SYSNSUB(1,&LINE))
ISREDIT FIND FIRST '&MARKLINE ' 2 10
IF &LASTCC = 0 THEN ISREDIT LINE_BEFORE .ZCSR = (LINE)
ELSE ISREDIT LINE_BEFORE .STMT = (LINE)
ERROR_LOOP: +
ISREDIT FIND LAST P'=' .JSCNC .JSCNC
ISREDIT FIND NEXT P'# ' 10 .ZCSR .ZLAST
END
ISREDIT FIND FIRST ' JES2 JOB STATISTICS '
ISREDIT FIND PREV 'JCL ERROR'
IF &LASTCC = 0 AND &JSCNERRC = 0 THEN +
DO
ISREDIT FIND NEXT 'IEF' 12 .STMT .ZLAST
DO WHILE &LASTCC = 0
SET MARKLINE = 0
SET JSCNERRC = &JSCNERRC + 1
ISREDIT LABEL .ZCSR = .JSCNC
ISREDIT (LINE) = LINE .ZCSR
ISREDIT FIND LAST P'¬' .ZCSR .ZCSR
ISREDIT (LN,CL) = CURSOR
ISREDIT FIND ' STATEMENT ' FIRST .ZCSR .ZCSR
IF &LASTCC = 0 THEN +
DO
ISREDIT FIND P'¬' NEXT .ZCSR .ZCSR
ISREDIT FIND P' ' NEXT .ZCSR .ZCSR
ISREDIT FIND P'#' NEXT .ZCSR .ZCSR
IF &LASTCC = 0 THEN +
DO
ISREDIT (LN1,CL1) = CURSOR
ISREDIT FIND P'-' NEXT .ZCSR .ZCSR
ISREDIT (LN2,CL2) = CURSOR
SET CL2 = &CL2 - 1
SET MARKLINE = &SUBSTR(&CL1:&CL2,+
&STR(&SYSNSUB(1,+
&LINE)))
SET MARKLINE = &MARKLINE + 1
END
END
SET LINE = &SUBSTR(12:&CL,&STR(&SYSNSUB(1,&LINE)))
SET LINE = &STR(&SPACE.ERROR>>> &SYSNSUB(1,&LINE))
IF &MARKLINE > 0 THEN +
ISREDIT FIND FIRST '&MARKLINE ' 2 10
ELSE +
ISREDIT FIND FIRST ' 1 //' 8
IF &LASTCC = 0 THEN +
ISREDIT LINE_BEFORE .ZCSR = (LINE)
ELSE ISREDIT LINE_BEFORE .STMT = (LINE)
ISREDIT FIND LAST P'=' .JSCNC .JSCNC
ISREDIT FIND NEXT 'IEF' 12 .ZCSR .ZLAST
END
END
ISREDIT DELETE .STMT .ZLAST
END
ISREDIT FIND FIRST '***** INVALID &SLASH&ASTERISK'
IF &LASTCC = 0 THEN +
DO
ISREDIT (JSCNJERL) = LINE .ZCSR
ISREDIT (X) = LINENUM .ZCSR
ISREDIT (JSCNJERS) = LINE &EVAL(&X-1)
SET JSCNERRC = &JSCNERRC + 1
END
ISREDIT SAVE
/**********************************************************************
/* CAPTURE THE JCL LINES IN SHARED ISPF VARIABLES FOR THE MARKING *
/**********************************************************************
ISREDIT FIND FIRST ' 2 ' 8
ISREDIT FIND PREV P'=' 1
ISREDIT FIND PREV P'=' 1
ISREDIT DELETE .ZFIRST .ZCSR
ISREDIT CHANGE ALL 'X' '/' 11 12
ISREDIT CHANGE ALL '+' '/' 11 12
ISREDIT CHANGE ALL '*' '/' 11 12
SET JSCNVARS = 0
ISREDIT FIND FIRST P'=' 1
DO WHILE &LASTCC = 0
SET JSCNVARS = &JSCNVARS + 1
ISREDIT (JLINE) = LINE .ZCSR
SET JSCN&JSCNVARS = &SUBSTR(11:82,&STR(&SYSNSUB(1,&JLINE)))
ISPEXEC VPUT (JSCN&JSCNVARS) SHARED
ISREDIT FIND NEXT P'=' 1
END
ISPEXEC VPUT (JSCNERRC JSCNJERL JSCNJERS JSCNVARS) SHARED
ISREDIT CANCEL
EXIT
HELPSEC: +
ISPEXEC SELECT PGM(ISPTUTOR) PARM(HELPSHEL)
SET ZEDLMSG = &STR(*** HELP DISPLAYED FOR JCLSCAN UTILITY +
*** NO PROCESSING PERFORMED ***)
ISPEXEC SETMSG MSG(UTLZ000)
EXIT
Documentation
JCLSCAN is an edit macro which operates interactively on the JCL you're
editing. It submits a scan of the JCL and then reads the output of the scan.
JES2 and JCL error messages are inserted at the proper point in your JCL. PROC
expansion lines are also inserted at the proper point in your JCL. These
insertions are in the form of edit "message" lines. At the end of the
processing, a message is displayed which indicates how many message lines were
inserted and how many of those lines are error messages as well.
To execute JCLSCAN, just type JCLSCAN on the command line while editing the JCL
and press ENTER. Messages will be displayed during the process to keep you
appraised of its progress.
Practically, JCLSCAN serves both as an error checker, and a PROC expander.
When ISPF 3.2 or higher are in place, the MD line command can be used to make
these inserted message lines into data lines. This also adds the ability to
create test versions of JCL from production PROCs, by making the expanded proc
message lines into data lines and using them in the JCL.
There are a few positional (optional) keyword parameters which may be specified
with JCLSCAN. The reserved keywords EDIT or (mutually exclusive options) PRINT
indicate that the user wishes to edit or print (using the PRINTIT utility) the
actual results of the JCL scan. They are always kept in a dataset named
youruserid.TEMP.JCLSCAN.JOB. The results are placed as message lines in the
JCL you are editing, but they still remain as results of the scan in and of
themselves.
One of the nice features of using the JCL scan listing dataset later is that
the error message lines (if any) are positioned within the scan output where
they occur. There is an "eyeball" string of "!!ERROR!!ERROR>>" prefixing the
line which helps to locate these errors in a printout.
The scan output listing dataset is written to temporary DASD and is always
named the same, so that it will go away nightly, and be replaced every time you
execute JCLSCAN.
The other positional parameter which may be used is PROCnn where "nn" is any
number from "00" through "99". This is, of course, a proclib name. If you
specify a proclib name, the proclib name you specify will be used in the scan
regardless of what is actually coded in the JCL. If a proclib name is
explicity coded in the JCL or explicitly specified when invoking JCLSCAN
warning message lines will be inserted in the JCL to let you know that
"default" proclib processing is not occurring (even if you specify or code
"PROC00").
Examples:
COMMAND ===> jclscan
COMMAND ===> jclscan edit
COMMAND ===> jclscan proc01
COMMAND ===> jclscan print proc02
COMMAND ===> jclscan proc02 edit
COMMAND ===> jclscan proc02 print

0 Comments