Mainframe Utility: CMP

Return to Mainframe Utilities Page

Module


PROC 0 HELP
/****************************************************                   00010000
/* FUNCTION: CMP                                    *                   00020000
/*                                                  *                   00030000
/* DESCRIPTION: COMPARE TWO CHANGED AGAINST BASE    *                   00040000
/*                                                  *                   00050000
/* INPUTS:   NONE                                   *                   00060001
/*                                                  *                   00070001
/* OUTPUTS:  NONE                                   *                   00080001
/*                                                  *                   00090001
/* NOTES:    NONE                                   *                   00100001
/******************* Modifications ******************                   00110001
/* 08/31/92 By: David Leigh                         *                   00090001
/*          I added a call to UTILLOG at the        *                   00090001
/*          beginning and I added code to allow     *                   00090001
/*          people with no TSO PROFILE PREFIX to    *                   00090001
/*          use CMP.  I looked into changing each   *                   00090001
/*          dataset reference to use an explicit    *                   00090001
/*          SYSUID prefix, but that looked more     *                   00090001
/*          complex at first glance than I wanted to*                   00090001
/*          get.  The problem with this method is   *                   00090001
/*          that if CMP bombs and the prefix had    *                   00090001
/*          been changed just for CMP, it would     *                   00090001
/*          remain changed and the person would be  *                   00090001
/*          screwed up!                             *                   00090001
/* 06/19/95 By: David Leigh                         *                   00090001
/*          In the event of an IEBUPDTE bad return  *                   00090001
/*          code CMP will now edit the SYSPRINT     *                   00090001
/*          dataset and then exit the CLIST.  This  *                   00090001
/*          was added to both IEBUPDTE calls.       *                   00090001
/****************************************************                   00110001
ISPEXEC CONTROL ERRORS RETURN
ISPEXEC VGET (DBGSWTCH) PROFILE
IF &DBGSWTCH = &STR(ON) THEN CONTROL MSG LIST CONLIST SYMLIST NOFLUSH
ELSE CONTROL NOMSG NOLIST NOFLUSH NOPROMPT

/**********************************************************************
/* DISPLAY HELP IF REQUESTED                                          *
/**********************************************************************
IF &HELP = HELP THEN GOTO HELPSEC

/**********************************************************************
/* Adjust for users who have PROFILE NOPREFIX in their logon          *
/**********************************************************************
SET CMPPREF = &SYSPREF
IF &STR(&CMPPREF) =    THEN PROFILE PREFIX(&SYSUID)

SET &CRSR = MEMBER
SET &INIT = NO
SET &RC   = OK

TOP: +
   ISPEXEC DISPLAY PANEL(cmp) CURSOR(&CRSR)                             00130001
   IF &LASTCC>7 THEN +
      GOTO EXIT

   SET &USER1DS=&STR('&USER1(&MEMBER)')
   SET &USER2DS=&STR('&USER2(&MEMBER)')
   SET &BASEDS=&STR('&BASE(&MEMBER)')

   IF &INIT = NO THEN GOTO INITIAL

/*******************************************************
/* COMPARE  USERDS1 WITH BASE                          *
/*******************************************************
POSTINI: +
   ISPEXEC CONTROL DISPLAY LOCK
   SET CMPLMSG=&STR( *** Comparing &user1ds to &baseds ***)
   ISPEXEC DISPLAY MSG(CMPC000M)
   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)
   SET &cRSR=BASE

   SYSCALL OPEN &SYSODS &sysout_dd &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER
   OPENFILE &SYSOUT_DD OUTPUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR( *** &CMPLMSG)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   CLOSFILE SYSOUT

   SYSCALL OPEN &SYSPRT &sysprint_dd &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER
   OPENFILE &SYSPRINT_DD OUTPUT
   SET &SYSPRINT = &STR( ***)
   PUTFILE SYSPRINT
   SET &SYSPRINT = &STR( *** &CMPLMSG)
   PUTFILE SYSPRINT
   SET &SYSPRINT = &STR( ***)
   PUTFILE SYSPRINT
   CLOSFILE SYSPRINT

   ALLOC DSN(&DELTA1) DD(&SYSUT3) SHR
   IF &LASTCC > 7 THEN +
      DO
         SET &RC = &STR(*** Unable to allocate &DELTA1 ***)
         GOTO ALLOCER
      END

   SYSCALL OPEN &BASEDS &SYSUT1 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &CARDFILE &SYSIN &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SET &CRSR=USER1
   SYSCALL OPEN &USER1DS &SYSUT2 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   CALL 'SYS3.COMPAREX.PROD.LOADLIB(COMPAREX)' /******** COMPARE **/

   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)

