Skip to content

Analyzing Skeleton Imbeds

The information in this chapter was assembled by analyzing skeleton libraries using the ISPF Search-For Utility (=3.14).

You can analyze skeleton imbeds yourself by searching skeleton libraries for ’)IM ’, the operator in the ISPF skeleton imbed statement in column 1:

ISRSFSPR                        Search-For Utility
Command ===>

Search String . . ’)IM ’

ISPF Library:
    Project . . .
    Group . . . . . . . . . . . . .
    Type . . . .
    Member . . . (Blank or pattern for member selection list,
                    "*" for all members)
Other Partitioned, Sequential or VSAM Data Set:
    Data Set Name . . . CMNTP.CMN820.SKELS(*)
    Volume Serial . . . (If not cataloged)

Listing Data Set . . . USER015.SRCHFOR.LIST
Data Set Password . . (If Search-For data set password protected)

Enter "/" to select option              Execution Mode      Output Mode
_ Specify additional search strings    1 1. Foreground     1 1. View
_ Mixed Mode                             2. Batch            2. Browse
_ Bypass selection list

...

The following panel shows a snippet of the results of a search:

1 ISRSUPC   -   MVS/PDF FILE/LINE/WORD/BYTE/SFOR COMPARE UTILITY- ISPF FOR z/OS
LINE-# SOURCE SECTION                       SRCH DSN: USER015.CMN820.SKELS

CMN$$ACB                    --------- STRING(S) FOUND ----------------

    1 //*)IM CMN$$ACB
    30 //*)IM CMN$$ACB END

CMN$$ARE                    --------- STRING(S) FOUND ----------------

    1 //*)IM CMN$$ARE
    245 )IM CMN$$XVP
    247 //*)IM CMN$$ARE END

CMN$$ASM                    --------- STRING(S) FOUND ----------------

    1 //*)IM CMN$$ASM
    26 )IM CMN$$SYC
    63 )IM CMN$$OPT
    64 //*)IM CMN$$ASM END

CMN$$ASN                    --------- STRING(S) FOUND ----------------

    1 //*)IM CMN$$ASN
    13 )IM CMN$$SPR
    36 )IM CMN$$XVP

...

CMN$$AUD                    --------- STRING(S) FOUND ----------------
    1 //*)IM CMN$$AUD
    20 )IM CMN$$SPR
    120 )IM CMN$$SPR
    156 )IM CMN$$SEX
    176 //*)IM CMN$$SPR
    203 )IM CMN$$XVP

...

Notice that many ChangeMan ZMF skeletons begin with a JCL comment containing the skeleton name (unless they require a jobcard, when that has to come first):

//*)IM CMN$$ASM

Alternatively they may have a skeleton comment to the same effect, i.e.

)CM IM CMNJLCIC
or
)CM )IM CMNJLDB2

You will need to read the comments in the skeleton, as there may be relevant instructions; i.e.,

)CM APPLY THE FOLLOWING IMBED TO APPLY PACKAGE SCRATCH/RENAMES
)CM TO THE TARGET PROMOTION LIBRARIES
)CM
)CM )IM CMN$$PSR

The only effective includes are the ones that start in column 1; e.g., lines 245, 26, 63, 13, 36, 20, 120, 156 and 203 above.

By searching backward through JCL generated by file tailoring from ChangeMan ZMF skeletons, you can get information about the hierarchy of imbeds that was used by ISPF file tailoring to build the JCL. However, there is no way to tell from the JCL comments if a skeleton was imbedded in a previously listed skeleton or if both were imbedded in another skeleton and processed serially.

This JCL fragment from a stage job shows that skeletons CMN$$DSN, CMN$$JBL, CMNCOB2, CMN$$VAR, CMN$PARM, and CMN$$WRT were processed by ISPF file tailoring to build the JCL. In fact, skeletons CMN$$VAR and CMN$$XSC are imbedded in procedure skeleton CMNCOB2, and skeleton CMN$PARM is imbedded in CMN$$VAR.

