Go to LeighWeb Home Page            

Back To LeighWeb Mainframe Utilities Page

View the documentation associated with this module

/**********************************************************************
/* UTILITY: LAYOUT                                                    *
/* AUTHOR: DAVID LEIGH                                                *
/* FUNCTION: COMPILE A COPYBOOK AND BRING BACK THE LENGTH AND POSITION*
/*           INFORMATION INTO THE COPYBOOK FROM THE COMPILE LISTING.  *
/* CHANGE  : DAVID SLEEMAN.                                           *
/*           CHANGED CODE TO BE ABLE TO HANDLE THE OCCURS CLAUSE AND  *
/*           PUT (1) AFTER TABLES ON THE SORT PARAMETER OPTIONS.      *
/**********************************************************************
ISREDIT MACRO (OPT1 OPT2 OPT3 OPT4 OPT5 OPT6 OPT7 OPT8 OPT9 OPT10)
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
/**********************************************************************
/* NOTIFY THE USER                                                    *
/**********************************************************************
SET ZEDLMSG = &STR(*** PREPARING TO CALL THE COBOL COMPILER ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* SET PROCESSING VARIABLES                                           *
/**********************************************************************
DO &I = 1 TO 10
    IF &STR(&SYSNSUB(2,&&OPT&I)) >     THEN +
        DO
            SET X = &STR(&SYSNSUB(2,&&OPT&I))
            SELECT (&STR(&X))
                WHEN (SYNCSORT ¦ SORT) SET FORMAT = SYNCSORT
                WHEN (RDW) SET RDW = RDW
                WHEN (X) DO
                    SET EXCLUDE = ON
                    SET OPTIONS = &STR(&OPTIONS &X)
                END
                OTHERWISE SET OPTIONS = &STR(&OPTIONS &X)
            END
        END
END
SET COMPILER = IGYCRCTL
/**********************************************************************
/* ALLOCATE THE NECESSARY DD'S FOR THE COMPILE                        *
/**********************************************************************
FREE DD(SYSIN SYSLIB SYSPRINT SYSLIN +
        SYSUT1 SYSUT2 SYSUT3 SYSUT4 SYSUT5 SYSUT6 SYSUT7)
ALLOC DD(SYSLIB) DATASET('PPROD.STR.COPYLIB')
ALLOC DD(SYSLIN) DUMMY
ALLOC DD(SYSUT1) UNIT(SYSDA) SPACE(1,1) CYLINDERS
ALLOC DD(SYSUT2) UNIT(SYSDA) SPACE(1,1) CYLINDERS
ALLOC DD(SYSUT3) UNIT(SYSDA) SPACE(1,1) CYLINDERS
ALLOC DD(SYSUT4) UNIT(SYSDA) SPACE(1,1) CYLINDERS
ALLOC DD(SYSUT5) UNIT(SYSDA) SPACE(1,1) CYLINDERS
ALLOC DD(SYSUT6) UNIT(SYSDA) SPACE(1,1) CYLINDERS
ALLOC DD(SYSUT7) UNIT(SYSDA) SPACE(1,1) CYLINDERS
ALLOC DD(SYSPRINT) +
      NEW +
      UNIT(SYSDA) +
      SPACE(1,1) TRACKS RELEASE +
      RECFM(F B A) LRECL(133) BLKSIZE(23408) DSORG(PS)
ALLOC DD(SYSIN) +
      NEW +
      UNIT(SYSDA) +
      SPACE(1,1) TRACKS RELEASE +
      RECFM(F B) LRECL(80) BLKSIZE(23440) DSORG(PS)
/**********************************************************************
/* UNIQUELY DEFINE "FILLER"                                           *
/**********************************************************************
SET FILLNUM = 0
ISREDIT SEEK FIRST ' FILLER-1 ' &STR(&OPTIONS)
DO WHILE &LASTCC = 0
    SET FILLNUM = &FILLNUM + 1
    ISREDIT CHANGE 'FILLER' 'FILLER-&FILLNUM'
    IF &LASTCC = 0 AND &EXCLUDE = ON THEN +
        DO
            ISREDIT EXCLUDE FIRST 'FILLER' .ZCSR .ZCSR
            ISREDIT SEEK LAST P'=' .ZCSR .ZCSR
        END
    ISREDIT SEEK NEXT ' FILLER-2 ' &STR(&OPTIONS)
END
/**********************************************************************
/* MAKE A "PROGRAM" OUT OF THIS COPYBOOK                              *
/**********************************************************************
OPENFILE SYSIN OUTPUT
SET SYSIN = &STR(       IDENTIFICATION DIVISION.)
PUTFILE SYSIN
SET SYSIN = &STR(       PROGRAM-ID. TESTPGM.)
PUTFILE SYSIN
SET SYSIN = &STR(       DATE-COMPILED.)
PUTFILE SYSIN
SET SYSIN = &STR(       ENVIRONMENT DIVISION.)
PUTFILE SYSIN
SET SYSIN = &STR(       INPUT-OUTPUT SECTION.)
PUTFILE SYSIN
SET SYSIN = &STR(       FILE-CONTROL.)
PUTFILE SYSIN
SET SYSIN = &STR(       DATA DIVISION.)
PUTFILE SYSIN
SET SYSIN = &STR(       FILE SECTION.)
PUTFILE SYSIN
SET SYSIN = &STR(       WORKING-STORAGE SECTION.)
PUTFILE SYSIN
ISREDIT (X,Y) = NUMBER
IF &X = ON AND &SYSINDEX(&STR( COBOL),&STR(&Y)) > 0 THEN +
    DO
        SET COL1 = 1
        SET COL2 = 66
        SET COL3 = 4
        SET PREFIX = &STR(      )
    END
ELSE +
    DO
        SET COL1 = 7
        SET COL2 = 72
        SET COL3 = 10
        SET PREFIX =
    END
/**********************************************************************
/* LOOK FOR AN "01" LEVEL TO BEGIN THE DATA ELEMENT                   *
/**********************************************************************
ISREDIT CURSOR = 1 1
LOOP_01: +
ISREDIT SEEK NEXT P' #' &COL1 &COL2 &STR(&OPTIONS)
ISREDIT (LN1,CL1) = CURSOR
ISREDIT SEEK NEXT ' ' .ZCSR .ZCSR
ISREDIT (LN2,CL2) = CURSOR
ISREDIT SEEK FIRST P'¬' &COL1 &COL1 .ZCSR .ZCSR
IF &LASTCC = 0 THEN +
    DO
        ISREDIT SEEK LAST P'=' .ZCSR .ZCSR
        GOTO LOOP_01
    END
ISREDIT (NBR) = LINE .ZCSR
SET NBR = &SUBSTR(&CL1:&CL2,&STR(&NBR))
SET NBR = &NBR
IF &NBR > 1 THEN +
    DO
        SET SYSIN = &STR(       01  TEMP-LAYOUT-AREA.)
        PUTFILE SYSIN
    END
ISREDIT SEEK FIRST P'=' &COL3 &STR(&OPTIONS)
DO WHILE &LASTCC = 0
    ISREDIT (SYSIN) = LINE .ZCSR
    SET SYSIN = &STR(&PREFIX&SYSNSUB(1,&SYSIN))
    PUTFILE SYSIN
    ISREDIT SEEK NEXT P'=' &COL3 &STR(&OPTIONS)
END
SET SYSIN = &STR(       PROCEDURE DIVISION.)
PUTFILE SYSIN
SET SYSIN = &STR(           GOBACK.)
PUTFILE SYSIN
CLOSFILE SYSIN
/**********************************************************************
/* NOTIFY THE USER                                                    *
/**********************************************************************
SET ZEDLMSG = &STR(*** COMPILING THIS DATA ELEMENT DESCRIPTION ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* COMPILE THE SUCKER !                                               *
/**********************************************************************
CALL 'SYS1.IGY.SIGYCOMP(&COMPILER)'
/* ISPEXEC SELECT PGM(&COMPILER) */
SET SAVECC = &LASTCC
   IF &SAVECC > 4 THEN +
    DO
        SET ZEDLMSG = &STR(*** COMPILE UNSUCCESSFUL!  RC=&SAVECC ***)
        ISPEXEC SETMSG MSG(UTLZ001W)
        ISPEXEC LMINIT DATAID(DID) DDNAME(SYSPRINT)
        ISPEXEC EDIT DATAID(&DID)
        ISPEXEC LMFREE DATAID(&DID)
        GOTO FINISH
    END