/*******************************************************
/* COMPARE  USERDS2 WITH BASE                          *
/*******************************************************

   ISPEXEC CONTROL DISPLAY LOCK
   SET CMPLMSG=&STR( *** Comparing &user2ds to &baseds ***)
   ISPEXEC DISPLAY MSG(CMPC000M)
   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)
   SET &cRSR=BASE

   SYSCALL OPEN &SYSODS &sysout_dd &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER
   OPENFILE &SYSOUT_DD OUTPUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR(&CMPLMSG)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   CLOSFILE SYSOUT

   SYSCALL OPEN &SYSPRT &sysprint_dd &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER
   OPENFILE &SYSPRINT_DD OUTPUT
   SET &SYSPRINT = &STR( ***)
   PUTFILE SYSPRINT
   SET &SYSPRINT = &STR(&CMPLMSG)
   PUTFILE SYSPRINT
   SET &SYSPRINT = &STR( ***)
   PUTFILE SYSPRINT
   CLOSFILE SYSPRINT

   ALLOC DSN(&DELTA2) DD(&SYSUT3) SHR
   IF &LASTCC > 7 THEN +
      DO
         SET &RC = &STR(*** Unable to allocate &DELTA2 ***)
         GOTO ALLOCER
      END

   SYSCALL OPEN &BASEDS &SYSUT1 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &CARDFILE &SYSIN &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SET &CRSR=USER2
   SYSCALL OPEN &USER2DS &SYSUT2 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   CALL 'SYS3.COMPAREX.PROD.LOADLIB(COMPAREX)' /******** COMPARE **/

   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)