000010 //*
000011 //*)IM CMN$$DSN
000012 //*)IM CMN$$JBL
000013 //JOBLIB     DD DISP=SHR,DSN=CMNTP.CMN812.C6.LOAD
000014 //           DD DISP=SHR,DSN=CMNTP.SER812.C6.LOAD
000015 //           DD DISP=SHR,DSN=CMNTP.CMN812.LOAD
000016 //           DD DISP=SHR,DSN=CMNTP.SER812.LOAD
000017 //*)IM CMNCOB2
000018 //*)IM CMN$$VAR
000019 //* USROP01 = Y
000020 //*)IM CMN$PARM
000021 //* SEL = AND OBJLIB = Y
000022 //*)IM CMN$$XSC
000023 //SERCOPY EXEC   PGM=SERCOPY,  *** COPY ACPSRCEE FROM STAGING
000024 //               REGION=3M,
000025 //               PARM=('INDSN(CMNTP.S6.ACTP.STG6.#000032.SRC)',
000026 //               'MEMBER=ACPSRCEE')
000027 //SYSPRINT   DD  DISP=(,PASS),DSN=&&LIST00,
000028 //               UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE),
000029 //               DCB=(RECFM=FBM,LRECL=121,BLKSIZE=0)
000030 //ABNLIGNR   DD  DUMMY
000031 //SYSUT2     DD  DISP=(,PASS),DSN=&&SOURCE(ACPSRCEE),
000032 //               UNIT=SYSDA,SPACE=(CYL,(1,2,1),RLSE),
000033 //               DCB=(DSORG=PO,RECFM=FB,LRECL=80,BLKSIZE=0)
000034 //SYSUT3     DD  UNIT=SYSDA,SPACE=(CYL,(5,5))
000035 //SYSUT4     DD  UNIT=SYSDA,SPACE=(CYL,(5,5))
000036 //*)IM CMN$$WRT
000037 //WRITE  EXEC    PGM=CMNWRITE, *** PARSE/EXPAND COMPONENT ACPSRCEE
000038 //               COND=(4,LT),
000039 //               PARM=('SUBSYS=6,USER=USER015',
000040 //               '')
000041 //*)IM CMN$$SPR
000042 //SER#PARM   DD  DISP=SHR,DSN=CMNTP.SER812.C6.TCPIPORT
000043 //SYSPRINT   DD  DISP=(,PASS),DSN=&&LIST10W1,
000044 //               UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE)
000045 //*)IM CMN$$SYC
000046 //SYSLIB     DD  DISP=SHR,DSN=CMNTP.S6.ACTP.STG6.#000032.CPY
000047 //           DD  DISP=SHR,DSN=CMNTP.S6.V812.BASE.ACTP.CPY

...

Note also that there is often logic to determine if a skeleton is used, and that a given skeleton may appear several times in the calling skeleton, for example CMN$$CBL which includes CMN$$SPR, which for the first include of CMN$$SPR is subject to 5 separate )SEL statements:

000005 )SEL &STORMNS EQ P OR &SKLBLVL EQ 0 AND &STORMNS NE L
000006 )SEL &STORMNS EQ P OR &SKLBLVL EQ 0 AND &STORMNS NE A
000007 )SEL &STORMNS EQ P OR &SKLBLVL EQ 0 AND &STORMNS NE V
000008 )SEL &STORMNS NE H
- - - - - - - - - - - - - - - - - - - 82 Line(s) not Displayed
000091 )SEL &LIBORG EQ LIB
- - - - - - - - - - - - - - - - - - - 9 Line(s) not Displayed
000101 )IM CMN$$SPR
- - - - - - - - - - - - - - - - - - - 40 Line(s) not Displayed
000142 )ENDSEL &LIBORG EQ LIB
000143 )ENDSEL &STORMNS NE H
000144 )ENDSEL &STORMNS EQ P OR &SKLBLVL EQ 0 AND &STORMNS NE V
000145 )ENDSEL &STORMNS EQ P OR &SKLBLVL EQ 0 AND &STORMNS NE A
000146 )ENDSEL &STORMNS EQ P OR &SKLBLVL EQ 0 AND &STORMNS NE L

Another point to be aware of is the use of JCL IF-THEN-ELSE constructs, which will also affect execution at run time of the JCL. See near the end of CMN$$ILD:

)CM DELETE CMNBAT90 OUTPUT IF WE GET ILOD CONFLICT - CLEAR IT OUT
)CM FOR CMN99 STEP
)CM
//CHKVILOD IF (VFYILOD&L#N..RUN = TRUE) THEN
//DLTILOD&L#N EXEC PGM=IEFBR14,
//              COND=(8,GT,VFYILOD&L#N)
//BAT90CTL DD   DISP=(MOD,DELETE,DELETE),
//              UNIT=SYSDA,SPACE=(CYL,0),
//              DCB=(DSORG=PS,RECFM=FB,LRECL=80,BLKSIZE=0),
//              DSN=&&&&BAT90CTL
//CHKVILOD ENDIF

...