User Exit Example

The following is the source code for a sample user exit. This exit will change the storage group to non-SMS if the data set is non-SMS-managed. In addition, this exit will test if the 'A' record contains a high used RBA and a high allocated RBA value of zero. If a value of zero is found in this test, then the record is not written out.

Figure 1. DCOLLECT User Exit Example
IDCDCX1  TITLE 'USER EXIT FOR DCOLLECT - EXAMPLE'
IDCDCX1  CSECT
IDCDCX1  AMODE 24
IDCDCX1  RMODE 24
**********************************************************************
* DESCRIPTIVE NAME: USER EXIT FOR DCOLLECT - EXAMPLE                 *
*                                                                    *
* FUNCTION: THIS MODULE TESTS IF A STORAGE GROUP NAME EXISTS IN THE  *
*           'D ' RECORD, AND IF NOT, SETS THE STORAGE GROUP NAME TO  *
*           A VALUE OF "NON-SMS ". IT ALSO TESTS IF THE 'A ' RECORD  *
*           CONTAINS A HURBA AND HARBA VALUE OF ZERO, AND IF SO,     *
*           INDICATES THAT THIS RECORD SHOULD NOT BE WRITTEN TO THE  *
*           OUTPUT DATA SET.                                         *
*                                                                    *
* REGISTER CONVENTIONS:                                              *
*     ON ENTRY:  R0  = LENGTH OF RECORD                              *
*                R1  = ADDRESS OF RECORD                             *
*                R2  = 100 BYTE WORK AREA ADDRESS                    *
*                R13 = CALLER'S SAVE AREA ADDRESS                    *
*                R14 = RETURN ADDRESS                                *
*     ON EXIT :  R0  = NEW RECORD LENGTH (IF MODIFIED)               *
*                R1  = NEW RECORD ADDRESS (IF MODIFIED)              *
*                R15 = RETURN CODE                                   *
*                                                                    *
* RETURN CODE VALUES                                                 *
*   0 = NO CHANGES MADE. WRITE RECORD TO OUTPUT DATA SET             *
*   4 = CHANGES MADE TO RECORD. WRITE RECORD TO OUTPUT DATA SET      *
*  12 = DO NOT WRITE RECORD TO OUTPUT DATA SET                       *
*                                                                    *
*                                                                    *
* ENTRY POINT: IDCDCX1                                               *
*                                                                    *
* CONTROL BLOCKS REFERENCED:                                         *
*   IDCDOUT - AMS DCOLLECT FUNCTION OUTPUT RECORD FORMATS            *
*                                                                    *
**********************************************************************
*
         DS    0H
         USING *,R15
         B     START
         DC    C'IDCDCX1 '
         DC    C'EXAMPLE 1 '
         DROP  R15
**********************************************************************
* SAVE REGISTERS FROM CALLER                                         *
**********************************************************************
START    STM   R14,R12,12(R13)
         LR    R12,R15
         USING IDCDCX1,R12
         USING DCUOUTH,R1
*
* INITIALIZE THE RETURN REGISTER (R15)
         SLR   R15,R15
*
**********************************************************************
* TEST REG1 FOR A VALUE OF 'FFFFFFFF'X, INDICATING THE FINAL CALL    *
* TO THE USER EXIT. IF FINAL CALL TO EXIT, JUST RETURN TO DCOLLECT.  *
* IF ANY AREAS WERE GETMAINED, THEY WOULD BE FREED AT THIS TIME,     *
* AND ANY OTHER NECESSARY CLEANUP PERFORMED.                         *
**********************************************************************
         SLR   R14,R14
         BCTR  R14,0
         CLR   R1,R14
         BE    EXIT
*
**********************************************************************
* IF THIS IS A 'D ' TYPE RECORD, TEST THE STORAGE GROUP LENGTH FIELD *
* FOR A VALUE OF ZERO. IF ZERO, PUT THE VALUE 'NON_SMS ' IN THE      *
* STORAGE GROUP FIELD. THE TYPES OF RECORDS USED BY DCURCTYP CAN BE  *
* OBTAINED FROM THE MAPPING MACRO ICDOUT FOR USE BY THE CUSTOMER-    *
* DESIGNED EXIT.                                                     *
**********************************************************************
         CLI   DCURCTYP,='D '
         BNE   TEST_A
*
* TEST FOR A STORAGE GROUP FOR THIS DATA SET
         LH    R14,DCDSGLNG
         LTR   R14,R14
         BNZ   EXIT
*
* SET DCDSGLNG TO 8
         LA    R3,8
         STH   R3,DCDSGLNG
* SET DCDSTGRP TO 'NON_SMS '
         MVI   DCDSTGRP+8,C' '
         MVC   DCDSTGRP+9(21),DCDSTGRP+8
         MVC   DCDSTGRP(8),NON_SMS
* INDICATE THAT THE RECORD HAS BEEN MODIFIED
         LA    R15,4
         B     EXIT
*
**********************************************************************
* IF THIS IS AN 'A ' TYPE RECORD, TEST DACHURBA AND DCAHARBA FOR A   *
* VALUE OF ZERO. IF BOTH FIELDS ARE ZERO, THEN SET REGISTER 15 TO    *
* 12, INDICATING THAT THIS RECORD SHOULD NOT BE WRITTEN OUT.         *
* THE TYPES OF RECORDS USED BY DCURCTYP CAN BE OBTAINED FROM THE     *
* MAPPING MACRO ICDOUT FOR USE BY THE CUSTOMER-DESIGNED EXIT.        *
**********************************************************************
TEST_A   DS    0H
         CLI   DCURCTYP,DCUASSOC
         BNE   EXIT
*
* TEST IF DCAHURBA = 0 & DCAHARBA = 0
         L     R3,DCAHURBA
         LTR   R3,R3
         BNZ   EXIT
         L     R14,DCAHARBA
         LTR   R14,R14
         BNZ   EXIT
* DON'T WRITE THIS RECORD OUT TO THE OUTPUT DATA SET
         LA    R15,12
*
EXIT     DS    0H
* RETURN TO DCOLLECT WITH THE RETURN CODE IN REGISTER 15
         L     R14,12(,R13)
         LM    R0,R12,20(R13)
         BR    R14
*
         LTORG
         DS    0D
NON_SMS  DC    CL8'NON_SMS '
R0       EQU   0
R1       EQU   1
R3       EQU   3
R12      EQU   12
R13      EQU   13
R14      EQU   14
R15      EQU   15
         IDCDOUT
*
         END