/*******************************************************
/* APPLY first  set of changes                         *
/*******************************************************

   ISPEXEC CONTROL DISPLAY LOCK
   SET CMPLMSG=&STR( *** Applying &user1ds updates to temp file ***)
   ISPEXEC DISPLAY MSG(CMPC000M)
   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)
   SET &CRSR=BASE

   SYSCALL OPEN &SYSODS &sysout_dd &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER
   OPENFILE &SYSOUT_DD OUTPUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR(&CMPLMSG)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   CLOSFILE SYSOUT

   SYSCALL OPEN &SYSPRT_UP &SYSPRINT_DD &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &DELTA1 &SYSIN &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &BASEDS &SYSUT1 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &UPDATEDS &SYSUT2 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   ISPEXEC SELECT PGM(IEBUPDTE) PARM(MOD)

   SET &LASTC = &LASTCC
   IF &LASTC  > 0 THEN +
      DO
         SET &CMPLMSG = &STR(Bad Return from IEBUPDTE (RC=&LASTC) #1)
         ISPEXEC SETMSG MSG(CMPC000M)
         ISPEXEC EDIT DATASET(&SYSPRT_UP)
         EXIT
      END

   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)

/*******************************************************
/* APPLY second set of changes                         *
/*******************************************************

   ISPEXEC CONTROL DISPLAY LOCK
   SET CMPLMSG=&STR( *** Applying &user2ds updates to temp file ***)
   ISPEXEC DISPLAY MSG(CMPC000M)
   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)
   SET &CRSR=BASE

   SYSCALL OPEN &SYSODS &sysout_dd &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER
   OPENFILE &SYSOUT_DD OUTPUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR(&CMPLMSG)
   PUTFILE SYSOUT
   SET &SYSOUT = &STR( ***)
   PUTFILE SYSOUT
   CLOSFILE SYSOUT

   SYSCALL OPEN &SYSPRT_UP &SYSPRINT_DD &DISPMOD RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &DELTA2 &SYSIN &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &UPDATEDS &SYSUT1 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   SYSCALL OPEN &UPDATEDS &SYSUT2 &DISPSHR RC
   IF &STR(&RC) NE OK THEN GOTO ALLOCER

   ISPEXEC SELECT PGM(IEBUPDTE) PARM(MOD)

   SET &LASTC = &LASTCC
   IF &LASTC  > 0 THEN +
      DO
         SET &CMPLMSG = &STR(Bad Return from IEBUPDTE (RC=&LASTC) #2)
         ISPEXEC SETMSG MSG(CMPC000M)
         ISPEXEC EDIT DATASET(&SYSPRT_UP)
         EXIT
      END

   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)

   ISPEXEC EDIT DATASET(&UPDATEDS(&MEMBER)) MACRO(CMPUPDT)
   SET &LASTC=&LASTCC
   IF &LASTC > 0 THEN +
      SET &CMPLMSG = &STR(*** Unable to view &UPDATEDS ***)
   ELSE
      SET &CMPLMSG = &STR(*** Completed Processing ***)

   ISPEXEC SETMSG MSG(CMPC000M)
   SET &CRSR = MEMBER
   GOTO TOP

/*******************************
/* PROCESS AN ALLOCATION ERROR *
/*******************************
ALLOCER: +
   IF &STR(&RC)=OK THEN +
      ISPEXEC SETMSG MSG(CMPC000A)
   ELSE +
      DO
         SET &CMPLMSG=&STR(&RC)
         ISPEXEC SETMSG MSG(CMPC000B)
      END
   GOTO TOP

/*************************
/* SINGLE POINT OF EXIT  *
/*************************
EXIT: +
   IF &STR(&CMPPREF) =    THEN PROFILE NOPREFIX
   DELETE cmp1.*
   EXIT

/********************************************************
/* SUBROUTINES                                          *
/********************************************************

/*************************
/* OPEN A DATASET        *
/*************************
OPEN: PROC 3 DSN DD DISP RC
   SYSREF &RC

   SET RC=&SYSDSN(&DSN)
   IF &STR(&RC)=OK THEN +
      DO
         ALLOC DA(&DSN) FI(&DD) &DISP
         SET &LASTC=&LASTCC
         IF &LASTCC >7 THEN +
            SET RC=&STR(ERROR: Allocating &DSN DISP=&DISP (RC: &LASTC))
      END
   ELSE +
         SET &RC = &STR(&RC: &DSN DISP=&DISP)
   END

/*************************
/* create card file      *
/*************************
BLDCARD: PROC 1 DSN

   ALLOC DD(CARDS) DSN(&DSN) +
                    NEW CATALOG +
                    UNIT(SYSDA) VOLUME(WRK$$$) +
                    SPACE(5 1) CYLINDERS RELEASE +
                    RECFM(F B) LRECL(80) BLKSIZE(23440)
   IF &LASTCC>7 THEN +
      DO
        SET RC='Unable to open ' &DSN ' for output rc:' &lastcc
        GOTO ALLOCER
      END
   ELSE +
      DO
         OPENFILE CARDS OUTPUT
         SET &CARDS=&STR(TEXT=$COBOL)
         PUTFILE CARDS
         SET &CARDS=&STR(COPYDIFF=(IEBUPDTE,SEQFLD=016))
         PUTFILE CARDS
         SET &CARDS=&STR(MASK=(1,8))
         PUTFILE CARDS
         SET &CARDS=&STR(MAXDIFF=1000)
         PUTFILE CARDS
         SET &CARDS=CONTINUE
         PUTFILE CARDS
         CLOSFILE CARDS
         FREE DD(CARDS)
      END
   END

/*************************
/* OPEN NEW DATASET      *
/*************************
OPENNEW: PROC 4 DSN DD DISP DCB RC
   SYSREF &DISP &DCB &RC

   ALLOC DD(&DD) DSN(&DSN) +
                    &DISP +
                    UNIT(SYSDA) VOLUME(WRK$$$) +
                    SPACE(5 1) CYLINDERS RELEASE +
                    &DCB
   SET &LASTC = &LASTCC
   IF &LASTC>7 THEN +
        SET RC=&STR(ERROR: Allocating &dsn DISP=&DISP (RC: &LASTC))
   END

/*************************
/* INITIALIZE ENVIRONMENT*
/*************************
INITIAL: +
   ISPEXEC CONTROL DISPLAY LOCK
   SET CMPLMSG=&STR( *** Allocating Temporary Datasets ***)
   ISPEXEC DISPLAY MSG(CMPC000M)

   SET &SYSIN    = SYSIN
   SET &SYSUT1   = SYSUT1
   SET &SYSUT2   = SYSUT2
   SET &SYSUT3   = SYSUT3
   SET &SYSOUT   = SYSOUT
   SET &SYSPRINT = SYSPRINT
   SET &sysout_dd = SYSOUT
   SET &sysprint_dd = SYSPRINT
   SET &SYSODS   = cmp1.SYSOUT
   SET &SYSPRT   = cmp1.SYSPRT
   SET &SYSPRT_UP= cmp1.IEBUPPRT
   SET &CARDFILE = cmp1.SYSIN
   SET &DCBFBA   = RECFM(F B A) LRECL(121) BLKSIZE(12100)
   SET &DCBVB    = RECFM(V B ) LRECL(240) BLKSIZE(23440)
   SET &DCBF80   = RECFM(F B) LRECL(80) BLKSIZE(23440)
   SET &DISPMOD  = MOD
   SET &DISPNEW  = NEW CATALOG
   SET &DISPSHR  = SHR
   SET &UPDATEDS = cmp.UPDATED
   SET &DELTA1   = &UPDATEDS(DELTA1)
   SET &DELTA2   = &UPDATEDS(DELTA2)
   SET &INIT     = YES
                                                                           00120
   FREE DD(SYSUT1 SYSUT2 SYSUT3 SYSIN SYSPRINT SYSOUT)
   DELETE cmp1.*
   SYSCALL BLDCARD &CARDFILE
   SYSCALL OPENNEW &SYSODS &SYSOUT_DD DISPNEW DCBFBA RC
     OPENFILE SYSOUT OUTPUT
     SET &SYSOUT=&STR(cmp &ZTIME &ZDATE)
     PUTFILE SYSOUT
     CLOSFILE SYSOUT

   SYSCALL OPENNEW &SYSPRT &sysprint_dd DISPNEW DCBVB RC
     OPENFILE SYSPRINT OUTPUT
     SET &SYSPRINT=&STR(cmp &ZTIME &ZDATE)
     PUTFILE SYSPRINT
     CLOSFILE SYSPRINT

   FREE DD(&SYSPRINT_DD)
   SYSCALL OPENNEW &SYSPRT_UP &SYSPRINT_DD DISPNEW DCBFBA RC
     OPENFILE SYSPRINT OUTPUT
     SET &SYSPRINT=&STR(cmp &ZTIME &ZDATE)
     PUTFILE SYSPRINT
     CLOSFILE SYSPRINT

   IF &SYSDSN(&UPDATEDS) NE OK THEN +
      ALLOC DD(TMP) DSN(&UPDATEDS) +
                    NEW CATALOG +
                    DSORG(PO) +
                    UNIT(SYSDA) VOLUME(WRK$$$) +
                    SPACE(5 1) CYLINDERS RELEASE +
                    DIR(5) +
                    RECFM(F B) LRECL(80) BLKSIZE(23440)

   FREE DD(TMP)
   GOTO POSTINI                  /* return to top of code */

