Mainframe Utility: JCLSCAN

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
            


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.