/**********************************************************************
/* NOTIFY THE USER                                                    *
/**********************************************************************
SET ZEDLMSG = &STR(*** EXTRACTING THE COMPILER LISTING OUTPUT ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* EXTRACT THE DATA                                                   *
/**********************************************************************
FREE DD(SYSIN SYSLIB SYSLIN +
        SYSUT1 SYSUT2 SYSUT3 SYSUT4 SYSUT5 SYSUT6 SYSUT7)
ISPEXEC LMINIT DATAID(DID) DDNAME(SYSPRINT)
ISPEXEC EDIT DATAID(&DID) MACRO(LAYOUTMA)
/**********************************************************************
/* NOTIFY THE USER                                                    *
/**********************************************************************
IF &FORMAT = SYNCSORT THEN +
    SET ZEDLMSG = &STR(*** CONVERTING TO SYNCSORT FORMAT ***)
ELSE +
    SET ZEDLMSG = &STR(*** INSERTING MESSAGE LINES ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* INSERT THE INFORMATION AS MESSAGE LINES                            *
/**********************************************************************
ISPEXEC LMFREE DATAID(&DID)
FREE DD(SYSPRINT)
ISPEXEC VGET (CPINNUM CPIVAR CPIMAX) SHARED
SET CPIMAX = &LENGTH(&CPIMAX)
DO &I = 1 TO &CPIMAX
    SET ZEROPFX = &STR(0&ZEROPFX)
    SET QUESPFX = &STR(?&QUESPFX)
END
SET CPIMAX = &CPIMAX - 1
IF &CPIVAR = YES THEN +
    DO
        SET RDW = RDW
        IF &FORMAT = SYNCSORT THEN +
            SET RDWLINE = &SUBSTR(&LENGTH(&STR(&ZEROPFX.1))-&CPIMAX:+
                                  &LENGTH(&STR(&ZEROPFX.1)),+
                                          &STR(&ZEROPFX.1))+
                          &STR(,)+
                          &SUBSTR(&LENGTH(&STR(&ZEROPFX.4))-&CPIMAX:+
                                  &LENGTH(&STR(&ZEROPFX.4)),+
                                          &STR(&ZEROPFX.4))+
                          &STR(,CH,A,)
    END
SET &OCCURSW = NO
DO &I = 1 TO &CPINNUM
    SET ZEDSMSG = &STR(ON &I OF &CPINNUM)
    ISPEXEC CONTROL DISPLAY LOCK
    ISPEXEC DISPLAY MSG(UTLZ000)
    ISPEXEC VGET (CPID&I +
                  CPIH&I +
                  CPIP&I +
                  CPIL&I +
                  CPIF&I +
                  CPIO&I +
                  CPIR&I +
                  CPIV&I) SHARED
    IF &STR(&SYSNSUB(2,&&CPIO&I)) = YES THEN +
        SET &HEX = YES
    IF &HEX = YES THEN +
      DO
        ISPEXEC SELECT PGM(HEX2DECP) PARM(&STR(&SYSNSUB(2,&&CPIH&I)))
        ISPEXEC VGET DECNUM SHARED
        SET DECNUM = &DECNUM + 1
        SET POSITION = &DECNUM
      END
    ELSE +
       SET POSITION = &STR(&SYSNSUB(2,&&CPIP&I))
    ISREDIT FIND FIRST ' &STR(&SYSNSUB(2,&&CPID&I)) ' &STR(&OPTIONS)
    IF &LASTCC ¬= 0 THEN +
       ISREDIT FIND FIRST ' &STR(&SYSNSUB(2,&&CPID&I)). ' &STR(&OPTIONS)
    IF &FORMAT = SYNCSORT THEN +
        DO
            SET &OCCUR =
            SET LEVEL = &STR(&SYSNSUB(2,&&CPIV&I))
            SET LEVEL = &LEVEL - 13 + 35
            IF &HLDLEVEL = &LEVEL OR &HLDLEVEL > &LEVEL THEN +
                SET OCCURSW = NO
            IF &OCCURSW = YES THEN SET OCCUR = &STR((1))
            IF &POSITION = 1 AND &RDW = RDW THEN +
                DO
                    SET CPIVAR = YES
                    SET RDW =
                    ISREDIT LINE_BEFORE .ZCSR = <15,(RDWLINE) +
                                                 32,' * RDW'>
                END
            IF &CPIVAR = YES THEN SET POSITION = &POSITION + 4
            SET POSITION = &STR(&ZEROPFX&POSITION)
            SET L = &LENGTH(&STR(&POSITION))
            IF &POSITIONS = OFF THEN SET POSITION = &STR(&QUESPFX)
            ELSE SET POSITION = &SUBSTR(&L-&CPIMAX:&L,&STR(&POSITION))
            SET DATALEN = &STR(&ZEROPFX&SYSNSUB(2,&&CPIL&I))
            SET L = &LENGTH(&STR(&DATALEN))
            SET DATALEN = &SUBSTR(&L-&CPIMAX:&L,&STR(&DATALEN))
            IF &STR(&SYSNSUB(2,&&CPIO&I)) = YES AND +
                     &OCCURSW = NO THEN +
                DO
                  SET OCCURSW = YES
                  SET HLDLEVEL = &LEVEL
                END
            SET DATANAME = &STR(&SYSNSUB(2,&&CPID&I) &OCCUR)
            SET SORTFMT = &STR(&SYSNSUB(2,&&CPIF&I))
            SET STRING = &STR(&POSITION,&DATALEN,&SORTFMT,A, * )
            ISREDIT LINE .ZCSR = <15,(STRING) +
                                  (LEVEL),(DATANAME) +
                                  72,'     '>
        END
    ELSE +
        DO
            IF &POSITIONS = OFF THEN SET CPIP&I = &STR(?????)
            SET MESSAGE  = &STR(POSITION=&POSITION )+
                           &STR(LENGTH=&SYSNSUB(2,&&CPIL&I ))
/*                         &STR(HEX=&DECNUM)
            ISREDIT (LN,CL) = CURSOR
            IF &SLN =     THEN SET SLN = &LN
            SET CL = &CL + 1
            ISREDIT LINE_BEFORE .ZCSR = MSGLINE <(CL) (MESSAGE)>
        END
/*          SET MESSAGE  = &STR(POSITION=&SYSNSUB(2,&&CPIP&I) )+
/*      DO
/*          SET POSITIONS = OFF
/*          ISREDIT LINE_BEFORE .ZCSR = MSGLINE +
/*                 '&STR(*** DEFINED WITH "OCCURS" *** +
/*                  SUBSEQUENT "POSITIONS" ARE UNKNOWN ***)'
/*      END
END
/**********************************************************************
/* CLEAN UP                                                           *
/**********************************************************************
IF &FORMAT = SYNCSORT THEN +
    DO
        ISREDIT EXCLUDE ALL .ZFIRST .ZLAST
        IF &POSITIONS = OFF THEN ISREDIT LOCATE FIRST SPECIAL
        SET STGPOS = &EVAL(((&CPIMAX+1)*2)+19)
        ISREDIT FIND ALL ',A, * ' &STGPOS
        ISREDIT LINE_BEFORE .ZFIRST = ' SORT FIELDS=('
        ISREDIT DELETE EXCLUDED .ZFIRST .ZLAST
    END
ELSE +
    ISREDIT RESET EXCLUDED
/**********************************************************************
/* CLEAN UP FILLERS                                                   *
/**********************************************************************
FINISH: +
DO &I = 1 TO &FILLNUM
    ISREDIT CHANGE FIRST 'FILLER-&I ' 'FILLER '
END
IF &FORMAT = SYNCSORT THEN +
    ISREDIT CURSOR = 1 1
ELSE +
    DO
        ISREDIT CURSOR = &SLN 1
        ISREDIT FIND PREV P'=' 1
    END
EXIT