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