/**********************************************************************
/* DISPLAY ANY "HELP" WHICH IS AVAILABLE FOR THIS UTILITY             *
/**********************************************************************
HELPSEC: +
ISPEXEC SELECT PGM(ISPTUTOR) PARM(HELPSHEL)
SET ZEDLMSG = &STR(*** HELP DISPLAYED FOR CMP UTILITY +
                   *** NO PROCESSING PERFORMED ***)
ISPEXEC SETMSG MSG(UTLZ000)
EXIT
            


Documentation


 CMP COMPARES TWO VERSIONS OF A PROGRAM AND CREATES A MERGED VERSION OF THESE
 PROGRAMS.  IN ORDER TO ACCOMPLISH THIS, A COMMON BASE VERSION MUST EXIST.  AN
 EXAMPLE IS P@USER1 AND P@USER2 MADE CHANGES TO PROGRAM COBOL1.  THE COMMON BASE
 VERSION OF COBOL1 IS STORED IN SLSS.PRD.COBOL2(COBOL1).  EACH USER HAS THEIR
 VERSION STORED IN P@USER?.SLSS.COBOL(COBOL1).  CMP WILL COMPARE EACH P@USER1
 AND P@USER2 VERSIONS TO SLSS.PRD AND CREATE A MERGED VERSION IN A DATASET
 CALLED P [at] USER1 [dot] CMP [dot] UPDATED(COBOL1).  IF YOU HAVE ANY PROBLEMS WITH THIS FEEL
 FREE TO STOP BY AND ASK QUESTIONS. JIM X352
            


Leave a Reply

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